diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67e00e06..6743cf2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,13 @@ importers: commander: ^5.0.0 make-promises-safe: ^5.1.0 spritesmith: ^3.4.0 + tools/tupctime: + dependencies: + better-sqlite3: 7.0.1 + debug: 4.1.1 + specifiers: + better-sqlite3: ^7.0.1 + debug: ^4.1.1 lockfileVersion: 5.1 packages: /ajv/6.12.0: @@ -19,6 +26,23 @@ packages: dev: false resolution: integrity: sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + /ansi-regex/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + /aproba/1.2.0: + dev: false + resolution: + integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + /are-we-there-yet/1.1.5: + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.7 + dev: false + resolution: + integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== /asn1/0.2.4: dependencies: safer-buffer: 2.1.2 @@ -47,20 +71,58 @@ packages: dev: false resolution: integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + /base64-js/1.3.1: + dev: false + resolution: + integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== /bcrypt-pbkdf/1.0.2: dependencies: tweetnacl: 0.14.5 dev: false resolution: integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /better-sqlite3/7.0.1: + dependencies: + bindings: 1.5.0 + prebuild-install: 5.3.3 + tar: 4.4.10 + dev: false + requiresBuild: true + resolution: + integrity: sha512-fsVcoGXxnseNajbfFbth0BKnDWebPY6x77UWfrBHApCKq1yo41DlWnFsffOsLpjkQ4VKgDU5C3aUtiw3wGGU0Q== /bin-pack/1.0.2: dev: false resolution: integrity: sha1-wqAU7b8L7XCjKSBi7UZXe5YSBnk= + /bindings/1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + dev: false + resolution: + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + /bl/4.0.2: + dependencies: + buffer: 5.6.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + resolution: + integrity: sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ== + /buffer/5.6.0: + dependencies: + base64-js: 1.3.1 + ieee754: 1.1.13 + dev: false + resolution: + integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== /caseless/0.12.0: dev: false resolution: integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chownr/1.1.4: + dev: false + resolution: + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== /clone-stats/0.0.1: dev: false resolution: @@ -71,6 +133,12 @@ packages: node: '>=0.8' resolution: integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + /code-point-at/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= /combined-stream/1.0.8: dependencies: delayed-stream: 1.0.0 @@ -95,6 +163,10 @@ packages: '0': node >= 0.8 resolution: integrity: sha1-cIl4Yk2FavQaWnQd790mHadSwmY= + /console-control-strings/1.1.0: + dev: false + resolution: + integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= /contentstream/1.0.0: dependencies: readable-stream: 1.0.34 @@ -125,12 +197,43 @@ packages: dev: false resolution: integrity: sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo= + /debug/4.1.1: + dependencies: + ms: 2.1.2 + dev: false + resolution: + integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + /decompress-response/4.2.1: + dependencies: + mimic-response: 2.1.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + /deep-extend/0.6.0: + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== /delayed-stream/1.0.0: dev: false engines: node: '>=0.4.0' resolution: integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + dev: false + resolution: + integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + /detect-libc/1.0.3: + dev: false + engines: + node: '>=0.10' + hasBin: true + resolution: + integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= /ecc-jsbn/0.1.2: dependencies: jsbn: 0.1.1 @@ -138,6 +241,18 @@ packages: dev: false resolution: integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /end-of-stream/1.4.4: + dependencies: + once: 1.4.0 + dev: false + resolution: + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + /expand-template/2.0.3: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== /extend/3.0.2: dev: false resolution: @@ -156,6 +271,10 @@ packages: dev: false resolution: integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /file-uri-to-path/1.0.0: + dev: false + resolution: + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== /first-chunk-stream/1.0.0: dev: false engines: @@ -176,6 +295,29 @@ packages: node: '>= 0.12' resolution: integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /fs-constants/1.0.0: + dev: false + resolution: + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + /fs-minipass/1.2.7: + dependencies: + minipass: 2.9.0 + dev: false + resolution: + integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + /gauge/2.7.4: + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.3 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.3 + dev: false + resolution: + integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= /get-pixels/3.3.2: dependencies: data-uri-to-buffer: 0.0.3 @@ -206,6 +348,10 @@ packages: node: '>= 0.8.0' resolution: integrity: sha1-iitP6MqJWkjjoLbLs0CgpqNXGJk= + /github-from-package/0.0.0: + dev: false + resolution: + integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= /graceful-fs/4.2.3: dev: false resolution: @@ -225,6 +371,10 @@ packages: node: '>=6' resolution: integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + /has-unicode/2.0.1: + dev: false + resolution: + integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= /http-signature/1.2.0: dependencies: assert-plus: 1.0.0 @@ -236,10 +386,18 @@ packages: npm: '>=1.3.7' resolution: integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /ieee754/1.1.13: + dev: false + resolution: + integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== /inherits/2.0.4: dev: false resolution: integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ini/1.3.5: + dev: false + resolution: + integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== /iota-array/1.0.0: dev: false resolution: @@ -248,6 +406,14 @@ packages: dev: false resolution: integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + /is-fullwidth-code-point/1.0.0: + dependencies: + number-is-nan: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= /is-typedarray/1.0.0: dev: false resolution: @@ -329,6 +495,48 @@ packages: node: '>= 0.6' resolution: integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + /mimic-response/2.1.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + /minimist/1.2.5: + dev: false + resolution: + integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + /minipass/2.9.0: + dependencies: + safe-buffer: 5.2.0 + yallist: 3.1.1 + dev: false + resolution: + integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + /minizlib/1.3.3: + dependencies: + minipass: 2.9.0 + dev: false + resolution: + integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + /mkdirp-classic/0.5.2: + dev: false + resolution: + integrity: sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g== + /mkdirp/0.5.5: + dependencies: + minimist: 1.2.5 + dev: false + hasBin: true + resolution: + integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + /ms/2.1.2: + dev: false + resolution: + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /napi-build-utils/1.0.2: + dev: false + resolution: + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== /ndarray-ops/1.2.2: dependencies: cwise-compiler: 1.1.3 @@ -349,12 +557,37 @@ packages: dev: false resolution: integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + /node-abi/2.16.0: + dependencies: + semver: 5.7.1 + dev: false + resolution: + integrity: sha512-+sa0XNlWDA6T+bDLmkCUYn6W5k5W6BPRL6mqzSCs6H/xUgtl4D5x2fORKDzopKiU6wsyn/+wXlRXwXeSp+mtoA== /node-bitmap/0.0.1: dev: false engines: node: '>=v0.6.5' resolution: integrity: sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= + /noop-logger/0.1.1: + dev: false + resolution: + integrity: sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + /npmlog/4.1.2: + dependencies: + are-we-there-yet: 1.1.5 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: false + resolution: + integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + /number-is-nan/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= /oauth-sign/0.9.0: dev: false resolution: @@ -363,10 +596,22 @@ packages: dev: false resolution: integrity: sha1-u0SKR3X7les0p4H5CLusLfI9u1s= + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= /omggif/1.0.10: dev: false resolution: integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + dev: false + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= /parse-data-uri/0.2.0: dependencies: data-uri-to-buffer: 0.0.3 @@ -405,6 +650,29 @@ packages: node: '>=4.0.0' resolution: integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + /prebuild-install/5.3.3: + dependencies: + detect-libc: 1.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.5 + mkdirp: 0.5.5 + napi-build-utils: 1.0.2 + node-abi: 2.16.0 + noop-logger: 0.1.1 + npmlog: 4.1.2 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 3.1.0 + tar-fs: 2.0.1 + tunnel-agent: 0.6.0 + which-pm-runs: 1.0.0 + dev: false + engines: + node: '>=6' + hasBin: true + resolution: + integrity: sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== /process-nextick-args/1.0.7: dev: false resolution: @@ -417,6 +685,13 @@ packages: dev: false resolution: integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + /pump/3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + resolution: + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== /punycode/2.1.1: dev: false engines: @@ -429,6 +704,16 @@ packages: node: '>=0.6' resolution: integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /rc/1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.5 + minimist: 1.2.5 + strip-json-comments: 2.0.1 + dev: false + hasBin: true + resolution: + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== /readable-stream/1.0.34: dependencies: core-util-is: 1.0.2 @@ -470,6 +755,16 @@ packages: dev: false resolution: integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /readable-stream/3.6.0: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== /replace-ext/0.0.1: dev: false engines: @@ -533,6 +828,31 @@ packages: hasBin: true resolution: integrity: sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no= + /semver/5.7.1: + dev: false + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /set-blocking/2.0.0: + dev: false + resolution: + integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + /signal-exit/3.0.3: + dev: false + resolution: + integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + /simple-concat/1.0.0: + dev: false + resolution: + integrity: sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + /simple-get/3.1.0: + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.0 + dev: false + resolution: + integrity: sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== /spritesmith/3.4.0: dependencies: concat-stream: 1.5.2 @@ -562,6 +882,16 @@ packages: hasBin: true resolution: integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /string-width/1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= /string_decoder/0.10.31: dev: false resolution: @@ -572,6 +902,20 @@ packages: dev: false resolution: integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /string_decoder/1.3.0: + dependencies: + safe-buffer: 5.2.0 + dev: false + resolution: + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= /strip-bom-stream/1.0.0: dependencies: first-chunk-stream: 1.0.0 @@ -589,6 +933,45 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + /strip-json-comments/2.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= + /tar-fs/2.0.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.2 + pump: 3.0.0 + tar-stream: 2.1.2 + dev: false + resolution: + integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== + /tar-stream/2.1.2: + dependencies: + bl: 4.0.2 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + resolution: + integrity: sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q== + /tar/4.4.10: + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.5 + safe-buffer: 5.2.0 + yallist: 3.1.1 + dev: false + engines: + node: '>=4.5' + resolution: + integrity: sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== /through/2.3.8: dev: false resolution: @@ -673,9 +1056,27 @@ packages: node: '>= 0.9' resolution: integrity: sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= + /which-pm-runs/1.0.0: + dev: false + resolution: + integrity: sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + /wide-align/1.1.3: + dependencies: + string-width: 1.0.2 + dev: false + resolution: + integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + /wrappy/1.0.2: + dev: false + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= /xtend/4.0.2: dev: false engines: node: '>=0.4' resolution: integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + /yallist/3.1.1: + dev: false + resolution: + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a67fab0f..5d34a696 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - 'tools/sprites' + - 'tools/tupctime' diff --git a/tools/tupctime/index.js b/tools/tupctime/index.js new file mode 100644 index 00000000..bb29ee2c --- /dev/null +++ b/tools/tupctime/index.js @@ -0,0 +1,70 @@ + +const fs = require('fs'); +const pathlib = require('path'); +const Database = require('better-sqlite3'); +const debug = require('debug')('tupctime'); + +const start = process.argv[2]; +if (start === undefined) { + throw new Error("Pass in directory containing tup db."); +} + +process.chdir(start); + +while (true) { + if (fs.existsSync('.tup')) { + break; + } + + if (process.cwd() === '/') { + throw new Error("Can't find tup root."); + } + + process.chdir('..'); +} + +const db = new Database('.tup/db'); + +const TUP_DB_FILE = 0; +const TUP_DB_DIR = 2; +const TUP_DB_GENERATED = 4; +const TUP_DB_GENERATED_DIR = 7; + +// ^ and $ are virtual directories for environment variables +const traversalQuery = db.prepare(` +SELECT id, type, mtime as ctime, name +FROM node +WHERE dir = ? +AND type IN (${TUP_DB_FILE}, ${TUP_DB_DIR}, ${TUP_DB_GENERATED}, ${TUP_DB_GENERATED_DIR}) +AND name NOT IN ('^', '$')`); +const updateQuery = db.prepare(`UPDATE node SET mtime = ? WHERE id = ?`); + +function update() { + const stack = [{isDir: true, id: 0, path: "."}]; + + let item; + while (item = stack.pop()) { + if (!fs.existsSync(item.path)) { + debug(`Ignoring ${item.path}`); + continue; + } + + if (item.isDir) { + for (const {id, type, ctime, name} of traversalQuery.iterate(item.id)) { + const isDir = [TUP_DB_DIR, TUP_DB_GENERATED_DIR].includes(type); + const path = pathlib.join(item.path, name); + stack.push({isDir, id, ctime: BigInt(ctime), path}); + } + } else { + // bigint calculation is necessary to avoid rounding errors/spurious update + const ctime = fs.lstatSync(item.path, {bigint: true}).ctimeMs / 1000n; + if (ctime !== item.ctime) { + debug(`Updating ${item.path}: ${ctime}, ${item.ctime}`); + if (updateQuery.run(ctime, item.id).changes !== 1) + throw new Error(`Couldn't update ${path}`); + } + } + } +} + +db.transaction(update)(); diff --git a/tools/tupctime/package.json b/tools/tupctime/package.json new file mode 100644 index 00000000..2cf0c9d8 --- /dev/null +++ b/tools/tupctime/package.json @@ -0,0 +1 @@ +{"dependencies":{"better-sqlite3":"^7.0.1","debug":"^4.1.1"}}