upgrade deps

This commit is contained in:
wryk 2021-11-07 00:11:15 +01:00
parent cbe47ba8c5
commit 40b719e613
33 changed files with 4399 additions and 14607 deletions

View File

@ -1,17 +0,0 @@
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"exclude": [
"@babel/plugin-transform-classes"
],
"corejs": {
"version": 3,
"proposals": true
}
}
]
]
}

View File

@ -1,7 +0,0 @@
last 2 chrome versions
last 2 and_chr versions
last 2 edge versions
last 2 ff versions
last 2 and_ff versions
last 2 safari versions
last 2 ios_saf versions

4
.gitignore vendored
View File

@ -1,5 +1,5 @@
node_modules node_modules
public dist
.cache .parcel-cache
.env .env
.vercel .vercel

10
.parcelrc Normal file
View File

@ -0,0 +1,10 @@
{
"extends": [
"@parcel/config-default"
],
"transformers": {
"*.svelte": [
"parcel-transformer-svelte"
]
}
}

18732
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,43 +2,43 @@
"name": "eldritch-cafe-radio", "name": "eldritch-cafe-radio",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js",
"scripts": { "scripts": {
"build": "parcel build src/index.html -d public", "build": "parcel build src/index.html",
"dev": "parcel src/index.html", "dev": "parcel src/index.html",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"repository": {
"type": "git",
"url": "https://github.com/EldritchCafe/radio.git"
},
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "browserslist": "> 0.25%, not dead",
"@babel/core": "^7.8.4",
"@babel/preset-env": "^7.8.3",
"autoprefixer": "^9.7.4",
"parcel": "^1.12.4",
"parcel-plugin-static-files-copy": "^2.3.1",
"parcel-plugin-svelte": "^4.0.5",
"postcss-input-range": "^4.0.0",
"posthtml-expressions": "^1.9.0",
"sass": "^1.25.0",
"svelte": "^3.18.2",
"typescript": "^3.8.2"
},
"dependencies": { "dependencies": {
"@popperjs/core": "^2.0.6", "@popperjs/core": "^2.10.2",
"@swc/helpers": "^0.2.13",
"copy-to-clipboard": "^3.2.1", "copy-to-clipboard": "^3.2.1",
"core-js": "^3.6.4", "core-js-pure": "^3.19.1",
"date-fns": "^2.9.0", "date-fns": "^2.25.0",
"get-urls": "^9.2.0", "get-urls": "^9.2.0",
"iter-tools": "^7.0.0-rc.0", "iter-tools": "^7.1.4",
"regenerator-runtime": "^0.13.3", "regenerator-runtime": "^0.13.9",
"route-parser": "0.0.5", "route-parser": "0.0.5",
"svelte": "^3.44.1",
"svelte-pipeable-store": "^1.0.3", "svelte-pipeable-store": "^1.0.3",
"svelte-portal": "^0.1.0", "svelte-portal": "^0.1.0",
"svelte-routing": "^1.4.0" "svelte-routing": "^1.6.0",
"typescript": "^4.4.4"
}, },
"staticFiles": { "devDependencies": {
"staticPath": "public", "@parcel/packager-raw-url": "^2.0.0",
"watcherGlob": "**" "@parcel/transformer-sass": "^2.0.0",
"@parcel/transformer-webmanifest": "^2.0.0",
"autoprefixer": "^10.4.0",
"parcel": "^2.0.0",
"parcel-transformer-svelte": "^1.2.3",
"postcss": "^8.3.11",
"postcss-input-range": "^4.0.0"
} }
} }

View File

@ -1,9 +0,0 @@
module.exports = {
plugins: {
"posthtml-expressions": {
locals: {
INSTANCE: process.env.INSTANCE || 'eldritch.cafe'
}
}
}
};

View File

@ -1,14 +1,15 @@
// -------------------------------------------------------------- // --------------------------------------------------------------
// == mixins */ // == mixins */
// -------------------------------------------------------------- // --------------------------------------------------------------
@use 'sass:math';
@mixin flow($font-size, $bf: $base-font, $lh: $line-height) { @mixin flow($font-size, $bf: $base-font, $lh: $line-height) {
$lh-value: $base-font * $lh; $lh-value: $base-font * $lh;
$coeff: ceil($font-size / $lh-value); $coeff: ceil(math.div($font-size, $lh-value));
$new-lh: ($lh-value / $font-size) * $coeff; $new-lh: math.div($lh-value, $font-size) * $coeff;
$margin-bottom: $new-lh / $coeff; $margin-bottom: math.div($new-lh, $coeff);
margin-bottom: $margin-bottom + em; margin-bottom: $margin-bottom + em;
font-size: $font-size / 10 + rem; font-size: math.div($font-size, 10) + rem;
line-height: $new-lh; line-height: $new-lh;
} }

