mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:20:48 +08:00
Merge branch 'master' into develop
This commit is contained in:
commit
f9e559f069
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -1,6 +1,6 @@
|
|||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: [leaanthony]
|
github: [ leaanthony ]
|
||||||
patreon: # Replace with a single Patreon username
|
patreon: # Replace with a single Patreon username
|
||||||
open_collective: # Replace with a single Open Collective username
|
open_collective: # Replace with a single Open Collective username
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
35
.github/workflows/deploy-website-to-wails.top-mirror.yml
vendored
Normal file
35
.github/workflows/deploy-website-to-wails.top-mirror.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: Deploy mirror | 部署镜像
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
# pull_request:
|
||||||
|
# branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
name: Automatic deployment | 自动部署
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.repository == 'misitebao/wails'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout | 切换到部署分支
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: "master"
|
||||||
|
submodules: true
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Build Site | 构建网站
|
||||||
|
run: |
|
||||||
|
cd website &&
|
||||||
|
npm install && npm run build
|
||||||
|
|
||||||
|
- name: Deploy to Server | 部署到服务器
|
||||||
|
uses: hengkx/ssh-deploy@v1.0.1
|
||||||
|
with:
|
||||||
|
HOST: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
USERNAME: ${{ secrets.DEPLOY_HOST_USER }}
|
||||||
|
PASSWORD: ${{ secrets.DEPLOY_HOST_PASSWORD }}
|
||||||
|
SOURCE: "website/build"
|
||||||
|
TARGET: "/www/wwwroot/wails.top"
|
4
.github/workflows/latest-pre.yml
vendored
4
.github/workflows/latest-pre.yml
vendored
@ -1,8 +1,10 @@
|
|||||||
name: latest pre-release
|
name: latest pre-release
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
tags:
|
tags:
|
||||||
- '**-pre**'
|
- '**-pre**'
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
29
.github/workflows/runtime.yml
vendored
Normal file
29
.github/workflows/runtime.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: Runtime
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- v2-alpha
|
||||||
|
paths:
|
||||||
|
- 'v2/internal/frontend/runtime/**'
|
||||||
|
jobs:
|
||||||
|
rebuild-runtime:
|
||||||
|
name: Rebuild the runtime
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 14.17.6
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: v2/internal/frontend/runtime/package-lock.json
|
||||||
|
- run: npm install
|
||||||
|
working-directory: v2/internal/frontend/runtime
|
||||||
|
- run: npm run build
|
||||||
|
working-directory: v2/internal/frontend/runtime
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
uses: devops-infra/action-commit-push@master
|
||||||
|
with:
|
||||||
|
github_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
commit_prefix: "[AUTO]"
|
||||||
|
commit_message: "The runtime was rebuilt"
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -17,8 +17,17 @@ cmd/wails/wails
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
tmp
|
tmp
|
||||||
node_modules/
|
node_modules/
|
||||||
|
package.json.md5
|
||||||
|
v2/test/**/frontend/dist
|
||||||
|
v2/test/**/build/
|
||||||
|
v2/test/frameless/icon.png
|
||||||
|
v2/test/hidden/icon.png
|
||||||
|
v2/test/kitchensink/frontend/public/bundle.*
|
||||||
|
v2/pkg/parser/testproject/frontend/wails
|
||||||
v2/test/kitchensink/frontend/public
|
v2/test/kitchensink/frontend/public
|
||||||
v2/internal/ffenestri/runtime.c
|
|
||||||
v2/internal/runtime/assets/desktop.js
|
|
||||||
v2/test/kitchensink/build/darwin/desktop/kitchensink
|
v2/test/kitchensink/build/darwin/desktop/kitchensink
|
||||||
v2/test/kitchensink/frontend/package.json.md5
|
v2/test/kitchensink/frontend/package.json.md5
|
||||||
|
/v2/internal/ffenestri/windows/test/cmake-build-debug/
|
||||||
|
!v2/internal/ffenestri/windows/x64/webview2.dll
|
||||||
|
!v2/internal/ffenestri/windows/x64/WebView2Loader.dll
|
||||||
|
.idea/
|
||||||
|
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
"go.formatTool": "goimports",
|
"go.formatTool": "goimports",
|
||||||
"eslint.alwaysShowStatus": true
|
"eslint.alwaysShowStatus": true,
|
||||||
|
"files.associations": {
|
||||||
|
"__locale": "c",
|
||||||
|
"ios": "c"
|
||||||
|
}
|
||||||
}
|
}
|
@ -31,18 +31,18 @@ Wails is what it is because of the time and effort given by these great people.
|
|||||||
* [Christopher Murphy](https://github.com/Splode)
|
* [Christopher Murphy](https://github.com/Splode)
|
||||||
* [Zámbó, Levente](https://github.com/Lyimmi)
|
* [Zámbó, Levente](https://github.com/Lyimmi)
|
||||||
* [artem](https://github.com/Unix4ever)
|
* [artem](https://github.com/Unix4ever)
|
||||||
* [Tim Kipp](https://github.com/timkippdev)
|
* [Tim Kipp](https://github.com/timkippdev)
|
||||||
* [Dmitry Gomzyakov](https://github.com/kyoto44)
|
* [Dmitry Gomzyakov](https://github.com/kyoto44)
|
||||||
* [Arthur Wiebe](https://github.com/artooro)
|
* [Arthur Wiebe](https://github.com/artooro)
|
||||||
* [Ilgıt Yıldırım](https://github.com/ilgityildirim)
|
* [Ilgıt Yıldırım](https://github.com/ilgityildirim)
|
||||||
* [Altynbek](https://github.com/gelleson)
|
* [Altynbek](https://github.com/gelleson)
|
||||||
* [Kyle](https://github.com/kmuchmore)
|
* [Kyle](https://github.com/kmuchmore)
|
||||||
* [Balakrishna Prasad Ganne](https://github.com/aayush420)
|
* [Balakrishna Prasad Ganne](https://github.com/aayush420)
|
||||||
* [Charaf Rezrazi](https://github.com/Rezrazi)
|
* [Charaf Rezrazi](https://github.com/Rezrazi)
|
||||||
* [misitebao](https://github.com/misitebao)
|
* [misitebao](https://github.com/misitebao)
|
||||||
* [Elie Grenon](https://github.com/DrunkenPoney)
|
* [Elie Grenon](https://github.com/DrunkenPoney)
|
||||||
* [SophieAu](https://github.com/SophieAu)
|
* [SophieAu](https://github.com/SophieAu)
|
||||||
* [Alexander Matviychuk](https://github.com/alexmat)
|
* [Alexander Matviychuk](https://github.com/alexmat)
|
||||||
* [RH12503](https://github.com/RH12503)
|
* [RH12503](https://github.com/RH12503)
|
||||||
* [hi019](https://github.com/hi019)
|
* [hi019](https://github.com/hi019)
|
||||||
* [Igor Minen](https://github.com/Igogrek)
|
* [Igor Minen](https://github.com/Igogrek)
|
||||||
|
146
README.md
146
README.md
@ -1,5 +1,5 @@
|
|||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<img src="logo_cropped.png" width="40%"><br/>
|
<img src="logo.png" width="55%"><br/>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Build desktop applications using Go & Web Technologies.<br/><br/>
|
Build desktop applications using Go & Web Technologies.<br/><br/>
|
||||||
@ -18,12 +18,16 @@
|
|||||||
|
|
||||||
## Internationalization
|
## Internationalization
|
||||||
|
|
||||||
English | [简体中文](README.zh_CN.md)
|
English | [简体中文](README.zh-Hans.md)
|
||||||
|
|
||||||
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!
|
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!
|
||||||
|
|
||||||
The official docs can be found at [https://wails.app](https://wails.app).
|
The official docs can be found at [https://wails.app](https://wails.app).
|
||||||
|
|
||||||
|
Click [here](https://wails.io) if you are interested in trying out v2 Beta for Windows.
|
||||||
|
|
||||||
<span id="nav-2"></span>
|
<span id="nav-2"></span>
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
@ -33,22 +37,21 @@ The official docs can be found at [https://wails.app](https://wails.app).
|
|||||||
- [3. Features](#nav-3)
|
- [3. Features](#nav-3)
|
||||||
- [4. Sponsors](#nav-4)
|
- [4. Sponsors](#nav-4)
|
||||||
- [5. Installation](#nav-5)
|
- [5. Installation](#nav-5)
|
||||||
- [5.1 MacOS](#nav-5-1)
|
- [5.1 MacOS](#nav-5-1)
|
||||||
- [5.2 Linux](#nav-5-2)
|
- [5.2 Linux](#nav-5-2)
|
||||||
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
||||||
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
||||||
- [5.2.3 Centos](#nav-5-2-3)
|
- [5.2.3 Centos](#nav-5-2-3)
|
||||||
- [5.2.4 Fedora](#nav-5-2-4)
|
- [5.2.4 Fedora](#nav-5-2-4)
|
||||||
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
||||||
- [5.2.6 Gentoo](#nav-5-2-6)
|
- [5.2.6 Gentoo](#nav-5-2-6)
|
||||||
- [5.3 Windows](#nav-5-3)
|
- [5.3 Windows](#nav-5-3)
|
||||||
- [6. Installation](#nav-6)
|
- [6. Installation](#nav-6)
|
||||||
- [7. Next Steps](#nav-7)
|
- [7. Next Steps](#nav-7)
|
||||||
- [8. FAQ](#nav-8)
|
- [8. FAQ](#nav-8)
|
||||||
- [9. Contributors](#nav-9)
|
- [9. Contributors](#nav-9)
|
||||||
- [10. Special Mentions](#nav-10)
|
- [10. Special Mentions](#nav-10)
|
||||||
- [11. Licensing](#nav-11)
|
- [11. Special Thanks](#nav-11)
|
||||||
- [12. Special Thanks](#nav-12)
|
|
||||||
|
|
||||||
<span id="nav-3"></span>
|
<span id="nav-3"></span>
|
||||||
|
|
||||||
@ -70,33 +73,81 @@ The official docs can be found at [https://wails.app](https://wails.app).
|
|||||||
|
|
||||||
This project is supported by these kind people / companies:
|
This project is supported by these kind people / companies:
|
||||||
|
|
||||||
<a href="https://github.com/matryer" style="width:100px"><img src="https://github.com/matryer.png" width="100"/></a>
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
<a href="https://www.jetbrains.com?from=Wails" style="width:100px"><img src="jetbrains-grayscale.png" width="100"/></a>
|
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
||||||
<a href="https://github.com/tc-hib" style="width:55px;border-radius: 50%">
|
|
||||||
<img src="https://github.com/tc-hib.png?size=55" width="55" style="border-radius: 50%"/>
|
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/picatz" style="width:50px;border-radius: 50%">
|
<a href="https://github.com/snider" style="width:100px;">
|
||||||
<img src="https://github.com/picatz.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="https://github.com/snider.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/tylertravisty" style="width:50px;border-radius: 50%">
|
<a href="https://github.com/codydbentley" style="width:100px">
|
||||||
<img src="https://github.com/tylertravisty.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/akhudek" style="width:50px;border-radius: 50%">
|
<br/>
|
||||||
<img src="https://github.com/akhudek.png?size=50" width="50" style="border-radius: 50%"/>
|
<br/>
|
||||||
|
<a href="https://github.com/matryer" style="width:100px">
|
||||||
|
<img src="https://github.com/matryer.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/akhudek" style="width:50px;border-radius: 50%">
|
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
||||||
<img src="https://github.com/akhudek.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="/img/jetbrains-grayscale.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/trea" style="width:50px;border-radius: 50%">
|
<a href="https://github.com/tc-hib" style="width:55px">
|
||||||
<img src="https://github.com/trea.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/LanguageAgnostic" style="width:55px;border-radius: 50%">
|
<a href="https://github.com/picatz" style="width:50px">
|
||||||
<img src="https://github.com/LanguageAgnostic.png?size=55" width="55" style="border-radius: 50%"/>
|
<img src="https://github.com/picatz.png?size=50" width="50"/>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="https://github.com/tylertravisty" style="width:50px">
|
||||||
|
<img src="https://github.com/tylertravisty.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/akhudek" style="width:50px">
|
||||||
|
<img src="https://github.com/akhudek.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/trea" style="width:50px">
|
||||||
|
<img src="https://github.com/trea.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/LanguageAgnostic" style="width:55px">
|
||||||
|
<img src="https://github.com/LanguageAgnostic.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/fcjr" style="width:55px">
|
||||||
|
<img src="https://github.com/fcjr.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/nickarellano" style="width:60px">
|
||||||
|
<img src="https://github.com/nickarellano.png?size=60" width="60"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/bglw" style="width:65px">
|
||||||
|
<img src="https://github.com/bglw.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/jugglingjsons" style="width:50px">
|
||||||
|
<img src="https://github.com/jugglingjsons.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/marcus-crane" style="width:65px">
|
||||||
|
<img src="https://github.com/marcus-crane.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/bbergshaven" style="width:45px">
|
||||||
|
<img src="https://github.com/bbergshaven.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Gilgames000" style="width:45px">
|
||||||
|
<img src="https://github.com/Gilgames000.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ilgityildirim" style="width:50px">
|
||||||
|
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ondoki" style="width:65px">
|
||||||
|
<img src="https://github.com/ondoki.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/questrail" style="width:50px">
|
||||||
|
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/DonTomato" style="width:45px">
|
||||||
|
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<span id="nav-5"></span>
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Wails uses cgo to bind to the native rendering engines so a number of platform dependent libraries are needed as well as an installation of Go. The basic requirements are:
|
Wails uses cgo to bind to the native rendering engines so a number of platform dependent libraries are needed as well as
|
||||||
|
an installation of Go. The basic requirements are:
|
||||||
|
|
||||||
- Go 1.16
|
- Go 1.16
|
||||||
- npm
|
- npm
|
||||||
@ -165,7 +216,9 @@ _Fedora 29, 30_
|
|||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
Windows requires gcc and related tooling. The recommended download is from [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download). Once this is installed, you are good to go.
|
Windows requires gcc and related tooling. The recommended download is
|
||||||
|
from [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download). Once this is installed, you are good to
|
||||||
|
go.
|
||||||
|
|
||||||
<span id="nav-6"></span>
|
<span id="nav-6"></span>
|
||||||
|
|
||||||
@ -191,15 +244,20 @@ It is recommended at this stage to read the comprehensive documentation at [http
|
|||||||
|
|
||||||
- Is this an alternative to Electron?
|
- Is this an alternative to Electron?
|
||||||
|
|
||||||
Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop applications or add a frontend to their existing applications. Whilst Wails does not currently offer hooks into native elements such as menus, this may change in the future.
|
Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop
|
||||||
|
applications or add a frontend to their existing applications. Whilst Wails does not currently offer hooks into native
|
||||||
|
elements such as menus, this may change in the future.
|
||||||
|
|
||||||
- Who is this project aimed at?
|
- Who is this project aimed at?
|
||||||
|
|
||||||
Go programmers who want to bundle an HTML/JS/CSS frontend with their applications, without resorting to creating a server and opening a browser to view it.
|
Go programmers who want to bundle an HTML/JS/CSS frontend with their applications, without resorting to creating a
|
||||||
|
server and opening a browser to view it.
|
||||||
|
|
||||||
- What's with the name?
|
- What's with the name?
|
||||||
|
|
||||||
When I saw WebView, I thought "What I really want is tooling around building a WebView app, a bit like Rails is to Ruby". So initially it was a play on words (Webview on Rails). It just so happened to also be a homophone of the English name for the [Country](https://en.wikipedia.org/wiki/Wales) I am from. So it stuck.
|
When I saw WebView, I thought "What I really want is tooling around building a WebView app, a bit like Rails is to
|
||||||
|
Ruby". So initially it was a play on words (Webview on Rails). It just so happened to also be a homophone of the
|
||||||
|
English name for the [Country](https://en.wikipedia.org/wiki/Wales) I am from. So it stuck.
|
||||||
|
|
||||||
<span id="nav-9"></span>
|
<span id="nav-9"></span>
|
||||||
|
|
||||||
@ -250,6 +308,7 @@ It is recommended at this stage to read the comprehensive documentation at [http
|
|||||||
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/Igogrek"><img src="https://github.com/Igogrek.png?size=40" width="40"/></a></a>
|
||||||
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/aschey"><img src="https://github.com/aschey.png?size=40" width="40"/></a></a>
|
||||||
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a></a>
|
<a href="https://github.com/akhudek"><img src="https://github.com/akhudek.png?size=40" width="40"/></a></a>
|
||||||
|
<a href="https://github.com/s12chung"><img src="https://github.com/s12chung.png?size=40" width="40"/></a></a>
|
||||||
|
|
||||||
<span id="nav-10"></span>
|
<span id="nav-10"></span>
|
||||||
|
|
||||||
@ -257,9 +316,12 @@ It is recommended at this stage to read the comprehensive documentation at [http
|
|||||||
|
|
||||||
Without the following people, this project would never have existed:
|
Without the following people, this project would never have existed:
|
||||||
|
|
||||||
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!).
|
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than
|
||||||
- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing.
|
you can throw a stick at (Not long now Dustin!).
|
||||||
- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his incredible input, we never would have got to v1.
|
- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses
|
||||||
|
for the windowing.
|
||||||
|
- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his
|
||||||
|
incredible input, we never would have got to v1.
|
||||||
|
|
||||||
This project was mainly coded to the following albums:
|
This project was mainly coded to the following albums:
|
||||||
|
|
||||||
@ -279,17 +341,11 @@ This project was mainly coded to the following albums:
|
|||||||
|
|
||||||
<span id="nav-11"></span>
|
<span id="nav-11"></span>
|
||||||
|
|
||||||
## Licensing
|
|
||||||
|
|
||||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large)
|
|
||||||
|
|
||||||
<span id="nav-12"></span>
|
|
||||||
|
|
||||||
## Special Thanks
|
## Special Thanks
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
||||||
A *huge* thanks to <a href="https://pace.dev">Pace</a> for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!<br/><br/>
|
A <i>huge<i/> thanks to <a href="https://pace.dev">Pace</a> for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!<br/><br/>
|
||||||
If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!<br/><br/>
|
If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!<br/><br/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<img src="logo_cropped.png" width="40%"><br/>
|
<img src="logo.png" width="40%"><br/>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
使用 Go 和 Web 技术构建桌面应用程序。<br/><br/>
|
使用 Go 和 Web 技术构建桌面应用程序。<br/><br/>
|
||||||
@ -20,10 +20,12 @@
|
|||||||
|
|
||||||
[English](README.md) | 简体中文
|
[English](README.md) | 简体中文
|
||||||
|
|
||||||
向 Go 程序提供 Web 接口的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web 前端都包装成单个二进制文件的能力。通过处理项目创建、编译和打包,可为您提供工具,使您轻松做到这一点。你所要做的就是发挥创造力!
|
向 Go 程序提供 Web 接口的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web
|
||||||
|
前端都包装成单个二进制文件的能力。通过提供工具,可以很轻松的完成项目的创建、编译和打包。你所要做的就是发挥创意!
|
||||||
|
|
||||||
官方文档可以在 [https://wails.app](https://wails.app)中找到。
|
官方文档可以在 [https://wails.app](https://wails.app) 中找到。
|
||||||
国内镜像站点 [https://wails.top](https://wails.top)
|
|
||||||
|
国内镜像站点 [https://wails.top](https://wails.top)。
|
||||||
|
|
||||||
<span id="nav-2"></span>
|
<span id="nav-2"></span>
|
||||||
|
|
||||||
@ -34,15 +36,15 @@
|
|||||||
- [3. 特征](#nav-3)
|
- [3. 特征](#nav-3)
|
||||||
- [4. 赞助商](#nav-4)
|
- [4. 赞助商](#nav-4)
|
||||||
- [5. 安装](#nav-5)
|
- [5. 安装](#nav-5)
|
||||||
- [5.1 MacOS](#nav-5-1)
|
- [5.1 MacOS](#nav-5-1)
|
||||||
- [5.2 Linux](#nav-5-2)
|
- [5.2 Linux](#nav-5-2)
|
||||||
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
- [5.2.1 Debian/Ubuntu](#nav-5-2-1)
|
||||||
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
- [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2)
|
||||||
- [5.2.3 Centos](#nav-5-2-3)
|
- [5.2.3 Centos](#nav-5-2-3)
|
||||||
- [5.2.4 Fedora](#nav-5-2-4)
|
- [5.2.4 Fedora](#nav-5-2-4)
|
||||||
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
- [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5)
|
||||||
- [5.2.6 Gentoo](#nav-5-2-6)
|
- [5.2.6 Gentoo](#nav-5-2-6)
|
||||||
- [5.3 Windows](#nav-5-3)
|
- [5.3 Windows](#nav-5-3)
|
||||||
- [6. 安装](#nav-6)
|
- [6. 安装](#nav-6)
|
||||||
- [7. 下一步](#nav-7)
|
- [7. 下一步](#nav-7)
|
||||||
- [8. 常见问题](#nav-8)
|
- [8. 常见问题](#nav-8)
|
||||||
@ -71,29 +73,81 @@
|
|||||||
|
|
||||||
这个项目由以下这些人或者公司支持:
|
这个项目由以下这些人或者公司支持:
|
||||||
|
|
||||||
<a href="https://github.com/matryer" style="width:100px"><img src="https://github.com/matryer.png" width="100"/></a>
|
|
||||||
<a href="https://www.jetbrains.com?from=Wails" style="width:100px"><img src="jetbrains-grayscale.png" width="100"/></a>
|
<a href="https://github.com/sponsors/leaanthony" style="width:100px;">
|
||||||
<a href="https://github.com/tc-hib" style="width:55px;border-radius: 50%">
|
<img src="sponsors/bronze%20sponsor.png" width="100"/>
|
||||||
<img src="https://github.com/tc-hib.png?size=55" width="55" style="border-radius: 50%"/>
|
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/picatz" style="width:50px;border-radius: 50%">
|
<a href="https://github.com/snider" style="width:100px;">
|
||||||
<img src="https://github.com/picatz.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="https://github.com/snider.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/tylertravisty" style="width:50px;border-radius: 50%">
|
<a href="https://github.com/codydbentley" style="width:100px">
|
||||||
<img src="https://github.com/tylertravisty.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="https://github.com/codydbentley.png?size=100" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/akhudek" style="width:50px;border-radius: 50%">
|
<br/>
|
||||||
<img src="https://github.com/akhudek.png?size=50" width="50" style="border-radius: 50%"/>
|
<br/>
|
||||||
|
<a href="https://github.com/matryer" style="width:100px">
|
||||||
|
<img src="https://github.com/matryer.png" width="100"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/trea" style="width:50px;border-radius: 50%">
|
<a href="https://www.jetbrains.com?from=Wails" style="width:100px">
|
||||||
<img src="https://github.com/trea.png?size=50" width="50" style="border-radius: 50%"/>
|
<img src="/img/jetbrains-grayscale.png" width="100"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/tc-hib" style="width:55px">
|
||||||
|
<img src="https://github.com/tc-hib.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/picatz" style="width:50px">
|
||||||
|
<img src="https://github.com/picatz.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/tylertravisty" style="width:50px">
|
||||||
|
<img src="https://github.com/tylertravisty.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/akhudek" style="width:50px">
|
||||||
|
<img src="https://github.com/akhudek.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/trea" style="width:50px">
|
||||||
|
<img src="https://github.com/trea.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/LanguageAgnostic" style="width:55px">
|
||||||
|
<img src="https://github.com/LanguageAgnostic.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/fcjr" style="width:55px">
|
||||||
|
<img src="https://github.com/fcjr.png?size=55" width="55"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/nickarellano" style="width:60px">
|
||||||
|
<img src="https://github.com/nickarellano.png?size=60" width="60"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/bglw" style="width:65px">
|
||||||
|
<img src="https://github.com/bglw.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/jugglingjsons" style="width:50px">
|
||||||
|
<img src="https://github.com/jugglingjsons.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/marcus-crane" style="width:65px">
|
||||||
|
<img src="https://github.com/marcus-crane.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/bbergshaven" style="width:45px">
|
||||||
|
<img src="https://github.com/bbergshaven.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Gilgames000" style="width:45px">
|
||||||
|
<img src="https://github.com/Gilgames000.png?size=45" width="45"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ilgityildirim" style="width:50px">
|
||||||
|
<img src="https://github.com/ilgityildirim.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ondoki" style="width:65px">
|
||||||
|
<img src="https://github.com/ondoki.png?size=65" width="65"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/questrail" style="width:50px">
|
||||||
|
<img src="https://github.com/questrail.png?size=50" width="50"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/DonTomato" style="width:45px">
|
||||||
|
<img src="https://github.com/DonTomato.png?size=45" width="45"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<span id="nav-5"></span>
|
<span id="nav-5"></span>
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
Wails 使用 cgo 与原生渲染引擎结合,因此需要一些依赖平台的库以及 Go 的安装。基本要求是:
|
Wails 使用 cgo 与原生渲染引擎结合,因此需要依赖一些平台的库以及 Go 的安装。基本要求是:
|
||||||
|
|
||||||
- Go 1.16
|
- Go 1.16
|
||||||
- npm
|
- npm
|
||||||
@ -120,7 +174,7 @@ _Debian: 8, 9, 10_
|
|||||||
|
|
||||||
_Ubuntu: 16.04, 18.04, 19.04_
|
_Ubuntu: 16.04, 18.04, 19.04_
|
||||||
|
|
||||||
_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
_也成功测试了: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS
|
||||||
|
|
||||||
<span id="nav-5-2-2"></span>
|
<span id="nav-5-2-2"></span>
|
||||||
|
|
||||||
@ -128,7 +182,7 @@ _Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, K
|
|||||||
|
|
||||||
`sudo pacman -S webkit2gtk gtk3`
|
`sudo pacman -S webkit2gtk gtk3`
|
||||||
|
|
||||||
_Also succesfully test on: Manjaro & ArcoLinux_
|
_也成功测试了: Manjaro & ArcoLinux_
|
||||||
|
|
||||||
<span id="nav-5-2-3"></span>
|
<span id="nav-5-2-3"></span>
|
||||||
|
|
||||||
@ -162,13 +216,13 @@ _Fedora 29, 30_
|
|||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
Windows 需要 GCC 和相关工具。 建议从 [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download)下载, 安装完成,您就可以开始了。
|
Windows 需要 GCC 和相关工具。 建议从 [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download) 下载, 安装完成,您就可以开始了。
|
||||||
|
|
||||||
<span id="nav-6"></span>
|
<span id="nav-6"></span>
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
**确保 Go modules 是开启的: GO111MODULE=on 并且 go/bin 在您的 PATH 变量中.**
|
**确保 Go modules 是开启的:GO111MODULE=on 并且 go/bin 在您的 PATH 变量中。**
|
||||||
|
|
||||||
安装很简单,运行以下命令:
|
安装很简单,运行以下命令:
|
||||||
|
|
||||||
@ -180,7 +234,7 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
|
|
||||||
## 下一步
|
## 下一步
|
||||||
|
|
||||||
建议在此时阅读[https://wails.app](https://wails.app)上面的文档.
|
建议在此时阅读 [https://wails.app](https://wails.app) 上面的文档.
|
||||||
|
|
||||||
<span id="nav-8"></span>
|
<span id="nav-8"></span>
|
||||||
|
|
||||||
@ -188,15 +242,16 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
|
|
||||||
- 它是 Electron 的替代品吗?
|
- 它是 Electron 的替代品吗?
|
||||||
|
|
||||||
取决于您的要求。它旨在使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端。尽管 Wails 当前不提供对诸如菜单之类的本机元素的钩子,但将来可能会改变。
|
取决于您的要求。它旨在使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端。尽管 Wails 当前不提供对诸如菜单之类的原生元素的钩子,但将来可能会改变。
|
||||||
|
|
||||||
- 这个项目针对的是谁?
|
- 这个项目针对的是谁?
|
||||||
|
|
||||||
希望将 HTML / JS / CSS 前端与其应用程序捆绑在一起的程序员,而无需借助创建服务并打开浏览器进行查看的方式。
|
希望将 HTML / JS / CSS 前端与其应用程序捆绑在一起的程序员,而不是借助创建服务并打开浏览器进行查看的方式。
|
||||||
|
|
||||||
- 名字怎么来的?
|
- 名字怎么来的?
|
||||||
|
|
||||||
当我看到 WebView 时,我想"我真正想要的是围绕构建 WebView 应用程序工作,有点像 Rails 对于 Ruby"。因此,最初它是一个文字游戏(Webview on Rails)。碰巧也是我来自的[国家](https://en.wikipedia.org/wiki/Wales)的英文名字的同音。所以就是他了。
|
当我看到 WebView 时,我想"我真正想要的是围绕构建 WebView 应用程序工作,有点像 Rails 对于 Ruby"。因此,最初它是一个文字游戏(Webview on
|
||||||
|
Rails)。碰巧也是我来自的 [国家](https://en.wikipedia.org/wiki/Wales) 的英文名字的同音。所以就是他了。
|
||||||
|
|
||||||
<span id="nav-9"></span>
|
<span id="nav-9"></span>
|
||||||
|
|
||||||
@ -252,11 +307,11 @@ go get -u github.com/wailsapp/wails/cmd/wails
|
|||||||
|
|
||||||
## 特别提及
|
## 特别提及
|
||||||
|
|
||||||
如果没有以下人员,此项目将永远不会存在:
|
如果没有以下人员,此项目或许永远不会存在:
|
||||||
|
|
||||||
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!).
|
- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - 他的支持和反馈是巨大的。
|
||||||
- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing.
|
- [Serge Zaitsev](https://github.com/zserge) - Wails 窗口所使用的 [Webview](https://github.com/zserge/webview) 的作者。
|
||||||
- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his incredible input, we never would have got to v1.
|
- [Byron](https://github.com/bh90210) - 有时,Byron 单枪匹马地保持这个项目活着。没有他令人难以置信的投入,我们永远不会得到 v1 。
|
||||||
|
|
||||||
This project was mainly coded to the following albums:
|
This project was mainly coded to the following albums:
|
||||||
|
|
||||||
@ -286,12 +341,12 @@ This project was mainly coded to the following albums:
|
|||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
<a href="https://pace.dev"><img src="pace.jpeg"/></a><br/>
|
||||||
非常感谢<a href="https://pace.dev">Pace</a>对项目的赞助,并帮助将Wails移植到Apple Silicon<br/><br/>
|
<i>非常<i/>感谢<a href="https://pace.dev">Pace</a>对项目的赞助,并帮助将 Wails 移植到 Apple Silicon !<br/><br/>
|
||||||
如果您正在寻找一个强大的项目管理工具,并且快速和易于使用,可以看看他们!<br/><br/>
|
如果您正在寻找一个强大并且快速和易于使用的项目管理工具,可以看看他们!<br/><br/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center" style="text-align: center">
|
<p align="center" style="text-align: center">
|
||||||
特别感谢JetBrains向我们捐赠许可!<br/><br/>
|
特别感谢 JetBrains 向我们捐赠许可!<br/><br/>
|
||||||
请点击logo让他们知道你的感激之情!<br/><br/>
|
请点击 logo 让他们知道你的感激之情!<br/><br/>
|
||||||
<a href="https://www.jetbrains.com?from=Wails"><img src="jetbrains-grayscale.png" width="30%"></a>
|
<a href="https://www.jetbrains.com?from=Wails"><img src="jetbrains-grayscale.png" width="30%"></a>
|
||||||
</p>
|
</p>
|
@ -1,3 +1,4 @@
|
|||||||
|
//go:build linux || darwin || !windows
|
||||||
// +build linux darwin !windows
|
// +build linux darwin !windows
|
||||||
|
|
||||||
package wails
|
package wails
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//go:build windows || !linux || !darwin
|
||||||
// +build windows !linux !darwin
|
// +build windows !linux !darwin
|
||||||
|
|
||||||
package wails
|
package wails
|
||||||
|
@ -73,6 +73,9 @@ const (
|
|||||||
RHEL
|
RHEL
|
||||||
// NixOS distribution
|
// NixOS distribution
|
||||||
NixOS
|
NixOS
|
||||||
|
// Artix linux distribution
|
||||||
|
ArtixLinux
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DistroInfo contains all the information relating to a linux distribution
|
// DistroInfo contains all the information relating to a linux distribution
|
||||||
@ -187,6 +190,8 @@ func parseOsRelease(osRelease string) *DistroInfo {
|
|||||||
result.Distribution = Crux
|
result.Distribution = Crux
|
||||||
case "nixos":
|
case "nixos":
|
||||||
result.Distribution = NixOS
|
result.Distribution = NixOS
|
||||||
|
case "artix":
|
||||||
|
result.Distribution = ArtixLinux
|
||||||
default:
|
default:
|
||||||
result.Distribution = Unknown
|
result.Distribution = Unknown
|
||||||
}
|
}
|
||||||
|
@ -213,6 +213,15 @@ distributions:
|
|||||||
gccversioncommand: *gccdumpversion
|
gccversioncommand: *gccdumpversion
|
||||||
programs: *archdefaultprograms
|
programs: *archdefaultprograms
|
||||||
libraries: *archdefaultlibraries
|
libraries: *archdefaultlibraries
|
||||||
|
artix:
|
||||||
|
id: artix
|
||||||
|
releases:
|
||||||
|
default:
|
||||||
|
version: default
|
||||||
|
name: Artix Linux
|
||||||
|
gccversioncommand: *gccdumpversion
|
||||||
|
programs: *archdefaultprograms
|
||||||
|
libraries: *archdefaultlibraries
|
||||||
ctlos:
|
ctlos:
|
||||||
id: ctlos
|
id: ctlos
|
||||||
releases:
|
releases:
|
||||||
@ -364,4 +373,3 @@ distributions:
|
|||||||
help: Please install with `nix-env -iA nixos.gtk3`
|
help: Please install with `nix-env -iA nixos.gtk3`
|
||||||
- name: webkitgtk
|
- name: webkitgtk
|
||||||
help: Please install with `nix-env -iA nixos.nodePackages.webkitgtk`
|
help: Please install with `nix-env -iA nixos.nodePackages.webkitgtk`
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@ func CheckDependencies(logger *Logger) (bool, error) {
|
|||||||
switch distroInfo.Distribution {
|
switch distroInfo.Distribution {
|
||||||
case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian, PopOS:
|
case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian, PopOS:
|
||||||
libraryChecker = DpkgInstalled
|
libraryChecker = DpkgInstalled
|
||||||
case Arch, ArcoLinux, ArchLabs, Ctlos, Manjaro, ManjaroARM, EndeavourOS:
|
case Arch, ArcoLinux, ArchLabs, Ctlos, Manjaro, ManjaroARM, EndeavourOS, ArtixLinux:
|
||||||
libraryChecker = PacmanInstalled
|
libraryChecker = PacmanInstalled
|
||||||
case CentOS, Fedora, Tumbleweed, Leap, RHEL:
|
case CentOS, Fedora, Tumbleweed, Leap, RHEL:
|
||||||
libraryChecker = RpmInstalled
|
libraryChecker = RpmInstalled
|
||||||
|
@ -2,7 +2,7 @@ import svelte from 'rollup-plugin-svelte';
|
|||||||
import resolve from '@rollup/plugin-node-resolve';
|
import resolve from '@rollup/plugin-node-resolve';
|
||||||
import commonjs from '@rollup/plugin-commonjs';
|
import commonjs from '@rollup/plugin-commonjs';
|
||||||
import livereload from 'rollup-plugin-livereload';
|
import livereload from 'rollup-plugin-livereload';
|
||||||
import { terser } from 'rollup-plugin-terser';
|
import {terser} from 'rollup-plugin-terser';
|
||||||
import image from '@rollup/plugin-image';
|
import image from '@rollup/plugin-image';
|
||||||
import babel from 'rollup-plugin-babel';
|
import babel from 'rollup-plugin-babel';
|
||||||
import polyfill from 'rollup-plugin-polyfill';
|
import polyfill from 'rollup-plugin-polyfill';
|
||||||
|
@ -1,24 +1,29 @@
|
|||||||
# vue-js
|
# vue-js
|
||||||
|
|
||||||
## Project setup
|
## Project setup
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
### Compiles and hot-reloads for development
|
### Compiles and hot-reloads for development
|
||||||
|
|
||||||
```
|
```
|
||||||
npm run serve
|
npm run serve
|
||||||
```
|
```
|
||||||
|
|
||||||
### Compiles and minifies for production
|
### Compiles and minifies for production
|
||||||
|
|
||||||
```
|
```
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
### Lints and fixes files
|
### Lints and fixes files
|
||||||
|
|
||||||
```
|
```
|
||||||
npm run lint
|
npm run lint
|
||||||
```
|
```
|
||||||
|
|
||||||
### Customize configuration
|
### Customize configuration
|
||||||
|
|
||||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
See [Configuration Reference](https://cli.vuejs.org/config/).
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
presets: [
|
presets: [
|
||||||
'@vue/cli-plugin-babel/preset'
|
'@vue/cli-plugin-babel/preset'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="">
|
<html lang="">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta content="IE=edge" http-equiv="X-UA-Compatible">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta content="width=device-width,initial-scale=1.0" name="viewport">
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
<link href="<%= BASE_URL %>favicon.ico" rel="icon">
|
||||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>
|
<noscript>
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
|
||||||
</noscript>
|
Please enable it to continue.</strong>
|
||||||
<div id="app"></div>
|
</noscript>
|
||||||
<!-- built files will be auto injected -->
|
<div id="app"></div>
|
||||||
</body>
|
<!-- built files will be auto injected -->
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { createApp } from 'vue'
|
import {createApp} from 'vue'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
@ -8,7 +8,7 @@ import * as Wails from '@wailsapp/runtime';
|
|||||||
|
|
||||||
Wails.Init(() => {
|
Wails.Init(() => {
|
||||||
createApp(App)
|
createApp(App)
|
||||||
.use(store)
|
.use(store)
|
||||||
.use(router)
|
.use(router)
|
||||||
.mount('#app')
|
.mount('#app')
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { createRouter, createMemoryHistory } from 'vue-router'
|
import {createMemoryHistory, createRouter} from 'vue-router'
|
||||||
import Home from '../views/Home.vue'
|
import Home from '../views/Home.vue'
|
||||||
import About from '../views/About.vue'
|
import About from '../views/About.vue'
|
||||||
|
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
import { createStore } from 'vuex'
|
import {createStore} from 'vuex'
|
||||||
|
|
||||||
export default createStore({
|
export default createStore({
|
||||||
state: {
|
state: {},
|
||||||
},
|
mutations: {},
|
||||||
mutations: {
|
actions: {},
|
||||||
},
|
modules: {}
|
||||||
actions: {
|
|
||||||
},
|
|
||||||
modules: {
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
@ -1,42 +1,42 @@
|
|||||||
let cssConfig = {};
|
let cssConfig = {};
|
||||||
|
|
||||||
if (process.env.NODE_ENV == 'production') {
|
if (process.env.NODE_ENV == 'production') {
|
||||||
cssConfig = {
|
cssConfig = {
|
||||||
extract: {
|
extract: {
|
||||||
filename: '[name].css',
|
filename: '[name].css',
|
||||||
chunkFilename: '[name].css'
|
chunkFilename: '[name].css'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
chainWebpack: config => {
|
chainWebpack: config => {
|
||||||
let limit = 9999999999999999;
|
let limit = 9999999999999999;
|
||||||
config.module
|
config.module
|
||||||
.rule('images')
|
.rule('images')
|
||||||
.test(/\.(png|gif|jpg)(\?.*)?$/i)
|
.test(/\.(png|gif|jpg)(\?.*)?$/i)
|
||||||
.use('url-loader')
|
.use('url-loader')
|
||||||
.loader('url-loader')
|
.loader('url-loader')
|
||||||
.tap(options => Object.assign(options, { limit: limit }));
|
.tap(options => Object.assign(options, {limit: limit}));
|
||||||
config.module
|
config.module
|
||||||
.rule('fonts')
|
.rule('fonts')
|
||||||
.test(/\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/i)
|
.test(/\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/i)
|
||||||
.use('url-loader')
|
.use('url-loader')
|
||||||
.loader('url-loader')
|
.loader('url-loader')
|
||||||
.options({
|
.options({
|
||||||
limit: limit
|
limit: limit
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
css: cssConfig,
|
css: cssConfig,
|
||||||
configureWebpack: {
|
configureWebpack: {
|
||||||
output: {
|
output: {
|
||||||
filename: '[name].js'
|
filename: '[name].js'
|
||||||
},
|
},
|
||||||
optimization: {
|
optimization: {
|
||||||
splitChunks: false
|
splitChunks: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
devServer: {
|
devServer: {
|
||||||
disableHostCheck: true
|
disableHostCheck: true
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -11,5 +11,8 @@
|
|||||||
"serve": "npm run serve",
|
"serve": "npm run serve",
|
||||||
"bridge": "src",
|
"bridge": "src",
|
||||||
"wailsdir": "",
|
"wailsdir": "",
|
||||||
"platforms": ["linux", "darwin"]
|
"platforms": [
|
||||||
|
"linux",
|
||||||
|
"darwin"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//go:build dev
|
||||||
// +build dev
|
// +build dev
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//go:build dev
|
||||||
// +build dev
|
// +build dev
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//go:build windows
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package cmd
|
package cmd
|
||||||
|
7
go.mod
7
go.mod
@ -5,7 +5,7 @@ require (
|
|||||||
github.com/abadojack/whatlanggo v1.0.1
|
github.com/abadojack/whatlanggo v1.0.1
|
||||||
github.com/fatih/color v1.7.0
|
github.com/fatih/color v1.7.0
|
||||||
github.com/go-playground/colors v1.2.0
|
github.com/go-playground/colors v1.2.0
|
||||||
github.com/gorilla/websocket v1.4.0
|
github.com/gorilla/websocket v1.4.1
|
||||||
github.com/jackmordaunt/icns v1.0.0
|
github.com/jackmordaunt/icns v1.0.0
|
||||||
github.com/kennygrant/sanitize v1.2.4
|
github.com/kennygrant/sanitize v1.2.4
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||||
@ -16,12 +16,13 @@ require (
|
|||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
|
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
|
||||||
github.com/pkg/errors v0.8.1 // indirect
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
github.com/sirupsen/logrus v1.4.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
|
github.com/stretchr/objx v0.1.1 // indirect
|
||||||
github.com/stretchr/testify v1.3.0 // indirect
|
github.com/stretchr/testify v1.3.0 // indirect
|
||||||
github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba
|
github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba
|
||||||
golang.org/x/image v0.0.0-20200430140353-33d19683fad8
|
golang.org/x/image v0.0.0-20200430140353-33d19683fad8
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359
|
||||||
golang.org/x/text v0.3.0
|
golang.org/x/text v0.3.0
|
||||||
gopkg.in/AlecAivazis/survey.v1 v1.8.4
|
gopkg.in/AlecAivazis/survey.v1 v1.8.4
|
||||||
gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22
|
gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22
|
||||||
|
12
go.sum
12
go.sum
@ -11,8 +11,8 @@ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
|||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/go-playground/colors v1.2.0 h1:0EdjTXKrr2g1L/LQTYtIqabeHpZuGZz1U4osS1T8+5M=
|
github.com/go-playground/colors v1.2.0 h1:0EdjTXKrr2g1L/LQTYtIqabeHpZuGZz1U4osS1T8+5M=
|
||||||
github.com/go-playground/colors v1.2.0/go.mod h1:miw1R2JIE19cclPxsXqNdzLZsk4DP4iF+m88bRc7kfM=
|
github.com/go-playground/colors v1.2.0/go.mod h1:miw1R2JIE19cclPxsXqNdzLZsk4DP4iF+m88bRc7kfM=
|
||||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ=
|
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ=
|
||||||
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
|
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
|
||||||
github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ=
|
github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ=
|
||||||
@ -54,6 +54,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
@ -76,8 +78,12 @@ golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c h1:UIcGWL6/wpCfyGuJnRFJRurA+yj8RrW7Q6x2YMCXt6c=
|
||||||
|
golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
||||||
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
gopkg.in/AlecAivazis/survey.v1 v1.8.4 h1:10xXXN3wgIhPheb5NI58zFgZv32Ana7P3Tl4shW+0Qc=
|
gopkg.in/AlecAivazis/survey.v1 v1.8.4 h1:10xXXN3wgIhPheb5NI58zFgZv32Ana7P3Tl4shW+0Qc=
|
||||||
|
@ -24,12 +24,12 @@ import (
|
|||||||
var UseFirebug = ""
|
var UseFirebug = ""
|
||||||
|
|
||||||
type WebView struct {
|
type WebView struct {
|
||||||
window wv.WebView // The webview object
|
window wv.WebView // The webview object
|
||||||
ipc interfaces.IPCManager
|
ipc interfaces.IPCManager
|
||||||
log *logger.CustomLogger
|
log *logger.CustomLogger
|
||||||
config interfaces.AppConfig
|
config interfaces.AppConfig
|
||||||
eventManager interfaces.EventManager
|
eventManager interfaces.EventManager
|
||||||
bindingCache []string
|
bindingCache []string
|
||||||
maximumSizeSet bool
|
maximumSizeSet bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
"browser": true,
|
"browser": true,
|
||||||
"es6": true,
|
"es6": true,
|
||||||
"amd": true,
|
"amd": true,
|
||||||
"node": true,
|
"node": true
|
||||||
},
|
},
|
||||||
"extends": "eslint:recommended",
|
"extends": "eslint:recommended",
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"ecmaVersion": 2016,
|
"ecmaVersion": 2016,
|
||||||
"sourceType": "module",
|
"sourceType": "module"
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"indent": [
|
"indent": [
|
||||||
|
@ -26,7 +26,7 @@ export function OpenURL(url) {
|
|||||||
* Opens the given filename using the system's default file handler
|
* Opens the given filename using the system's default file handler
|
||||||
*
|
*
|
||||||
* @export
|
* @export
|
||||||
* @param {sting} filename
|
* @param {string} filename
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export function OpenFile(filename) {
|
export function OpenFile(filename) {
|
||||||
|
@ -62,7 +62,7 @@ if (window.crypto) {
|
|||||||
export function Call(bindingName, data, timeout) {
|
export function Call(bindingName, data, timeout) {
|
||||||
|
|
||||||
// Timeout infinite by default
|
// Timeout infinite by default
|
||||||
if (timeout == null || timeout == undefined) {
|
if (timeout == null) {
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ function Invoke(message) {
|
|||||||
*
|
*
|
||||||
* @export
|
* @export
|
||||||
* @param {string} type
|
* @param {string} type
|
||||||
* @param {string} payload
|
* @param {Object} payload
|
||||||
* @param {string=} callbackID
|
* @param {string=} callbackID
|
||||||
*/
|
*/
|
||||||
export function SendMessage(type, payload, callbackID) {
|
export function SendMessage(type, payload, callbackID) {
|
||||||
|
@ -10,11 +10,11 @@ The lightweight framework for web-like apps
|
|||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
import * as Log from './log';
|
import * as Log from './log';
|
||||||
import * as Browser from './browser';
|
import * as Browser from './browser';
|
||||||
import { On, OnMultiple, Emit, Notify, Heartbeat, Acknowledge } from './events';
|
import {Acknowledge, Emit, Heartbeat, Notify, On, OnMultiple} from './events';
|
||||||
import { NewBinding } from './bindings';
|
import {NewBinding} from './bindings';
|
||||||
import { Callback } from './calls';
|
import {Callback} from './calls';
|
||||||
import { AddScript, InjectCSS, InjectFirebug } from './utils';
|
import {AddScript, InjectCSS, InjectFirebug} from './utils';
|
||||||
import { AddIPCListener } from './ipc';
|
import {AddIPCListener} from './ipc';
|
||||||
import * as Store from './store';
|
import * as Store from './store';
|
||||||
|
|
||||||
// Initialise global if not already
|
// Initialise global if not already
|
||||||
@ -29,7 +29,7 @@ window.backend = {};
|
|||||||
// so we have to use an explicit if statement to prevent webpack from optimizing the code.
|
// so we have to use an explicit if statement to prevent webpack from optimizing the code.
|
||||||
if (window.external == undefined) {
|
if (window.external == undefined) {
|
||||||
window.external = {
|
window.external = {
|
||||||
invoke: function(x) {
|
invoke: function (x) {
|
||||||
window.webkit.messageHandlers.external.postMessage(x);
|
window.webkit.messageHandlers.external.postMessage(x);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -75,7 +75,7 @@ window.onerror = function (msg, url, lineNo, columnNo, error) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Use firebug?
|
// Use firebug?
|
||||||
if( window.usefirebug ) {
|
if (window.usefirebug) {
|
||||||
InjectFirebug();
|
InjectFirebug();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
bridge.js
|
index.js
|
6
runtime/js/runtime/package-lock.json
generated
6
runtime/js/runtime/package-lock.json
generated
@ -260,9 +260,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"path-parse": {
|
"path-parse": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
|
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"path-type": {
|
"path-type": {
|
||||||
|
BIN
sponsors/bronze sponsor.png
Normal file
BIN
sponsors/bronze sponsor.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
40
v2/NOTES.md
Normal file
40
v2/NOTES.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
# Packing linux
|
||||||
|
|
||||||
|
* create app, app.desktop, app.png (512x512)
|
||||||
|
* chmod +x app!
|
||||||
|
* ./linuxdeploy-x86_64.AppImage --appdir AppDir -i react.png -d react.desktop -e react --output appimage
|
||||||
|
|
||||||
|
|
||||||
|
# Wails Doctor
|
||||||
|
|
||||||
|
Tested on:
|
||||||
|
|
||||||
|
* Debian 8
|
||||||
|
* Ubuntu 20.04
|
||||||
|
* Ubuntu 19.10
|
||||||
|
* Solus 4.1
|
||||||
|
* Centos 8
|
||||||
|
* Gentoo
|
||||||
|
* OpenSUSE/leap
|
||||||
|
* Fedora 31
|
||||||
|
|
||||||
|
### Development
|
||||||
|
|
||||||
|
Add a new package manager processor here: `v2/internal/system/packagemanager/`. IsAvailable should work even if the package is installed.
|
||||||
|
Add your new package manager to the list of package managers in `v2/internal/system/packagemanager/packagemanager.go`:
|
||||||
|
|
||||||
|
```
|
||||||
|
var db = map[string]PackageManager{
|
||||||
|
"eopkg": NewEopkg(),
|
||||||
|
"apt": NewApt(),
|
||||||
|
"yum": NewYum(),
|
||||||
|
"pacman": NewPacman(),
|
||||||
|
"emerge": NewEmerge(),
|
||||||
|
"zypper": NewZypper(),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gentoo
|
||||||
|
|
||||||
|
* Setup docker image using: emerge-webrsync -x -v
|
6
v2/README.md
Normal file
6
v2/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Wails v2 ALPHA
|
||||||
|
|
||||||
|
This branch contains WORK IN PROGRESS! There are no guarantees. Use at your peril!
|
||||||
|
|
||||||
|
This document will be updated as progress is made.
|
||||||
|
|
48
v2/cmd/wails/internal/commands/build/README.md
Normal file
48
v2/cmd/wails/internal/commands/build/README.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# Build
|
||||||
|
|
||||||
|
The build command processes the Wails project and generates an application binary.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`wails build <flags>`
|
||||||
|
|
||||||
|
### Flags
|
||||||
|
|
||||||
|
| Flag | Details | Default |
|
||||||
|
| :------------- | :----------- | :------ |
|
||||||
|
| -clean | Clean the bin directory before building | |
|
||||||
|
| -compiler path/to/compiler | Use a different go compiler, eg go1.15beta1 | go |
|
||||||
|
| -ldflags "custom ld flags" | Use given ldflags | |
|
||||||
|
| -o path/to/binary | Compile to given path/filename | |
|
||||||
|
| -k | Keep generated assets | |
|
||||||
|
| -package | Create a platform specific package | |
|
||||||
|
| -production | Compile in production mode: -ldflags="-w -s" + "-h windows" on Windows | |
|
||||||
|
| -tags | Build tags to pass to Go compiler (quoted and space separated) | |
|
||||||
|
| -upx | Compress final binary with UPX (if installed) | |
|
||||||
|
| -upxflags "custom flags" | Flags to pass to upx | |
|
||||||
|
| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 |
|
||||||
|
| -delve | If true, runs delve on the compiled binary | false |
|
||||||
|
|
||||||
|
## The Build Process
|
||||||
|
|
||||||
|
The build process is as follows:
|
||||||
|
|
||||||
|
- The flags are processed, and an Options struct built containing the build context.
|
||||||
|
- The type of target is determined, and a custom build process is followed for target.
|
||||||
|
|
||||||
|
### Desktop Target
|
||||||
|
|
||||||
|
- The frontend dependencies are installed. The command is read from the project file `wails.json` under the key `frontend:install` and executed in the `frontend` directory. If this is not defined, it is ignored.
|
||||||
|
- The frontend is then built. This command is read from the project file `wails.json` under the key `frontend:install` and executed in the `frontend` directory. If this is not defined, it is ignored.
|
||||||
|
- The project directory is checked to see if the `build` directory exists. If not, it is created and default project assets are copied to it.
|
||||||
|
- An asset bundle is then created by reading the `html` key from `wails.json` and loading the referenced file. This is then parsed, looking for local Javascript and CSS references. Those files are in turn loaded into memory, converted to C data and saved into the asset bundle located at `build/assets.h`, which also includes the original HTML.
|
||||||
|
- The application icon is then processed: if there is no `build/appicon.png`, a default icon is copied. On Windows, an `app.ico` file is generated from this png. On Mac, `icons.icns` is generated.
|
||||||
|
- If there are icons in the `build/tray` directory, these are processed, converted to C data and saved as `build/trayicons.h`, ready for the compilation step.
|
||||||
|
- If there are icons in the `build/dialog` directory, these are processed, converted to C data and saved as `build/userdialogicons.h`, ready for the compilation step.
|
||||||
|
- If the `-package` flag is given for a Windows target, the Windows assets in the `build/windows` directory are processed: manifest + icons compiled to a `.syso` file (deleted after compilation).
|
||||||
|
- If we are building a universal binary for Mac, the application is compiled for both `arm64` and `amd64`. The `lipo` tool is then executed to create the universal binary.
|
||||||
|
- If we are not building a universal binary for Mac, the application is built using `go build`, using build tags to indicate type of application and build mode (debug/production).
|
||||||
|
- If the `-upx` flag was provided, `upx` is invoked to compress the binary. Custom flags may be provided using the `-upxflags` flag.
|
||||||
|
- If the `package` flag is given for a non Windows target, the application is bundled for the platform. On Mac, this creates a `.app` with the processed icons, the `Info.plist` in `build/darwin` and the compiled binary.
|
||||||
|
|
||||||
|
|
230
v2/cmd/wails/internal/commands/build/build.go
Normal file
230
v2/cmd/wails/internal/commands/build/build.go
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
package build
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"text/tabwriter"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/internal/system"
|
||||||
|
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/leaanthony/slicer"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/commands/build"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddBuildSubcommand adds the `build` command for the Wails application
|
||||||
|
func AddBuildSubcommand(app *clir.Cli, w io.Writer) {
|
||||||
|
|
||||||
|
outputType := "desktop"
|
||||||
|
|
||||||
|
validTargetTypes := slicer.String([]string{"desktop", "hybrid", "server"})
|
||||||
|
|
||||||
|
command := app.NewSubCommand("build", "Builds the application")
|
||||||
|
|
||||||
|
// Setup noPackage flag
|
||||||
|
noPackage := false
|
||||||
|
command.BoolFlag("noPackage", "Skips platform specific packaging", &noPackage)
|
||||||
|
|
||||||
|
compilerCommand := "go"
|
||||||
|
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &compilerCommand)
|
||||||
|
|
||||||
|
compress := false
|
||||||
|
command.BoolFlag("upx", "Compress final binary with UPX (if installed)", &compress)
|
||||||
|
|
||||||
|
compressFlags := ""
|
||||||
|
command.StringFlag("upxflags", "Flags to pass to upx", &compressFlags)
|
||||||
|
|
||||||
|
// Setup Platform flag
|
||||||
|
platform := runtime.GOOS
|
||||||
|
//command.StringFlag("platform", "Platform to target", &platform)
|
||||||
|
|
||||||
|
// Verbosity
|
||||||
|
verbosity := 1
|
||||||
|
command.IntFlag("v", "Verbosity level (0 - silent, 1 - default, 2 - verbose)", &verbosity)
|
||||||
|
|
||||||
|
// ldflags to pass to `go`
|
||||||
|
ldflags := ""
|
||||||
|
command.StringFlag("ldflags", "optional ldflags", &ldflags)
|
||||||
|
|
||||||
|
// tags to pass to `go`
|
||||||
|
tags := ""
|
||||||
|
command.StringFlag("tags", "tags to pass to Go compiler (quoted and space separated)", &tags)
|
||||||
|
|
||||||
|
outputFilename := ""
|
||||||
|
command.StringFlag("o", "Output filename", &outputFilename)
|
||||||
|
|
||||||
|
// Clean build directory
|
||||||
|
cleanBuildDirectory := false
|
||||||
|
command.BoolFlag("clean", "Clean the build directory before building", &cleanBuildDirectory)
|
||||||
|
|
||||||
|
webview2 := "download"
|
||||||
|
command.StringFlag("webview2", "WebView2 installer strategy: download,embed,browser,error.", &webview2)
|
||||||
|
|
||||||
|
skipFrontend := false
|
||||||
|
command.BoolFlag("s", "Skips building the frontend", &skipFrontend)
|
||||||
|
|
||||||
|
forceBuild := false
|
||||||
|
command.BoolFlag("f", "Force build application", &forceBuild)
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
|
||||||
|
quiet := verbosity == 0
|
||||||
|
|
||||||
|
// Create logger
|
||||||
|
logger := clilogger.New(w)
|
||||||
|
logger.Mute(quiet)
|
||||||
|
|
||||||
|
// Validate output type
|
||||||
|
if !validTargetTypes.Contains(outputType) {
|
||||||
|
return fmt.Errorf("output type '%s' is not valid", outputType)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !quiet {
|
||||||
|
app.PrintBanner()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check platform
|
||||||
|
validPlatformArch := slicer.String([]string{
|
||||||
|
"darwin",
|
||||||
|
"darwin/amd64",
|
||||||
|
"darwin/arm64",
|
||||||
|
"darwin/universal",
|
||||||
|
"linux",
|
||||||
|
//"linux/amd64",
|
||||||
|
//"linux/arm-7",
|
||||||
|
"windows",
|
||||||
|
"windows/amd64",
|
||||||
|
})
|
||||||
|
if !validPlatformArch.Contains(platform) {
|
||||||
|
return fmt.Errorf("platform %s is not supported", platform)
|
||||||
|
}
|
||||||
|
|
||||||
|
if compress && platform == "darwin/universal" {
|
||||||
|
logger.Println("Warning: compress flag unsupported for universal binaries. Ignoring.")
|
||||||
|
compress = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookup compiler path
|
||||||
|
compilerPath, err := exec.LookPath(compilerCommand)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to find compiler: %s", compilerCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
experimental := false
|
||||||
|
userTags := []string{}
|
||||||
|
for _, tag := range strings.Split(tags, " ") {
|
||||||
|
thisTag := strings.TrimSpace(tag)
|
||||||
|
if thisTag != "" {
|
||||||
|
userTags = append(userTags, thisTag)
|
||||||
|
}
|
||||||
|
if thisTag == "exp" {
|
||||||
|
experimental = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if runtime.GOOS == "darwin" && !experimental {
|
||||||
|
return fmt.Errorf("MacOS version coming soon!")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Webview2 installer strategy (download by default)
|
||||||
|
wv2rtstrategy := ""
|
||||||
|
webview2 = strings.ToLower(webview2)
|
||||||
|
if webview2 != "" {
|
||||||
|
validWV2Runtime := slicer.String([]string{"download", "embed", "browser", "error"})
|
||||||
|
if !validWV2Runtime.Contains(webview2) {
|
||||||
|
return fmt.Errorf("invalid option for flag 'webview2': %s", webview2)
|
||||||
|
}
|
||||||
|
// These are the build tags associated with the strategies
|
||||||
|
switch webview2 {
|
||||||
|
case "embed":
|
||||||
|
wv2rtstrategy = "wv2runtime.embed"
|
||||||
|
case "error":
|
||||||
|
wv2rtstrategy = "wv2runtime.error"
|
||||||
|
case "browser":
|
||||||
|
wv2rtstrategy = "wv2runtime.browser"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create BuildOptions
|
||||||
|
buildOptions := &build.Options{
|
||||||
|
Logger: logger,
|
||||||
|
OutputType: outputType,
|
||||||
|
OutputFile: outputFilename,
|
||||||
|
CleanBuildDirectory: cleanBuildDirectory,
|
||||||
|
Mode: build.Production,
|
||||||
|
Pack: !noPackage,
|
||||||
|
LDFlags: ldflags,
|
||||||
|
Compiler: compilerCommand,
|
||||||
|
Verbosity: verbosity,
|
||||||
|
ForceBuild: forceBuild,
|
||||||
|
IgnoreFrontend: skipFrontend,
|
||||||
|
Compress: compress,
|
||||||
|
CompressFlags: compressFlags,
|
||||||
|
UserTags: userTags,
|
||||||
|
WebView2Strategy: wv2rtstrategy,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate platform and arch
|
||||||
|
platformSplit := strings.Split(platform, "/")
|
||||||
|
buildOptions.Platform = platformSplit[0]
|
||||||
|
if system.IsAppleSilicon {
|
||||||
|
buildOptions.Arch = "arm64"
|
||||||
|
} else {
|
||||||
|
buildOptions.Arch = runtime.GOARCH
|
||||||
|
}
|
||||||
|
if len(platformSplit) == 2 {
|
||||||
|
buildOptions.Arch = platformSplit[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start a new tabwriter
|
||||||
|
w := new(tabwriter.Writer)
|
||||||
|
w.Init(os.Stdout, 8, 8, 0, '\t', 0)
|
||||||
|
|
||||||
|
// Write out the system information
|
||||||
|
fmt.Fprintf(w, "\n")
|
||||||
|
fmt.Fprintf(w, "App Type: \t%s\n", buildOptions.OutputType)
|
||||||
|
fmt.Fprintf(w, "Platform: \t%s\n", buildOptions.Platform)
|
||||||
|
fmt.Fprintf(w, "Arch: \t%s\n", buildOptions.Arch)
|
||||||
|
fmt.Fprintf(w, "Compiler: \t%s\n", compilerPath)
|
||||||
|
fmt.Fprintf(w, "Skip Frontend: \t%t\n", skipFrontend)
|
||||||
|
fmt.Fprintf(w, "Compress: \t%t\n", buildOptions.Compress)
|
||||||
|
fmt.Fprintf(w, "Package: \t%t\n", buildOptions.Pack)
|
||||||
|
fmt.Fprintf(w, "Clean Build Dir: \t%t\n", buildOptions.CleanBuildDirectory)
|
||||||
|
fmt.Fprintf(w, "LDFlags: \t\"%s\"\n", buildOptions.LDFlags)
|
||||||
|
fmt.Fprintf(w, "Tags: \t[%s]\n", strings.Join(buildOptions.UserTags, ","))
|
||||||
|
if len(buildOptions.OutputFile) > 0 {
|
||||||
|
fmt.Fprintf(w, "Output File: \t%s\n", buildOptions.OutputFile)
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "\n")
|
||||||
|
w.Flush()
|
||||||
|
|
||||||
|
return doBuild(buildOptions)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// doBuild is our main build command
|
||||||
|
func doBuild(buildOptions *build.Options) error {
|
||||||
|
|
||||||
|
// Start Time
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
outputFilename, err := build.Build(buildOptions)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output stats
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
buildOptions.Logger.Println("")
|
||||||
|
buildOptions.Logger.Println(fmt.Sprintf("Built '%s' in %s.", outputFilename, elapsed.Round(time.Millisecond).String()))
|
||||||
|
buildOptions.Logger.Println("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
22
v2/cmd/wails/internal/commands/dev/README.md
Normal file
22
v2/cmd/wails/internal/commands/dev/README.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Dev
|
||||||
|
|
||||||
|
The dev command allows you to develop your application through a standard browser.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`wails dev <flags>`
|
||||||
|
|
||||||
|
### Flags
|
||||||
|
|
||||||
|
| Flag | Details | Default |
|
||||||
|
| :------------- | :----------- | :------ |
|
||||||
|
| -compiler path/to/compiler | Use a different go compiler, eg go1.15beta1 | go |
|
||||||
|
| -ldflags "custom ld flags" | Use given ldflags | |
|
||||||
|
| -e list,of,extensions | File extensions to trigger rebuilds | go |
|
||||||
|
| -w | Show warnings | false |
|
||||||
|
| -v int | Verbosity level (0 - silent, 1 - default, 2 - verbose) | 1 |
|
||||||
|
| -loglevel | Loglevel to pass to the application - Trace, Debug, Info, Warning, Error | Debug |
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
The project is built using a special mode that starts a webserver and starts listening to port 34115. When the frontend project is run independently, so long as the JS is wrapped with the runtime method `ready`, then the frontend will connect to the backend code via websockets. The interface should be present in your browser, and you should be able to interact with the backend as you would in a desktop app.
|
576
v2/cmd/wails/internal/commands/dev/dev.go
Normal file
576
v2/cmd/wails/internal/commands/dev/dev.go
Normal file
@ -0,0 +1,576 @@
|
|||||||
|
package dev
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/cmd/wails/internal"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/gomod"
|
||||||
|
|
||||||
|
"github.com/leaanthony/slicer"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/project"
|
||||||
|
|
||||||
|
"github.com/pkg/browser"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/colour"
|
||||||
|
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/fs"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/process"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/commands/build"
|
||||||
|
)
|
||||||
|
|
||||||
|
const defaultDevServerURL = "http://localhost:34115"
|
||||||
|
|
||||||
|
func LogGreen(message string, args ...interface{}) {
|
||||||
|
text := fmt.Sprintf(message, args...)
|
||||||
|
println(colour.Green(text))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LogRed(message string, args ...interface{}) {
|
||||||
|
text := fmt.Sprintf(message, args...)
|
||||||
|
println(colour.Red(text))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LogDarkYellow(message string, args ...interface{}) {
|
||||||
|
text := fmt.Sprintf(message, args...)
|
||||||
|
println(colour.DarkYellow(text))
|
||||||
|
}
|
||||||
|
|
||||||
|
func sliceToMap(input []string) map[string]struct{} {
|
||||||
|
result := map[string]struct{}{}
|
||||||
|
for _, value := range input {
|
||||||
|
result[value] = struct{}{}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
type devFlags struct {
|
||||||
|
ldflags string
|
||||||
|
compilerCommand string
|
||||||
|
assetDir string
|
||||||
|
extensions string
|
||||||
|
openBrowser bool
|
||||||
|
noReload bool
|
||||||
|
wailsjsdir string
|
||||||
|
tags string
|
||||||
|
verbosity int
|
||||||
|
loglevel string
|
||||||
|
forceBuild bool
|
||||||
|
debounceMS int
|
||||||
|
devServerURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddSubcommand adds the `dev` command for the Wails application
|
||||||
|
func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
||||||
|
|
||||||
|
command := app.NewSubCommand("dev", "Development mode")
|
||||||
|
|
||||||
|
flags := defaultDevFlags()
|
||||||
|
command.StringFlag("ldflags", "optional ldflags", &flags.ldflags)
|
||||||
|
command.StringFlag("compiler", "Use a different go compiler to build, eg go1.15beta1", &flags.compilerCommand)
|
||||||
|
command.StringFlag("assetdir", "Serve assets from the given directory", &flags.assetDir)
|
||||||
|
command.StringFlag("e", "Extensions to trigger rebuilds (comma separated) eg go", &flags.extensions)
|
||||||
|
command.BoolFlag("browser", "Open application in browser", &flags.openBrowser)
|
||||||
|
command.BoolFlag("noreload", "Disable reload on asset change", &flags.noReload)
|
||||||
|
command.StringFlag("wailsjsdir", "Directory to generate the Wails JS modules", &flags.wailsjsdir)
|
||||||
|
command.StringFlag("tags", "tags to pass to Go compiler (quoted and space separated)", &flags.tags)
|
||||||
|
command.IntFlag("v", "Verbosity level (0 - silent, 1 - standard, 2 - verbose)", &flags.verbosity)
|
||||||
|
command.StringFlag("loglevel", "Loglevel to use - Trace, Debug, Info, Warning, Error", &flags.loglevel)
|
||||||
|
command.BoolFlag("f", "Force build application", &flags.forceBuild)
|
||||||
|
command.IntFlag("debounce", "The amount of time to wait to trigger a reload on change", &flags.debounceMS)
|
||||||
|
command.StringFlag("devserverurl", "The url of the dev server to use", &flags.devServerURL)
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
// Create logger
|
||||||
|
logger := clilogger.New(w)
|
||||||
|
app.PrintBanner()
|
||||||
|
|
||||||
|
experimental := false
|
||||||
|
userTags := []string{}
|
||||||
|
for _, tag := range strings.Split(flags.tags, " ") {
|
||||||
|
thisTag := strings.TrimSpace(tag)
|
||||||
|
if thisTag != "" {
|
||||||
|
userTags = append(userTags, thisTag)
|
||||||
|
}
|
||||||
|
if thisTag == "exp" {
|
||||||
|
experimental = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if runtime.GOOS == "darwin" && !experimental {
|
||||||
|
return fmt.Errorf("MacOS version coming soon!")
|
||||||
|
}
|
||||||
|
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
projectConfig, err := loadAndMergeProjectConfig(cwd, &flags)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update go.mod to use current wails version
|
||||||
|
err = syncGoModVersion(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run go mod tidy to ensure we're up to date
|
||||||
|
err = runCommand(cwd, false, "go", "mod", "tidy")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.tags != "" {
|
||||||
|
err = runCommand(cwd, true, "wails", "generate", "module", "-tags", flags.tags)
|
||||||
|
} else {
|
||||||
|
err = runCommand(cwd, true, "wails", "generate", "module")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// frontend:dev server command
|
||||||
|
if projectConfig.DevCommand != "" {
|
||||||
|
var devCommandWaitGroup sync.WaitGroup
|
||||||
|
closer := runFrontendDevCommand(cwd, projectConfig.DevCommand, &devCommandWaitGroup)
|
||||||
|
defer closer(&devCommandWaitGroup)
|
||||||
|
}
|
||||||
|
|
||||||
|
buildOptions := generateBuildOptions(flags)
|
||||||
|
buildOptions.Logger = logger
|
||||||
|
buildOptions.UserTags = internal.ParseUserTags(flags.tags)
|
||||||
|
|
||||||
|
var debugBinaryProcess *process.Process = nil
|
||||||
|
|
||||||
|
// Setup signal handler
|
||||||
|
quitChannel := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(quitChannel, os.Interrupt, os.Kill, syscall.SIGTERM)
|
||||||
|
exitCodeChannel := make(chan int, 1)
|
||||||
|
|
||||||
|
// Do initial build
|
||||||
|
logger.Println("Building application for development...")
|
||||||
|
newProcess, appBinary, err := restartApp(buildOptions, debugBinaryProcess, flags, exitCodeChannel)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if newProcess != nil {
|
||||||
|
debugBinaryProcess = newProcess
|
||||||
|
}
|
||||||
|
|
||||||
|
// open browser
|
||||||
|
if flags.openBrowser {
|
||||||
|
url := defaultDevServerURL
|
||||||
|
if flags.devServerURL != "" {
|
||||||
|
url = flags.devServerURL
|
||||||
|
}
|
||||||
|
err = browser.OpenURL(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the project files watcher
|
||||||
|
watcher, err := initialiseWatcher(cwd, logger.Fatal)
|
||||||
|
defer func(watcher *fsnotify.Watcher) {
|
||||||
|
err := watcher.Close()
|
||||||
|
if err != nil {
|
||||||
|
logger.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
}(watcher)
|
||||||
|
|
||||||
|
LogGreen("Watching (sub)/directory: %s", cwd)
|
||||||
|
LogGreen("Using Dev Server URL: %s", flags.devServerURL)
|
||||||
|
LogGreen("Using reload debounce setting of %d milliseconds", flags.debounceMS)
|
||||||
|
|
||||||
|
// Watch for changes and trigger restartApp()
|
||||||
|
doWatcherLoop(buildOptions, debugBinaryProcess, flags, watcher, exitCodeChannel, quitChannel)
|
||||||
|
|
||||||
|
// Kill the current program if running
|
||||||
|
if debugBinaryProcess != nil {
|
||||||
|
err := debugBinaryProcess.Kill()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove dev binary
|
||||||
|
err = os.Remove(appBinary)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
LogGreen("Development mode exited")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func syncGoModVersion(cwd string) error {
|
||||||
|
gomodFilename := filepath.Join(cwd, "go.mod")
|
||||||
|
gomodData, err := os.ReadFile(gomodFilename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
outOfSync, err := gomod.GoModOutOfSync(gomodData, internal.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !outOfSync {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
LogGreen("Updating go.mod to use Wails '%s'", internal.Version)
|
||||||
|
newGoData, err := gomod.UpdateGoModVersion(gomodData, internal.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return os.WriteFile(gomodFilename, newGoData, 0755)
|
||||||
|
}
|
||||||
|
|
||||||
|
func runCommand(dir string, exitOnError bool, command string, args ...string) error {
|
||||||
|
LogGreen("Executing: " + command + " " + strings.Join(args, " "))
|
||||||
|
cmd := exec.Command(command, args...)
|
||||||
|
cmd.Dir = dir
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
println(string(output))
|
||||||
|
if exitOnError {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultDevFlags generates devFlags with default options
|
||||||
|
func defaultDevFlags() devFlags {
|
||||||
|
return devFlags{
|
||||||
|
devServerURL: defaultDevServerURL,
|
||||||
|
compilerCommand: "go",
|
||||||
|
verbosity: 1,
|
||||||
|
extensions: "go",
|
||||||
|
debounceMS: 100,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generateBuildOptions creates a build.Options using the flags
|
||||||
|
func generateBuildOptions(flags devFlags) *build.Options {
|
||||||
|
result := &build.Options{
|
||||||
|
OutputType: "dev",
|
||||||
|
Mode: build.Dev,
|
||||||
|
Arch: runtime.GOARCH,
|
||||||
|
Pack: false,
|
||||||
|
Platform: runtime.GOOS,
|
||||||
|
LDFlags: flags.ldflags,
|
||||||
|
Compiler: flags.compilerCommand,
|
||||||
|
ForceBuild: flags.forceBuild,
|
||||||
|
IgnoreFrontend: false,
|
||||||
|
Verbosity: flags.verbosity,
|
||||||
|
WailsJSDir: flags.wailsjsdir,
|
||||||
|
}
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "darwin":
|
||||||
|
result.Pack = false
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadAndMergeProjectConfig reconciles flags passed to the CLI with project config settings and updates
|
||||||
|
// the project config if necessary
|
||||||
|
func loadAndMergeProjectConfig(cwd string, flags *devFlags) (*project.Project, error) {
|
||||||
|
projectConfig, err := project.Load(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var shouldSaveConfig bool
|
||||||
|
|
||||||
|
if projectConfig.AssetDirectory == "" && flags.assetDir == "" {
|
||||||
|
return nil, fmt.Errorf("No asset directory provided. Please use -assetdir to indicate which directory contains your built assets.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.assetDir == "" && projectConfig.AssetDirectory != "" {
|
||||||
|
flags.assetDir = projectConfig.AssetDirectory
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.assetDir != projectConfig.AssetDirectory {
|
||||||
|
projectConfig.AssetDirectory = filepath.ToSlash(flags.assetDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
flags.assetDir, err = filepath.Abs(flags.assetDir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.devServerURL == defaultDevServerURL && projectConfig.DevServerURL != defaultDevServerURL && projectConfig.DevServerURL != "" {
|
||||||
|
flags.devServerURL = projectConfig.DevServerURL
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.devServerURL != projectConfig.DevServerURL {
|
||||||
|
projectConfig.DevServerURL = flags.devServerURL
|
||||||
|
shouldSaveConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.wailsjsdir == "" && projectConfig.WailsJSDir != "" {
|
||||||
|
flags.wailsjsdir = projectConfig.WailsJSDir
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.wailsjsdir == "" {
|
||||||
|
flags.wailsjsdir = "./frontend"
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.wailsjsdir != projectConfig.WailsJSDir {
|
||||||
|
projectConfig.WailsJSDir = filepath.ToSlash(flags.wailsjsdir)
|
||||||
|
shouldSaveConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.debounceMS == 100 && projectConfig.DebounceMS != 100 {
|
||||||
|
if projectConfig.DebounceMS == 0 {
|
||||||
|
projectConfig.DebounceMS = 100
|
||||||
|
}
|
||||||
|
flags.debounceMS = projectConfig.DebounceMS
|
||||||
|
}
|
||||||
|
|
||||||
|
if flags.debounceMS != projectConfig.DebounceMS {
|
||||||
|
projectConfig.DebounceMS = flags.debounceMS
|
||||||
|
shouldSaveConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if shouldSaveConfig {
|
||||||
|
err = projectConfig.Save()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return projectConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// runFrontendDevCommand will run the `frontend:dev` command if it was given, ex- `npm run dev`
|
||||||
|
func runFrontendDevCommand(cwd string, devCommand string, wg *sync.WaitGroup) func(group *sync.WaitGroup) {
|
||||||
|
LogGreen("Running frontend dev command: '%s'", devCommand)
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
dir := filepath.Join(cwd, "frontend")
|
||||||
|
cmdSlice := strings.Split(devCommand, " ")
|
||||||
|
wg.Add(1)
|
||||||
|
cmd := exec.CommandContext(ctx, cmdSlice[0], cmdSlice[1:]...)
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Dir = dir
|
||||||
|
go func(ctx context.Context, devCommand string, cwd string, wg *sync.WaitGroup) {
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
if err.Error() != "exit status 1" {
|
||||||
|
LogRed("Error from '%s': %s", devCommand, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogGreen("Dev command exited!")
|
||||||
|
wg.Done()
|
||||||
|
}(ctx, devCommand, cwd, wg)
|
||||||
|
|
||||||
|
return func(wg *sync.WaitGroup) {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
// Credit: https://stackoverflow.com/a/44551450
|
||||||
|
// For whatever reason, killing an npm script on windows just doesn't exit properly with cancel
|
||||||
|
if cmd != nil && cmd.Process != nil {
|
||||||
|
kill := exec.Command("TASKKILL", "/T", "/F", "/PID", strconv.Itoa(cmd.Process.Pid))
|
||||||
|
kill.Stderr = os.Stderr
|
||||||
|
kill.Stdout = os.Stdout
|
||||||
|
err := kill.Run()
|
||||||
|
if err != nil {
|
||||||
|
if err.Error() != "exit status 1" {
|
||||||
|
LogRed("Error from '%s': %s", devCommand, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialiseWatcher creates the project directory watcher that will trigger recompile
|
||||||
|
func initialiseWatcher(cwd string, logFatal func(string, ...interface{})) (*fsnotify.Watcher, error) {
|
||||||
|
watcher, err := fsnotify.NewWatcher()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all subdirectories
|
||||||
|
dirs, err := fs.GetSubdirectories(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup a watcher for non-node_modules directories
|
||||||
|
dirs.Each(func(dir string) {
|
||||||
|
if strings.Contains(dir, "node_modules") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Ignore build directory
|
||||||
|
if strings.HasPrefix(dir, filepath.Join(cwd, "build")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Ignore dot directories
|
||||||
|
if strings.HasPrefix(dir, ".") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = watcher.Add(dir)
|
||||||
|
if err != nil {
|
||||||
|
logFatal(err.Error())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return watcher, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// restartApp does the actual rebuilding of the application when files change
|
||||||
|
func restartApp(buildOptions *build.Options, debugBinaryProcess *process.Process, flags devFlags, exitCodeChannel chan int) (*process.Process, string, error) {
|
||||||
|
|
||||||
|
appBinary, err := build.Build(buildOptions)
|
||||||
|
println()
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Build error - continuing to run current version")
|
||||||
|
LogDarkYellow(err.Error())
|
||||||
|
return nil, "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kill existing binary if need be
|
||||||
|
if debugBinaryProcess != nil {
|
||||||
|
killError := debugBinaryProcess.Kill()
|
||||||
|
|
||||||
|
if killError != nil {
|
||||||
|
buildOptions.Logger.Fatal("Unable to kill debug binary (PID: %d)!", debugBinaryProcess.PID())
|
||||||
|
}
|
||||||
|
|
||||||
|
debugBinaryProcess = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start up new binary with correct args
|
||||||
|
args := slicer.StringSlicer{}
|
||||||
|
args.Add("-loglevel", flags.loglevel)
|
||||||
|
if flags.assetDir != "" {
|
||||||
|
args.Add("-assetdir", flags.assetDir)
|
||||||
|
}
|
||||||
|
if flags.devServerURL != "" {
|
||||||
|
args.Add("-devserverurl", flags.devServerURL)
|
||||||
|
}
|
||||||
|
newProcess := process.NewProcess(appBinary, args.AsSlice()...)
|
||||||
|
err = newProcess.Start(exitCodeChannel)
|
||||||
|
if err != nil {
|
||||||
|
// Remove binary
|
||||||
|
if fs.FileExists(appBinary) {
|
||||||
|
deleteError := fs.DeleteFile(appBinary)
|
||||||
|
if deleteError != nil {
|
||||||
|
buildOptions.Logger.Fatal("Unable to delete app binary: " + appBinary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buildOptions.Logger.Fatal("Unable to start application: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return newProcess, appBinary, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// doWatcherLoop is the main watch loop that runs while dev is active
|
||||||
|
func doWatcherLoop(buildOptions *build.Options, debugBinaryProcess *process.Process, flags devFlags, watcher *fsnotify.Watcher, exitCodeChannel chan int, quitChannel chan os.Signal) {
|
||||||
|
// Main Loop
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
newBinaryProcess *process.Process
|
||||||
|
)
|
||||||
|
var extensionsThatTriggerARebuild = sliceToMap(strings.Split(flags.extensions, ","))
|
||||||
|
quit := false
|
||||||
|
interval := time.Duration(flags.debounceMS) * time.Millisecond
|
||||||
|
timer := time.NewTimer(interval)
|
||||||
|
rebuild := false
|
||||||
|
reload := false
|
||||||
|
for quit == false {
|
||||||
|
//reload := false
|
||||||
|
select {
|
||||||
|
case exitCode := <-exitCodeChannel:
|
||||||
|
if exitCode == 0 {
|
||||||
|
quit = true
|
||||||
|
}
|
||||||
|
case item := <-watcher.Events:
|
||||||
|
// Check for file writes
|
||||||
|
if item.Op&fsnotify.Write == fsnotify.Write {
|
||||||
|
// Ignore directories
|
||||||
|
if fs.DirExists(item.Name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate all file patterns
|
||||||
|
ext := filepath.Ext(item.Name)
|
||||||
|
if ext != "" {
|
||||||
|
ext = ext[1:]
|
||||||
|
if _, exists := extensionsThatTriggerARebuild[ext]; exists {
|
||||||
|
rebuild = true
|
||||||
|
timer.Reset(interval)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(item.Name, flags.assetDir) {
|
||||||
|
reload = true
|
||||||
|
}
|
||||||
|
timer.Reset(interval)
|
||||||
|
}
|
||||||
|
// Check for new directories
|
||||||
|
if item.Op&fsnotify.Create == fsnotify.Create {
|
||||||
|
// If this is a folder, add it to our watch list
|
||||||
|
if fs.DirExists(item.Name) {
|
||||||
|
//node_modules is BANNED!
|
||||||
|
if !strings.Contains(item.Name, "node_modules") {
|
||||||
|
err := watcher.Add(item.Name)
|
||||||
|
if err != nil {
|
||||||
|
buildOptions.Logger.Fatal("%s", err.Error())
|
||||||
|
}
|
||||||
|
LogGreen("Added new directory to watcher: %s", item.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-timer.C:
|
||||||
|
if rebuild {
|
||||||
|
rebuild = false
|
||||||
|
LogGreen("[Rebuild triggered] files updated")
|
||||||
|
// Try and build the app
|
||||||
|
newBinaryProcess, _, err = restartApp(buildOptions, debugBinaryProcess, flags, exitCodeChannel)
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Error during build: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// If we have a new process, save it
|
||||||
|
if newBinaryProcess != nil {
|
||||||
|
debugBinaryProcess = newBinaryProcess
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if reload {
|
||||||
|
reload = false
|
||||||
|
_, err = http.Get("http://localhost:34115/wails/reload")
|
||||||
|
if err != nil {
|
||||||
|
LogRed("Error during refresh: %s", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-quitChannel:
|
||||||
|
LogGreen("\nCaught quit")
|
||||||
|
quit = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
158
v2/cmd/wails/internal/commands/doctor/doctor.go
Normal file
158
v2/cmd/wails/internal/commands/doctor/doctor.go
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
package doctor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"text/tabwriter"
|
||||||
|
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/system"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/system/packagemanager"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddSubcommand adds the `doctor` command for the Wails application
|
||||||
|
func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
||||||
|
|
||||||
|
command := app.NewSubCommand("doctor", "Diagnose your environment")
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
|
||||||
|
logger := clilogger.New(w)
|
||||||
|
|
||||||
|
app.PrintBanner()
|
||||||
|
|
||||||
|
logger.Print("Scanning system - Please wait (this may take a long time)...")
|
||||||
|
|
||||||
|
// Get system info
|
||||||
|
info, err := system.GetInfo()
|
||||||
|
if err != nil {
|
||||||
|
logger.Println("Failed.")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
logger.Println("Done.")
|
||||||
|
|
||||||
|
logger.Println("")
|
||||||
|
|
||||||
|
// Start a new tabwriter
|
||||||
|
w := new(tabwriter.Writer)
|
||||||
|
w.Init(os.Stdout, 8, 8, 0, '\t', 0)
|
||||||
|
|
||||||
|
// Write out the system information
|
||||||
|
fmt.Fprintf(w, "System\n")
|
||||||
|
fmt.Fprintf(w, "------\n")
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "OS:", info.OS.Name)
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "Version: ", info.OS.Version)
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "ID:", info.OS.ID)
|
||||||
|
|
||||||
|
// Output Go Information
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "Go Version:", runtime.Version())
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "Platform:", runtime.GOOS)
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "Architecture:", runtime.GOARCH)
|
||||||
|
|
||||||
|
// Exit early if PM not found
|
||||||
|
if info.PM != nil {
|
||||||
|
fmt.Fprintf(w, "%s\t%s\n", "Package Manager: ", info.PM.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output Dependencies Status
|
||||||
|
var dependenciesMissing = []string{}
|
||||||
|
var externalPackages = []*packagemanager.Dependancy{}
|
||||||
|
var dependenciesAvailableRequired = 0
|
||||||
|
var dependenciesAvailableOptional = 0
|
||||||
|
fmt.Fprintf(w, "\n")
|
||||||
|
fmt.Fprintf(w, "Dependency\tPackage Name\tStatus\tVersion\n")
|
||||||
|
fmt.Fprintf(w, "----------\t------------\t------\t-------\n")
|
||||||
|
|
||||||
|
hasOptionalDependencies := false
|
||||||
|
// Loop over dependencies
|
||||||
|
for _, dependency := range info.Dependencies {
|
||||||
|
|
||||||
|
name := dependency.Name
|
||||||
|
if dependency.Optional {
|
||||||
|
name = "*" + name
|
||||||
|
hasOptionalDependencies = true
|
||||||
|
}
|
||||||
|
packageName := "Unknown"
|
||||||
|
status := "Not Found"
|
||||||
|
|
||||||
|
// If we found the package
|
||||||
|
if dependency.PackageName != "" {
|
||||||
|
|
||||||
|
packageName = dependency.PackageName
|
||||||
|
|
||||||
|
// If it's installed, update the status
|
||||||
|
if dependency.Installed {
|
||||||
|
status = "Installed"
|
||||||
|
} else {
|
||||||
|
// Generate meaningful status text
|
||||||
|
status = "Available"
|
||||||
|
|
||||||
|
if dependency.Optional {
|
||||||
|
dependenciesAvailableOptional++
|
||||||
|
} else {
|
||||||
|
dependenciesAvailableRequired++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if !dependency.Optional {
|
||||||
|
dependenciesMissing = append(dependenciesMissing, dependency.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if dependency.External {
|
||||||
|
externalPackages = append(externalPackages, dependency)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", name, packageName, status, dependency.Version)
|
||||||
|
}
|
||||||
|
if hasOptionalDependencies {
|
||||||
|
fmt.Fprintf(w, "\n")
|
||||||
|
fmt.Fprintf(w, "* - Optional Dependency\n")
|
||||||
|
}
|
||||||
|
w.Flush()
|
||||||
|
logger.Println("")
|
||||||
|
logger.Println("Diagnosis")
|
||||||
|
logger.Println("---------")
|
||||||
|
|
||||||
|
// Generate an appropriate diagnosis
|
||||||
|
|
||||||
|
if len(dependenciesMissing) == 0 && dependenciesAvailableRequired == 0 {
|
||||||
|
logger.Println("Your system is ready for Wails development!")
|
||||||
|
} else {
|
||||||
|
logger.Println("Your system has missing dependencies!\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if dependenciesAvailableRequired != 0 {
|
||||||
|
logger.Println("Required package(s) installation details: \n" + info.Dependencies.InstallAllRequiredCommand())
|
||||||
|
}
|
||||||
|
|
||||||
|
if dependenciesAvailableOptional != 0 {
|
||||||
|
logger.Println("Optional package(s) installation details: \n" + info.Dependencies.InstallAllOptionalCommand())
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//if len(externalPackages) > 0 {
|
||||||
|
// for _, p := range externalPackages {
|
||||||
|
// if p.Optional {
|
||||||
|
// print("[Optional] ")
|
||||||
|
// }
|
||||||
|
// logger.Println("Install " + p.Name + ": " + p.InstallCommand)
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
if len(dependenciesMissing) != 0 {
|
||||||
|
// TODO: Check if apps are available locally and if so, adjust the diagnosis
|
||||||
|
logger.Println("Fatal:")
|
||||||
|
logger.Println("Required dependencies missing: " + strings.Join(dependenciesMissing, " "))
|
||||||
|
logger.Println("Please read this article on how to resolve this: https://wails.app/guides/resolving-missing-packages")
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Println("")
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
18
v2/cmd/wails/internal/commands/generate/README.md
Normal file
18
v2/cmd/wails/internal/commands/generate/README.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generate
|
||||||
|
|
||||||
|
The `generate` command provides the ability to generate various Wails related components.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`wails generate [subcommand] [options]`
|
||||||
|
|
||||||
|
## Template
|
||||||
|
|
||||||
|
`wails generate template -name <name> [-frontend] [-q]`
|
||||||
|
|
||||||
|
Generate a starter template for you to customise.
|
||||||
|
|
||||||
|
| Flag | Details |
|
||||||
|
| :------------- | :----------- |
|
||||||
|
| -frontend | Copies all the files from the current directory into the template's `frontend` directory. Useful for converting frontend projects created by boilerplate generators. |
|
||||||
|
| -q | Suppress output |
|
23
v2/cmd/wails/internal/commands/generate/generate.go
Normal file
23
v2/cmd/wails/internal/commands/generate/generate.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template"
|
||||||
|
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddSubcommand adds the `generate` command for the Wails application
|
||||||
|
func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
||||||
|
|
||||||
|
command := app.NewSubCommand("generate", "Code Generation Tools")
|
||||||
|
|
||||||
|
err := AddModuleCommand(app, command, w)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
template.AddSubCommand(app, command, w)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
58
v2/cmd/wails/internal/commands/generate/module.go
Normal file
58
v2/cmd/wails/internal/commands/generate/module.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/wailsapp/wails/v2/cmd/wails/internal"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/shell"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddModuleCommand adds the `module` subcommand for the `generate` command
|
||||||
|
func AddModuleCommand(app *clir.Cli, parent *clir.Command, w io.Writer) error {
|
||||||
|
|
||||||
|
command := parent.NewSubCommand("module", "Generate wailsjs modules")
|
||||||
|
var tags string
|
||||||
|
command.StringFlag("tags", "tags to pass to Go compiler (quoted and space separated)", &tags)
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
|
||||||
|
filename := "wailsbindings"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
filename += ".exe"
|
||||||
|
}
|
||||||
|
// go build -tags bindings -o bindings.exe
|
||||||
|
tempDir := os.TempDir()
|
||||||
|
filename = filepath.Join(tempDir, filename)
|
||||||
|
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tagList := internal.ParseUserTags(tags)
|
||||||
|
tagList = append(tagList, "bindings")
|
||||||
|
|
||||||
|
stdout, stderr, err := shell.RunCommand(cwd, "go", "build", "-tags", strings.Join(tagList, ","), "-o", filename)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("%s\n%s\n%s", stdout, stderr, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout, stderr, err = shell.RunCommand(cwd, filename)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("%s\n%s\n%s", stdout, stderr, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Remove(filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
# Next Steps
|
||||||
|
|
||||||
|
Congratulations on generating your template!
|
||||||
|
|
||||||
|
## Completing your template
|
||||||
|
|
||||||
|
The next steps to complete the template are:
|
||||||
|
|
||||||
|
1. Complete the fields in the `template.json` file.
|
||||||
|
- It is really important to ensure `helpurl` is valid as this is where users of the template will be directed for help.
|
||||||
|
2. Update `README.md`.
|
||||||
|
3. Edit `wails.json` and ensure all fields are correct, especially:
|
||||||
|
- `assetdir` - path to your assets
|
||||||
|
- `wailsjsdir` - path to generate wailsjs modules
|
||||||
|
- `frontend:install` - The command to install your frontend dependencies
|
||||||
|
- `frontend:build` - The command to build your frontend
|
||||||
|
4. Remove any `public` or `dist` directories.
|
||||||
|
5. Delete this file.
|
||||||
|
|
||||||
|
## Testing your template
|
||||||
|
|
||||||
|
You can test your template by running this command:
|
||||||
|
|
||||||
|
`wails init -n test -t {{.TemplateDir}}`
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
|
||||||
|
Once generated, do the following tests:
|
||||||
|
- Change into the new project directory and run `wails build`. A working binary should be generated in the `build/bin` project directory.
|
||||||
|
- Run `wails dev`. This will compile your app and run it.
|
||||||
|
- You should be able to see your application running on http://localhost:34115/
|
||||||
|
|
||||||
|
## Publishing your template
|
||||||
|
|
||||||
|
You can publish a template to a git repository and use it as follows:
|
||||||
|
|
||||||
|
`wails init -name test -t https://your/git/url`
|
||||||
|
|
||||||
|
EG:
|
||||||
|
|
||||||
|
`wails init -name test -t https://github.com/leaanthony/testtemplate`
|
||||||
|
|
@ -0,0 +1,16 @@
|
|||||||
|
# README
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
About your template
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
To build this project in debug mode, use `wails build`. For production, use `wails build -production`.
|
||||||
|
To generate a platform native package, add the `-package` flag.
|
||||||
|
|
||||||
|
## Live Development
|
||||||
|
|
||||||
|
To run in live development mode, run `wails dev` in the project directory. In another terminal, go into the `frontend`
|
||||||
|
directory and run `npm run dev`. The frontend dev server will run on http://localhost:34115. Connect to this
|
||||||
|
in your browser and connect to your application.
|
@ -0,0 +1,37 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// App struct
|
||||||
|
type App struct {
|
||||||
|
ctx context.Context
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewApp creates a new App application struct
|
||||||
|
func NewApp() *App {
|
||||||
|
return &App{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// startup is called at application startup
|
||||||
|
func (a *App) startup(ctx context.Context) {
|
||||||
|
// Perform your setup here
|
||||||
|
a.ctx = ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
// domReady is called after the front-end dom has been loaded
|
||||||
|
func (a App) domReady(ctx context.Context) {
|
||||||
|
// Add your action here
|
||||||
|
}
|
||||||
|
|
||||||
|
// shutdown is called at application termination
|
||||||
|
func (a *App) shutdown(ctx context.Context) {
|
||||||
|
// Perform your teardown here
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greet returns a greeting for the given name
|
||||||
|
func (a *App) Greet(name string) string {
|
||||||
|
return fmt.Sprintf("Hello %s!", name)
|
||||||
|
}
|
93
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/assets/fonts/OFL.txt
vendored
Normal file
93
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/assets/fonts/OFL.txt
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com),
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
80
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/assets/images/logo-dark.svg
vendored
Normal file
80
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/assets/images/logo-dark.svg
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 551 436" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xml:space="preserve"
|
||||||
|
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,104.01,410.563)">
|
||||||
|
<path d="M0,-51.891L14.429,-51.891L13.043,-21.183L22.568,-51.891L34.226,-51.891L34.084,-21.183L42.365,-51.891L56.794,-51.891L38.526,0L25.198,0L25.34,-32.45L15.211,0L1.919,0L0,-51.891Z"
|
||||||
|
style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,224.985,367.503)">
|
||||||
|
<path d="M0,15.639L5.793,15.639L5.971,-3.589L0,15.639ZM-20.187,33.765L-0.675,-18.126L16.42,-18.126L20.08,33.765L5.437,33.765L5.509,26.123L-3.057,26.123L-5.332,33.765L-20.187,33.765Z"
|
||||||
|
style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.19929,-1.2596,-1.2596,-0.19929,332.323,396.949)">
|
||||||
|
<path d="M-16.046,33.107L36.491,33.107L38.757,18.784L-13.785,18.82L-16.046,33.107Z"
|
||||||
|
style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,353.217,344.388)">
|
||||||
|
<path d="M0,51.891L8.246,0L22.781,0L16.597,39.024L27.224,39.024L25.199,51.891L0,51.891Z"
|
||||||
|
style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,427.939,364.922)">
|
||||||
|
<path d="M0,19.83C1.611,21.181 3.305,22.224 5.083,22.959C6.859,23.693 8.565,24.06 10.2,24.06C11.645,24.06 12.794,23.663 13.647,22.87C14.5,22.076 14.927,20.992 14.927,19.617C14.927,18.434 14.571,17.254 13.861,16.081C13.15,14.908 11.775,13.351 9.738,11.408C7.273,9.015 5.58,6.906 4.655,5.081C3.731,3.257 3.27,1.243 3.27,-0.96C3.27,-5.912 4.839,-9.846 7.979,-12.76C11.118,-15.674 15.377,-17.132 20.756,-17.132C22.936,-17.132 25.008,-16.889 26.975,-16.403C28.941,-15.917 30.943,-15.165 32.982,-14.146L30.92,-1.493C29.356,-2.583 27.834,-3.412 26.354,-3.981C24.872,-4.551 23.457,-4.835 22.106,-4.835C20.898,-4.835 19.943,-4.521 19.245,-3.894C18.546,-3.265 18.196,-2.406 18.196,-1.316C18.196,0.154 19.535,2.215 22.213,4.868C22.544,5.2 22.805,5.46 22.995,5.649C25.696,8.304 27.473,10.578 28.326,12.475C29.179,14.37 29.605,16.56 29.605,19.049C29.605,24.594 27.893,28.965 24.469,32.163C21.046,35.361 16.36,36.962 10.413,36.962C7.877,36.962 5.479,36.66 3.216,36.056C0.953,35.45 -0.948,34.615 -2.488,33.549L0,19.83Z"
|
||||||
|
style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)">
|
||||||
|
<path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)">
|
||||||
|
<path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z"
|
||||||
|
style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)">
|
||||||
|
<path d="M0.44,-0.04L0.44,-0.04L0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z"
|
||||||
|
style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(61.6919,58.8091,58.8091,-61.6919,258.631,180.413)">
|
||||||
|
<path d="M0.5,0L0.5,-0L0.5,0L0.5,0Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)">
|
||||||
|
<path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z"
|
||||||
|
style="fill:url(#_Linear5);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)">
|
||||||
|
<path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" style="fill:url(#_Linear6);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)">
|
||||||
|
<path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.138,0.186L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z"
|
||||||
|
style="fill:url(#_Linear7);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(185.076,176.427,176.427,-185.076,153.446,80.1488)">
|
||||||
|
<path d="M0.735,-0L0.735,-0L0.735,0L0.735,-0Z" style="fill:url(#_Linear8);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,-3.46945e-18,-3.46945e-18,-1,0,-3.05761e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,-1,0,-2.75467e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,-1.11022e-16,-1.11022e-16,-1,0,-2.61861e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,-5.55112e-17,-5.55112e-17,-1,0,-1.57562e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.801899,-0.59746,-0.59746,0.801899,1.3495,0.447457)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,-2.77556e-17,-2.77556e-17,-1,0,-1.92826e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,-1,0,9.68429e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear8" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,-1,0,1.43665e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/>
|
||||||
|
<stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.2 KiB |
18
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/index.html
vendored
Normal file
18
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/index.html
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="/main.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body data-wails-drag>
|
||||||
|
<div class="logo"></div>
|
||||||
|
<div class="result" id="result">Please enter your name below 👇</div>
|
||||||
|
<div class="input-box" id="input" data-wails-no-drag>
|
||||||
|
<input class="input" id="name" type="text" autocomplete="off">
|
||||||
|
<button class="btn" onclick="greet()">Greet</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="/main.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
72
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/main.css
vendored
Normal file
72
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/main.css
vendored
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
html {
|
||||||
|
background-color: rgba(33, 37, 43, 1);
|
||||||
|
text-align: center;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
color: white;
|
||||||
|
font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
|
||||||
|
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
||||||
|
sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Nunito";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local(""),
|
||||||
|
url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
display: block;
|
||||||
|
width: 35%;
|
||||||
|
height: 35%;
|
||||||
|
margin: auto;
|
||||||
|
padding: 15% 0 0;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url("./assets/images/logo-dark.svg");
|
||||||
|
}
|
||||||
|
.result {
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin: 1.5rem auto;
|
||||||
|
}
|
||||||
|
.input-box .btn {
|
||||||
|
width: 60px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: none;
|
||||||
|
margin: 0 0 0 20px;
|
||||||
|
padding: 0 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.input-box .btn:hover {
|
||||||
|
background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%);
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-box .input {
|
||||||
|
border: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
outline: none;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding: 0 10px;
|
||||||
|
background-color: rgba(240, 240, 240, 1);
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-box .input:hover {
|
||||||
|
border: none;
|
||||||
|
background-color: rgba(255, 255, 255, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-box .input:focus {
|
||||||
|
border: none;
|
||||||
|
background-color: rgba(255, 255, 255, 1);
|
||||||
|
}
|
23
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/main.js
vendored
Normal file
23
v2/cmd/wails/internal/commands/generate/template/base/frontend/dist/main.js
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Get input + focus
|
||||||
|
let nameElement = document.getElementById("name");
|
||||||
|
nameElement.focus();
|
||||||
|
|
||||||
|
// Setup the greet function
|
||||||
|
window.greet = function () {
|
||||||
|
|
||||||
|
// Get name
|
||||||
|
let name = nameElement.value;
|
||||||
|
|
||||||
|
// Call App.Greet(name)
|
||||||
|
window.go.main.App.Greet(name).then((result) => {
|
||||||
|
// Update result with data back from App.Greet()
|
||||||
|
document.getElementById("result").innerText = result;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
nameElement.onkeydown = function (e) {
|
||||||
|
console.log(e)
|
||||||
|
if (e.keyCode == 13) {
|
||||||
|
window.greet()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "{{.ProjectName}}",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"build": ""
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "{{.AuthorName}}"
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
module changeme
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
|
||||||
|
require github.com/wailsapp/wails/v2 {{.WailsVersion}}
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/andybalholm/brotli v1.0.2 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab // indirect
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1 // indirect
|
||||||
|
github.com/go-ole/go-ole v1.2.5 // indirect
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0 // indirect
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8 // indirect
|
||||||
|
github.com/google/uuid v1.1.2 // indirect
|
||||||
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5 // indirect
|
||||||
|
github.com/klauspost/compress v1.12.2 // indirect
|
||||||
|
github.com/leaanthony/debme v1.2.1 // indirect
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1 // indirect
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3 // indirect
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
||||||
|
github.com/leaanthony/slicer v1.5.0 // indirect
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0 // indirect
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f // indirect
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5 // indirect
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
|
github.com/valyala/fasthttp v1.28.0 // indirect
|
||||||
|
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
// replace github.com/wailsapp/wails/v2 {{.WailsVersion}} => {{.WailsDirectory}}
|
225
v2/cmd/wails/internal/commands/generate/template/base/go.sum
Normal file
225
v2/cmd/wails/internal/commands/generate/template/base/go.sum
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||||
|
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
|
||||||
|
github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E=
|
||||||
|
github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab h1:9e2joQGp642wHGFP5m86SDptAavrdGBe8/x9DGEEAaI=
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab/go.mod h1:smsv/h4PBEBaU0XDTY5UwJTpZv69fQ0FfcLJr21mA6Y=
|
||||||
|
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1 h1:qevA6c2MtE1RorlScnixeG0VA1H4xrXyhyX3oWBynNQ=
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8=
|
||||||
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
|
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||||
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
|
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
|
||||||
|
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
|
||||||
|
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||||
|
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
|
||||||
|
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
|
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||||
|
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||||
|
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
|
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||||
|
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
||||||
|
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0 h1:qP3PkGUbBB0i9iQh5E057XI1yO5CZigUxZhyUFYAFoM=
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0/go.mod h1:iftruuHGkRYGEXVISmdD7HTYWyfS2Bh+Dkfq4n/1Owg=
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8 h1:Hb4y6IxYZVMO0segROODXJiXVgVD3a6i7wnfot8kM6k=
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8/go.mod h1:fv8HSGQX09sauNv9g5Xq8GeGAaahLFYQKKb4ZdT0x2w=
|
||||||
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/jackmordaunt/icns v1.0.0/go.mod h1:7TTQVEuGzVVfOPPlLNHJIkzA6CoV7aH1Dv9dW351oOo=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5 h1:pdFFlHXY9tZXmJz+tRSm1DzYEH4ebha7cffmm607bMU=
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
||||||
|
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||||
|
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
|
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
|
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
|
github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8=
|
||||||
|
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0=
|
||||||
|
github.com/leaanthony/debme v1.1.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
|
||||||
|
github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=
|
||||||
|
github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4=
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM=
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y=
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0=
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 h1:nK/JTPyJi5QRqYjVZjXgtN4/dhg2qtngoLxLDVn429k=
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934/go.mod h1:lS5ds4bruPk9d7lzdF/OH31Z0YCerI6MmHNFGsWoUnM=
|
||||||
|
github.com/leaanthony/gosod v1.0.2/go.mod h1:W8RyeSFBXu7RpIxPGEJfW4moSyGGEjlJMLV25wEbAdU=
|
||||||
|
github.com/leaanthony/idgen v1.0.0/go.mod h1:4nBZnt8ml/f/ic/EVQuLxuj817RccT2fyrUaZFxrcVA=
|
||||||
|
github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
|
||||||
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
|
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||||
|
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||||
|
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
||||||
|
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||||
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc=
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f h1:PgA+Olipyj258EIEYnpFFONrrCcAIWNUNoFhUfMqAGY=
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f/go.mod h1:lHhJedqxCoHN+zMtwGNTXWmF0u9Jt363FYRhV6g0CdY=
|
||||||
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/tc-hib/winres v0.1.5/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A=
|
||||||
|
github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs=
|
||||||
|
github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ=
|
||||||
|
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
|
||||||
|
github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
|
||||||
|
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
|
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
|
github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs=
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ=
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
|
||||||
|
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||||
|
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
|
github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||||
|
github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
|
||||||
|
github.com/valyala/fasthttp v1.28.0 h1:ruVmTmZaBR5i67NqnjvvH5gEv0zwHfWtbjoyW98iho4=
|
||||||
|
github.com/valyala/fasthttp v1.28.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
|
||||||
|
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
||||||
|
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||||
|
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||||
|
github.com/wzshiming/ctc v1.2.3/go.mod h1:2tVAtIY7SUyraSk0JxvwmONNPFL4ARavPuEsg5+KA28=
|
||||||
|
github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20=
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
|
||||||
|
github.com/xyproto/xpm v1.2.1/go.mod h1:cMnesLsD0PBXLgjDfTDEaKr8XyTFsnP1QycSqRw7BiY=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww=
|
||||||
|
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
|
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
|
||||||
|
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I=
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
|
@ -0,0 +1,54 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed frontend/dist
|
||||||
|
var assets embed.FS
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Create an instance of the app structure
|
||||||
|
app := NewApp()
|
||||||
|
|
||||||
|
// Create application with options
|
||||||
|
err := wails.Run(&options.App{
|
||||||
|
Title: "{{.ProjectName}}",
|
||||||
|
Width: 1024,
|
||||||
|
Height: 768,
|
||||||
|
// MinWidth: 720,
|
||||||
|
// MinHeight: 570,
|
||||||
|
// MaxWidth: 1280,
|
||||||
|
// MaxHeight: 740,
|
||||||
|
DisableResize: false,
|
||||||
|
Fullscreen: false,
|
||||||
|
Frameless: false,
|
||||||
|
StartHidden: false,
|
||||||
|
HideWindowOnClose: false,
|
||||||
|
RGBA: &options.RGBA{255, 255, 255, 255},
|
||||||
|
Assets: assets,
|
||||||
|
LogLevel: logger.DEBUG,
|
||||||
|
OnStartup: app.startup,
|
||||||
|
OnDomReady: app.domReady,
|
||||||
|
OnShutdown: app.shutdown,
|
||||||
|
Bind: []interface{}{
|
||||||
|
app,
|
||||||
|
},
|
||||||
|
// Windows platform specific options
|
||||||
|
Windows: &windows.Options{
|
||||||
|
WebviewIsTransparent: false,
|
||||||
|
WindowIsTranslucent: false,
|
||||||
|
DisableWindowIcon: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Long name",
|
||||||
|
"shortname": "{{.Name}}",
|
||||||
|
"author": "",
|
||||||
|
"description": "Description of the template",
|
||||||
|
"helpurl": "URL for help with the template, eg homepage"
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "{{.ProjectName}}",
|
||||||
|
"outputfilename": "{{.BinaryName}}",
|
||||||
|
"assetdir": "frontend/dist",
|
||||||
|
"frontend:install": "npm install",
|
||||||
|
"frontend:build": "npm run build",
|
||||||
|
"author": {
|
||||||
|
"name": "{{.AuthorName}}",
|
||||||
|
"email": "{{.AuthorEmail}}"
|
||||||
|
}
|
||||||
|
}
|
215
v2/cmd/wails/internal/commands/generate/template/template.go
Normal file
215
v2/cmd/wails/internal/commands/generate/template/template.go
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
package template
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/leaanthony/debme"
|
||||||
|
|
||||||
|
"github.com/leaanthony/gosod"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/fs"
|
||||||
|
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/tidwall/sjson"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed base
|
||||||
|
var base embed.FS
|
||||||
|
|
||||||
|
func AddSubCommand(app *clir.Cli, parent *clir.Command, w io.Writer) {
|
||||||
|
|
||||||
|
// command
|
||||||
|
command := parent.NewSubCommand("template", "Generates a wails template")
|
||||||
|
|
||||||
|
name := ""
|
||||||
|
command.StringFlag("name", "The name of the template", &name)
|
||||||
|
|
||||||
|
existingProjectDir := ""
|
||||||
|
command.StringFlag("frontend", "A path to an existing frontend project to include in the template", &existingProjectDir)
|
||||||
|
|
||||||
|
// Quiet Init
|
||||||
|
quiet := false
|
||||||
|
command.BoolFlag("q", "Suppress output to console", &quiet)
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
|
||||||
|
// name is mandatory
|
||||||
|
if name == "" {
|
||||||
|
command.PrintHelp()
|
||||||
|
return fmt.Errorf("no template name given")
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the current directory is not empty, we create a new directory
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
templateDir := filepath.Join(cwd, name)
|
||||||
|
if !fs.DirExists(templateDir) {
|
||||||
|
err := os.MkdirAll(templateDir, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
empty, err := fs.DirIsEmpty(templateDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !empty {
|
||||||
|
templateDir = filepath.Join(cwd, name)
|
||||||
|
println("Creating new template directory:", name)
|
||||||
|
err = fs.Mkdir(templateDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create base template
|
||||||
|
baseTemplate, err := debme.FS(base, "base")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
g := gosod.New(baseTemplate)
|
||||||
|
g.SetTemplateFilters([]string{".template"})
|
||||||
|
|
||||||
|
err = os.Chdir(templateDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type templateData struct {
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
TemplateDir string
|
||||||
|
WailsVersion string
|
||||||
|
}
|
||||||
|
|
||||||
|
println("Extracting base template files...")
|
||||||
|
|
||||||
|
err = g.Extract(templateDir, &templateData{
|
||||||
|
Name: name,
|
||||||
|
TemplateDir: templateDir,
|
||||||
|
WailsVersion: app.Version(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Chdir(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we aren't migrating the files, just exit
|
||||||
|
if existingProjectDir == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove frontend directory
|
||||||
|
frontendDir := filepath.Join(templateDir, "frontend")
|
||||||
|
err = os.RemoveAll(frontendDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the files into a new frontend directory
|
||||||
|
println("Migrating existing project files to frontend directory...")
|
||||||
|
|
||||||
|
sourceDir, err := filepath.Abs(existingProjectDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
newFrontendDir := filepath.Join(templateDir, "frontend")
|
||||||
|
err = fs.CopyDirExtended(sourceDir, newFrontendDir, []string{name, "node_modules"})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process package.json
|
||||||
|
err = processPackageJSON(frontendDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process package-lock.json
|
||||||
|
err = processPackageLockJSON(frontendDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove node_modules - ignore error, eg it doesn't exist
|
||||||
|
_ = os.RemoveAll(filepath.Join(frontendDir, "node_modules"))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func processPackageJSON(frontendDir string) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
packageJSON := filepath.Join(frontendDir, "package.json")
|
||||||
|
if !fs.FileExists(packageJSON) {
|
||||||
|
println("No package.json found - cannot process.")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := os.ReadFile(packageJSON)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
json := string(data)
|
||||||
|
|
||||||
|
// We will ignore these errors - it's not critical
|
||||||
|
println("Updating package.json data...")
|
||||||
|
json, _ = sjson.Set(json, "name", "{{.ProjectName}}")
|
||||||
|
json, _ = sjson.Set(json, "author", "{{.AuthorName}}")
|
||||||
|
|
||||||
|
err = os.WriteFile(packageJSON, []byte(json), 0644)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
baseDir := filepath.Dir(packageJSON)
|
||||||
|
println("Renaming package.json -> package.tmpl.json...")
|
||||||
|
err = os.Rename(packageJSON, filepath.Join(baseDir, "package.tmpl.json"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func processPackageLockJSON(frontendDir string) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
filename := filepath.Join(frontendDir, "package-lock.json")
|
||||||
|
if !fs.FileExists(filename) {
|
||||||
|
println("No package-lock.json found - cannot process.")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := os.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
json := string(data)
|
||||||
|
|
||||||
|
// We will ignore these errors - it's not critical
|
||||||
|
println("Updating package-lock.json data...")
|
||||||
|
json, _ = sjson.Set(json, "name", "{{.ProjectName}}")
|
||||||
|
|
||||||
|
err = os.WriteFile(filename, []byte(json), 0644)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
baseDir := filepath.Dir(filename)
|
||||||
|
println("Renaming package-lock.json -> package-lock.tmpl.json...")
|
||||||
|
err = os.Rename(filename, filepath.Join(baseDir, "package-lock.tmpl.json"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
235
v2/cmd/wails/internal/commands/initialise/initialise.go
Normal file
235
v2/cmd/wails/internal/commands/initialise/initialise.go
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
package initialise
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/flytam/filenamify"
|
||||||
|
"github.com/leaanthony/slicer"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/buildassets"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/initialise/templates"
|
||||||
|
|
||||||
|
"github.com/leaanthony/clir"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/git"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddSubcommand adds the `init` command for the Wails application
|
||||||
|
func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
||||||
|
|
||||||
|
command := app.NewSubCommand("init", "Initialise a new Wails project")
|
||||||
|
|
||||||
|
// Setup template name flag
|
||||||
|
templateName := "vanilla"
|
||||||
|
description := "Name of built-in template to use, path to template or template url."
|
||||||
|
command.StringFlag("t", description, &templateName)
|
||||||
|
|
||||||
|
// Setup project name
|
||||||
|
projectName := ""
|
||||||
|
command.StringFlag("n", "Name of project", &projectName)
|
||||||
|
|
||||||
|
// Setup project directory
|
||||||
|
projectDirectory := ""
|
||||||
|
command.StringFlag("d", "Project directory", &projectDirectory)
|
||||||
|
|
||||||
|
// Quiet Init
|
||||||
|
quiet := false
|
||||||
|
command.BoolFlag("q", "Suppress output to console", &quiet)
|
||||||
|
|
||||||
|
initGit := false
|
||||||
|
gitInstalled := git.IsInstalled()
|
||||||
|
if gitInstalled {
|
||||||
|
// Git Init
|
||||||
|
command.BoolFlag("g", "Initialise git repository", &initGit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VSCode project files
|
||||||
|
ide := ""
|
||||||
|
command.StringFlag("ide", "Generate IDE project files", &ide)
|
||||||
|
|
||||||
|
// List templates
|
||||||
|
list := false
|
||||||
|
command.BoolFlag("l", "List templates", &list)
|
||||||
|
|
||||||
|
command.Action(func() error {
|
||||||
|
|
||||||
|
// Create logger
|
||||||
|
logger := clilogger.New(w)
|
||||||
|
logger.Mute(quiet)
|
||||||
|
|
||||||
|
// Are we listing templates?
|
||||||
|
if list {
|
||||||
|
app.PrintBanner()
|
||||||
|
err := templates.OutputList(logger)
|
||||||
|
logger.Println("")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate name
|
||||||
|
if len(projectName) == 0 {
|
||||||
|
logger.Println("ERROR: Project name required")
|
||||||
|
logger.Println("")
|
||||||
|
command.PrintHelp()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate IDE option
|
||||||
|
supportedIDEs := slicer.String([]string{"vscode", "goland"})
|
||||||
|
ide = strings.ToLower(ide)
|
||||||
|
if ide != "" {
|
||||||
|
if !supportedIDEs.Contains(ide) {
|
||||||
|
return fmt.Errorf("ide '%s' not supported. Valid values: %s", ide, supportedIDEs.Join(" "))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !quiet {
|
||||||
|
app.PrintBanner()
|
||||||
|
}
|
||||||
|
|
||||||
|
task := fmt.Sprintf("Initialising Project %s", strings.Title(projectName))
|
||||||
|
logger.Println(task)
|
||||||
|
logger.Println(strings.Repeat("-", len(task)))
|
||||||
|
|
||||||
|
projectFilename, err := filenamify.Filenamify(projectName, filenamify.Options{
|
||||||
|
Replacement: "_",
|
||||||
|
MaxLength: 255,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
goBinary, err := exec.LookPath("go")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to find Go compiler. Please download and install Go: https://golang.org/dl/")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get base path and convert to forward slashes
|
||||||
|
goPath := filepath.ToSlash(filepath.Dir(goBinary))
|
||||||
|
// Trim bin directory
|
||||||
|
goSDKPath := strings.TrimSuffix(goPath, "/bin")
|
||||||
|
|
||||||
|
// Create Template Options
|
||||||
|
options := &templates.Options{
|
||||||
|
ProjectName: projectName,
|
||||||
|
TargetDir: projectDirectory,
|
||||||
|
TemplateName: templateName,
|
||||||
|
Logger: logger,
|
||||||
|
IDE: ide,
|
||||||
|
InitGit: initGit,
|
||||||
|
ProjectNameFilename: projectFilename,
|
||||||
|
WailsVersion: app.Version(),
|
||||||
|
GoSDKPath: goSDKPath,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to discover author details from git config
|
||||||
|
findAuthorDetails(options)
|
||||||
|
|
||||||
|
return initProject(options, quiet)
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// initProject is our main init command
|
||||||
|
func initProject(options *templates.Options, quiet bool) error {
|
||||||
|
|
||||||
|
// Start Time
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
// Install the template
|
||||||
|
remote, template, err := templates.Install(options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install the default assets
|
||||||
|
err = buildassets.Install(options.TargetDir, options.ProjectName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run `go mod tidy` to ensure `go.sum` is up to date
|
||||||
|
cmd := exec.Command("go", "mod", "tidy")
|
||||||
|
cmd.Dir = options.TargetDir
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
if !quiet {
|
||||||
|
println("")
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
}
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.InitGit {
|
||||||
|
err = initGit(options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if quiet {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output stats
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
options.Logger.Println("")
|
||||||
|
options.Logger.Println("Project Name: " + options.ProjectName)
|
||||||
|
options.Logger.Println("Project Directory: " + options.TargetDir)
|
||||||
|
options.Logger.Println("Project Template: " + options.TemplateName)
|
||||||
|
options.Logger.Println("Template Support: " + template.HelpURL)
|
||||||
|
|
||||||
|
// IDE message
|
||||||
|
switch options.IDE {
|
||||||
|
case "vscode":
|
||||||
|
options.Logger.Println("VSCode config files generated.")
|
||||||
|
case "goland":
|
||||||
|
options.Logger.Println("Goland config files generated.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.InitGit {
|
||||||
|
options.Logger.Println("Git repository initialised.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if remote {
|
||||||
|
options.Logger.Println("\nNOTE: You have created a project using a remote template. The Wails project takes no responsibility for 3rd party templates. Only use remote templates that you trust.")
|
||||||
|
}
|
||||||
|
|
||||||
|
options.Logger.Println("")
|
||||||
|
options.Logger.Println(fmt.Sprintf("Initialised project '%s' in %s.", options.ProjectName, elapsed.Round(time.Millisecond).String()))
|
||||||
|
options.Logger.Println("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func initGit(options *templates.Options) error {
|
||||||
|
err := git.InitRepo(options.TargetDir)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Unable to initialise git repository:")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// findAuthorDetails tries to find the user's name and email
|
||||||
|
// from gitconfig. If it finds them, it stores them in the project options
|
||||||
|
func findAuthorDetails(options *templates.Options) {
|
||||||
|
if git.IsInstalled() {
|
||||||
|
name, err := git.Name()
|
||||||
|
if err == nil {
|
||||||
|
options.AuthorName = strings.TrimSpace(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
email, err := git.Email()
|
||||||
|
if err == nil {
|
||||||
|
options.AuthorEmail = strings.TrimSpace(email)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/{{.ProjectNameFilename}}.iml"
|
||||||
|
filepath="$PROJECT_DIR$/.idea/{{.ProjectNameFilename}}.iml"/>
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1 @@
|
|||||||
|
{{.ProjectName}}
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="Go" enabled="true" />
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git"/>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,95 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="ALL"/>
|
||||||
|
</component>
|
||||||
|
<component name="GOROOT" url="file://{{.GoSDKPath}}"/>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$"/>
|
||||||
|
</component>
|
||||||
|
<component name="GoLibraries">
|
||||||
|
<option name="indexEntireGoPath" value="false"/>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectId" id="wails-{{.ProjectName}}"/>
|
||||||
|
<component name="ProjectLevelVcsManager" settingsEditedManually="true"/>
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true"/>
|
||||||
|
<option name="showLibraryContents" value="true"/>
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent">
|
||||||
|
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true"/>
|
||||||
|
<property name="RunOnceActivity.ShowReadmeOnStart" value="true"/>
|
||||||
|
<property name="WebServerToolWindowFactoryState" value="false"/>
|
||||||
|
<property name="com.intellij.ide.scratch.LRUPopupBuilder$1/New Scratch File" value="TEXT"/>
|
||||||
|
<property name="go.formatter.settings.were.checked" value="true"/>
|
||||||
|
<property name="go.import.settings.migrated" value="true"/>
|
||||||
|
<property name="go.modules.go.list.on.any.changes.was.set" value="true"/>
|
||||||
|
<property name="go.sdk.automatically.set" value="true"/>
|
||||||
|
<property name="go.tried.to.enable.integration.vgo.integrator" value="true"/>
|
||||||
|
<property name="last_opened_file_path" value="$PROJECT_DIR$"/>
|
||||||
|
<property name="settings.editor.selected.configurable"
|
||||||
|
value="reference.settingsdialog.IDE.editor.colors.Console Font"/>
|
||||||
|
</component>
|
||||||
|
<component name="RunManager" selected="Go Build.{{.ProjectName}} (dev)">>
|
||||||
|
<configuration name="{{.ProjectName}} (dev)" type="GoApplicationRunConfiguration" factoryName="Go Application">
|
||||||
|
<module name="{{.ProjectName}}"/>
|
||||||
|
<working_directory value="$PROJECT_DIR$"/>
|
||||||
|
<go_parameters value="-gcflags "all=-N -l" -tags dev -o {{.PathToDesktopBinary}}"/>
|
||||||
|
<useCustomBuildTags value="true"/>
|
||||||
|
<parameters value="-assetdir {{.AssetDir}}"/>
|
||||||
|
<envs>
|
||||||
|
<env name="CGO_ENABLED" value=""{{.CGOEnabled}}""/>
|
||||||
|
</envs>
|
||||||
|
<kind value="DIRECTORY"/>
|
||||||
|
<directory value="$PROJECT_DIR$"/>
|
||||||
|
<filePath value="$PROJECT_DIR$"/>
|
||||||
|
<method v="2">
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration name="{{.ProjectName}} (production)" type="GoApplicationRunConfiguration"
|
||||||
|
factoryName="Go Application">
|
||||||
|
<module name="{{.ProjectName}}"/>
|
||||||
|
<working_directory value="$PROJECT_DIR$"/>
|
||||||
|
<go_parameters
|
||||||
|
value="-ldflags "-w -s{{.WindowsFlags}}" -tags desktop,production -o {{.PathToDesktopBinary}}"/>
|
||||||
|
<useCustomBuildTags value="true"/>
|
||||||
|
<envs>
|
||||||
|
<env name="CGO_ENABLED" value=""{{.CGOEnabled}}""/>
|
||||||
|
</envs>
|
||||||
|
<kind value="DIRECTORY"/>
|
||||||
|
<directory value="$PROJECT_DIR$"/>
|
||||||
|
<filePath value="$PROJECT_DIR$"/>
|
||||||
|
<method v="2">
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
<list>
|
||||||
|
<item itemvalue="Go Build.{{.ProjectName}} (dev)"/>
|
||||||
|
<item itemvalue="Go Remote.Local"/>
|
||||||
|
</list>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0"
|
||||||
|
DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true"/>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3"/>
|
||||||
|
</component>
|
||||||
|
<component name="Vcs.Log.Tabs.Properties">
|
||||||
|
<option name="TAB_STATES">
|
||||||
|
<map>
|
||||||
|
<entry key="MAIN">
|
||||||
|
<value>
|
||||||
|
<State/>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="oldMeFiltersMigrated" value="true"/>
|
||||||
|
</component>
|
||||||
|
<component name="VgoProject">
|
||||||
|
<integration-enabled>true</integration-enabled>
|
||||||
|
</component>
|
||||||
|
<component name="XDebuggerManager">
|
||||||
|
<breakpoint-manager>
|
||||||
|
</breakpoint-manager>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Wails: Debug {{.ProjectName}}",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "exec",
|
||||||
|
"program": "${workspaceFolder}/{{.PathToDesktopBinary}}",
|
||||||
|
"preLaunchTask": "build",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"env": {},
|
||||||
|
"args": [
|
||||||
|
"-assetdir",
|
||||||
|
"{{.AssetDir}}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "build",
|
||||||
|
"type": "shell",
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"command": "go",
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"-tags",
|
||||||
|
"dev",
|
||||||
|
"-gcflags",
|
||||||
|
"all=-N -l",
|
||||||
|
"-o",
|
||||||
|
"{{.PathToDesktopBinary}}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
442
v2/cmd/wails/internal/commands/initialise/templates/templates.go
Normal file
442
v2/cmd/wails/internal/commands/initialise/templates/templates.go
Normal file
@ -0,0 +1,442 @@
|
|||||||
|
package templates
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"github.com/go-git/go-git/v5"
|
||||||
|
gofs "io/fs"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
"github.com/leaanthony/debme"
|
||||||
|
"github.com/leaanthony/gosod"
|
||||||
|
"github.com/olekukonko/tablewriter"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/fs"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed templates
|
||||||
|
var templates embed.FS
|
||||||
|
|
||||||
|
//go:embed ides/*
|
||||||
|
var ides embed.FS
|
||||||
|
|
||||||
|
// Cahce for the templates
|
||||||
|
// We use this because we need different views of the same data
|
||||||
|
var templateCache []Template = nil
|
||||||
|
|
||||||
|
// Data contains the data we wish to embed during template installation
|
||||||
|
type Data struct {
|
||||||
|
ProjectName string
|
||||||
|
BinaryName string
|
||||||
|
WailsVersion string
|
||||||
|
NPMProjectName string
|
||||||
|
AuthorName string
|
||||||
|
AuthorEmail string
|
||||||
|
AuthorNameAndEmail string
|
||||||
|
WailsDirectory string
|
||||||
|
GoSDKPath string
|
||||||
|
AssetDir string
|
||||||
|
WindowsFlags string
|
||||||
|
CGOEnabled string
|
||||||
|
OutputFile string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options for installing a template
|
||||||
|
type Options struct {
|
||||||
|
ProjectName string
|
||||||
|
TemplateName string
|
||||||
|
BinaryName string
|
||||||
|
TargetDir string
|
||||||
|
Logger *clilogger.CLILogger
|
||||||
|
PathToDesktopBinary string
|
||||||
|
PathToServerBinary string
|
||||||
|
InitGit bool
|
||||||
|
AuthorName string
|
||||||
|
AuthorEmail string
|
||||||
|
AssetDir string
|
||||||
|
IDE string
|
||||||
|
ProjectNameFilename string // The project name but as a valid filename
|
||||||
|
WailsVersion string
|
||||||
|
GoSDKPath string
|
||||||
|
WindowsFlags string
|
||||||
|
CGOEnabled string
|
||||||
|
OutputFile string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Template holds data relating to a template
|
||||||
|
// including the metadata stored in template.json
|
||||||
|
type Template struct {
|
||||||
|
|
||||||
|
// Template details
|
||||||
|
Name string `json:"name"`
|
||||||
|
ShortName string `json:"shortname"`
|
||||||
|
Author string `json:"author"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
HelpURL string `json:"helpurl"`
|
||||||
|
|
||||||
|
// Other data
|
||||||
|
FS gofs.FS `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseTemplate(template gofs.FS) (Template, error) {
|
||||||
|
var result Template
|
||||||
|
data, err := gofs.ReadFile(template, "template.json")
|
||||||
|
if err != nil {
|
||||||
|
return result, errors.Wrap(err, "Error parsing template")
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(data, &result)
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
result.FS = template
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns the list of available templates
|
||||||
|
func List() ([]Template, error) {
|
||||||
|
|
||||||
|
// If the cache isn't loaded, load it
|
||||||
|
if templateCache == nil {
|
||||||
|
err := loadTemplateCache()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return templateCache, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getTemplateByShortname returns the template with the given short name
|
||||||
|
func getTemplateByShortname(shortname string) (Template, error) {
|
||||||
|
|
||||||
|
var result Template
|
||||||
|
|
||||||
|
// If the cache isn't loaded, load it
|
||||||
|
if templateCache == nil {
|
||||||
|
err := loadTemplateCache()
|
||||||
|
if err != nil {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, template := range templateCache {
|
||||||
|
if template.ShortName == shortname {
|
||||||
|
return template, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, fmt.Errorf("shortname '%s' is not a valid template shortname", shortname)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loads the template cache
|
||||||
|
func loadTemplateCache() error {
|
||||||
|
|
||||||
|
templatesFS, err := debme.FS(templates, "templates")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get directories
|
||||||
|
files, err := templatesFS.ReadDir(".")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset cache
|
||||||
|
templateCache = []Template{}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
if file.IsDir() {
|
||||||
|
templateFS, err := templatesFS.FS(file.Name())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
template, err := parseTemplate(templateFS)
|
||||||
|
if err != nil {
|
||||||
|
// Cannot parse this template, continue
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
templateCache = append(templateCache, template)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install the given template. Returns true if the template is remote.
|
||||||
|
func Install(options *Options) (bool, *Template, error) {
|
||||||
|
// Get cwd
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Did the user want to install in current directory?
|
||||||
|
if options.TargetDir == "" {
|
||||||
|
options.TargetDir = filepath.Join(cwd, options.ProjectName)
|
||||||
|
if fs.DirExists(options.TargetDir) {
|
||||||
|
return false, nil, fmt.Errorf("cannot create project directory. Dir exists: %s", options.TargetDir)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Get the absolute path of the given directory
|
||||||
|
targetDir, err := filepath.Abs(filepath.Join(cwd, options.TargetDir))
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
options.TargetDir = targetDir
|
||||||
|
if !fs.DirExists(options.TargetDir) {
|
||||||
|
err := fs.Mkdir(options.TargetDir)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flag to indicate remote template
|
||||||
|
remoteTemplate := false
|
||||||
|
|
||||||
|
// Is this a shortname?
|
||||||
|
template, err := getTemplateByShortname(options.TemplateName)
|
||||||
|
if err != nil {
|
||||||
|
// Is this a filepath?
|
||||||
|
templatePath, err := filepath.Abs(options.TemplateName)
|
||||||
|
if fs.DirExists(templatePath) {
|
||||||
|
templateFS := os.DirFS(templatePath)
|
||||||
|
template, err = parseTemplate(templateFS)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, errors.Wrap(err, "Error installing template")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// git clone to temporary dir
|
||||||
|
tempdir, err := gitclone(options)
|
||||||
|
defer func(path string) {
|
||||||
|
err := os.RemoveAll(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}(tempdir)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
// Remove the .git directory
|
||||||
|
err = os.RemoveAll(filepath.Join(tempdir, ".git"))
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateFS := os.DirFS(tempdir)
|
||||||
|
template, err = parseTemplate(templateFS)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
remoteTemplate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use Gosod to install the template
|
||||||
|
installer := gosod.New(template.FS)
|
||||||
|
|
||||||
|
// Ignore template.json files
|
||||||
|
installer.IgnoreFile("template.json")
|
||||||
|
|
||||||
|
// Setup the data.
|
||||||
|
// We use the directory name for the binary name, like Go
|
||||||
|
BinaryName := filepath.Base(options.TargetDir)
|
||||||
|
NPMProjectName := strings.ToLower(strings.ReplaceAll(BinaryName, " ", ""))
|
||||||
|
localWailsDirectory := fs.RelativePath("../../../../../..")
|
||||||
|
|
||||||
|
templateData := &Data{
|
||||||
|
ProjectName: options.ProjectName,
|
||||||
|
BinaryName: filepath.Base(options.TargetDir),
|
||||||
|
NPMProjectName: NPMProjectName,
|
||||||
|
WailsDirectory: localWailsDirectory,
|
||||||
|
AuthorEmail: options.AuthorEmail,
|
||||||
|
AuthorName: options.AuthorName,
|
||||||
|
WailsVersion: options.WailsVersion,
|
||||||
|
GoSDKPath: options.GoSDKPath,
|
||||||
|
AssetDir: options.AssetDir,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a formatted name and email combo.
|
||||||
|
if options.AuthorName != "" {
|
||||||
|
templateData.AuthorNameAndEmail = options.AuthorName + " "
|
||||||
|
}
|
||||||
|
if options.AuthorEmail != "" {
|
||||||
|
templateData.AuthorNameAndEmail += "<" + options.AuthorEmail + ">"
|
||||||
|
}
|
||||||
|
templateData.AuthorNameAndEmail = strings.TrimSpace(templateData.AuthorNameAndEmail)
|
||||||
|
|
||||||
|
installer.RenameFiles(map[string]string{
|
||||||
|
"gitignore.txt": ".gitignore",
|
||||||
|
})
|
||||||
|
|
||||||
|
// Extract the template
|
||||||
|
err = installer.Extract(options.TargetDir, templateData)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = generateIDEFiles(options)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return remoteTemplate, &template, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clones the given uri and returns the temporary cloned directory
|
||||||
|
func gitclone(options *Options) (string, error) {
|
||||||
|
// Create temporary directory
|
||||||
|
dirname, err := ioutil.TempDir("", "wails-template-*")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
_, err = git.PlainClone(dirname, false, &git.CloneOptions{
|
||||||
|
URL: options.TemplateName,
|
||||||
|
})
|
||||||
|
|
||||||
|
return dirname, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// OutputList prints the list of available tempaltes to the given logger
|
||||||
|
func OutputList(logger *clilogger.CLILogger) error {
|
||||||
|
templates, err := List()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
table := tablewriter.NewWriter(logger.Writer)
|
||||||
|
table.SetHeader([]string{"Template", "Short Name", "Description"})
|
||||||
|
table.SetAutoWrapText(false)
|
||||||
|
table.SetAutoFormatHeaders(true)
|
||||||
|
table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
|
||||||
|
table.SetAlignment(tablewriter.ALIGN_LEFT)
|
||||||
|
table.SetCenterSeparator("")
|
||||||
|
table.SetColumnSeparator("")
|
||||||
|
table.SetRowSeparator("")
|
||||||
|
table.SetHeaderLine(false)
|
||||||
|
table.SetBorder(false)
|
||||||
|
table.SetTablePadding("\t") // pad with tabs
|
||||||
|
table.SetNoWhiteSpace(true)
|
||||||
|
for _, template := range templates {
|
||||||
|
table.Append([]string{template.Name, template.ShortName, template.Description})
|
||||||
|
}
|
||||||
|
table.Render()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateIDEFiles(options *Options) error {
|
||||||
|
|
||||||
|
switch options.IDE {
|
||||||
|
case "vscode":
|
||||||
|
return generateVSCodeFiles(options)
|
||||||
|
case "goland":
|
||||||
|
return generateGolandFiles(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ideOptions struct {
|
||||||
|
name string
|
||||||
|
targetDir string
|
||||||
|
options *Options
|
||||||
|
renameFiles map[string]string
|
||||||
|
ignoredFiles []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateGolandFiles(options *Options) error {
|
||||||
|
ideoptions := ideOptions{
|
||||||
|
name: "goland",
|
||||||
|
targetDir: filepath.Join(options.TargetDir, ".idea"),
|
||||||
|
options: options,
|
||||||
|
renameFiles: map[string]string{
|
||||||
|
"projectname.iml": options.ProjectNameFilename + ".iml",
|
||||||
|
"gitignore.txt": ".gitignore",
|
||||||
|
"name": ".name",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if !options.InitGit {
|
||||||
|
ideoptions.ignoredFiles = []string{"vcs.xml"}
|
||||||
|
}
|
||||||
|
err := installIDEFiles(ideoptions)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "generating Goland IDE files")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateVSCodeFiles(options *Options) error {
|
||||||
|
ideoptions := ideOptions{
|
||||||
|
name: "vscode",
|
||||||
|
targetDir: filepath.Join(options.TargetDir, ".vscode"),
|
||||||
|
options: options,
|
||||||
|
}
|
||||||
|
return installIDEFiles(ideoptions)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func installIDEFiles(o ideOptions) error {
|
||||||
|
source, err := debme.FS(ides, "ides/"+o.name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use gosod to install the template
|
||||||
|
installer := gosod.New(source)
|
||||||
|
|
||||||
|
if o.renameFiles != nil {
|
||||||
|
installer.RenameFiles(o.renameFiles)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ignoreFile := range o.ignoredFiles {
|
||||||
|
installer.IgnoreFile(ignoreFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
binaryName := filepath.Base(o.options.TargetDir)
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
// yay windows
|
||||||
|
binaryName += ".exe"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse wails.json for assetdir
|
||||||
|
wailsJSONBytes, err := os.ReadFile(filepath.Join(o.options.TargetDir, "wails.json"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var wailsJSON map[string]interface{}
|
||||||
|
err = json.Unmarshal(wailsJSONBytes, &wailsJSON)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
assetDir := wailsJSON["assetdir"]
|
||||||
|
if assetDir == "" {
|
||||||
|
return fmt.Errorf("Unable to find 'assetdir' in 'wails.json' ")
|
||||||
|
}
|
||||||
|
|
||||||
|
o.options.AssetDir = assetDir.(string)
|
||||||
|
o.options.PathToDesktopBinary = filepath.ToSlash(filepath.Join("build", "bin", binaryName))
|
||||||
|
|
||||||
|
o.options.WindowsFlags = ""
|
||||||
|
o.options.CGOEnabled = "1"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
o.options.WindowsFlags = " -H windowsgui"
|
||||||
|
o.options.CGOEnabled = "0"
|
||||||
|
}
|
||||||
|
err = installer.Extract(o.targetDir, o.options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
# README
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
This is a basic Svelte template, using rollup to bundle the assets into a single JS file.
|
||||||
|
Rollup is configured to do the following:
|
||||||
|
|
||||||
|
- Convert imported images to base64 strings
|
||||||
|
- Convert `url()` in `@font-face` declarations to base64 strings
|
||||||
|
- Bundle all css into the JS bundle
|
||||||
|
- Copy `index.html` from `frontend/src/` to `frontend/dist/`
|
||||||
|
|
||||||
|
Clicking the button will call the backend.
|
||||||
|
|
||||||
|
## Live Development
|
||||||
|
|
||||||
|
To run in live development mode, run `wails dev` in the project directory. The frontend dev server will run
|
||||||
|
on http://localhost:34115. Open this in your browser to connect to your application.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
For a production build, use `wails build`.
|
@ -0,0 +1,37 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// App application struct
|
||||||
|
type App struct {
|
||||||
|
ctx context.Context
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewApp creates a new App application struct
|
||||||
|
func NewApp() *App {
|
||||||
|
return &App{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// startup is called at application startup
|
||||||
|
func (b *App) startup(ctx context.Context) {
|
||||||
|
// Perform your setup here
|
||||||
|
b.ctx = ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
// domReady is called after the front-end dom has been loaded
|
||||||
|
func (b *App) domReady(ctx context.Context) {
|
||||||
|
// Add your action here
|
||||||
|
}
|
||||||
|
|
||||||
|
// shutdown is called at application termination
|
||||||
|
func (b *App) shutdown(ctx context.Context) {
|
||||||
|
// Perform your teardown here
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greet returns a greeting for the given name
|
||||||
|
func (b *App) Greet(name string) string {
|
||||||
|
return fmt.Sprintf("Hello %s!", name)
|
||||||
|
}
|
4
v2/cmd/wails/internal/commands/initialise/templates/templates/svelte/frontend/.gitignore
vendored
Normal file
4
v2/cmd/wails/internal/commands/initialise/templates/templates/svelte/frontend/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/node_modules/
|
||||||
|
/dist/build/
|
||||||
|
|
||||||
|
.DS_Store
|
@ -0,0 +1,105 @@
|
|||||||
|
*Looking for a shareable component template? Go here --> [sveltejs/component-template](https://github.com/sveltejs/component-template)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# svelte app
|
||||||
|
|
||||||
|
This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template.
|
||||||
|
|
||||||
|
To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx degit sveltejs/template svelte-app
|
||||||
|
cd svelte-app
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note that you will need to have [Node.js](https://nodejs.org) installed.*
|
||||||
|
|
||||||
|
|
||||||
|
## Get started
|
||||||
|
|
||||||
|
Install the dependencies...
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd svelte-app
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
...then start [Rollup](https://rollupjs.org):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Navigate to [localhost:5000](http://localhost:5000). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes.
|
||||||
|
|
||||||
|
By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`.
|
||||||
|
|
||||||
|
If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense.
|
||||||
|
|
||||||
|
## Building and running in production mode
|
||||||
|
|
||||||
|
To create an optimised version of the app:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com).
|
||||||
|
|
||||||
|
|
||||||
|
## Single-page app mode
|
||||||
|
|
||||||
|
By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere.
|
||||||
|
|
||||||
|
If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json:
|
||||||
|
|
||||||
|
```js
|
||||||
|
"start": "sirv public --single"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using TypeScript
|
||||||
|
|
||||||
|
This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node scripts/setupTypeScript.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Or remove the script via:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm scripts/setupTypeScript.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deploying to the web
|
||||||
|
|
||||||
|
### With [Vercel](https://vercel.com)
|
||||||
|
|
||||||
|
Install `vercel` if you haven't already:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g vercel
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, from within your project folder:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd public
|
||||||
|
vercel deploy --name my-project
|
||||||
|
```
|
||||||
|
|
||||||
|
### With [surge](https://surge.sh/)
|
||||||
|
|
||||||
|
Install `surge` if you haven't already:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g surge
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, from within your project folder:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
surge public my-project.surge.sh
|
||||||
|
```
|
@ -0,0 +1 @@
|
|||||||
|
<!-- This file is a placeholder to prevent IDE warnings for go:embed --->
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "{{.ProjectName}}",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "rollup -c",
|
||||||
|
"dev": "rollup -c -w",
|
||||||
|
"start": "sirv dist --no-clear"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-commonjs": "^17.0.0",
|
||||||
|
"@rollup/plugin-image": "^2.0.6",
|
||||||
|
"@rollup/plugin-node-resolve": "^11.0.0",
|
||||||
|
"postcss": "^8.3.5",
|
||||||
|
"postcss-url": "^10.1.3",
|
||||||
|
"rollup": "^2.3.4",
|
||||||
|
"rollup-plugin-copy": "^3.4.0",
|
||||||
|
"rollup-plugin-livereload": "^2.0.0",
|
||||||
|
"rollup-plugin-postcss": "^4.0.0",
|
||||||
|
"rollup-plugin-svelte": "^7.0.0",
|
||||||
|
"rollup-plugin-terser": "^7.0.0",
|
||||||
|
"svelte": "^3.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"sirv-cli": "^1.0.0"
|
||||||
|
},
|
||||||
|
"author": "{{.AuthorName}}"
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
import svelte from 'rollup-plugin-svelte';
|
||||||
|
import commonjs from '@rollup/plugin-commonjs';
|
||||||
|
import resolve from '@rollup/plugin-node-resolve';
|
||||||
|
import livereload from 'rollup-plugin-livereload';
|
||||||
|
import {terser} from 'rollup-plugin-terser';
|
||||||
|
import copy from 'rollup-plugin-copy';
|
||||||
|
import postcss from 'rollup-plugin-postcss'
|
||||||
|
|
||||||
|
const production = !process.env.ROLLUP_WATCH;
|
||||||
|
|
||||||
|
function serve() {
|
||||||
|
let server;
|
||||||
|
|
||||||
|
function toExit() {
|
||||||
|
if (server) server.kill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
writeBundle() {
|
||||||
|
if (server) return;
|
||||||
|
server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
|
||||||
|
stdio: ['ignore', 'inherit', 'inherit'],
|
||||||
|
shell: true
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('SIGTERM', toExit);
|
||||||
|
process.on('exit', toExit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
input: 'src/main.js',
|
||||||
|
output: {
|
||||||
|
sourcemap: true,
|
||||||
|
format: 'iife',
|
||||||
|
name: 'app',
|
||||||
|
file: 'dist/bundle.js'
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
svelte({
|
||||||
|
compilerOptions: {
|
||||||
|
// enable run-time checks when not in production
|
||||||
|
dev: !production
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
postcss({
|
||||||
|
minimize: true,
|
||||||
|
}),
|
||||||
|
// If you have external dependencies installed from
|
||||||
|
// npm, you'll most likely need these plugins. In
|
||||||
|
// some cases you'll need additional configuration -
|
||||||
|
// consult the documentation for details:
|
||||||
|
// https://github.com/rollup/plugins/tree/master/packages/commonjs
|
||||||
|
resolve({
|
||||||
|
browser: true,
|
||||||
|
dedupe: ['svelte']
|
||||||
|
}),
|
||||||
|
commonjs(),
|
||||||
|
copy({
|
||||||
|
targets: [
|
||||||
|
{src: 'src/index.html', dest: 'dist/'},
|
||||||
|
{src: 'src/global.css', dest: 'dist/'},
|
||||||
|
{src: 'src/assets', dest: 'dist/'},
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
|
||||||
|
// In dev mode, call `npm run start` once
|
||||||
|
// the bundle has been generated
|
||||||
|
!production && serve(),
|
||||||
|
|
||||||
|
// Watch the `dist` directory and refresh the
|
||||||
|
// browser on changes when not in production
|
||||||
|
!production && livereload('dist'),
|
||||||
|
|
||||||
|
// If we're building for production (npm run build
|
||||||
|
// instead of npm run dev), minify
|
||||||
|
production && terser()
|
||||||
|
],
|
||||||
|
watch: {
|
||||||
|
clearScreen: false
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,121 @@
|
|||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** This script modifies the project to support TS code in .svelte files like:
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export let name: string;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
As well as validating the code for CI.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** To work on this script:
|
||||||
|
rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require("fs")
|
||||||
|
const path = require("path")
|
||||||
|
const { argv } = require("process")
|
||||||
|
|
||||||
|
const projectRoot = argv[2] || path.join(__dirname, "..")
|
||||||
|
|
||||||
|
// Add deps to pkg.json
|
||||||
|
const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8"))
|
||||||
|
packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, {
|
||||||
|
"svelte-check": "^2.0.0",
|
||||||
|
"svelte-preprocess": "^4.0.0",
|
||||||
|
"@rollup/plugin-typescript": "^8.0.0",
|
||||||
|
"typescript": "^4.0.0",
|
||||||
|
"tslib": "^2.0.0",
|
||||||
|
"@tsconfig/svelte": "^2.0.0"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Add script for checking
|
||||||
|
packageJSON.scripts = Object.assign(packageJSON.scripts, {
|
||||||
|
"check": "svelte-check --tsconfig ./tsconfig.json"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Write the package JSON
|
||||||
|
fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " "))
|
||||||
|
|
||||||
|
// mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too
|
||||||
|
const beforeMainJSPath = path.join(projectRoot, "src", "main.js")
|
||||||
|
const afterMainTSPath = path.join(projectRoot, "src", "main.ts")
|
||||||
|
fs.renameSync(beforeMainJSPath, afterMainTSPath)
|
||||||
|
|
||||||
|
// Switch the app.svelte file to use TS
|
||||||
|
const appSveltePath = path.join(projectRoot, "src", "App.svelte")
|
||||||
|
let appFile = fs.readFileSync(appSveltePath, "utf8")
|
||||||
|
appFile = appFile.replace("<script>", '<script lang="ts">')
|
||||||
|
appFile = appFile.replace("export let name;", 'export let name: string;')
|
||||||
|
fs.writeFileSync(appSveltePath, appFile)
|
||||||
|
|
||||||
|
// Edit rollup config
|
||||||
|
const rollupConfigPath = path.join(projectRoot, "rollup.config.js")
|
||||||
|
let rollupConfig = fs.readFileSync(rollupConfigPath, "utf8")
|
||||||
|
|
||||||
|
// Edit imports
|
||||||
|
rollupConfig = rollupConfig.replace(`'rollup-plugin-terser';`, `'rollup-plugin-terser';
|
||||||
|
import sveltePreprocess from 'svelte-preprocess';
|
||||||
|
import typescript from '@rollup/plugin-typescript';`)
|
||||||
|
|
||||||
|
// Replace name of entry point
|
||||||
|
rollupConfig = rollupConfig.replace(`'src/main.js'`, `'src/main.ts'`)
|
||||||
|
|
||||||
|
// Add preprocessor
|
||||||
|
rollupConfig = rollupConfig.replace(
|
||||||
|
'compilerOptions:',
|
||||||
|
'preprocess: sveltePreprocess({ sourceMap: !production }),\n\t\t\tcompilerOptions:'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add TypeScript
|
||||||
|
rollupConfig = rollupConfig.replace(
|
||||||
|
'commonjs(),',
|
||||||
|
'commonjs(),\n\t\ttypescript({\n\t\t\tsourceMap: !production,\n\t\t\tinlineSources: !production\n\t\t}),'
|
||||||
|
);
|
||||||
|
fs.writeFileSync(rollupConfigPath, rollupConfig)
|
||||||
|
|
||||||
|
// Add TSConfig
|
||||||
|
const tsconfig = `{
|
||||||
|
"extends": "@tsconfig/svelte/tsconfig.json",
|
||||||
|
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules/*", "__sapper__/*", "public/*"]
|
||||||
|
}`
|
||||||
|
const tsconfigPath = path.join(projectRoot, "tsconfig.json")
|
||||||
|
fs.writeFileSync(tsconfigPath, tsconfig)
|
||||||
|
|
||||||
|
// Add global.d.ts
|
||||||
|
const dtsPath = path.join(projectRoot, "src", "global.d.ts")
|
||||||
|
fs.writeFileSync(dtsPath, `/// <reference types="svelte" />`)
|
||||||
|
|
||||||
|
// Delete this script, but not during testing
|
||||||
|
if (!argv[2]) {
|
||||||
|
// Remove the script
|
||||||
|
fs.unlinkSync(path.join(__filename))
|
||||||
|
|
||||||
|
// Check for Mac's DS_store file, and if it's the only one left remove it
|
||||||
|
const remainingFiles = fs.readdirSync(path.join(__dirname))
|
||||||
|
if (remainingFiles.length === 1 && remainingFiles[0] === '.DS_store') {
|
||||||
|
fs.unlinkSync(path.join(__dirname, '.DS_store'))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the scripts folder is empty
|
||||||
|
if (fs.readdirSync(path.join(__dirname)).length === 0) {
|
||||||
|
// Remove the scripts folder
|
||||||
|
fs.rmdirSync(path.join(__dirname))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adds the extension recommendation
|
||||||
|
fs.mkdirSync(path.join(projectRoot, ".vscode"), { recursive: true })
|
||||||
|
fs.writeFileSync(path.join(projectRoot, ".vscode", "extensions.json"), `{
|
||||||
|
"recommendations": ["svelte.svelte-vscode"]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
console.log("Converted to TypeScript.")
|
||||||
|
|
||||||
|
if (fs.existsSync(path.join(projectRoot, "node_modules"))) {
|
||||||
|
console.log("\nYou will need to re-run your dependency manager to get started.")
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
<script>
|
||||||
|
let name = "";
|
||||||
|
let greeting = "";
|
||||||
|
|
||||||
|
function greet() {
|
||||||
|
window.go.main.App.Greet(name).then((result) => {
|
||||||
|
greeting = result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div id="logo"></div>
|
||||||
|
<div id="input" data-wails-no-drag>
|
||||||
|
<input id="name" type="text" bind:value={name}>
|
||||||
|
<button class="button" on:click={greet}>Greet</button>
|
||||||
|
</div>
|
||||||
|
{#if greeting}
|
||||||
|
<div id="result">{greeting}</div>
|
||||||
|
{/if}
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
main {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#result {
|
||||||
|
margin-top: 1rem;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
-webkit-appearance: default-button;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#name {
|
||||||
|
border-radius: 3px;
|
||||||
|
outline: none;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
width: 40%;
|
||||||
|
height: 40%;
|
||||||
|
padding-top: 20%;
|
||||||
|
margin: auto;
|
||||||
|
display: block;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url("assets/images/logo-dark.svg");
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com),
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
@ -0,0 +1,53 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 551 436" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,104.01,410.563)">
|
||||||
|
<path d="M0,-51.891L14.429,-51.891L13.043,-21.183L22.568,-51.891L34.226,-51.891L34.084,-21.183L42.365,-51.891L56.794,-51.891L38.526,0L25.198,0L25.34,-32.45L15.211,0L1.919,0L0,-51.891Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,224.985,367.503)">
|
||||||
|
<path d="M0,15.639L5.793,15.639L5.971,-3.589L0,15.639ZM-20.187,33.765L-0.675,-18.126L16.42,-18.126L20.08,33.765L5.437,33.765L5.509,26.123L-3.057,26.123L-5.332,33.765L-20.187,33.765Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.19929,-1.2596,-1.2596,-0.19929,332.323,396.949)">
|
||||||
|
<path d="M-16.046,33.107L36.491,33.107L38.757,18.784L-13.785,18.82L-16.046,33.107Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,353.217,344.388)">
|
||||||
|
<path d="M0,51.891L8.246,0L22.781,0L16.597,39.024L27.224,39.024L25.199,51.891L0,51.891Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(1.27527,0,0,1.27527,427.939,364.922)">
|
||||||
|
<path d="M0,19.83C1.611,21.181 3.305,22.224 5.083,22.959C6.859,23.693 8.565,24.06 10.2,24.06C11.645,24.06 12.794,23.663 13.647,22.87C14.5,22.076 14.927,20.992 14.927,19.617C14.927,18.434 14.571,17.254 13.861,16.081C13.15,14.908 11.775,13.351 9.738,11.408C7.273,9.015 5.58,6.906 4.655,5.081C3.731,3.257 3.27,1.243 3.27,-0.96C3.27,-5.912 4.839,-9.846 7.979,-12.76C11.118,-15.674 15.377,-17.132 20.756,-17.132C22.936,-17.132 25.008,-16.889 26.975,-16.403C28.941,-15.917 30.943,-15.165 32.982,-14.146L30.92,-1.493C29.356,-2.583 27.834,-3.412 26.354,-3.981C24.872,-4.551 23.457,-4.835 22.106,-4.835C20.898,-4.835 19.943,-4.521 19.245,-3.894C18.546,-3.265 18.196,-2.406 18.196,-1.316C18.196,0.154 19.535,2.215 22.213,4.868C22.544,5.2 22.805,5.46 22.995,5.649C25.696,8.304 27.473,10.578 28.326,12.475C29.179,14.37 29.605,16.56 29.605,19.049C29.605,24.594 27.893,28.965 24.469,32.163C21.046,35.361 16.36,36.962 10.413,36.962C7.877,36.962 5.479,36.66 3.216,36.056C0.953,35.45 -0.948,34.615 -2.488,33.549L0,19.83Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)">
|
||||||
|
<path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)">
|
||||||
|
<path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)">
|
||||||
|
<path d="M0.44,-0.04L0.44,-0.04L0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(61.6919,58.8091,58.8091,-61.6919,258.631,180.413)">
|
||||||
|
<path d="M0.5,0L0.5,-0L0.5,0L0.5,0Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)">
|
||||||
|
<path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z" style="fill:url(#_Linear5);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)">
|
||||||
|
<path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" style="fill:url(#_Linear6);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)">
|
||||||
|
<path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.138,0.186L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z" style="fill:url(#_Linear7);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(185.076,176.427,176.427,-185.076,153.446,80.1488)">
|
||||||
|
<path d="M0.735,-0L0.735,-0L0.735,0L0.735,-0Z" style="fill:url(#_Linear8);fill-rule:nonzero;"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-3.46945e-18,-3.46945e-18,-1,0,-3.05761e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,-2.75467e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-1.11022e-16,-1.11022e-16,-1,0,-2.61861e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-5.55112e-17,-5.55112e-17,-1,0,-1.57562e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.801899,-0.59746,-0.59746,0.801899,1.3495,0.447457)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-2.77556e-17,-2.77556e-17,-1,0,-1.92826e-06)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,9.68429e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
<linearGradient id="_Linear8" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,0,1.43665e-07)"><stop offset="0" style="stop-color:rgb(227,50,50);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(107,0,13);stop-opacity:1"/></linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.8 KiB |
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
html {
|
||||||
|
text-align: center;
|
||||||
|
color: white;
|
||||||
|
background-color: rgba(0, 0, 0, 255);
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: white;
|
||||||
|
font-family: 'Nunito', -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overscroll-behavior: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Nunito';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local(''),
|
||||||
|
url('./assets/fonts/nunito-v16-latin-regular.woff2') format('woff2')
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset='utf-8'>
|
||||||
|
<meta content='width=device-width,initial-scale=1' name='viewport'>
|
||||||
|
|
||||||
|
<title>{{.ProjectName}}</title>
|
||||||
|
<link href="/global.css" rel="stylesheet">
|
||||||
|
<script defer src='bundle.js'></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body data-wails-drag>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,7 @@
|
|||||||
|
import App from './App.svelte';
|
||||||
|
|
||||||
|
const app = new App({
|
||||||
|
target: document.body,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default app;
|
@ -0,0 +1,9 @@
|
|||||||
|
# Wails bin directory
|
||||||
|
build/bin
|
||||||
|
|
||||||
|
# IDEs
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# The black hole that is...
|
||||||
|
node_modules
|
@ -0,0 +1,38 @@
|
|||||||
|
module changeme
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
|
||||||
|
require github.com/wailsapp/wails/v2 {{.WailsVersion}}
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/andybalholm/brotli v1.0.2 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab // indirect
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1 // indirect
|
||||||
|
github.com/go-ole/go-ole v1.2.5 // indirect
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0 // indirect
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8 // indirect
|
||||||
|
github.com/google/uuid v1.1.2 // indirect
|
||||||
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5 // indirect
|
||||||
|
github.com/klauspost/compress v1.12.2 // indirect
|
||||||
|
github.com/leaanthony/debme v1.2.1 // indirect
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1 // indirect
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3 // indirect
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210914103035-f00aa774a934 // indirect
|
||||||
|
github.com/leaanthony/slicer v1.5.0 // indirect
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 // indirect
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0 // indirect
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 // indirect
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f // indirect
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5 // indirect
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
|
github.com/valyala/fasthttp v1.28.0 // indirect
|
||||||
|
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
// replace github.com/wailsapp/wails/v2 {{.WailsVersion}} => {{.WailsDirectory}}
|
@ -0,0 +1,228 @@
|
|||||||
|
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||||
|
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
|
||||||
|
github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E=
|
||||||
|
github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab h1:9e2joQGp642wHGFP5m86SDptAavrdGBe8/x9DGEEAaI=
|
||||||
|
github.com/fasthttp/websocket v0.0.0-20200320073529-1554a54587ab/go.mod h1:smsv/h4PBEBaU0XDTY5UwJTpZv69fQ0FfcLJr21mA6Y=
|
||||||
|
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
|
github.com/flytam/filenamify v1.0.0/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1 h1:qevA6c2MtE1RorlScnixeG0VA1H4xrXyhyX3oWBynNQ=
|
||||||
|
github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8=
|
||||||
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
|
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||||
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
|
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
|
||||||
|
github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
|
||||||
|
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||||
|
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
|
||||||
|
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
|
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||||
|
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||||
|
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||||
|
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
|
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||||
|
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
||||||
|
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0 h1:qP3PkGUbBB0i9iQh5E057XI1yO5CZigUxZhyUFYAFoM=
|
||||||
|
github.com/gofiber/fiber/v2 v2.17.0/go.mod h1:iftruuHGkRYGEXVISmdD7HTYWyfS2Bh+Dkfq4n/1Owg=
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8 h1:Hb4y6IxYZVMO0segROODXJiXVgVD3a6i7wnfot8kM6k=
|
||||||
|
github.com/gofiber/websocket/v2 v2.0.8/go.mod h1:fv8HSGQX09sauNv9g5Xq8GeGAaahLFYQKKb4ZdT0x2w=
|
||||||
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/jackmordaunt/icns v1.0.0/go.mod h1:7TTQVEuGzVVfOPPlLNHJIkzA6CoV7aH1Dv9dW351oOo=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20200815041850-dec1ee9a7fd5/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
||||||
|
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||||
|
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
|
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
|
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
|
github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8=
|
||||||
|
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0=
|
||||||
|
github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=
|
||||||
|
github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4=
|
||||||
|
github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM=
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y=
|
||||||
|
github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0=
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210928094513-a94a08b538bd h1:6m4zZ/esiByaDbzgdvDxjsOaIDgtuG1q2cyhjAi6uAg=
|
||||||
|
github.com/leaanthony/go-webview2 v0.0.0-20210928094513-a94a08b538bd/go.mod h1:lS5ds4bruPk9d7lzdF/OH31Z0YCerI6MmHNFGsWoUnM=
|
||||||
|
github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
|
||||||
|
github.com/leaanthony/idgen v1.0.0/go.mod h1:4nBZnt8ml/f/ic/EVQuLxuj817RccT2fyrUaZFxrcVA=
|
||||||
|
github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
|
||||||
|
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7 h1:yoznzWzyxkO/iWdlpq+aPcuJ5Y/hpjq/lmgMFmpjwl0=
|
||||||
|
github.com/leaanthony/typescriptify-golang-structs v0.1.7/go.mod h1:cWtOkiVhMF77e6phAXUcfNwYmMwCJ67Sij24lfvi9Js=
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c=
|
||||||
|
github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk=
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18 h1:5iOd93PZbpH4Iir8QkC4coFD+zEQEZSIRcjwjTFZkr0=
|
||||||
|
github.com/leaanthony/winc v0.0.0-20210921073452-54963136bf18/go.mod h1:KEbMsKoznsebyGHwLk5LqkFOxL5uXSRdvpP4+avmAMs=
|
||||||
|
github.com/leaanthony/winicon v1.0.0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU=
|
||||||
|
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||||
|
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||||
|
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
||||||
|
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||||
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc=
|
||||||
|
github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f h1:PgA+Olipyj258EIEYnpFFONrrCcAIWNUNoFhUfMqAGY=
|
||||||
|
github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f/go.mod h1:lHhJedqxCoHN+zMtwGNTXWmF0u9Jt363FYRhV6g0CdY=
|
||||||
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/tc-hib/winres v0.1.5/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A=
|
||||||
|
github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs=
|
||||||
|
github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ=
|
||||||
|
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
|
||||||
|
github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
|
||||||
|
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
|
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
|
github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs=
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ=
|
||||||
|
github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
|
||||||
|
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||||
|
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
|
github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||||
|
github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
|
||||||
|
github.com/valyala/fasthttp v1.28.0 h1:ruVmTmZaBR5i67NqnjvvH5gEv0zwHfWtbjoyW98iho4=
|
||||||
|
github.com/valyala/fasthttp v1.28.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA=
|
||||||
|
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
||||||
|
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||||
|
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||||
|
github.com/wailsapp/wails/v2 v2.0.0-beta.3 h1:8vhBbnjpYDF6cCUwKadon7J/98UjcP1nrnptUl70Tfg=
|
||||||
|
github.com/wailsapp/wails/v2 v2.0.0-beta.3/go.mod h1:aku28riyHF2G5jmx/qtxjLWi7VwpTjhhX/HVLCptWFA=
|
||||||
|
github.com/wzshiming/ctc v1.2.3/go.mod h1:2tVAtIY7SUyraSk0JxvwmONNPFL4ARavPuEsg5+KA28=
|
||||||
|
github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20=
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
|
||||||
|
github.com/xyproto/xpm v1.2.1/go.mod h1:cMnesLsD0PBXLgjDfTDEaKr8XyTFsnP1QycSqRw7BiY=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww=
|
||||||
|
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
|
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
|
||||||
|
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I=
|
||||||
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo=
|
||||||
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
|
@ -0,0 +1,54 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v2"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/windows"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed frontend/dist
|
||||||
|
var assets embed.FS
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Create an instance of the app structure
|
||||||
|
app := NewApp()
|
||||||
|
|
||||||
|
// Create application with options
|
||||||
|
err := wails.Run(&options.App{
|
||||||
|
Title: "{{.ProjectName}}",
|
||||||
|
Width: 720,
|
||||||
|
Height: 570,
|
||||||
|
MinWidth: 720,
|
||||||
|
MinHeight: 570,
|
||||||
|
MaxWidth: 1280,
|
||||||
|
MaxHeight: 740,
|
||||||
|
DisableResize: false,
|
||||||
|
Fullscreen: false,
|
||||||
|
Frameless: false,
|
||||||
|
StartHidden: false,
|
||||||
|
HideWindowOnClose: false,
|
||||||
|
RGBA: &options.RGBA{R: 255, G: 255, B: 255, A: 255},
|
||||||
|
Assets: assets,
|
||||||
|
LogLevel: logger.DEBUG,
|
||||||
|
OnStartup: app.startup,
|
||||||
|
OnDomReady: app.domReady,
|
||||||
|
OnShutdown: app.shutdown,
|
||||||
|
Bind: []interface{}{
|
||||||
|
app,
|
||||||
|
},
|
||||||
|
// Windows platform specific options
|
||||||
|
Windows: &windows.Options{
|
||||||
|
WebviewIsTransparent: false,
|
||||||
|
WindowIsTranslucent: false,
|
||||||
|
DisableWindowIcon: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"name": "Basic Svelte + Rollup",
|
||||||
|
"shortname": "svelte",
|
||||||
|
"author": "Lea Anthony <lea.anthony@gmail.com>",
|
||||||
|
"description": "Svelte template using rollup to bundle css, images and fonts",
|
||||||
|
"helpurl": "https://github.com/wailsapp/wails"
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "{{.ProjectName}}",
|
||||||
|
"outputfilename": "{{.BinaryName}}",
|
||||||
|
"assetdir": "frontend/dist",
|
||||||
|
"frontend:install": "npm install",
|
||||||
|
"frontend:build": "npm run build",
|
||||||
|
"author": {
|
||||||
|
"name": "{{.AuthorName}}",
|
||||||
|
"email": "{{.AuthorEmail}}"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
# README
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
This template uses vanilla JS / HTML and CSS.
|
||||||
|
|
||||||
|
## Live Development
|
||||||
|
|
||||||
|
To run in live development mode, run `wails dev` in the project directory. The frontend dev server will run
|
||||||
|
on http://localhost:34115. Open this in your browser to connect to your application.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
For a production build, use `wails build`.
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// App struct
|
||||||
|
type App struct {
|
||||||
|
ctx context.Context
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewApp creates a new App application struct
|
||||||
|
func NewApp() *App {
|
||||||
|
return &App{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// startup is called at application startup
|
||||||
|
func (b *App) startup(ctx context.Context) {
|
||||||
|
// Perform your setup here
|
||||||
|
b.ctx = ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
// domReady is called after the front-end dom has been loaded
|
||||||
|
func (b *App) domReady(ctx context.Context) {
|
||||||
|
// Add your action here
|
||||||
|
}
|
||||||
|
|
||||||
|
// shutdown is called at application termination
|
||||||
|
func (b *App) shutdown(ctx context.Context) {
|
||||||
|
// Perform your teardown here
|
||||||
|
}
|
||||||
|
|
||||||
|
// Greet returns a greeting for the given name
|
||||||
|
func (b *App) Greet(name string) string {
|
||||||
|
return fmt.Sprintf("Hello %s, It's show time!", name)
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com),
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user