Merge pull request #1 from johnbintz/updates
Get Hugo 0.69.0 working, other updates
This commit is contained in:
commit
d80ef5df18
2
.sandstorm/Vagrantfile
vendored
2
.sandstorm/Vagrantfile
vendored
@ -16,7 +16,7 @@ end
|
|||||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
# Base on the Sandstorm snapshots of the official Debian 8 (jessie) box.
|
# Base on the Sandstorm snapshots of the official Debian 8 (jessie) box.
|
||||||
config.vm.box = "debian/contrib-stretch64"
|
config.vm.box = "debian/contrib-stretch64"
|
||||||
config.vm.box_version = "9.3.0"
|
config.vm.box_version = ">= 0"
|
||||||
|
|
||||||
if Vagrant.has_plugin?("vagrant-vbguest") then
|
if Vagrant.has_plugin?("vagrant-vbguest") then
|
||||||
# vagrant-vbguest is a Vagrant plugin that upgrades
|
# vagrant-vbguest is a Vagrant plugin that upgrades
|
||||||
|
@ -21,5 +21,5 @@ fi
|
|||||||
|
|
||||||
cd /opt/app
|
cd /opt/app
|
||||||
cp post-receive /var/git/.git/hooks
|
cp post-receive /var/git/.git/hooks
|
||||||
caddy &
|
|
||||||
NODE_ENV=production HOME=/tmp npm start
|
npm start
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -17,11 +17,11 @@ const pkgdef :Spk.PackageDefinition = (
|
|||||||
# This manifest is included in your app package to tell Sandstorm
|
# This manifest is included in your app package to tell Sandstorm
|
||||||
# about your app.
|
# about your app.
|
||||||
|
|
||||||
appTitle = (defaultText = "Hugo"),
|
appTitle = (defaultText = "Hugo (new)"),
|
||||||
|
|
||||||
appVersion = 3, # Increment this for every release.
|
appVersion = 4, # Increment this for every release.
|
||||||
|
|
||||||
appMarketingVersion = (defaultText = "0.20.7-sandstorm3"),
|
appMarketingVersion = (defaultText = "0.69.0-sandstorm"),
|
||||||
# Human-readable representation of appVersion. Should match the way you
|
# Human-readable representation of appVersion. Should match the way you
|
||||||
# identify versions of your app in documentation and marketing.
|
# identify versions of your app in documentation and marketing.
|
||||||
|
|
||||||
@ -242,6 +242,8 @@ const myCommand :Spk.Manifest.Command = (
|
|||||||
# Note that this defines the *entire* environment seen by your app.
|
# Note that this defines the *entire* environment seen by your app.
|
||||||
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"),
|
(key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"),
|
||||||
(key = "SANDSTORM", value = "1"),
|
(key = "SANDSTORM", value = "1"),
|
||||||
|
(key = "HOME", value = "/var"),
|
||||||
|
(key = "NODE_ENV", value = "production"),
|
||||||
# Export SANDSTORM=1 into the environment, so that apps running within Sandstorm
|
# Export SANDSTORM=1 into the environment, so that apps running within Sandstorm
|
||||||
# can detect if $SANDSTORM="1" at runtime, switching UI and/or backend to use
|
# can detect if $SANDSTORM="1" at runtime, switching UI and/or backend to use
|
||||||
# the app's Sandstorm-specific integration code.
|
# the app's Sandstorm-specific integration code.
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
export HUGO_VERSION=0.69.0
|
||||||
|
export NODE_VERSION=10
|
||||||
|
|
||||||
apt-get update
|
apt-get update
|
||||||
apt-get install -y git
|
apt-get install -y git
|
||||||
|
|
||||||
@ -14,9 +17,9 @@ apt-get install -y git
|
|||||||
if [ ! -e /usr/local/bin/capnp ] ; then
|
if [ ! -e /usr/local/bin/capnp ] ; then
|
||||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -q clang autoconf pkg-config libtool
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -q clang autoconf pkg-config libtool
|
||||||
cd /tmp
|
cd /tmp
|
||||||
if [ ! -e capnproto ]; then git clone https://github.com/sandstorm-io/capnproto; fi
|
if [ ! -e capnproto ]; then git clone https://github.com/capnproto/capnproto; fi
|
||||||
cd capnproto
|
cd capnproto
|
||||||
git checkout f73ac9f6667d7b87c395d23f3753dde63937cf00
|
git checkout master
|
||||||
cd c++
|
cd c++
|
||||||
autoreconf -i
|
autoreconf -i
|
||||||
./configure
|
./configure
|
||||||
@ -33,7 +36,7 @@ fi
|
|||||||
|
|
||||||
cp /opt/app/sandstorm-integration/bin/getPublicId /usr/local/bin
|
cp /opt/app/sandstorm-integration/bin/getPublicId /usr/local/bin
|
||||||
|
|
||||||
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
|
curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | sudo -E bash -
|
||||||
apt-get install -y nodejs
|
apt-get install -y nodejs
|
||||||
npm install -g yarn
|
npm install -g yarn
|
||||||
|
|
||||||
@ -41,16 +44,6 @@ apt-get install -y python-pip asciidoctor
|
|||||||
pip install pygments
|
pip install pygments
|
||||||
|
|
||||||
cd /tmp
|
cd /tmp
|
||||||
wget https://github.com/gohugoio/hugo/releases/download/v0.49.2/hugo_0.49.2_Linux-64bit.deb -O hugo.deb
|
wget https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.deb -O hugo.deb
|
||||||
dpkg -i hugo.deb
|
dpkg -i hugo.deb
|
||||||
rm hugo.deb
|
rm hugo.deb
|
||||||
# cd /tmp
|
|
||||||
# wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz -O go.tar.gz
|
|
||||||
# tar xfz go.tar.gz
|
|
||||||
# mv go /usr/local
|
|
||||||
# rm go.tar.gz
|
|
||||||
wget "https://caddyserver.com/download/build?os=linux&arch=amd64&features=filemanager%2Chugo" -O /tmp/caddy.tar.gz
|
|
||||||
cd /tmp
|
|
||||||
tar xfz caddy.tar.gz
|
|
||||||
mv caddy /usr/local/bin
|
|
||||||
rm caddy.tar.gz
|
|
||||||
|
28
CHANGELOG.md
28
CHANGELOG.md
@ -1,3 +1,27 @@
|
|||||||
# V0 (2016-10-10)
|
## V0 (2016-10-10)
|
||||||
|
|
||||||
* Initial release.
|
* Initial release.
|
||||||
|
|
||||||
|
## 0.69.0 (2020-04-10)
|
||||||
|
|
||||||
|
The "I can't stand Hugo 0.20.something anymore" release.
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* Upgrade Hugo to 0.69.0
|
||||||
|
* Remove Caddy & admin interface for now
|
||||||
|
* This never quite worked right for me and direct support for
|
||||||
|
Hugo management was [dropped during Caddy 2 development](https://caddy.community/t/new-old-plugin-http-filebrowser/5103).
|
||||||
|
Bringing back Caddy would require a bit more work than I'm able to put into
|
||||||
|
it for this release.
|
||||||
|
* Update NodeJS to 10 and `yarn upgrade` all transitive dependencies
|
||||||
|
|
||||||
|
### Workarounds
|
||||||
|
|
||||||
|
* For some reason the `getPublicId` script causes some part of Cap'n Proto to
|
||||||
|
crash the grain when executed, specifically as the script is exiting.
|
||||||
|
I've tried everything I know to have it not do that, but ended up with a
|
||||||
|
terrible workaround: capture the stdout of the script to a file as it
|
||||||
|
executes and memoize the output based on the session ID parameter.
|
||||||
|
For my single-person Sandstorm server, this seems fine. I would love help
|
||||||
|
figuring this out.
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
127.0.0.1:8001
|
|
||||||
errors stderr
|
|
||||||
log stdout
|
|
||||||
hugo /var/git {
|
|
||||||
allow_commands false
|
|
||||||
after_save "/opt/app/commit-on-save {path}"
|
|
||||||
}
|
|
28
README.md
28
README.md
@ -1,34 +1,36 @@
|
|||||||
Hugo Sandstorm package
|
# Hugo Sandstorm package
|
||||||
===========================
|
|
||||||
|
|
||||||
This is the [Sandstorm](https://sandstorm.io) package of [Hugo](https://gohugo.io/).
|
This is the [Sandstorm](https://sandstorm.io) package of [Hugo](https://gohugo.io/).
|
||||||
|
The version of Hugo in this build is 0.69.0.
|
||||||
|
|
||||||
![Hugo screenshot](.sandstorm/app-graphics/screenshot2.png "Hugo administration view in Sandstorm")
|
## Development
|
||||||
|
|
||||||
# How to
|
The package is built with [vagrant-spk](https://github.com/sandstorm-io/vagrant-spk),
|
||||||
|
a tool designed to help app developers package apps for [Sandstorm](https://sandstorm.io).
|
||||||
The package is done with [vagrant-spk](https://github.com/sandstorm-io/vagrant-spk), a tool designed to help app developers package apps for [Sandstorm](https://sandstorm.io).
|
|
||||||
|
|
||||||
You can follow the below mentioned steps to make your own package or to contribute.
|
You can follow the below mentioned steps to make your own package or to contribute.
|
||||||
|
|
||||||
## Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
You will need to install:
|
You will need to install:
|
||||||
- [Vagrant](https://www.vagrantup.com/)
|
|
||||||
- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
|
* [Vagrant](https://www.vagrantup.com/)
|
||||||
- Git
|
* [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
|
||||||
|
* Git
|
||||||
|
|
||||||
## Step by Step
|
## Step by Step
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/sandstorm-io/vagrant-spk
|
git clone https://github.com/sandstorm-io/vagrant-spk
|
||||||
git clone https://github.com/ndarilek/hugo-sandstorm
|
git clone https://github.com/johnbintz/hugo-sandstorm
|
||||||
export PATH=$(pwd)/vagrant-spk:$PATH
|
export PATH=$(pwd)/vagrant-spk:$PATH
|
||||||
cd hugo-sandstorm
|
cd hugo-sandstorm
|
||||||
vagrant-spk vm up
|
vagrant-spk vm up
|
||||||
vagrant-spk dev
|
vagrant-spk dev
|
||||||
```
|
```
|
||||||
|
|
||||||
visit [http://local.sandstorm.io:6080/](http://local.sandstorm.io:6080/) in a web browser
|
Visit [http://local.sandstorm.io:6080/](http://local.sandstorm.io:6080/) in a web browser.
|
||||||
|
|
||||||
Note: when you want to fork this repo and create actual app packages for the app store you would need either the original app key or create a new one and make your own version of the app.
|
Note: when you want to fork this repo and create actual app packages for the app
|
||||||
|
store you would need either the original app key or
|
||||||
|
[create a new one and make your own version of the app](https://docs.sandstorm.io/en/latest/developing/publishing-apps/).
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
cd /var/git
|
|
||||||
git add $1
|
|
||||||
git commit $1 -m "Saved $1 via administrative interface."
|
|
||||||
/var/git/.git/hooks/post-receive
|
|
@ -1,3 +1,3 @@
|
|||||||
Introducing [Hugo](https://gohugo.io), a new idea for making website creation simple again. Hugo works flexibly with many formats, and is ideal for blogs, docs, portfolios and much more. Hugo’s speed fosters creativity—it makes building a website fun again.
|
Introducing [Hugo](https://gohugo.io), a new idea for making website creation simple again. Hugo works flexibly with many formats, and is ideal for blogs, docs, portfolios and much more. Hugo’s speed fosters creativity—it makes building a website fun again.
|
||||||
|
|
||||||
Enjoy powerful syntax highlighting for a large variety of programming languages with integrated Pygments support. Publish books, manuals, and other complex Asciidoc material with the included Asciidoctor distribution. Updates and themes can be pushed directly to an embedded Git repository, or can be edited via a web-based administrative interface.
|
Enjoy powerful syntax highlighting for a large variety of programming languages with integrated Pygments support. Publish books, manuals, and other complex Asciidoc material with the included Asciidoctor distribution. Updates and themes are pushed directly to an embedded Git repository.
|
||||||
|
@ -1,28 +1,41 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<p>Your public site is available at <a :href="url" target="_blank">{{ url }}</a>.</p>
|
<template v-if="isLoading">
|
||||||
<div v-if="!isDemo">
|
<p>
|
||||||
<p>To set up your domain to point at your public site, add the following DNS records to your domain. Replace <code>blog.example.com</code> with your site's hostname.</p>
|
Loading public site information...
|
||||||
<table>
|
</p>
|
||||||
<thead>
|
</template>
|
||||||
<th>Name</th>
|
<template v-else-if="loadError">
|
||||||
<th>Type</th>
|
<p>
|
||||||
<th>Value</th>
|
Unable to load public site information! Try restarting the grain.
|
||||||
</thead>
|
This is a known bug.
|
||||||
<tbody>
|
</p>
|
||||||
<tr>
|
</template>
|
||||||
<td>blog.example.com</td>
|
<template v-else>
|
||||||
<td>CNAME</td>
|
<p>Your public site is available at <a :href="url" rel="noopener" target="_blank">{{ url }}</a>.</p>
|
||||||
<td>{{ domain }}</td>
|
<div v-if="!isDemo">
|
||||||
</tr>
|
<p>To set up your domain to point at your public site, add the following DNS records to your domain. Replace <code>blog.example.com</code> with your site's hostname.</p>
|
||||||
<tr>
|
<table>
|
||||||
<td>sandstorm-www.blog.example.com</td>
|
<thead>
|
||||||
<td>TXT</td>
|
<th>Name</th>
|
||||||
<td>{{ publicId }}</td>
|
<th>Type</th>
|
||||||
</tr>
|
<th>Value</th>
|
||||||
</tbody>
|
</thead>
|
||||||
</table>
|
<tbody>
|
||||||
</div>
|
<tr>
|
||||||
|
<td>blog.example.com</td>
|
||||||
|
<td>CNAME</td>
|
||||||
|
<td>{{ domain }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>sandstorm-www.blog.example.com</td>
|
||||||
|
<td>TXT</td>
|
||||||
|
<td>{{ publicId }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<h2>Editing Your Site</h2>
|
<h2>Editing Your Site</h2>
|
||||||
<p>To check out the Git repository containing your site, first add an authorization key to Git:</p>
|
<p>To check out the Git repository containing your site, first add an authorization key to Git:</p>
|
||||||
<render-template
|
<render-template
|
||||||
@ -45,7 +58,11 @@
|
|||||||
rpcId="gitPush"
|
rpcId="gitPush"
|
||||||
:template="'git remote add origin ' + this.gitUrl + '\ngit push -fu origin master'"/>
|
:template="'git remote add origin ' + this.gitUrl + '\ngit push -fu origin master'"/>
|
||||||
<h2>Admin Interface</h2>
|
<h2>Admin Interface</h2>
|
||||||
<p>Simple site changes can be made directly in the included <a href="/admin/">administrative interface</a>.</p>
|
<p>
|
||||||
|
...had to be removed temporarily because Caddy 1 isn't recommended anymore and
|
||||||
|
<a target="_blank" rel="noopener" href="https://caddy.community/t/new-old-plugin-http-filebrowser/5103">Caddy 2 needs some work to get working well with Hugo</a>.
|
||||||
|
<a target="_blank" rel="noopener" href="https://github.com/johnbintz/hugo-sandstorm">Want to help?</a>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -58,7 +75,9 @@
|
|||||||
isDemo: true,
|
isDemo: true,
|
||||||
url: "",
|
url: "",
|
||||||
domain: "",
|
domain: "",
|
||||||
publicId: ""
|
publicId: "",
|
||||||
|
isLoading: true,
|
||||||
|
loadError: null
|
||||||
}),
|
}),
|
||||||
computed: {
|
computed: {
|
||||||
gitHost: () => {
|
gitHost: () => {
|
||||||
@ -74,17 +93,25 @@
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
// mounted actions occur immediately. we use async here to
|
||||||
fetch("/publicId", {
|
// simplify promise handling.
|
||||||
credentials: "same-origin"
|
async mounted () {
|
||||||
}).then((r) => r.json())
|
this.isLoading = true
|
||||||
.then((r) => {
|
try {
|
||||||
this.isDemo = r.isDemo
|
const result = await fetch("/publicId", {
|
||||||
this.url = r.url
|
credentials: "same-origin"
|
||||||
this.publicId = r.publicId
|
})
|
||||||
this.domain = r.domain
|
const jsonResult = await result.json()
|
||||||
})
|
this.isDemo = jsonResult.isDemo
|
||||||
.catch(console.error)
|
this.url = jsonResult.url
|
||||||
|
this.publicId = jsonResult.publicId
|
||||||
|
this.domain = jsonResult.domain
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
this.loadError = e
|
||||||
|
} finally {
|
||||||
|
this.isLoading = false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
head: {
|
head: {
|
||||||
title: "Home"
|
title: "Home"
|
||||||
|
@ -48,7 +48,10 @@ namespace sandstorm {
|
|||||||
request.setId(sessionId);
|
request.setId(sessionId);
|
||||||
auto session = request.send().getContext().castAs<HackSessionContext>();
|
auto session = request.send().getContext().castAs<HackSessionContext>();
|
||||||
|
|
||||||
kj::Promise<void> promise = session.getPublicIdRequest().send().then([](auto result) {
|
kj::Promise<void> promise = session
|
||||||
|
.getPublicIdRequest()
|
||||||
|
.send()
|
||||||
|
.then([](capnp::Response<sandstorm::HackSessionContext::GetPublicIdResults>&& result) {
|
||||||
auto publicId = result.getPublicId();
|
auto publicId = result.getPublicId();
|
||||||
auto hostname = result.getHostname();
|
auto hostname = result.getHostname();
|
||||||
auto autoUrl = result.getAutoUrl();
|
auto autoUrl = result.getAutoUrl();
|
||||||
@ -73,3 +76,4 @@ namespace sandstorm {
|
|||||||
} // namespace sandstorm
|
} // namespace sandstorm
|
||||||
|
|
||||||
KJ_MAIN(sandstorm::GetPublicIdMain)
|
KJ_MAIN(sandstorm::GetPublicIdMain)
|
||||||
|
|
||||||
|
61
server.js
61
server.js
@ -1,9 +1,11 @@
|
|||||||
import Nuxt from "nuxt"
|
import Nuxt from "nuxt"
|
||||||
import logger from "morgan"
|
import logger from "morgan"
|
||||||
const exec = require("child_process").exec
|
import fs from 'fs'
|
||||||
import Express from "express"
|
import Express from "express"
|
||||||
import gitBackend from "git-http-backend"
|
import gitBackend from "git-http-backend"
|
||||||
import httpProxy from "http-proxy"
|
// TODO: once Caddy 2 or something similar is in place, reinstate the
|
||||||
|
// admin proxy.
|
||||||
|
//import httpProxy from "http-proxy"
|
||||||
const spawn = require("child_process").spawn
|
const spawn = require("child_process").spawn
|
||||||
|
|
||||||
const app = new Express()
|
const app = new Express()
|
||||||
@ -17,17 +19,52 @@ app.set("port", port)
|
|||||||
|
|
||||||
app.get("/publicId", (req, res) => {
|
app.get("/publicId", (req, res) => {
|
||||||
const sessionId = req.headers["x-sandstorm-session-id"]
|
const sessionId = req.headers["x-sandstorm-session-id"]
|
||||||
exec(`getPublicId ${sessionId}`, (err, rv) => {
|
let allData = ""
|
||||||
if(err)
|
// TODO: figure out why Cap'n Proto keeps crashing when
|
||||||
return res.end(err)
|
// getPublicId exits so we can get rid of this weird
|
||||||
const lines = rv.split("\n")
|
// memoization hack I had to do!
|
||||||
|
const file = `/var/publicid-${sessionId}`
|
||||||
|
|
||||||
|
const handleResult = () => {
|
||||||
|
const lines = allData.split("\n")
|
||||||
const publicId = lines[0]
|
const publicId = lines[0]
|
||||||
const hostname = lines[1]
|
const hostname = lines[1]
|
||||||
const domain = publicId+"."+hostname
|
const domain = publicId+"."+hostname
|
||||||
const url = lines[2]
|
const url = lines[2]
|
||||||
const isDemo = lines[3] == "true"
|
const isDemo = lines[3] == "true"
|
||||||
res.json({publicId, hostname, domain, url, isDemo})
|
res.json({publicId, hostname, domain, url, isDemo})
|
||||||
})
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
allData = fs.readFileSync(file, 'utf8').toString()
|
||||||
|
} catch (e) {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
const lines = allData.split("\n")
|
||||||
|
if (lines.length >= 4) {
|
||||||
|
handleResult()
|
||||||
|
} else {
|
||||||
|
const gpId = spawn('getPublicId', [sessionId])
|
||||||
|
allData = ""
|
||||||
|
|
||||||
|
gpId.stdout.on('data', (data) => {
|
||||||
|
fs.appendFileSync(file, data)
|
||||||
|
allData += data
|
||||||
|
})
|
||||||
|
|
||||||
|
gpId.on('error', (err) => {
|
||||||
|
return res.send(err)
|
||||||
|
})
|
||||||
|
|
||||||
|
gpId.on('close', (code) => {
|
||||||
|
if (code !== 0) {
|
||||||
|
return res.send(code)
|
||||||
|
}
|
||||||
|
|
||||||
|
handleResult()
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.use("/git", (req, res) => {
|
app.use("/git", (req, res) => {
|
||||||
@ -41,12 +78,12 @@ app.use("/git", (req, res) => {
|
|||||||
})).pipe(res)
|
})).pipe(res)
|
||||||
})
|
})
|
||||||
|
|
||||||
const proxy = httpProxy.createProxyServer({
|
//const proxy = httpProxy.createProxyServer({
|
||||||
target: "http://127.0.0.1:8001/admin/",
|
// target: "http://127.0.0.1:8001/admin/",
|
||||||
changeOrigin: true
|
// changeOrigin: true
|
||||||
})
|
//})
|
||||||
|
|
||||||
app.use("/admin/", (req, res) => proxy.web(req, res))
|
// app.use("/admin/", (req, res) => proxy.web(req, res))
|
||||||
|
|
||||||
// Import and Set Nuxt.js options
|
// Import and Set Nuxt.js options
|
||||||
let config = require("./nuxt.config.js")
|
let config = require("./nuxt.config.js")
|
||||||
|
Loading…
Reference in New Issue
Block a user