View File

@ -1,6 +1,7 @@
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* == typography */ /* == typography */
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
@use 'sass:math';
html { html {
font-size: 62.5%; font-size: 62.5%;
@ -9,7 +10,7 @@ html {
} }
body { body {
font-size: $base-font / 10 + em; font-size: math.div($base-font, 10) + em;
line-height: $line-height; line-height: $line-height;
} }

View File

@ -1,4 +1,5 @@
// important: nth-child(n) is used to keep same specificity between grid (equal and unequal) // important: nth-child(n) is used to keep same specificity between grid (equal and unequal)
@use 'sass:math';
.grid { .grid {
display: flex; display: flex;
@ -79,20 +80,20 @@
// with gutter // with gutter
@else { @else {
$g : $gutter / 2; $g : math.div($gutter, 2);
&>* { &>* {
margin-bottom: $mb; margin-bottom: $mb;
} }
& > *:nth-child(odd) { & > *:nth-child(odd) {
$size : ($column1 * 100%) / ($column1 + $column2); $size : math.div($column1 * 100%, $column1 + $column2);
width: calc(#{$size} - #{$g} - .01px); // .01px = $bugfix IE width: calc(#{$size} - #{$g} - .01px); // .01px = $bugfix IE
} }
& > *:nth-child(even) { & > *:nth-child(even) {
$size : ($column2 * 100%) / ($column1 + $column2); $size : math.div($column2 * 100%, $column1 + $column2);
margin-left: $gutter; margin-left: $gutter;
width: calc(#{$size} - #{$g} - .01px); // .01px = $bugfix IE width: calc(#{$size} - #{$g} - .01px); // .01px = $bugfix IE

View File

@ -7,7 +7,7 @@
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
font-family: "Roboto"; font-family: "Roboto";
src: local("Roboto Regular"), local("Roboto"), url("/assets/fonts/roboto-regular.woff2") format("woff2"), src: local("Roboto Regular"), local("Roboto"), url("/src/assets/fonts/roboto-regular.woff2") format("woff2"),
; ;
} }
@ -16,12 +16,12 @@
font-weight: 600; font-weight: 600;
font-style: normal; font-style: normal;
font-family: "Roboto"; font-family: "Roboto";
src: local("Roboto Medium"), local("Roboto"), url("/assets/fonts/roboto-medium.woff2") format("woff2"); src: local("Roboto Medium"), local("Roboto"), url("/src/assets/fonts/roboto-medium.woff2") format("woff2");
} }
@font-face { @font-face {
font-display: swap; font-display: swap;
font-weight: bold; font-weight: bold;
font-style: normal; font-style: normal;
font-family: "Roboto"; font-family: "Roboto";
src: local("Roboto Bold"), local("Roboto"), url("/assets/fonts/roboto-bold.woff2") format("woff2"); src: local("Roboto Bold"), local("Roboto"), url("/src/assets/fonts/roboto-bold.woff2") format("woff2");
} }

View File

@ -30,14 +30,14 @@
left: -2.1rem; left: -2.1rem;
width: 1rem; width: 1rem;
height: 1rem; height: 1rem;
background: no-repeat url("/assets/img/playbar.svg"); background: no-repeat url("/src/assets/img/playbar.svg");
background-position: left center; background-position: left center;
background-size: 1rem 1rem; background-size: 1rem 1rem;
content: ""; content: "";
} }
.track--playing::before { .track--playing::before {
background-image: url("/assets/img/playbar-animate.svg"); background-image: url("/src/assets/img/playbar-animate.svg");
} }
.track__main { .track__main {

View File

@ -100,7 +100,7 @@
left: calc(50% - 1.5rem); left: calc(50% - 1.5rem);
width: 3rem; width: 3rem;
height: 2.7rem; height: 2.7rem;
background: $color-bg no-repeat url("/assets/img/separator-tentacle.svg"); background: $color-bg no-repeat url("/src/assets/img/separator-tentacle.svg");
background-size: 100% 100%; background-size: 100% 100%;
content: ""; content: "";
} }

View File

@ -18,7 +18,7 @@
<script> <script>
import Portal from 'svelte-portal' import Portal from 'svelte-portal'
import ContextPage from '/components/ContextPage' import ContextPage from '/src/components/ContextPage'
let open = false let open = false

View File

@ -6,9 +6,9 @@
<script> <script>
import { Router, Route } from 'svelte-routing' import { Router, Route } from 'svelte-routing'
import { home, share } from '/routes.js' import { home, share } from '/src/routes.js'
import Home from '/routes/Home.svelte' import Home from '/src/routes/Home.svelte'
import Share from '/routes/Share.svelte' import Share from '/src/routes/Share.svelte'
const pair = (duplex, component) => ({ duplex, component }) const pair = (duplex, component) => ({ duplex, component })
@ -16,4 +16,4 @@
pair(share, Share), pair(share, Share),
pair(home, Home) pair(home, Home)
] ]
</script> </script>

View File

@ -17,7 +17,7 @@
<script> <script>
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import Close from '/components/icons/context/close' import Close from '/src/components/icons/context/close'
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@ -29,7 +29,7 @@
if (open) { if (open) {
const scrollPosition = window.scrollY const scrollPosition = window.scrollY
document.body.setAttribute('data-scroll', scrollPosition) document.body.setAttribute('data-scroll', scrollPosition)
document.body.classList.add('contextEnabled') document.body.classList.add('contextEnabled')
} else { } else {
document.body.classList.remove('contextEnabled') document.body.classList.remove('contextEnabled')
const scrollPosition = document.body.getAttribute('data-scroll') const scrollPosition = document.body.getAttribute('data-scroll')
@ -44,4 +44,4 @@
let close = () => { let close = () => {
dispatch('close') dispatch('close')
} }
</script> </script>

View File

@ -43,13 +43,13 @@
<script> <script>
import { getContext } from 'svelte' import { getContext } from 'svelte'
import Volume from '/components/Volume' import Volume from '/src/components/Volume'
import PlayPause from '/components/icons/controls/PlayPause' import PlayPause from '/src/components/icons/controls/PlayPause'
import Prev from '/components/icons/controls/Prev' import Prev from '/src/components/icons/controls/Prev'
import Next from '/components/icons/controls/Next' import Next from '/src/components/icons/controls/Next'
import IconMenu from '/components/icons/Menu' import IconMenu from '/src/components/icons/Menu'
import Popper from '/components/PopperMenu' import Popper from '/src/components/PopperMenu'
import ContextMenu from '/components/ContextMenu' import ContextMenu from '/src/components/ContextMenu'
const current = getContext('current') const current = getContext('current')
const paused = getContext('paused') const paused = getContext('paused')

View File

@ -61,10 +61,10 @@
<script> <script>
import { getContext } from 'svelte' import { getContext } from 'svelte'
import DistanceDate from '/components/DistanceDate' import DistanceDate from '/src/components/DistanceDate'
import IconMenu from '/components/icons/Menu' import IconMenu from '/src/components/icons/Menu'
import Popper from '/components/PopperMenu' import Popper from '/src/components/PopperMenu'
import ContextMenu from '/components/ContextMenu' import ContextMenu from '/src/components/ContextMenu'
const current = getContext('current') const current = getContext('current')
const enqueueing = getContext('enqueueing') const enqueueing = getContext('enqueueing')

View File

@ -19,13 +19,13 @@
<script> <script>
import { setContext, onMount } from 'svelte' import { setContext, onMount } from 'svelte'
import Header from '/components/layout/Header.svelte' import Header from '/src/components/layout/Header.svelte'
import Footer from '/components/layout/Footer.svelte' import Footer from '/src/components/layout/Footer.svelte'
import Queue from '/components/Queue.svelte' import Queue from '/src/components/Queue.svelte'
import Viewer from '/components/Viewer.svelte' import Viewer from '/src/components/Viewer.svelte'
import { get, writable, writableStorage, derived, scan, wait, startWith } from '/services/store.js' import { get, writable, writableStorage, derived, scan, wait, startWith } from '/src/services/store.js'
import { radioIterator, radioShareIterator } from '/services/radio.js' import { radioIterator, radioShareIterator } from '/src/services/radio.js'
import DeepSet from '/services/deep-set.js' import DeepSet from '/src/services/deep-set.js'
export let share export let share
export let large export let large
@ -34,7 +34,7 @@
const cache = new DeepSet() const cache = new DeepSet()
const domain = writableStorage(localStorage, 'domain', window.instance) const domain = writableStorage(localStorage, 'domain', process.env.INSTANCE)
const hashtags = writableStorage(localStorage, 'hashtags', [ const hashtags = writableStorage(localStorage, 'hashtags', [
'np', 'np',

View File

@ -66,8 +66,8 @@
import { getContext } from 'svelte' import { getContext } from 'svelte'
import { writable, derived } from 'svelte/store' import { writable, derived } from 'svelte/store'
import Portal from 'svelte-portal' import Portal from 'svelte-portal'
import ContextPage from '/components/ContextPage' import ContextPage from '/src/components/ContextPage'
import TagInput from '/components/TagInput' import TagInput from '/src/components/TagInput'
const domain = getContext('domain') const domain = getContext('domain')
const hashtags = getContext('hashtags') const hashtags = getContext('hashtags')
@ -125,4 +125,4 @@
let closePage = () => { let closePage = () => {
open = false open = false
} }
</script> </script>

View File

@ -96,12 +96,12 @@
<script> <script>
import { getContext } from 'svelte' import { getContext } from 'svelte'
import Controls from '/components/Controls.svelte' import Controls from '/src/components/Controls.svelte'
import IconReduce from '/components/icons/player/Reduce.svelte' import IconReduce from '/src/components/icons/player/Reduce.svelte'
import IconExpand from '/components/icons/player/Expand.svelte' import IconExpand from '/src/components/icons/player/Expand.svelte'
import IconHeart from '/components/icons/Heart.svelte' import IconHeart from '/src/components/icons/Heart.svelte'
import YoutubePlayer from '/components/YoutubePlayer' import YoutubePlayer from '/src/components/YoutubePlayer'
import Progress from '/components/player/Progress' import Progress from '/src/components/player/Progress'
export let large export let large
export let sticky export let sticky

View File

@ -2,8 +2,8 @@
<script> <script>
import { createEventDispatcher, onMount, onDestroy } from 'svelte' import { createEventDispatcher, onMount, onDestroy } from 'svelte'
import { loadIframeApi, STATE } from '/services/youtube.js' import { loadIframeApi, STATE } from '/src/services/youtube.js'
import { queue } from '/services/misc.js' import { queue } from '/src/services/misc.js'
// input props // input props
export let id export let id

View File

@ -4,5 +4,5 @@
</footer> </footer>
<script> <script>
import eldritchSky from '/assets/img/eldritch-sky.svg' import eldritchSky from '/src/assets/img/eldritch-sky.svg'
</script> </script>

View File

@ -11,7 +11,7 @@
</header> </header>
<script> <script>
import logo from '/assets/img/logo.svg' import logo from '/src/assets/img/logo.svg'
import About from '/components/About' import About from '/src/components/About'
import Settings from '/components/Settings' import Settings from '/src/components/Settings'
</script> </script>

View File

@ -19,7 +19,7 @@
</div> </div>
</div> </div>
<script> <script>
import { secondsToElapsedTime } from '/services/misc.js' import { secondsToElapsedTime } from '/src/services/misc.js'
export let ready export let ready
export let currentTime export let currentTime
@ -33,4 +33,4 @@
$: durationText = duration != null ? secondsToElapsedTime(duration) : '--:--' $: durationText = duration != null ? secondsToElapsedTime(duration) : '--:--'
$: currentPercent = currentTime != null ? (currentTime / duration) * 100 : 0 $: currentPercent = currentTime != null ? (currentTime / duration) * 100 : 0
</script> </script>

View File

@ -5,21 +5,18 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Eldritch Radio</title> <title>Eldritch Radio</title>
<link rel="stylesheet" href="/assets/scss/style.scss"> <link rel="stylesheet" href="assets/scss/style.scss">
<link rel="icon" href="/assets/favicon/favicon.svg" type="image/svg+xml"> <link rel="manifest" href="manifest.json">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png"> <link rel="icon" href="assets/favicon/favicon.svg" type="image/svg+xml">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32x32.png"> <link rel="apple-touch-icon" sizes="180x180" href="assets/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="32x32" href="assets/favicon/favicon-32x32.png">
<link rel="manifest" href="/assets/favicon/manifest.webmanifest"> <link rel="icon" type="image/png" sizes="16x16" href="assets/favicon/favicon-16x16.png">
<link rel="mask-icon" href="/assets/favicon/safari-pinned-tab.svg" color="#635776"> <link rel="mask-icon" href="assets/favicon/safari-pinned-tab.svg" color="#635776">
<meta name="msapplication-TileColor" content="#635776"> <meta name="msapplication-TileColor" content="#635776">
<meta name="theme-color" content="#635776"> <meta name="theme-color" content="#635776">
</head> </head>
<body> <body>
<script> <script type="module" src="main.js"></script>
window.instance = '{{ INSTANCE }}';
</script>
<script src="main.js"></script>
</body> </body>
</html> </html>

View File

@ -1,11 +1,5 @@
import 'core-js/stable' import App from '/src/components/App.svelte'
import 'core-js/proposals'
import 'regenerator-runtime/runtime'
import App from '/components/App.svelte' new App({
const app = new App({
target: document.body target: document.body
}) })
export default app

View File

@ -3,12 +3,12 @@
"short_name": "Eldritch Radio", "short_name": "Eldritch Radio",
"icons": [ "icons": [
{ {
"src": "/assets/favicon/android-chrome-192x192.png", "src": "assets/favicon/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "/assets/favicon/android-chrome-512x512.png", "src": "assets/favicon/android-chrome-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png" "type": "image/png"
} }

View File

@ -1,5 +1,5 @@
<Radio share={null} large={false} /> <Radio share={null} large={false} />
<script> <script>
import Radio from '/components/Radio.svelte' import Radio from '/src/components/Radio.svelte'
</script> </script>

View File

@ -1,7 +1,7 @@
<Radio share={refererCredentials} large={large} /> <Radio share={refererCredentials} large={large} />
<script> <script>
import Radio from '/components/Radio.svelte' import Radio from '/src/components/Radio.svelte'
export let domain export let domain
export let id export let id
@ -13,4 +13,4 @@
domain, domain,
id id
} }
</script> </script>

View File

@ -1,6 +1,7 @@
import Observable from 'core-js-pure/features/observable'
import getUrls from 'get-urls' import getUrls from 'get-urls'
import { asyncMap, execPipe, map, findOr } from 'iter-tools' import { asyncMap, execPipe, map, findOr } from 'iter-tools'
import { mapNullable } from '/services/misc.js' import { mapNullable } from '/src/services/misc.js'
const LINK_RE = /<(.+?)>; rel="(\w+)"/gi const LINK_RE = /<(.+?)>; rel="(\w+)"/gi
@ -205,4 +206,4 @@ const findMedia = status => execPipe(
} }
}), }),
findOr(null, x => x !== null) findOr(null, x => x !== null)
) )

