Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1347bcc3c | ||
|
|
c7e170b1a3 | ||
|
|
3d75384848 | ||
|
|
bf4819b241 | ||
|
|
7dd6050416 | ||
|
|
bb0ad8ff32 | ||
|
|
9eb192146a | ||
|
|
1b6e6ad142 | ||
|
|
f0d4a9e6f0 | ||
|
|
a2cbe7f5c8 | ||
|
|
57395b8dc7 | ||
|
|
a11e783cde | ||
|
|
e2e22517b6 | ||
|
|
d8e0399e92 | ||
|
|
f456897520 | ||
|
|
9303035bb9 | ||
|
|
3c40219003 | ||
|
|
392b339727 | ||
|
|
852eff8de6 | ||
|
|
c74a15c40c | ||
|
|
5419425834 | ||
|
|
f3a386079b | ||
|
|
aa43713943 | ||
|
|
1dece10679 | ||
|
|
c4f16d786a | ||
|
|
36b8adc019 | ||
|
|
bfe0b4757d | ||
|
|
2b61e55783 | ||
|
|
36c4f451b3 | ||
|
|
268d4ae7fa | ||
|
|
1b49e02cd8 | ||
|
|
9a55a6ec39 | ||
|
|
faaf6f770f | ||
|
|
79e4ed6e8b | ||
|
|
f956df1272 | ||
|
|
089ef56b10 | ||
|
|
c4e8721a2b | ||
|
|
a2efc2f767 | ||
|
|
c0e1c55453 | ||
|
|
860ca52e2d | ||
|
|
b891a1e3c0 | ||
|
|
70fb3b5dbe | ||
|
|
5bcc744867 | ||
|
|
da75226a63 | ||
|
|
974a061b44 | ||
|
|
7c50f5f1d7 | ||
|
|
4bf3f4d1e0 | ||
|
|
46da573715 |
@@ -1,2 +0,0 @@
|
|||||||
*.min.*
|
|
||||||
server/scripts/vendor/*
|
|
||||||
92
.eslintrc
@@ -1,92 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"es6": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": [
|
|
||||||
"airbnb-base"
|
|
||||||
],
|
|
||||||
"globals": {
|
|
||||||
"TravelCities": "readonly",
|
|
||||||
"RegionalCities": "readonly",
|
|
||||||
"StationInfo": "readonly",
|
|
||||||
"SunCalc": "readonly",
|
|
||||||
"NoSleep": "readonly",
|
|
||||||
"OVERRIDES": "readonly"
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": "latest",
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"plugins": [],
|
|
||||||
"rules": {
|
|
||||||
"indent": [
|
|
||||||
"error",
|
|
||||||
"tab",
|
|
||||||
{
|
|
||||||
"SwitchCase": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-tabs": 0,
|
|
||||||
"no-console": 0,
|
|
||||||
"max-len": 0,
|
|
||||||
"no-use-before-define": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"variables": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-param-reassign": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"props": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-mixed-operators": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"groups": [
|
|
||||||
[
|
|
||||||
"&",
|
|
||||||
"|",
|
|
||||||
"^",
|
|
||||||
"~",
|
|
||||||
"<<",
|
|
||||||
">>",
|
|
||||||
">>>"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"==",
|
|
||||||
"!=",
|
|
||||||
"===",
|
|
||||||
"!==",
|
|
||||||
">",
|
|
||||||
">=",
|
|
||||||
"<",
|
|
||||||
"<="
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"&&",
|
|
||||||
"||"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"in",
|
|
||||||
"instanceof"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"allowSamePrecedence": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"import/extensions": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"mjs": "always",
|
|
||||||
"json": "always"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ignorePatterns": [
|
|
||||||
"*.min.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
6
.github/workflows/build-docker.yaml
vendored
@@ -3,7 +3,7 @@ name: build-docker
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- '**'
|
||||||
tags:
|
tags:
|
||||||
- 'v*.*.*'
|
- 'v*.*.*'
|
||||||
- 'v*.*'
|
- 'v*.*'
|
||||||
@@ -49,8 +49,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
pull: true
|
pull: true
|
||||||
push: ${{ github.ref == 'refs/heads/main' }}
|
push: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') }}
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
|
platforms: linux/amd64,linux/arm64/v8
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
|
|||||||
@@ -139,6 +139,11 @@ Ws4kp is muted by default, but if it was unmuted on the last visit it is coded t
|
|||||||
|
|
||||||
Chrome seems to be more lenient on auto play and will eventually let a site auto-play music if you're visited it enough recently and manually clicked to start playing music on each visit. It also has a flag you can add to the command line when launching Chrome: `chrome.exe --autoplay-policy=no-user-gesture-required`. This is the best solution when using Kiosk-style setup.
|
Chrome seems to be more lenient on auto play and will eventually let a site auto-play music if you're visited it enough recently and manually clicked to start playing music on each visit. It also has a flag you can add to the command line when launching Chrome: `chrome.exe --autoplay-policy=no-user-gesture-required`. This is the best solution when using Kiosk-style setup.
|
||||||
|
|
||||||
|
If you're unable to pre-set the play state before entering kiosk mode (such as with a home dashboard implemenation) you can add the query string value below to the url. The browser will still follow the auto play rules outlined above.
|
||||||
|
```
|
||||||
|
?settings-mediaPlaying-boolean=true
|
||||||
|
```
|
||||||
|
|
||||||
## Community Notes
|
## Community Notes
|
||||||
|
|
||||||
Thanks to the WeatherStar community for providing these discussions to further extend your retro forecasts!
|
Thanks to the WeatherStar community for providing these discussions to further extend your retro forecasts!
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
// pass through api requests
|
|
||||||
|
|
||||||
// http(s) modules
|
|
||||||
import https from 'https';
|
|
||||||
|
|
||||||
// url parsing
|
|
||||||
import queryString from 'querystring';
|
|
||||||
|
|
||||||
// return an express router
|
|
||||||
const cors = (req, res) => {
|
|
||||||
// add out-going headers
|
|
||||||
const headers = {};
|
|
||||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
|
||||||
headers.accept = req.headers.accept;
|
|
||||||
|
|
||||||
// get query paramaters if the exist
|
|
||||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
|
||||||
// skip the paramater 'u'
|
|
||||||
if (key === 'u') return acc;
|
|
||||||
// add the paramter to the resulting object
|
|
||||||
acc[key] = req.query[key];
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
let query = queryString.encode(queryParams);
|
|
||||||
if (query.length > 0) query = `?${query}`;
|
|
||||||
|
|
||||||
// get the page
|
|
||||||
https.get(`https://api.weather.gov${req.path}${query}`, {
|
|
||||||
headers,
|
|
||||||
}, (getRes) => {
|
|
||||||
// pull some info
|
|
||||||
const { statusCode } = getRes;
|
|
||||||
// pass the status code through
|
|
||||||
res.status(statusCode);
|
|
||||||
|
|
||||||
// set headers
|
|
||||||
res.header('content-type', getRes.headers['content-type']);
|
|
||||||
// pipe to response
|
|
||||||
getRes.pipe(res);
|
|
||||||
}).on('error', (e) => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default cors;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
// pass through api requests
|
|
||||||
|
|
||||||
// http(s) modules
|
|
||||||
import https from 'https';
|
|
||||||
|
|
||||||
// url parsing
|
|
||||||
import queryString from 'querystring';
|
|
||||||
|
|
||||||
// return an express router
|
|
||||||
const outlook = (req, res) => {
|
|
||||||
// add out-going headers
|
|
||||||
const headers = {};
|
|
||||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
|
||||||
headers.accept = req.headers.accept;
|
|
||||||
|
|
||||||
// get query paramaters if the exist
|
|
||||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
|
||||||
// skip the paramater 'u'
|
|
||||||
if (key === 'u') return acc;
|
|
||||||
// add the paramter to the resulting object
|
|
||||||
acc[key] = req.query[key];
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
let query = queryString.encode(queryParams);
|
|
||||||
if (query.length > 0) query = `?${query}`;
|
|
||||||
|
|
||||||
// get the page
|
|
||||||
https.get(`https://www.cpc.ncep.noaa.gov/${req.path}${query}`, {
|
|
||||||
headers,
|
|
||||||
}, (getRes) => {
|
|
||||||
// pull some info
|
|
||||||
const { statusCode } = getRes;
|
|
||||||
// pass the status code through
|
|
||||||
res.status(statusCode);
|
|
||||||
|
|
||||||
// set headers
|
|
||||||
res.header('content-type', getRes.headers['content-type']);
|
|
||||||
res.header('last-modified', getRes.headers['last-modified']);
|
|
||||||
// pipe to response
|
|
||||||
getRes.pipe(res);
|
|
||||||
}).on('error', (e) => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default outlook;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
// pass through api requests
|
|
||||||
|
|
||||||
// http(s) modules
|
|
||||||
import https from 'https';
|
|
||||||
|
|
||||||
// url parsing
|
|
||||||
import queryString from 'querystring';
|
|
||||||
|
|
||||||
// return an express router
|
|
||||||
const radar = (req, res) => {
|
|
||||||
// add out-going headers
|
|
||||||
const headers = {};
|
|
||||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
|
||||||
headers.accept = req.headers.accept;
|
|
||||||
|
|
||||||
// get query paramaters if the exist
|
|
||||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
|
||||||
// skip the paramater 'u'
|
|
||||||
if (key === 'u') return acc;
|
|
||||||
// add the paramter to the resulting object
|
|
||||||
acc[key] = req.query[key];
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
let query = queryString.encode(queryParams);
|
|
||||||
if (query.length > 0) query = `?${query}`;
|
|
||||||
|
|
||||||
// get the page
|
|
||||||
https.get(`https://radar.weather.gov${req.path}${query}`, {
|
|
||||||
headers,
|
|
||||||
}, (getRes) => {
|
|
||||||
// pull some info
|
|
||||||
const { statusCode } = getRes;
|
|
||||||
// pass the status code through
|
|
||||||
res.status(statusCode);
|
|
||||||
|
|
||||||
// set headers
|
|
||||||
res.header('content-type', getRes.headers['content-type']);
|
|
||||||
res.header('last-modified', getRes.headers['last-modified']);
|
|
||||||
// pipe to response
|
|
||||||
getRes.pipe(res);
|
|
||||||
}).on('error', (e) => {
|
|
||||||
console.error(e);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default radar;
|
|
||||||
105
eslint.config.mjs
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
import { FlatCompat } from '@eslint/eslintrc';
|
||||||
|
|
||||||
|
const compat = new FlatCompat({
|
||||||
|
});
|
||||||
|
|
||||||
|
export default [{
|
||||||
|
ignores: [
|
||||||
|
'*.min.*',
|
||||||
|
'server/scripts/vendor/*',
|
||||||
|
'dist/**/*',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
...compat.config({
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
es6: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
'airbnb-base',
|
||||||
|
],
|
||||||
|
globals: {
|
||||||
|
TravelCities: 'readonly',
|
||||||
|
RegionalCities: 'readonly',
|
||||||
|
StationInfo: 'readonly',
|
||||||
|
SunCalc: 'readonly',
|
||||||
|
NoSleep: 'readonly',
|
||||||
|
OVERRIDES: 'readonly',
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
rules: {
|
||||||
|
indent: [
|
||||||
|
'error',
|
||||||
|
'tab',
|
||||||
|
{
|
||||||
|
SwitchCase: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-tabs': 0,
|
||||||
|
'no-console': 0,
|
||||||
|
'max-len': 0,
|
||||||
|
'no-use-before-define': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
variables: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-param-reassign': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
props: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-mixed-operators': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
groups: [
|
||||||
|
[
|
||||||
|
'&',
|
||||||
|
'|',
|
||||||
|
'^',
|
||||||
|
'~',
|
||||||
|
'<<',
|
||||||
|
'>>',
|
||||||
|
'>>>',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'==',
|
||||||
|
'!=',
|
||||||
|
'===',
|
||||||
|
'!==',
|
||||||
|
'>',
|
||||||
|
'>=',
|
||||||
|
'<',
|
||||||
|
'<=',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'&&',
|
||||||
|
'||',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'in',
|
||||||
|
'instanceof',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
allowSamePrecedence: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'import/extensions': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
mjs: 'always',
|
||||||
|
json: 'always',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
ignorePatterns: [
|
||||||
|
'*.min.js',
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
];
|
||||||
@@ -96,6 +96,29 @@ const buildJs = () => src(mjsSources)
|
|||||||
.pipe(webpack(webpackOptions))
|
.pipe(webpack(webpackOptions))
|
||||||
.pipe(dest(RESOURCES_PATH));
|
.pipe(dest(RESOURCES_PATH));
|
||||||
|
|
||||||
|
const workerSources = [
|
||||||
|
'./server/scripts/modules/radar-worker.mjs',
|
||||||
|
];
|
||||||
|
|
||||||
|
const buildWorkers = () => {
|
||||||
|
// update the file name in the webpack options
|
||||||
|
const output = {
|
||||||
|
chunkFilename: '[id].mjs',
|
||||||
|
chunkFormat: 'module',
|
||||||
|
filename: '[name].mjs',
|
||||||
|
};
|
||||||
|
const workerWebpackOptions = {
|
||||||
|
...webpackOptions,
|
||||||
|
output,
|
||||||
|
entry: {
|
||||||
|
'radar-worker': workerSources[0],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return src(workerSources)
|
||||||
|
.pipe(webpack(workerWebpackOptions))
|
||||||
|
.pipe(dest(RESOURCES_PATH));
|
||||||
|
};
|
||||||
|
|
||||||
const cssSources = [
|
const cssSources = [
|
||||||
'server/styles/main.css',
|
'server/styles/main.css',
|
||||||
];
|
];
|
||||||
@@ -137,6 +160,8 @@ const s3 = s3Upload({
|
|||||||
const uploadSources = [
|
const uploadSources = [
|
||||||
'dist/**',
|
'dist/**',
|
||||||
'!dist/**/*.map',
|
'!dist/**/*.map',
|
||||||
|
'!dist/images/**/*',
|
||||||
|
'!dist/fonts/**/*',
|
||||||
];
|
];
|
||||||
const upload = () => src(uploadSources, { base: './dist', encoding: false })
|
const upload = () => src(uploadSources, { base: './dist', encoding: false })
|
||||||
.pipe(s3({
|
.pipe(s3({
|
||||||
@@ -167,6 +192,9 @@ const uploadImages = () => src(imageSources, { base: './server', encoding: false
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const copyImageSources = () => src(imageSources, { base: './server', encoding: false })
|
||||||
|
.pipe(dest('./dist'));
|
||||||
|
|
||||||
const invalidate = () => cloudfront.send(new CreateInvalidationCommand({
|
const invalidate = () => cloudfront.send(new CreateInvalidationCommand({
|
||||||
DistributionId: process.env.DISTRIBUTION_ID,
|
DistributionId: process.env.DISTRIBUTION_ID,
|
||||||
InvalidationBatch: {
|
InvalidationBatch: {
|
||||||
@@ -184,7 +212,7 @@ const buildPlaylist = async () => {
|
|||||||
return file('playlist.json', JSON.stringify(playlist)).pipe(dest('./dist'));
|
return file('playlist.json', JSON.stringify(playlist)).pipe(dest('./dist'));
|
||||||
};
|
};
|
||||||
|
|
||||||
const buildDist = series(clean, parallel(buildJs, compressJsData, compressJsVendor, copyCss, compressHtml, copyOtherFiles, buildPlaylist));
|
const buildDist = series(clean, parallel(buildJs, buildWorkers, compressJsData, compressJsVendor, copyCss, compressHtml, copyOtherFiles, copyImageSources, buildPlaylist));
|
||||||
|
|
||||||
// upload_images could be in parallel with upload, but _images logs a lot and has little changes
|
// upload_images could be in parallel with upload, but _images logs a lot and has little changes
|
||||||
// by running upload last the majority of the changes will be at the bottom of the log for easy viewing
|
// by running upload last the majority of the changes will be at the bottom of the log for easy viewing
|
||||||
|
|||||||
14
index.mjs
@@ -1,9 +1,6 @@
|
|||||||
import 'dotenv/config';
|
import 'dotenv/config';
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import corsPassThru from './cors/index.mjs';
|
|
||||||
import radarPassThru from './cors/radar.mjs';
|
|
||||||
import outlookPassThru from './cors/outlook.mjs';
|
|
||||||
import playlist from './src/playlist.mjs';
|
import playlist from './src/playlist.mjs';
|
||||||
import OVERRIDES from './src/overrides.mjs';
|
import OVERRIDES from './src/overrides.mjs';
|
||||||
|
|
||||||
@@ -13,12 +10,6 @@ const port = process.env.WS4KP_PORT ?? 8080;
|
|||||||
// template engine
|
// template engine
|
||||||
app.set('view engine', 'ejs');
|
app.set('view engine', 'ejs');
|
||||||
|
|
||||||
// cors pass-thru to api.weather.gov
|
|
||||||
app.get('/stations/*station', corsPassThru);
|
|
||||||
app.get('/Conus/*radar', radarPassThru);
|
|
||||||
app.get('/products/*product', outlookPassThru);
|
|
||||||
app.get('/playlist.json', playlist);
|
|
||||||
|
|
||||||
// version
|
// version
|
||||||
const { version } = JSON.parse(fs.readFileSync('package.json'));
|
const { version } = JSON.parse(fs.readFileSync('package.json'));
|
||||||
|
|
||||||
@@ -81,8 +72,6 @@ const geoip = (req, res) => {
|
|||||||
// debugging
|
// debugging
|
||||||
if (process.env?.DIST === '1') {
|
if (process.env?.DIST === '1') {
|
||||||
// distribution
|
// distribution
|
||||||
app.use('/images', express.static('./server/images'));
|
|
||||||
app.use('/fonts', express.static('./server/fonts'));
|
|
||||||
app.use('/scripts', express.static('./server/scripts'));
|
app.use('/scripts', express.static('./server/scripts'));
|
||||||
app.use('/geoip', geoip);
|
app.use('/geoip', geoip);
|
||||||
app.use('/', express.static('./dist'));
|
app.use('/', express.static('./dist'));
|
||||||
@@ -90,8 +79,11 @@ if (process.env?.DIST === '1') {
|
|||||||
// debugging
|
// debugging
|
||||||
app.get('/index.html', index);
|
app.get('/index.html', index);
|
||||||
app.use('/geoip', geoip);
|
app.use('/geoip', geoip);
|
||||||
|
app.use('/resources', express.static('./server/scripts/modules'));
|
||||||
app.get('/', index);
|
app.get('/', index);
|
||||||
app.get('*name', express.static('./server'));
|
app.get('*name', express.static('./server'));
|
||||||
|
// cors pass-thru to api.weather.gov
|
||||||
|
app.get('/playlist.json', playlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
const server = app.listen(port, () => {
|
const server = app.listen(port, () => {
|
||||||
|
|||||||
1067
package-lock.json
generated
13
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ws4kp",
|
"name": "ws4kp",
|
||||||
"version": "5.21.15",
|
"version": "5.25.1",
|
||||||
"description": "Welcome to the WeatherStar 4000+ project page!",
|
"description": "Welcome to the WeatherStar 4000+ project page!",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -23,15 +23,18 @@
|
|||||||
"homepage": "https://github.com/netbymatt/ws4kp#readme",
|
"homepage": "https://github.com/netbymatt/ws4kp#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@aws-sdk/client-cloudfront": "^3.609.0",
|
"@aws-sdk/client-cloudfront": "^3.609.0",
|
||||||
|
"@eslint/eslintrc": "^3.3.1",
|
||||||
|
"ajv": "^8.17.1",
|
||||||
"del": "^8.0.0",
|
"del": "^8.0.0",
|
||||||
"eslint": "^8.2.0",
|
"eslint": "^9.0.0",
|
||||||
"eslint-config-airbnb-base": "^15.0.0",
|
"eslint-config-airbnb-base": "15.0.0",
|
||||||
"eslint-plugin-import": "^2.10.0",
|
"eslint-plugin-import": "^2.10.0",
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-awspublish": "^8.0.0",
|
"gulp-awspublish": "^8.0.0",
|
||||||
"gulp-concat": "^2.6.1",
|
"gulp-concat": "^2.6.1",
|
||||||
"gulp-ejs": "^5.1.0",
|
"gulp-ejs": "^5.1.0",
|
||||||
"gulp-file": "^0.4.0",
|
"gulp-file": "^0.4.0",
|
||||||
|
"gulp-html-minifier-terser": "^7.1.0",
|
||||||
"gulp-rename": "^2.0.0",
|
"gulp-rename": "^2.0.0",
|
||||||
"gulp-s3-uploader": "^1.0.6",
|
"gulp-s3-uploader": "^1.0.6",
|
||||||
"gulp-sass": "^6.0.0",
|
"gulp-sass": "^6.0.0",
|
||||||
@@ -42,8 +45,8 @@
|
|||||||
"suncalc": "^1.8.0",
|
"suncalc": "^1.8.0",
|
||||||
"swiped-events": "^1.1.4",
|
"swiped-events": "^1.1.4",
|
||||||
"terser-webpack-plugin": "^5.3.6",
|
"terser-webpack-plugin": "^5.3.6",
|
||||||
"webpack-stream": "^7.0.0",
|
"webpack": "^5.99.9",
|
||||||
"gulp-html-minifier-terser": "^7.1.0"
|
"webpack-stream": "^7.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^16.5.0",
|
"dotenv": "^16.5.0",
|
||||||
|
|||||||
BIN
server/images/gimp/Radar Basemap5.xcf
Normal file
BIN
server/images/maps/radar-stretched-overlay.webp
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
server/images/maps/radar-stretched.webp
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
server/images/maps/radar-tiles/00-00.webp
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
server/images/maps/radar-tiles/00-01.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/00-02.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
server/images/maps/radar-tiles/00-03.webp
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
server/images/maps/radar-tiles/00-04.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
server/images/maps/radar-tiles/00-05.webp
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
server/images/maps/radar-tiles/00-06.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-07.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/01-00.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/01-01.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
server/images/maps/radar-tiles/01-02.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/01-03.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
server/images/maps/radar-tiles/01-04.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
server/images/maps/radar-tiles/01-05.webp
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
server/images/maps/radar-tiles/01-06.webp
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
server/images/maps/radar-tiles/01-07.webp
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
server/images/maps/radar-tiles/01-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/01-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/02-00.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/02-01.webp
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
server/images/maps/radar-tiles/02-02.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/02-03.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/02-04.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/02-05.webp
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
server/images/maps/radar-tiles/02-06.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
server/images/maps/radar-tiles/02-07.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
server/images/maps/radar-tiles/02-08.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/02-09.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
server/images/maps/radar-tiles/03-00.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
server/images/maps/radar-tiles/03-01.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
server/images/maps/radar-tiles/03-02.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/03-03.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
server/images/maps/radar-tiles/03-04.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/03-05.webp
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
server/images/maps/radar-tiles/03-06.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
server/images/maps/radar-tiles/03-07.webp
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
server/images/maps/radar-tiles/03-08.webp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
server/images/maps/radar-tiles/03-09.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
server/images/maps/radar-tiles/04-00.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/04-01.webp
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
server/images/maps/radar-tiles/04-02.webp
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
server/images/maps/radar-tiles/04-03.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/04-04.webp
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
server/images/maps/radar-tiles/04-05.webp
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
server/images/maps/radar-tiles/04-06.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
server/images/maps/radar-tiles/04-07.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/04-08.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
server/images/maps/radar-tiles/04-09.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
server/images/maps/radar-tiles/05-00.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
server/images/maps/radar-tiles/05-01.webp
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
server/images/maps/radar-tiles/05-02.webp
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
server/images/maps/radar-tiles/05-03.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
server/images/maps/radar-tiles/05-04.webp
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
server/images/maps/radar-tiles/05-05.webp
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
server/images/maps/radar-tiles/05-06.webp
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
server/images/maps/radar-tiles/05-07.webp
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
server/images/maps/radar-tiles/05-08.webp
Normal file
|
After Width: | Height: | Size: 462 B |
BIN
server/images/maps/radar-tiles/05-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/06-00.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/06-01.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
server/images/maps/radar-tiles/06-02.webp
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
server/images/maps/radar-tiles/06-03.webp
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
server/images/maps/radar-tiles/06-04.webp
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
server/images/maps/radar-tiles/06-05.webp
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
server/images/maps/radar-tiles/06-06.webp
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
server/images/maps/radar-tiles/06-07.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
server/images/maps/radar-tiles/06-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/06-09.webp
Normal file
|
After Width: | Height: | Size: 482 B |
BIN
server/images/maps/radar-tiles/07-00.webp
Normal file
|
After Width: | Height: | Size: 604 B |
BIN
server/images/maps/radar-tiles/07-01.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
server/images/maps/radar-tiles/07-02.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
server/images/maps/radar-tiles/07-03.webp
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
server/images/maps/radar-tiles/07-04.webp
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
server/images/maps/radar-tiles/07-05.webp
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
server/images/maps/radar-tiles/07-06.webp
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
server/images/maps/radar-tiles/07-07.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
server/images/maps/radar-tiles/07-08.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/07-09.webp
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
server/images/maps/radar-tiles/08-00.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/08-01.webp
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
server/images/maps/radar-tiles/08-02.webp
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
server/images/maps/radar-tiles/08-03.webp
Normal file
|
After Width: | Height: | Size: 112 KiB |