Add progressive web app companion for cross-platform access
Vite + TypeScript PWA that mirrors the Android app's core features: - Pre-processed shelter data (build-time UTM33N→WGS84 conversion) - Leaflet map with shelter markers, user location, and offline tiles - Canvas compass arrow (ported from DirectionArrowView.kt) - IndexedDB shelter cache with 7-day staleness check - Service worker with CacheFirst tiles and precached app shell - i18n for en, nb, nn (ported from Android strings.xml) - iOS/Android compass handling with low-pass filter - Respects user map interaction (no auto-snap on pan/zoom) - Build revision cache-breaker for reliable SW updates Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
46365b713b
commit
e8428de775
12051 changed files with 1799735 additions and 0 deletions
108
pwa/node_modules/fast-uri/test/equal.test.js
generated
vendored
Normal file
108
pwa/node_modules/fast-uri/test/equal.test.js
generated
vendored
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
'use strict'
|
||||
|
||||
const test = require('tape')
|
||||
const fastURI = require('..')
|
||||
|
||||
const fn = fastURI.equal
|
||||
const runTest = (t, suite) => {
|
||||
suite.forEach(s => {
|
||||
const operator = s.result ? '==' : '!='
|
||||
t.equal(fn(s.pair[0], s.pair[1]), s.result, `${s.pair[0]} ${operator} ${s.pair[1]}`)
|
||||
t.equal(fn(s.pair[1], s.pair[0]), s.result, `${s.pair[1]} ${operator} ${s.pair[0]}`)
|
||||
})
|
||||
}
|
||||
|
||||
test('URI Equals', (t) => {
|
||||
const suite = [
|
||||
{ pair: ['example://a/b/c/%7Bfoo%7D', 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d'], result: true }, // test from RFC 3986
|
||||
{ pair: ['http://example.org/~user', 'http://example.org/%7euser'], result: true } // test from RFC 3987
|
||||
]
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
|
||||
// test('IRI Equals', (t) => {
|
||||
// // example from RFC 3987
|
||||
// t.equal(URI.equal('example://a/b/c/%7Bfoo%7D/ros\xE9', 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d/ros%C3%A9', IRI_OPTION), true)
|
||||
// t.end()
|
||||
// })
|
||||
|
||||
test('HTTP Equals', (t) => {
|
||||
const suite = [
|
||||
// test from RFC 2616
|
||||
{ pair: ['http://abc.com:80/~smith/home.html', 'http://abc.com/~smith/home.html'], result: true },
|
||||
{ pair: [{ scheme: 'http', host: 'abc.com', port: 80, path: '/~smith/home.html' }, 'http://abc.com/~smith/home.html'], result: true },
|
||||
{ pair: ['http://ABC.com/%7Esmith/home.html', 'http://abc.com/~smith/home.html'], result: true },
|
||||
{ pair: ['http://ABC.com:/%7esmith/home.html', 'http://abc.com/~smith/home.html'], result: true },
|
||||
{ pair: ['HTTP://ABC.COM', 'http://abc.com/'], result: true },
|
||||
// test from RFC 3986
|
||||
{ pair: ['http://example.com:/', 'http://example.com:80/'], result: true }
|
||||
]
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
|
||||
test('HTTPS Equals', (t) => {
|
||||
const suite = [
|
||||
{ pair: ['https://example.com', 'https://example.com:443/'], result: true },
|
||||
{ pair: ['https://example.com:/', 'https://example.com:443/'], result: true }
|
||||
]
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
|
||||
test('URN Equals', (t) => {
|
||||
const suite = [
|
||||
// test from RFC 2141
|
||||
{ pair: ['urn:foo:a123,456', 'urn:foo:a123,456'], result: true },
|
||||
{ pair: ['urn:foo:a123,456', 'URN:foo:a123,456'], result: true },
|
||||
{ pair: ['urn:foo:a123,456', 'urn:FOO:a123,456'], result: true }
|
||||
]
|
||||
|
||||
// Disabling for now as the whole equal logic might need
|
||||
// to be refactored
|
||||
// t.equal(URI.equal('urn:foo:a123,456', 'urn:foo:A123,456'), false)
|
||||
// t.equal(URI.equal('urn:foo:a123%2C456', 'URN:FOO:a123%2c456'), true)
|
||||
|
||||
runTest(t, suite)
|
||||
|
||||
t.throws(() => {
|
||||
fn('urn:', 'urn:FOO:a123,456')
|
||||
}, 'URN without nid cannot be serialized')
|
||||
|
||||
t.end()
|
||||
})
|
||||
|
||||
test('UUID Equals', (t) => {
|
||||
const suite = [
|
||||
{ pair: ['URN:UUID:F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6', 'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'], result: true }
|
||||
]
|
||||
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
|
||||
// test('Mailto Equals', (t) => {
|
||||
// // tests from RFC 6068
|
||||
// t.equal(URI.equal('mailto:addr1@an.example,addr2@an.example', 'mailto:?to=addr1@an.example,addr2@an.example'), true)
|
||||
// t.equal(URI.equal('mailto:?to=addr1@an.example,addr2@an.example', 'mailto:addr1@an.example?to=addr2@an.example'), true)
|
||||
// t.end()
|
||||
// })
|
||||
|
||||
test('WS Equal', (t) => {
|
||||
const suite = [
|
||||
{ pair: ['WS://ABC.COM:80/chat#one', 'ws://abc.com/chat'], result: true }
|
||||
]
|
||||
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
|
||||
test('WSS Equal', (t) => {
|
||||
const suite = [
|
||||
{ pair: ['WSS://ABC.COM:443/chat#one', 'wss://abc.com/chat'], result: true }
|
||||
]
|
||||
|
||||
runTest(t, suite)
|
||||
t.end()
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue