stash
This commit is contained in:
parent
9ce700c388
commit
35be834799
8 changed files with 92 additions and 15 deletions
|
|
@ -5,6 +5,30 @@ import {existsSync} from 'node:fs'
|
|||
import {defineConfig} from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
// Vite's dev-server SPA fallback only rewrites a request to index.html when the last path
|
||||
// segment has no dot (it sniffs for a file extension). A route whose only/last segment is a
|
||||
// URL-encoded handle (e.g. /groups/+user@a.localhost, see encodeHandleForUrl in src/router.js)
|
||||
// legitimately contains a dot from the domain part, so a direct load/refresh 404s there unless
|
||||
// we pre-empt that check ourselves. Gating on both a text/html Accept header and an '@' in the
|
||||
// last segment keeps this from ever matching real asset requests or vite's own internal
|
||||
// @fs/@id/@vite module paths (which never carry an html Accept header).
|
||||
function handleUrlFallback() {
|
||||
return {
|
||||
name: 'handle-url-fallback',
|
||||
configureServer(server) {
|
||||
server.middlewares.use((req, res, next) => {
|
||||
const accept = req.headers.accept || ''
|
||||
const pathname = (req.url || '').split('?')[0]
|
||||
const lastSegment = pathname.slice(pathname.lastIndexOf('/') + 1)
|
||||
if (req.method === 'GET' && accept.includes('text/html') && lastSegment.includes('@')) {
|
||||
req.url = '/index.html'
|
||||
}
|
||||
next()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function gitCommit() {
|
||||
// deploy/dev/docker-compose.yml bind-mounts the repo's real .git dir at
|
||||
// /git (separate from /app, which only has the frontend/ subtree) -
|
||||
|
|
@ -23,7 +47,7 @@ function gitCommit() {
|
|||
}
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
plugins: [vue(), handleUrlFallback()],
|
||||
define: {
|
||||
__GIT_COMMIT__: JSON.stringify(gitCommit())
|
||||
},
|
||||
|
|
@ -44,6 +68,10 @@ export default defineConfig({
|
|||
//'Upgrade-Insecure-Requests': '1',
|
||||
'Content-Security-Policy': 'default-src \'self\';'
|
||||
+ ' script-src \'self\' \'wasm-unsafe-eval\' \'unsafe-eval\' \'unsafe-inline\';'
|
||||
// Without this, worker-src falls back to script-src, which has no blob: source -
|
||||
// CameraScanner.vue's decode Worker (built from a Blob URL) would be silently
|
||||
// blocked by CSP rather than the app's own capability checks.
|
||||
+ ' worker-src \'self\' blob:;'
|
||||
+ ' style-src \'self\' \'unsafe-inline\';'
|
||||
+ ' img-src \'self\' * data: blob:;'
|
||||
+ ' connect-src * data:',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue