diff --git a/package-lock.json b/package-lock.json index 37116db..665dd9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,12 +6,12 @@ "packages": { "": { "name": "dropbox", - "version": "1.3.0", + "version": "1.4.0", "hasInstallScript": true, "license": "MIT", "dependencies": { "dropbox": "^10.32.0", - "roamjs-components": "^0.82.0" + "roamjs-components": "0.88.3" } }, "node_modules/@alloc/quick-lru": { @@ -3243,6 +3243,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -3250,74 +3251,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sdk": { - "version": "2.1231.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1231.0.tgz", - "integrity": "sha512-ONBuRsOxsu0zL8u/Vmz49tPWi9D4ls2pjb6szdfSx9VQef7bOnWe9gJpWoA94OTzcjOWsvjsG7UgjvQJkIuPBg==", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.4.19" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-sdk-plus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/aws-sdk-plus/-/aws-sdk-plus-0.5.3.tgz", - "integrity": "sha512-C/I1sWXAA5gRh5G4XbqnnVTGfzKimXJVkgBl62rt4SUAjOyakMICvSG/MaS4xzS+6umiVgKH8liWsNmiSueXXA==", - "dependencies": { - "aws-sdk": "^2.1004.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "node_modules/aws-sdk/node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/aws-sdk/node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/aws-sdk/node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/aws-sdk/node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -3365,7 +3298,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -3453,16 +3387,6 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -3502,6 +3426,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "peer": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -4409,6 +4334,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -4484,7 +4410,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "peer": true }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -4516,6 +4443,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "peer": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4562,6 +4490,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4585,6 +4514,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4626,6 +4556,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -4637,6 +4568,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -4648,6 +4580,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -4803,7 +4736,8 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "peer": true }, "node_modules/immediate": { "version": "3.0.6", @@ -4824,7 +4758,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "peer": true }, "node_modules/insect": { "version": "5.8.2", @@ -10986,6 +10921,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11060,6 +10996,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -11148,20 +11085,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -11293,6 +11216,7 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11344,7 +11268,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "peer": true }, "node_modules/isexe": { "version": "2.0.0", @@ -11397,18 +11322,11 @@ "jiti": "bin/jiti.js" } }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true }, "node_modules/jsdom": { "version": "20.0.3", @@ -11627,6 +11545,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -11837,6 +11756,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12443,15 +12363,6 @@ "node": ">=6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -12482,6 +12393,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -12506,6 +12418,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -12727,13 +12640,13 @@ } }, "node_modules/roamjs-components": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/roamjs-components/-/roamjs-components-0.82.0.tgz", - "integrity": "sha512-iyv1nSQ4tHXiO3FsOZWg3Iwe86Or3vdDpNkARjnnaVgnoOamc8xmbhTa4yVtpkDWQxXcL9aAulo9uKlj1O6SBw==", + "version": "0.88.3", + "resolved": "https://registry.npmjs.org/roamjs-components/-/roamjs-components-0.88.3.tgz", + "integrity": "sha512-eCKpgKSLoxtOqRZG9c0KOwTQIu2WrYzuipvfeGI377dzUZ8AIj4hJaq6qYzBPL7N1bnns0mMcjHiBhOgLgQTBg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@samepage/scripts": "^0.74.2", - "aws-sdk-plus": "^0.5.3", "color": "^4.0.1", "date-fns": "^2.27.0", "edn-data": "^1.0.0", @@ -12805,7 +12718,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -12829,6 +12743,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -13334,15 +13249,6 @@ "node": ">= 10.0.0" } }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -13353,11 +13259,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -13367,19 +13268,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -13521,6 +13409,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -16542,65 +16431,8 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "aws-sdk": { - "version": "2.1231.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1231.0.tgz", - "integrity": "sha512-ONBuRsOxsu0zL8u/Vmz49tPWi9D4ls2pjb6szdfSx9VQef7bOnWe9gJpWoA94OTzcjOWsvjsG7UgjvQJkIuPBg==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, - "uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" - } - } - }, - "aws-sdk-plus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/aws-sdk-plus/-/aws-sdk-plus-0.5.3.tgz", - "integrity": "sha512-C/I1sWXAA5gRh5G4XbqnnVTGfzKimXJVkgBl62rt4SUAjOyakMICvSG/MaS4xzS+6umiVgKH8liWsNmiSueXXA==", - "requires": { - "aws-sdk": "^2.1004.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "peer": true }, "axios": { "version": "0.27.2", @@ -16634,7 +16466,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "peer": true }, "binary-extensions": { "version": "2.2.0", @@ -16701,16 +16534,6 @@ "fill-range": "^7.0.1" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -16741,6 +16564,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "peer": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -17415,6 +17239,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "peer": true, "requires": { "is-callable": "^1.1.3" } @@ -17474,7 +17299,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "peer": true }, "functions-have-names": { "version": "1.2.3", @@ -17497,6 +17323,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "peer": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -17531,6 +17358,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "peer": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -17551,6 +17379,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "peer": true, "requires": { "function-bind": "^1.1.1" } @@ -17579,17 +17408,20 @@ "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "peer": true }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "peer": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "peer": true, "requires": { "has-symbols": "^1.0.2" } @@ -17703,7 +17535,8 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "peer": true }, "immediate": { "version": "3.0.6", @@ -17724,7 +17557,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "peer": true }, "insect": { "version": "5.8.2", @@ -22422,6 +22256,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "peer": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -22474,7 +22309,8 @@ "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "peer": true }, "is-ci": { "version": "2.0.0", @@ -22526,14 +22362,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "peer": true }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -22622,6 +22450,7 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "peer": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -22658,7 +22487,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "peer": true }, "isexe": { "version": "2.0.0", @@ -22699,15 +22529,11 @@ "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", "peer": true }, - "jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true }, "jsdom": { "version": "20.0.3", @@ -22891,6 +22717,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -23044,7 +22871,8 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "peer": true }, "object-hash": { "version": "3.0.0", @@ -23448,11 +23276,6 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "peer": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" - }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -23469,6 +23292,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -23487,6 +23311,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -23665,12 +23490,11 @@ } }, "roamjs-components": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/roamjs-components/-/roamjs-components-0.82.0.tgz", - "integrity": "sha512-iyv1nSQ4tHXiO3FsOZWg3Iwe86Or3vdDpNkARjnnaVgnoOamc8xmbhTa4yVtpkDWQxXcL9aAulo9uKlj1O6SBw==", + "version": "0.88.3", + "resolved": "https://registry.npmjs.org/roamjs-components/-/roamjs-components-0.88.3.tgz", + "integrity": "sha512-eCKpgKSLoxtOqRZG9c0KOwTQIu2WrYzuipvfeGI377dzUZ8AIj4hJaq6qYzBPL7N1bnns0mMcjHiBhOgLgQTBg==", "requires": { "@samepage/scripts": "^0.74.2", - "aws-sdk-plus": "^0.5.3", "color": "^4.0.1", "date-fns": "^2.27.0", "edn-data": "^1.0.0", @@ -23692,7 +23516,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true }, "safer-buffer": { "version": "2.1.2", @@ -23713,6 +23538,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -24096,22 +23922,6 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "peer": true }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - } - } - }, "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -24129,19 +23939,6 @@ "peer": true, "requires": {} }, - "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -24256,6 +24053,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "peer": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -24396,4 +24194,4 @@ "peer": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 7b732ab..56cb30f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dropbox", - "version": "1.3.1", + "version": "1.4.0", "description": "Send file uploads in Roam directly to your Dropbox!", "main": "./build/main.js", "scripts": { @@ -13,7 +13,7 @@ "license": "MIT", "dependencies": { "dropbox": "^10.32.0", - "roamjs-components": "^0.82.0" + "roamjs-components": "0.88.3" }, "samepage": { "extends": "node_modules/roamjs-components/package.json" diff --git a/src/components/DropboxOauthPanel.tsx b/src/components/DropboxOauthPanel.tsx index 9802ac5..d4e494e 100644 --- a/src/components/DropboxOauthPanel.tsx +++ b/src/components/DropboxOauthPanel.tsx @@ -267,38 +267,61 @@ const DropboxOauthPanel = () => { return (
- - {!!account && ( - <> + + ) : ( +
- {account.text} - + + + + Connected + + {account.text} +
- +
+ + Connection options + +
+ + +
+
+
)} {!!error && (
{error}
diff --git a/src/index.ts b/src/index.ts index 2c55bde..711f7bb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,10 +10,15 @@ import localStorageGet from "roamjs-components/util/localStorageGet"; import localStorageSet from "roamjs-components/util/localStorageSet"; import React from "react"; import apiPost from "roamjs-components/util/apiPost"; +import renderToast from "roamjs-components/components/Toast"; +import { renderLoading } from "roamjs-components/components/Loading"; +import { Intent } from "@blueprintjs/core"; import mimeTypes from "./mimeTypes"; import DropboxOauthPanel from "./components/DropboxOauthPanel"; const DROPBOX_AUTH_DOMAIN = "https://roamjs.com"; +const DROPBOX_UPLOAD_URL = "https://content.dropboxapi.com/2/files/upload"; +const DROPBOX_LOADING_TEXT = ""; const mimeLookup = (path: string) => { if (!path || typeof path !== "string") { @@ -38,6 +43,81 @@ function httpHeaderSafeJson(args: Record) { return JSON.stringify(args).replace(/[\u007f-\uffff]/g, getSafeUnicode); } +type DropboxFileMetadata = { + name: string; + path_display: string; +}; + +type DropboxUploadEvent = Event & { + roamjsDropboxUploadHandled?: boolean; +}; + +const getProxiedUrl = (url: string) => { + const proxyUrl = window.roamAlphaAPI?.constants?.corsAnywhereProxyUrl; + return proxyUrl ? `${proxyUrl.replace(/\/$/, "")}/${url}` : url; +}; + +const getErrorMessage = (error: unknown): string => { + if (error instanceof Error) { + return /failed to fetch|networkerror|load failed/i.test(error.message) + ? "The browser could not complete the Dropbox request. Please try again." + : error.message || "The browser blocked the Dropbox request."; + } + if (typeof error === "string") { + return error; + } + if (error && typeof error === "object") { + const e = error as { + error_summary?: string; + message?: string; + error?: string; + status?: number; + data?: unknown; + response?: { data?: unknown }; + }; + const nestedData = e.data || e.response?.data; + return ( + e.error_summary || + e.message || + e.error || + (nestedData ? getErrorMessage(nestedData) : "") || + (e.status ? `Dropbox returned status ${e.status}.` : "") + ); + } + return ""; +}; + +const hideDropBars = () => { + Array.from(document.getElementsByClassName("dnd-drop-bar")) + .map((c) => c as HTMLDivElement) + .forEach((c) => (c.style.display = "none")); +}; + +const renderUploadLoading = (uid: string) => { + let active = true; + let attempts = 0; + let removeLoading = () => { + // no spinner rendered yet + }; + const render = () => { + if (!active) return; + if ( + !document.querySelector(`.rm-block__input[id$="${uid}"]`) && + attempts < 10 + ) { + attempts += 1; + window.setTimeout(render, 50); + return; + } + removeLoading = renderLoading(uid); + }; + window.setTimeout(render, 1); + return () => { + active = false; + removeLoading(); + }; +}; + export default runExtension(async (args) => { args.extensionAPI.settings.panel.create({ tabTitle: "Dropbox", @@ -62,7 +142,7 @@ export default runExtension(async (args) => { const { time, uid: oauthUid } = node || {}; const tokenAge = differenceInSeconds( new Date(), - time ? new Date(time) : new Date(0) + time ? new Date(time) : new Date(0), ); return tokenAge > expires_in ? apiPost<{ access_token: string }>({ @@ -78,7 +158,7 @@ export default runExtension(async (args) => { .then((r) => { if (!r.access_token) { return Promise.reject( - `Did not find an access token. Found: ${JSON.stringify(r)}` + `Did not find an access token. Found: ${JSON.stringify(r)}`, ); } const storageData = localStorageGet("oauth-dropbox"); @@ -99,9 +179,9 @@ export default runExtension(async (args) => { time: new Date().valueOf(), text: at.text, } - : at - ) - ) + : at, + ), + ), ); return r.access_token; }) @@ -109,17 +189,66 @@ export default runExtension(async (args) => { Promise.reject( `Failed to refresh your access token: ${ e.response.data || e.message - }` - ) + }`, + ), ) : Promise.resolve(access_token); } else { return Promise.reject( - "Could not find your login info. Try first logging in through the [[roam/js/dropbox]] page" + "Could not find your login info. Try first logging in through the [[roam/js/dropbox]] page", ); } }; + const getDropboxUploadPath = (fileName: string) => { + const safeName = fileName.replace(/[\\/]/g, "-") || "upload"; + const id = `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; + const extensionIndex = safeName.lastIndexOf("."); + return extensionIndex > 0 + ? `/${safeName.slice(0, extensionIndex)}-${id}${safeName.slice( + extensionIndex, + )}` + : `/${safeName}-${id}`; + }; + + const getDropboxMetadata = ({ + access_token, + path, + }: { + access_token: string; + path: string; + }) => + apiPost({ + path: "files/get_metadata", + domain: "https://api.dropboxapi.com/2", + data: { path, dev: undefined }, + authorization: `Bearer ${access_token}`, + }); + + const recoverDropboxMetadata = ({ + access_token, + path, + uploadError, + retries = 2, + }: { + access_token: string; + path: string; + uploadError: unknown; + retries?: number; + }): Promise => + getDropboxMetadata({ access_token, path }).catch((metadataError) => + retries + ? new Promise((resolve) => setTimeout(resolve, 250)).then(() => + recoverDropboxMetadata({ + access_token, + path, + uploadError, + retries: retries - 1, + }), + ) + : Promise.reject(uploadError || metadataError), + ); + const uploadToDropbox = ({ files, getLoadingUid, @@ -132,108 +261,128 @@ export default runExtension(async (args) => { if (!files) return; const fileToUpload = files[0]; if (fileToUpload) { + const uploadEvent = e as DropboxUploadEvent; + if (uploadEvent.roamjsDropboxUploadHandled) return; + uploadEvent.roamjsDropboxUploadHandled = true; + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + getLoadingUid().then((uid) => { + const removeLoading = renderUploadLoading(uid); const catchError = (e: unknown) => { + const detail = getErrorMessage(e); + renderToast({ + id: "dropbox-upload-error", + intent: Intent.DANGER, + timeout: 8000, + content: `Dropbox upload failed. Please try again.${ + detail ? `\n\n${detail}` : "" + }`, + }); updateBlock({ uid, - text: "Failed to upload file to dropbox. Email support@roamjs.com with the error below:", - }); - createBlock({ - parentUid: uid, - node: { text: JSON.stringify(e) }, + text: "Dropbox upload failed. Please try again.", }); }; return getAccessToken() .then(async (access_token) => { - const reader = new FileReader(); + const uploadPath = getDropboxUploadPath(fileToUpload.name); - reader.readAsBinaryString(fileToUpload); - reader.onloadend = async () => - apiPost<{ name: string; path_display: string }>({ - path: "files/alpha/upload", - data: new Uint8Array(await fileToUpload.arrayBuffer()), - domain: "https://content.dropboxapi.com/2", - headers: { - "Content-Type": "application/octet-stream", - "Dropbox-API-Arg": httpHeaderSafeJson({ - path: `/${fileToUpload.name}`, - autorename: true, - }), - }, - authorization: `Bearer ${access_token}`, - }) - .then((r) => { - const contentType = mimeLookup(r.name) || "text/plain"; - return apiPost<{ links: { url: string }[] }>({ - path: "sharing/list_shared_links", - domain: "https://api.dropboxapi.com/2", - data: { path: r.path_display, dev: undefined }, - authorization: `Bearer ${access_token}`, - }).then((l) => - l.links.length - ? { contentType, url: l.links[0].url } - : apiPost<{ url: string }>({ - path: "sharing/create_shared_link_with_settings", - domain: "https://api.dropboxapi.com/2", - data: { - path: r.path_display, - settings: { - requested_visibility: { ".tag": "public" }, - }, - dev: undefined, + return apiPost({ + href: getProxiedUrl(DROPBOX_UPLOAD_URL), + data: new Uint8Array(await fileToUpload.arrayBuffer()), + headers: { + "Content-Type": "application/octet-stream", + "Dropbox-API-Arg": httpHeaderSafeJson({ + path: uploadPath, + autorename: false, + }), + }, + authorization: `Bearer ${access_token}`, + }) + .catch((uploadError) => + recoverDropboxMetadata({ + access_token, + path: uploadPath, + uploadError, + }), + ) + .then((r) => { + const contentType = mimeLookup(r.name) || "text/plain"; + return apiPost<{ links: { url: string }[] }>({ + path: "sharing/list_shared_links", + domain: "https://api.dropboxapi.com/2", + data: { path: r.path_display, dev: undefined }, + authorization: `Bearer ${access_token}`, + }).then((l) => + l.links.length + ? { contentType, url: l.links[0].url } + : apiPost<{ url: string }>({ + path: "sharing/create_shared_link_with_settings", + domain: "https://api.dropboxapi.com/2", + data: { + path: r.path_display, + settings: { + requested_visibility: { ".tag": "public" }, }, - authorization: `Bearer ${access_token}`, - }).then((c) => ({ url: c.url, contentType })) - ); - }) - .then(({ url, contentType }) => { - const dbxUrl = url.replace(/dl=0$/, "raw=1"); - updateBlock({ - uid, - text: contentType - ? contentType.includes("audio/") - ? `{{audio: ${dbxUrl}}}` - : contentType.includes("pdf") + dev: undefined, + }, + authorization: `Bearer ${access_token}`, + }).then((c) => ({ url: c.url, contentType })), + ); + }) + .then(({ url, contentType }) => { + const dbxUrl = url.replace(/dl=0$/, "raw=1"); + updateBlock({ + uid, + text: contentType + ? contentType.includes("audio/") + ? `{{audio: ${dbxUrl}}}` + : contentType.includes("pdf") ? `{{pdf: ${dbxUrl}}}` : contentType.includes("video/") - ? `{{video: ${dbxUrl}}}` - : contentType.includes("image/") - ? `![](${dbxUrl.replace( - "www.dropbox.com", - "dl.dropboxusercontent.com" - )})` - : `[${fileToUpload.name}](${dbxUrl})` - : `Unknown Content type for file ${fileToUpload.name}`, - }); - }) - .catch(catchError) - .finally(() => { - Array.from(document.getElementsByClassName("dnd-drop-bar")) - .map((c) => c as HTMLDivElement) - .forEach((c) => (c.style.display = "none")); + ? `{{video: ${dbxUrl}}}` + : contentType.includes("image/") + ? `![](${dbxUrl.replace( + "www.dropbox.com", + "dl.dropboxusercontent.com", + )})` + : `[${fileToUpload.name}](${dbxUrl})` + : `Unknown Content type for file ${fileToUpload.name}`, }); + }) + .catch(catchError); }) - .catch(catchError); + .catch(catchError) + .finally(() => { + removeLoading(); + hideDropBars(); + }); }); - e.stopPropagation(); - e.stopImmediatePropagation(); - e.preventDefault(); } }; + const dropAreas = new WeakSet(); + const textareas = new WeakSet(); + const fileInputs = new WeakSet(); + createHTMLObserver({ tag: "DIV", className: "dnd-drop-area", callback: (d) => { - d.addEventListener("drop", (e) => { + const dropArea = d as HTMLDivElement; + if (dropAreas.has(dropArea)) return; + dropAreas.add(dropArea); + dropArea.addEventListener("drop", (e) => { uploadToDropbox({ files: e.dataTransfer?.files || null, getLoadingUid: () => { - const { parentUid, offset } = getDropUidOffset(d as HTMLDivElement); + const { parentUid, offset } = getDropUidOffset(dropArea); return createBlock({ parentUid, order: offset, - node: { text: "Loading..." }, + node: { text: DROPBOX_LOADING_TEXT }, }); }, e, @@ -250,14 +399,17 @@ export default runExtension(async (args) => { tag: "TEXTAREA", className: "rm-block-input", callback: (t) => { - textareaRef.current = t as HTMLTextAreaElement; - t.addEventListener("paste", (e) => { + const textarea = t as HTMLTextAreaElement; + textareaRef.current = textarea; + if (textareas.has(textarea)) return; + textareas.add(textarea); + textarea.addEventListener("paste", (e) => { uploadToDropbox({ files: e.clipboardData?.files || null, getLoadingUid: () => { - const { blockUid } = getUids(t as HTMLTextAreaElement); + const { blockUid } = getUids(textarea); return updateBlock({ - text: "Loading...", + text: DROPBOX_LOADING_TEXT, uid: blockUid, }); }, @@ -274,6 +426,8 @@ export default runExtension(async (args) => { target.parentElement === document.body && target.type === "file" ) { + if (fileInputs.has(target)) return; + fileInputs.add(target); target.addEventListener( "change", (e) => { @@ -282,14 +436,14 @@ export default runExtension(async (args) => { getLoadingUid: () => { const { blockUid } = getUids(textareaRef.current); return updateBlock({ - text: "Loading...", + text: DROPBOX_LOADING_TEXT, uid: blockUid, }); }, e, }); }, - true + true, ); } };