View File

@ -1,5 +1,5 @@
import { execPipe, asyncFilter, asyncMap } from 'iter-tools' import { execPipe, asyncFilter, asyncMap } from 'iter-tools'
import { share } from '/routes.js' import { share } from '/src/routes.js'
const intersection = (xs, ys) => xs.filter(x => ys.includes(x)) const intersection = (xs, ys) => xs.filter(x => ys.includes(x))
const difference = (xs, ys) => xs.filter(x => !ys.includes(x)) const difference = (xs, ys) => xs.filter(x => !ys.includes(x))
@ -89,4 +89,4 @@ export async function* tracksIterator(partialTrackGenerator, cache) {
const fetchMetadata = (credentials) => { const fetchMetadata = (credentials) => {
return fetch(`https://noembed.com/embed?url=https://www.youtube.com/watch?v=${credentials.id}`) return fetch(`https://noembed.com/embed?url=https://www.youtube.com/watch?v=${credentials.id}`)
.then(response => response.json()) .then(response => response.json())
} }

View File

@ -1,9 +1,9 @@
import { asyncConcat } from 'iter-tools' import { asyncConcat } from 'iter-tools'
import { hashtagsIterator, statusIterator } from '/services/mastodon.js' import { hashtagsIterator, statusIterator } from '/src/services/mastodon.js'
import { tracksIterator } from '/services/misc.js' import { tracksIterator } from '/src/services/misc.js'
export const radioIterator = (domain, hashtags, cache) => export const radioIterator = (domain, hashtags, cache) =>
tracksIterator(hashtagsIterator(domain, hashtags), cache) tracksIterator(hashtagsIterator(domain, hashtags), cache)
export const radioShareIterator = (refererCredentials, domain, hashtags, cache) => export const radioShareIterator = (refererCredentials, domain, hashtags, cache) =>
tracksIterator(asyncConcat(statusIterator(refererCredentials), hashtagsIterator(domain, hashtags)), cache) tracksIterator(asyncConcat(statusIterator(refererCredentials), hashtagsIterator(domain, hashtags)), cache)