diff --git a/packages/util/src/aes.js b/packages/util/src/aes.ts similarity index 100% rename from packages/util/src/aes.js rename to packages/util/src/aes.ts diff --git a/packages/util/src/array.js b/packages/util/src/array.ts similarity index 100% rename from packages/util/src/array.js rename to packages/util/src/array.ts diff --git a/packages/util/src/index.js b/packages/util/src/index.ts similarity index 100% rename from packages/util/src/index.js rename to packages/util/src/index.ts diff --git a/packages/util/src/object.js b/packages/util/src/object.ts similarity index 100% rename from packages/util/src/object.js rename to packages/util/src/object.ts diff --git a/packages/util/src/osm.js b/packages/util/src/osm.ts similarity index 93% rename from packages/util/src/osm.js rename to packages/util/src/osm.ts index 6b75b5d..d0b027a 100644 --- a/packages/util/src/osm.js +++ b/packages/util/src/osm.ts @@ -59,10 +59,10 @@ export function utilCleanTags(tags) { // service: [ 'driveway', 'parking_aisle' ], // width: [ '3', undefined ] // } -export function utilCombinedTags(entityIDs, graph) { +export function utilCombinedTags(entityIDs: [string], graph) { let tags = {}; let tagCounts = {}; - let allKeys = new Set(); + let allKeys: Set = new Set(); const entities = entityIDs.map((entityID) => graph.hasEntity(entityID)).filter(Boolean); @@ -100,14 +100,14 @@ export function utilCombinedTags(entityIDs, graph) { }); }); - for (let key in tags) { - if (!Array.isArray(tags[key])) continue; + for (let k in tags) { + if (!Array.isArray(tags[k])) continue; // sort values by frequency then alphabetically - tags[key] = tags[key].sort((val1, val2) => { - let key = key; // capture - let count2 = tagCounts[key + '=' + val2]; - let count1 = tagCounts[key + '=' + val1]; + tags[k] = tags[k].sort((val1, val2) => { + const key = k; + const count2 = tagCounts[key + '=' + val2]; + const count1 = tagCounts[key + '=' + val1]; if (count2 !== count1) return count2 - count1; if (val2 && val1) return val1.localeCompare(val2); return val1 ? 1 : -1; @@ -233,9 +233,17 @@ export function utilGetAllNodes(ids, graph) { // // // +type TagDiff = { + type: string, + key: string, + oldVal: any, + newVal: any, + display: string +}; + export function utilTagDiff(oldTags, newTags) { - let tagDiff = []; - const keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); + let tagDiff: TagDiff[] = []; + const keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort() as [string]; keys.forEach((k) => { const oldVal = oldTags[k]; const newVal = newTags[k]; diff --git a/packages/util/src/session_mutex.js b/packages/util/src/session_mutex.js deleted file mode 100644 index 2dd3045..0000000 --- a/packages/util/src/session_mutex.js +++ /dev/null @@ -1,38 +0,0 @@ -// A per-domain session mutex backed by a cookie and dead man's -// switch. If the session crashes, the mutex will auto-release -// after 5 seconds. - -// This accepts a string and returns an object that complies with utilSessionMutexType -export function utilSessionMutex(name) { - let _mutex = {}; - let _intervalID; - - function renew() { - let expires = new Date(); - expires.setSeconds(expires.getSeconds() + 5); - document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict'; - } - - _mutex.lock = () => { - if (_intervalID) return true; - let cookie = document.cookie.replace( - new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), - '$1' - ); - if (cookie) return false; - renew(); - _intervalID = window.setInterval(renew, 4000); - return true; - }; - - _mutex.unlock = () => { - if (!_intervalID) return; - document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict'; - clearInterval(_intervalID); - _intervalID = null; - }; - - _mutex.locked = () => !!_intervalID; - - return _mutex; -} diff --git a/packages/util/src/session_mutex.ts b/packages/util/src/session_mutex.ts new file mode 100644 index 0000000..c53ad16 --- /dev/null +++ b/packages/util/src/session_mutex.ts @@ -0,0 +1,38 @@ +// A per-domain session mutex backed by a cookie and dead man's +// switch. If the session crashes, the mutex will auto-release +// after 5 seconds. + +// This accepts a string and returns an object that complies with utilSessionMutexType +export function utilSessionMutex(name) { + // let _mutex = {}; + let _intervalID; + + function renew() { + let expires = new Date(); + expires.setSeconds(expires.getSeconds() + 5); + document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict'; + } + + let _mutex = { + lock: () => { + if (_intervalID) return true; + let cookie = document.cookie.replace( + new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), + '$1' + ); + if (cookie) return false; + renew(); + _intervalID = window.setInterval(renew, 4000); + return true; + }, + unlock: () => { + if (!_intervalID) return; + document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict'; + clearInterval(_intervalID); + _intervalID = null; + }, + locked: () => { return !!_intervalID; } + }; + + return _mutex; +} diff --git a/packages/util/src/string.js b/packages/util/src/string.ts similarity index 94% rename from packages/util/src/string.js rename to packages/util/src/string.ts index 658fadd..4dc0ecd 100644 --- a/packages/util/src/string.js +++ b/packages/util/src/string.ts @@ -9,16 +9,15 @@ export function utilEditDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; - let matrix = []; - let i, j; - for (i = 0; i <= b.length; i++) { + let matrix: number[][] = []; + for (let i = 0; i <= b.length; i++) { matrix[i] = [i]; } - for (j = 0; j <= a.length; j++) { + for (let j = 0; j <= a.length; j++) { matrix[0][j] = j; } - for (i = 1; i <= b.length; i++) { - for (j = 1; j <= a.length; j++) { + for (let i = 1; i <= b.length; i++) { + for (let j = 1; j <= a.length; j++) { if (b.charAt(i - 1) === a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { diff --git a/packages/util/tests/aes.test.js b/packages/util/tests/aes.test.ts similarity index 100% rename from packages/util/tests/aes.test.js rename to packages/util/tests/aes.test.ts diff --git a/packages/util/tests/array.test.js b/packages/util/tests/array.test.ts similarity index 100% rename from packages/util/tests/array.test.js rename to packages/util/tests/array.test.ts diff --git a/packages/util/tests/object.test.js b/packages/util/tests/object.test.ts similarity index 100% rename from packages/util/tests/object.test.js rename to packages/util/tests/object.test.ts diff --git a/packages/util/tests/osm.test.js b/packages/util/tests/osm.test.ts similarity index 100% rename from packages/util/tests/osm.test.js rename to packages/util/tests/osm.test.ts diff --git a/packages/util/tests/session_mutex.test.js b/packages/util/tests/session_mutex.test.ts similarity index 64% rename from packages/util/tests/session_mutex.test.js rename to packages/util/tests/session_mutex.test.ts index 26b675f..04766d3 100644 --- a/packages/util/tests/session_mutex.test.js +++ b/packages/util/tests/session_mutex.test.ts @@ -5,48 +5,61 @@ import * as util from '../src/index'; describe('utilSessionMutex', () => { let a, b; + // Hack: Rename methods so esbuild-jest doesn't mistransform them... + function esbuildJestHack(obj) { + obj.lok = obj.lock; + obj.unlok = obj.unlock; + } + afterEach(() => { - if (a) a.unlock(); - if (b) b.unlock(); + if (a) a.unlok(); + if (b) b.unlok(); }); describe('#lock', () => { it('returns true when it gets a lock', () => { a = util.utilSessionMutex('name'); - expect(a.lock()).toBeTrue(); + esbuildJestHack(a); + expect(a.lok()).toBeTrue(); }); it('returns true when already locked', () => { a = util.utilSessionMutex('name'); - a.lock(); - expect(a.lock()).toBeTrue(); + esbuildJestHack(a); + a.lok(); + expect(a.lok()).toBeTrue(); }); it('returns false when the lock is held by another session', () => { a = util.utilSessionMutex('name'); - a.lock(); + esbuildJestHack(a); + a.lok(); b = util.utilSessionMutex('name'); - expect(b.lock()).toBeFalse(); + esbuildJestHack(b); + expect(b.lok()).toBeFalse(); }); }); describe('#locked', () => { it('returns false by default', () => { a = util.utilSessionMutex('name'); + esbuildJestHack(a); expect(a.locked()).toBeFalse(); }); it('returns true when locked', () => { a = util.utilSessionMutex('name'); - a.lock(); + esbuildJestHack(a); + a.lok(); expect(a.locked()).toBeTrue(); }); it('returns false when unlocked', () => { a = util.utilSessionMutex('name'); - a.lock(); - a.unlock(); + esbuildJestHack(a); + a.lok(); + a.unlok(); expect(a.locked()).toBeFalse(); }); }); @@ -54,36 +67,43 @@ describe('utilSessionMutex', () => { describe('#unlock', () => { it('unlocks the mutex', () => { a = util.utilSessionMutex('name'); - a.lock(); - a.unlock(); + esbuildJestHack(a); + a.lok(); + a.unlok(); b = util.utilSessionMutex('name'); - expect(b.lock()).toBeTrue(); + esbuildJestHack(b); + expect(b.lok()).toBeTrue(); }); it('does nothing when the lock is held by another session', () => { a = util.utilSessionMutex('name'); - a.lock(); + esbuildJestHack(a); + a.lok(); b = util.utilSessionMutex('name'); - b.unlock(); + esbuildJestHack(b); + b.unlok(); expect(a.locked()).toBeTrue(); }); it('does nothing when not locked', () => { a = util.utilSessionMutex('name'); - a.unlock(); + esbuildJestHack(a); + a.unlok(); expect(a.locked()).toBeFalse(); }); }); it('namespaces locks', () => { a = util.utilSessionMutex('a'); - a.lock(); + esbuildJestHack(a); + a.lok(); b = util.utilSessionMutex('b'); + esbuildJestHack(b); expect(b.locked()).toBeFalse(); - expect(b.lock()).toBeTrue(); + expect(b.lok()).toBeTrue(); }); }); diff --git a/packages/util/tests/string.test.js b/packages/util/tests/string.test.ts similarity index 100% rename from packages/util/tests/string.test.js rename to packages/util/tests/string.test.ts