diff --git a/DEVELOPERS.md b/DEVELOPERS.md index 5cc22df6597ee..ece23707bc4e3 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -4,6 +4,7 @@ * [Installing Dependencies](#Installing-Dependencies) * [Building Supabase](#Building-Supabase) * [Start a Development Server](#Start-a-Development-Server) +* [Build in Public](#Build-in-Public) ## Development Setup @@ -148,3 +149,9 @@ To debug code, and to see changes in real time, it is often useful to have a loc ``` For more information on Supabase Studio, see the [Supabase Studio readme](./studio/README.md). + +## Build in Public + +Videos of building supabase made in public. + +- [Contributing to open source as a beginner - Supabase](https://youtu.be/OAqhsylUuWg) - [@imskr](https://github.com/imskr) diff --git a/about/docs/careers/developer-success.mdx b/about/docs/careers/developer-success.mdx new file mode 100644 index 0000000000000..4c6e88a9e04d5 --- /dev/null +++ b/about/docs/careers/developer-success.mdx @@ -0,0 +1,61 @@ +--- +id: careers-developer-success +slug: developer-success +title: Developer Success Engineer +description: Supabase is hiring Developer Success Engineers +--- + +import Roles from '@site/docs/careers/snippets/roles.mdx' +import About from '@site/docs/careers/snippets/about.mdx' +import Team from '@site/docs/careers/snippets/team.mdx' +import Apply from '@site/docs/careers/snippets/apply.mdx' +import Process from '@site/docs/careers/snippets/process.mdx' + + +## About the role + +Supabase is hiring Developer Success Engineers. Help us build the easiest database platform in the world. + +### Responsibilities + +- Focused on unblocking developers, backlog of issues. +- Priority focus on Enterprise customers. +- Help high-value customers with implementation and monitoring. +- Build internal tools for support team. +- Produce tests and documentation to mitigate recurring support tickets. +- Triage/clean/close issues on any of our repos. +- Work with the community on all of our channels: GitHub, Discord, and Email. + +## About you + +- 2+ years experience in engineering or a highly technical support role. +- You must love remote work. +- You possess exceptional communication skills. +- Availability to work within a weekend and on-call rota. + + +## Bonus if you: + +- Are a Polyglot developer, with some skill in NodeJS/Javascript. +- Have PostgreSQL experience. + + +## About Supabase + +{' '} + +## About the team + +{' '} + +## Apply + +{' '} + +## Process + +{' '} + +## All roles + +{' '} diff --git a/about/docs/careers/snippets/roles.mdx b/about/docs/careers/snippets/roles.mdx index da9fa45d7df7d..c0305f7dc6a75 100644 --- a/about/docs/careers/snippets/roles.mdx +++ b/about/docs/careers/snippets/roles.mdx @@ -57,7 +57,7 @@
-

Developer Support and QA Engineers

+

Support Engineers

Build internal tooling, automated tests, and support processes.

@@ -69,9 +69,16 @@ - +

Technical recruiter

Take the lead on our technical recruitment.

+
+ + +
+

Developer Success Engineer

+

Build the easiest database platform in the world.

+
\ No newline at end of file diff --git a/about/docs/careers/support.mdx b/about/docs/careers/support.mdx index 8b946ca4dde70..c7b247910725c 100644 --- a/about/docs/careers/support.mdx +++ b/about/docs/careers/support.mdx @@ -1,8 +1,8 @@ --- id: careers-support slug: support-and-qa -title: Developer Support and QA Engineers. -description: Supabase is hiring Support and QA Engineers +title: Support Engineers. +description: Supabase is hiring Support Engineers --- import Roles from '@site/docs/careers/snippets/roles.mdx' @@ -13,28 +13,43 @@ import Process from '@site/docs/careers/snippets/process.mdx' ## About the role -Supabase is hiring Developer Support and QA Engineers. +Supabase is hiring Developer Support Engineers. ### Responsibilities -- Creating test cases and improving test coverage. -- Monitoring Github issues, discussions, twitter, email, and other feedback channels. - Providing initial responses to all support cases. - Triaging support cases. Including directing users to previous answers, code examples, documentation, or escalating to specific technical or business team members. -- Establishing key support metrics and identifying how best to measure them. -- Establishing a workflow to reduce 'time to response' and 'time to fix' that can scale to multiple team members. -- Identifying where internal tooling might be developed or obtained to improve support efficiency. +- Monitoring Github issues, discussions, twitter, email, and other feedback channels. +- Creating test cases and improving test coverage, if you have experience with testing. For the right candidate, additional responsibilities may include: +- Establishing a workflow to reduce 'time to response' and 'time to fix' that can scale to multiple team members. +- Identifying where internal tooling might be developed or obtained to improve support efficiency. +- Establishing key support metrics and identifying how best to measure them. - Working with the Founders to construct and execute on a hiring plan to grow the support team. ### Requirements +- 1+ year tech experience. - Familiar with popular JavaScript frameworks (React, Vue, Svelte) and Node.js. - Experience working with GitHub source code management, and CI/CD tools. + + +## Nice to have + +- Experience writing tests - Familiar with Postgres and Golang is a plus. +## Timezones + +- We're looking for global coverage, in particular the US, European and APAC timezone. + +## Four day work week + +This role is optionally a four-day workweek if you are interested in working from Friday to Monday. We can also discuss a shorter (pro-rated) week. +In particular we would like to hire people who would be willing to work on weekends (or at least one of the days (Saturday or Sunday). + ## About Supabase {' '} diff --git a/about/docs/careers/technical-recruiter.mdx b/about/docs/careers/technical-recruiter.mdx index a6ed006e447e2..d246e16ef08cf 100644 --- a/about/docs/careers/technical-recruiter.mdx +++ b/about/docs/careers/technical-recruiter.mdx @@ -1,7 +1,7 @@ --- id: careers-technical-recruiter slug: technical-recruiter -title: Technical Recruiter. +title: Technical Recruiter description: Supabase is hiring Technical Recruiters --- @@ -13,7 +13,13 @@ import Process from '@site/docs/careers/snippets/process.mdx' ## About the role -#### Candidate** **Must Haves / key skills / personality traits: +#### Key Responsibilities: + +- Be accountable for implementing inclusive recruiting practices and finding ways to engage more under-represented talent for technical roles +- Ability to understand and communicate the business' current technical challenges to entice candidates who are driven by solving interesting problems +- Accountable to starting a candidate search project from scratch through requirement gathering, job posting, sourcing, networking, previous applicants follow-ups etc + +#### Requirements: - Minimum 2+ years technical recruiting experience across the full hiring process from sourcing to the offer stage - Technical knowledge of different coding languages/technical stacks/terminology @@ -29,14 +35,9 @@ import Process from '@site/docs/careers/snippets/process.mdx' - A continuous improvement mindset with an iterative approach to making things better. Whether it's your interview technique, pipeline optimization or anything else that you discover. - Fluency with Greenhouse or other Applicant Tracking Systems, as well as various sourcing platforms (e.g., LinkedIn, Github, Work at a Startup, etc) -- You’re Comfortable coordinating all candidate touch points +- You're Comfortable coordinating all candidate touch points - You can plan out batch days & other projects to drive excellence for our candidate experience and quality of interviews -#### Key Responsibilities: - -- Be accountable for implementing inclusive recruiting practices and finding ways to engage more under-represented talent for technical roles -- Ability to understand and communicate the business' current technical challenges to entice candidates who are driven by solving interesting problems -- Accountable to starting a candidate search project from scratch through requirement gathering, job posting, sourcing, networking, previous applicants follow-ups etc ## About Supabase diff --git a/about/package-lock.json b/about/package-lock.json index 49dc26a3b7e31..013d6d2165810 100644 --- a/about/package-lock.json +++ b/about/package-lock.json @@ -2695,19 +2695,6 @@ } } }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -4148,11 +4135,6 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, - "css-b64-images": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", - "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=" - }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -4562,72 +4544,73 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.2.1.tgz", + "integrity": "sha512-E/5sP0aeK6YPXI/+4QlefvBFgmcyR2jYftId0PrYWv4Y/gW3c3thp1XG4rQzF0eUwV9tR1x05X5eWuJ6rQXvew==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" } }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "requires": { + "internmap": "1 - 2" + } }, "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" }, "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" } }, "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "requires": { - "d3-array": "1", - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-collection": { @@ -4636,183 +4619,199 @@ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" }, "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", "requires": { - "d3-array": "^1.1.1" + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" } }, "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" }, "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "d3-dispatch": "1 - 3", + "d3-selection": "3" } }, "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "requires": { - "commander": "2", - "iconv-lite": "0.4", + "commander": "7", + "iconv-lite": "0.6", "rw": "1" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } } } }, "d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "requires": { - "d3-dsv": "1" + "d3-dsv": "1 - 3" } }, "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", "requires": { - "d3-array": "1" + "d3-array": "2.5.0 - 3" } }, "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==" }, "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "requires": { - "d3-color": "1" + "d3-color": "1 - 3" } }, "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" }, "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" }, "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" }, "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" }, "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } }, "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" } }, "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", "requires": { - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } }, "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "requires": { - "d3-time": "1" + "d3-time": "1 - 3" } }, "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" }, "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-voronoi": { @@ -4821,15 +4820,15 @@ "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" }, "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" } }, "dagre": { @@ -4850,6 +4849,267 @@ "dagre": "^0.8.5", "graphlib": "^2.1.8", "lodash": "^4.17.15" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + } } }, "debug": { @@ -4980,6 +5240,14 @@ } } }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", @@ -5130,6 +5398,11 @@ "domelementtype": "1" } }, + "dompurify": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.4.tgz", + "integrity": "sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ==" + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -5337,14 +5610,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, - "entity-decode": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/entity-decode/-/entity-decode-2.0.2.tgz", - "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", - "requires": { - "he": "^1.1.1" - } - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -5419,11 +5684,6 @@ "estraverse": "^4.1.1" } }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5964,9 +6224,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "for-in": { "version": "1.0.2", @@ -6762,57 +7022,6 @@ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" }, - "html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "dependencies": { - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "^1.1.1" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "requires": { - "no-case": "^2.2.0" - } - } - } - }, "html-minifier-terser": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", @@ -7295,6 +7504,11 @@ "ipaddr.js": "^1.9.0" } }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7764,9 +7978,9 @@ } }, "khroma": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.1.0.tgz", - "integrity": "sha512-aTO+YX22tYOLEQJYFiatAj1lc5QZ+H5sHWFRBWNCiKwc5NWNUJZyeSeiHEPeURJ2a1GEVYcmyMUwGjjLe5ec5A==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.4.1.tgz", + "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" }, "killable": { "version": "1.0.1", @@ -7835,9 +8049,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -8205,22 +8419,19 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "mermaid": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.8.2.tgz", - "integrity": "sha512-Ib9jl5TMwgMKv2+vdfKZ/SIUxKYc4GMauKeV2+3BD/bU47kGbc5zv5taCY5iZR+V4hdweHKE7YOl11VGcWBy/w==", + "version": "8.13.8", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.13.8.tgz", + "integrity": "sha512-Z5v31rvo8P7BPTiGicdJl9BbzyUe9s5sXILK8sM1g7ijkagpfFjPtXZVsq5P1WlN8m/fUp2PPNXVF9SqeTM91w==", "requires": { "@braintree/sanitize-url": "^3.1.0", - "babel-eslint": "^10.1.0", - "d3": "^5.7.0", - "dagre": "^0.8.4", + "d3": "^7.0.0", + "dagre": "^0.8.5", "dagre-d3": "^0.6.4", - "entity-decode": "^2.0.2", - "graphlib": "^2.1.7", - "he": "^1.2.0", - "khroma": "^1.1.0", - "minify": "^4.1.1", - "moment-mini": "^2.22.1", - "stylis": "^3.5.2" + "dompurify": "2.3.4", + "graphlib": "^2.1.8", + "khroma": "^1.4.1", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" } }, "methods": { @@ -8336,20 +8547,6 @@ } } }, - "minify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/minify/-/minify-4.1.3.tgz", - "integrity": "sha512-ykuscavxivSmVpcCzsXmsVTukWYLUUtPhHj0w2ILvHDGqC+hsuTCihBn9+PJBd58JNvWTNg9132J9nrrI2anzA==", - "requires": { - "clean-css": "^4.1.6", - "css-b64-images": "~0.2.5", - "debug": "^4.1.0", - "html-minifier": "^4.0.0", - "terser": "^4.0.0", - "try-catch": "^2.0.0", - "try-to-catch": "^1.0.2" - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -11644,6 +11841,11 @@ "inherits": "^2.0.1" } }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -12593,9 +12795,9 @@ } }, "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "supports-color": { "version": "5.5.0", @@ -13039,16 +13241,6 @@ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, - "try-catch": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/try-catch/-/try-catch-2.0.1.tgz", - "integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg==" - }, - "try-to-catch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-1.1.1.tgz", - "integrity": "sha512-ikUlS+/BcImLhNYyIgZcEmq4byc31QpC+46/6Jm5ECWkVFhf8SM2Fp/0pMVXPX6vk45SMCwrP4Taxucne8I0VA==" - }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -13120,11 +13312,6 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==" }, - "uglify-js": { - "version": "3.11.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.4.tgz", - "integrity": "sha512-FyYnoxVL1D6+jDGQpbK5jW6y/2JlVfRfEeQ67BPCUg5wfCjaKOpr2XeceE4QL+MkhxliLtf5EbrMDZgzpt2CNw==" - }, "unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", @@ -13367,11 +13554,6 @@ "xdg-basedir": "^4.0.0" } }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", diff --git a/about/package.json b/about/package.json index 11cef24bdfa85..c5e4bc58791e9 100644 --- a/about/package.json +++ b/about/package.json @@ -10,7 +10,7 @@ "@docusaurus/core": "^2.0.0-alpha.63", "@docusaurus/preset-classic": "^2.0.0-alpha.63", "@kiwicopple/prism-react-renderer": "github:kiwicopple/prism-react-renderer", - "mermaid": "^8.6.4", + "mermaid": "^8.13.8", "react": "^16.8.4", "react-dom": "^16.8.4", "react-inlinesvg": "^2.0.1" diff --git a/docker/.env.example b/docker/.env.example index 8a12be00005d3..81009f3057717 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -3,8 +3,8 @@ POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long -ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY -SERVICE_ROLE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU +ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE +SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q # Auth diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 78197b5920e83..c5bf1ccd05c07 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -80,7 +80,7 @@ services: restart: unless-stopped environment: PGRST_DB_URI: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/postgres - PGRST_DB_SCHEMA: public,storage + PGRST_DB_SCHEMAS: public,storage PGRST_DB_ANON_ROLE: anon PGRST_JWT_SECRET: ${JWT_SECRET} PGRST_DB_USE_LEGACY_GUCS: "false" diff --git a/docker/volumes/api/kong.yml b/docker/volumes/api/kong.yml index 13a2caa42be7a..aab2fe55aa057 100644 --- a/docker/volumes/api/kong.yml +++ b/docker/volumes/api/kong.yml @@ -6,10 +6,10 @@ _format_version: "1.1" consumers: - username: anon keyauth_credentials: - - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY + - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE - username: service_role keyauth_credentials: - - key: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU + - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q ### ### Access Control List diff --git a/docker/volumes/db/init/03-post-setup.sql b/docker/volumes/db/init/03-post-setup.sql index 1304ae6ae096c..64dc7399fd525 100644 --- a/docker/volumes/db/init/03-post-setup.sql +++ b/docker/volumes/db/init/03-post-setup.sql @@ -4,7 +4,7 @@ RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN - NOTIFY ddl_command_end; + NOTIFY pgrst, 'reload schema'; END; $$; CREATE EVENT TRIGGER api_restart ON ddl_command_end diff --git a/examples/angular-todo-list/package-lock.json b/examples/angular-todo-list/package-lock.json index 177cb78a8e1c9..18a11279b7a7e 100644 --- a/examples/angular-todo-list/package-lock.json +++ b/examples/angular-todo-list/package-lock.json @@ -1,6 +1,6 @@ { "name": "angular-todo-list", - "version": "0.0.0", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6236,9 +6236,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", "dev": true }, "for-in": { diff --git a/examples/flutter-user-management/.dart_tool/package_config.json b/examples/flutter-user-management/.dart_tool/package_config.json deleted file mode 100644 index 3fffc2fb9eb4c..0000000000000 --- a/examples/flutter-user-management/.dart_tool/package_config.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "archive", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cross_file", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cross_file-0.3.1+4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cupertino_icons", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "ffi", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_launcher_icons", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_plugin_android_lifecycle", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "gotrue", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/gotrue-0.0.7", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image_picker", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image_picker_for_web", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image_picker_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_platform_interface-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "jwt_decode", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/jwt_decode-0.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lint", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/lint-1.5.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "postgrest", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/postgrest-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "realtime_client", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/realtime_client-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rounded_loading_button", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rounded_loading_button-2.0.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.26.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences_linux", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences_macos", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences_web", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shared_preferences_windows", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "storage_client", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/storage_client-0.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "supabase", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase-0.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "supabase_flutter", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase_flutter-0.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "uni_links", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "uni_links_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_platform_interface-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "uni_links_web", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "universal_io", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/universal_io-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "supabase_demo", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.12" - } - ], - "generated": "2021-07-19T01:13:21.414488Z", - "generator": "pub", - "generatorVersion": "2.13.4" -} diff --git a/examples/flutter-user-management/.dart_tool/package_config_subset b/examples/flutter-user-management/.dart_tool/package_config_subset deleted file mode 100644 index aaa82c5059f0a..0000000000000 --- a/examples/flutter-user-management/.dart_tool/package_config_subset +++ /dev/null @@ -1,321 +0,0 @@ -supabase_demo -2.12 -file:///Users/phamhieu/Documents/projects/nodejs/supabase/examples/flutter-user-management/ -file:///Users/phamhieu/Documents/projects/nodejs/supabase/examples/flutter-user-management/lib/ -archive -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.0.0/lib/ -async -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0/lib/ -charcode -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -clock -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -cross_file -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cross_file-0.3.1+4/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cross_file-0.3.1+4/lib/ -crypto -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -fake_async -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_launcher_icons -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.0/lib/ -flutter_plugin_android_lifecycle -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2/lib/ -flutter_secure_storage -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/lib/ -gotrue -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/gotrue-0.0.7/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/gotrue-0.0.7/lib/ -http -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -image_picker -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/lib/ -image_picker_for_web -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0/lib/ -image_picker_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_platform_interface-2.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_platform_interface-2.2.0/lib/ -js -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -jwt_decode -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/jwt_decode-0.3.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/jwt_decode-0.3.1/lib/ -lint -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/lint-1.5.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/lint-1.5.3/lib/ -matcher -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -path -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider_linux -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/lib/ -path_provider_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/lib/ -pedantic -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0/lib/ -plugin_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -postgrest -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/postgrest-0.1.4/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/postgrest-0.1.4/lib/ -process -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.1/lib/ -realtime_client -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/realtime_client-0.1.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/realtime_client-0.1.3/lib/ -rounded_loading_button -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rounded_loading_button-2.0.5/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rounded_loading_button-2.0.5/lib/ -rxdart -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.26.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.26.0/lib/ -shared_preferences -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/lib/ -shared_preferences_linux -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/lib/ -shared_preferences_macos -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/lib/ -shared_preferences_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.0.0/lib/ -shared_preferences_web -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/lib/ -shared_preferences_windows -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/lib/ -source_span -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -storage_client -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/storage_client-0.0.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/storage_client-0.0.2/lib/ -stream_channel -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -supabase -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase-0.0.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase-0.0.2/lib/ -supabase_flutter -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase_flutter-0.0.3/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase_flutter-0.0.3/lib/ -term_glyph -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -typed_data -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -uni_links -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/lib/ -uni_links_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_platform_interface-1.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_platform_interface-1.0.0/lib/ -uni_links_web -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0/lib/ -universal_io -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/universal_io-2.0.4/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/universal_io-2.0.4/lib/ -url_launcher -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0/lib/ -url_launcher_macos -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0/lib/ -url_launcher_platform_interface -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1/lib/ -url_launcher_windows -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0/lib/ -vector_math -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0/lib/ -web_socket_channel -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -win32 -2.13 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/bin/cache/pkg/sky_engine/ -file:///Users/phamhieu/Documents/sdks/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter/ -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter/lib/ -flutter_test -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_test/ -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_web_plugins/ -file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/examples/flutter-user-management/.dart_tool/version b/examples/flutter-user-management/.dart_tool/version deleted file mode 100644 index 6b4d157738258..0000000000000 --- a/examples/flutter-user-management/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.2.3 \ No newline at end of file diff --git a/examples/flutter-user-management/.flutter-plugins b/examples/flutter-user-management/.flutter-plugins deleted file mode 100644 index 9777d32994c4e..0000000000000 --- a/examples/flutter-user-management/.flutter-plugins +++ /dev/null @@ -1,19 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_plugin_android_lifecycle=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2/ -flutter_secure_storage=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/ -image_picker=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/ -image_picker_for_web=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0/ -path_provider_linux=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/ -path_provider_windows=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/ -shared_preferences=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/ -shared_preferences_linux=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/ -shared_preferences_macos=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/ -shared_preferences_web=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/ -shared_preferences_windows=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/ -uni_links=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/ -uni_links_web=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0/ -url_launcher=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0/ -url_launcher_macos=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0/ -url_launcher_web=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1/ -url_launcher_windows=/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0/ diff --git a/examples/flutter-user-management/.flutter-plugins-dependencies b/examples/flutter-user-management/.flutter-plugins-dependencies deleted file mode 100644 index e9c125c19cac3..0000000000000 --- a/examples/flutter-user-management/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/","dependencies":[]},{"name":"image_picker","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/","dependencies":[]},{"name":"shared_preferences","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"uni_links","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/","dependencies":[]},{"name":"url_launcher","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"flutter_plugin_android_lifecycle","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2/","dependencies":[]},{"name":"flutter_secure_storage","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/","dependencies":[]},{"name":"image_picker","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"shared_preferences","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"uni_links","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/","dependencies":[]},{"name":"url_launcher","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"shared_preferences_macos","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/","dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/","dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/","dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/","dependencies":["path_provider_windows"]},{"name":"url_launcher_windows","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0/","dependencies":[]}],"web":[{"name":"image_picker_for_web","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/","dependencies":[]},{"name":"uni_links_web","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1/","dependencies":[]}]},"dependencyGraph":[{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"flutter_secure_storage","dependencies":[]},{"name":"image_picker","dependencies":["flutter_plugin_android_lifecycle","image_picker_for_web"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"uni_links","dependencies":["uni_links_web"]},{"name":"uni_links_web","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2021-07-19 08:13:21.531040","version":"2.2.3"} \ No newline at end of file diff --git a/examples/flutter-user-management/.gitignore b/examples/flutter-user-management/.gitignore new file mode 100644 index 0000000000000..0fa6b675c0a52 --- /dev/null +++ b/examples/flutter-user-management/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/examples/flutter-user-management/.metadata b/examples/flutter-user-management/.metadata new file mode 100644 index 0000000000000..fd70cabc06d24 --- /dev/null +++ b/examples/flutter-user-management/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b + channel: stable + +project_type: app diff --git a/examples/flutter-user-management/.packages b/examples/flutter-user-management/.packages deleted file mode 100644 index 567fb2241c1cc..0000000000000 --- a/examples/flutter-user-management/.packages +++ /dev/null @@ -1,86 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tools/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2021-07-19 08:13:21.390732. -archive:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.0.0/lib/ -async:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0/lib/ -charcode:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -clock:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -cross_file:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cross_file-0.3.1+4/lib/ -crypto:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -fake_async:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter/lib/ -flutter_launcher_icons:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.0/lib/ -flutter_plugin_android_lifecycle:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.2/lib/ -flutter_secure_storage:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.0/lib/ -flutter_test:file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/phamhieu/Documents/sdks/flutter/packages/flutter_web_plugins/lib/ -gotrue:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/gotrue-0.0.7/lib/ -http:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -image_picker:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.8.2/lib/ -image_picker_for_web:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_for_web-2.1.0/lib/ -image_picker_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker_platform_interface-2.2.0/lib/ -js:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -jwt_decode:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/jwt_decode-0.3.1/lib/ -lint:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/lint-1.5.3/lib/ -matcher:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -path:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider_linux:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/lib/ -path_provider_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/lib/ -pedantic:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0/lib/ -plugin_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -postgrest:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/postgrest-0.1.4/lib/ -process:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.1/lib/ -realtime_client:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/realtime_client-0.1.3/lib/ -rounded_loading_button:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rounded_loading_button-2.0.5/lib/ -rxdart:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.26.0/lib/ -shared_preferences:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/lib/ -shared_preferences_linux:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/lib/ -shared_preferences_macos:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/lib/ -shared_preferences_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.0.0/lib/ -shared_preferences_web:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/lib/ -shared_preferences_windows:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/lib/ -sky_engine:file:///Users/phamhieu/Documents/sdks/flutter/bin/cache/pkg/sky_engine/lib/ -source_span:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -storage_client:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/storage_client-0.0.2/lib/ -stream_channel:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -supabase:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase-0.0.2/lib/ -supabase_flutter:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/supabase_flutter-0.0.3/lib/ -term_glyph:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -typed_data:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -uni_links:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links-0.5.1/lib/ -uni_links_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_platform_interface-1.0.0/lib/ -uni_links_web:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/uni_links_web-0.1.0/lib/ -universal_io:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/universal_io-2.0.4/lib/ -url_launcher:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.0/lib/ -url_launcher_macos:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.0/lib/ -url_launcher_platform_interface:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.1/lib/ -url_launcher_windows:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.0/lib/ -vector_math:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0/lib/ -web_socket_channel:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -win32:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/phamhieu/Documents/sdks/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -supabase_demo:lib/ diff --git a/examples/flutter-user-management/android/.gitignore b/examples/flutter-user-management/android/.gitignore index 0a741cb43d66c..6f568019d3c69 100644 --- a/examples/flutter-user-management/android/.gitignore +++ b/examples/flutter-user-management/android/.gitignore @@ -9,3 +9,5 @@ GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app key.properties +**/*.keystore +**/*.jks diff --git a/examples/flutter-user-management/android/app/build.gradle b/examples/flutter-user-management/android/app/build.gradle index aff4234ae58ab..2370fa037d19b 100644 --- a/examples/flutter-user-management/android/app/build.gradle +++ b/examples/flutter-user-management/android/app/build.gradle @@ -26,7 +26,16 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -36,7 +45,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "io.supabase.supabase_demo" minSdkVersion 18 - targetSdkVersion 30 + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/examples/flutter-user-management/android/app/src/main/AndroidManifest.xml b/examples/flutter-user-management/android/app/src/main/AndroidManifest.xml index b83deccaff53e..d5966e57f60d9 100644 --- a/examples/flutter-user-management/android/app/src/main/AndroidManifest.xml +++ b/examples/flutter-user-management/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:fullBackupContent="false"> - - - + - - + + @@ -82,6 +75,6 @@ Supabase เป็น [hosted platform](https://app.supabase.io). คุณส --- -## Sponsors +## การสนับสนุน -[![New Sponsor](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase) +[![สนับสนุนเราได้ที่นี่](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase) diff --git a/i18n/README.tr.md b/i18n/README.tr.md index c37577fa845a6..473b595559cc0 100644 --- a/i18n/README.tr.md +++ b/i18n/README.tr.md @@ -48,7 +48,7 @@ Supabase, açık kaynaklı araçların bir kombinasyonudur. Firebase'in özellik Supabase [barındırılan bir platformdur](https://app.supabase.io). Hiçbir şey yüklemeden Supabase'e kaydolabilir ve kullanmaya başlayabilirsiniz. Hala yerel geliştirme deneyimini yaratıyoruz - bu, artık platform kararlılığı ile birlikte temel odak noktamız. -![Architecture](https://supabase.com/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) +![Architecture](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) - [PostgreSQL](https://www.postgresql.org/) güvenilirlik, özellik sağlamlığı ve performans açısından güçlü bir üne kavuşan 30 yılı aşkın aktif geliştirmeye sahip bir nesne ilişkisel veritabanı sistemidir. - [Realtime](https://github.com/supabase/realtime) Web soketleri kullanarak PostgreSQL eklerini, güncellemelerini ve silmelerini dinlemenizi sağlayan bir Elixir sunucusudur. Supabase, Postgres'in yerleşik çoğaltma işlevini dinler, çoğaltma bayt akışını JSON'a dönüştürür ve ardından JSON'yi web yuvaları üzerinden yayınlar. diff --git a/i18n/README.uk.md b/i18n/README.uk.md index b7ed50da66a15..2e1af25d4b258 100644 --- a/i18n/README.uk.md +++ b/i18n/README.uk.md @@ -47,7 +47,7 @@ Supabase – це поєднання відкритого програмного Supabase – це [хмарна платформа](https://app.supabase.io). Ви можете зареєструватися і почати використовувати її, нічого не встановлюючи. Ми досі продовжуємо покращувати зручність локальної розробки – це наш основний пріоритет, одночасно зі стабільністю платформи. -![Architecture](https://supabase.com/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) +![Architecture](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) - [PostgreSQL](https://www.postgresql.org/) – це об'єктно-реляційна система керування базами даних з більш ніж 30 роками активної розробки, котра завоювали міцну репутацію завдяки надійності та продуктивності. - [Realtime](https://github.com/supabase/realtime) являє собою Elixir сервер який дозволяє слухати зміни в PostgreSQL за допомогою веб-сокетів. Supabase використовує вбудований функціонал реплікації Postgres, перетворюючи бінарний протокол реплікації в JSON та передаючи по веб-сокетам. diff --git a/i18n/README.vi-vn.md b/i18n/README.vi-vn.md index 7d02961304a0a..6aad15b91f39e 100644 --- a/i18n/README.vi-vn.md +++ b/i18n/README.vi-vn.md @@ -48,7 +48,7 @@ Supabase là sự kết hợp của các công cụ mã nguồn mở. Các tính Supabase là một [nền tảng lưu trữ cơ sở dữ liệu] (https://app.supabase.io). Bạn có thể đăng ký và bắt đầu sử dụng Supabase mà không cần cài đặt bất kỳ thứ gì. Chúng tôi vẫn đang phát triển tính năng chạy Supabase trong môi trường ảo hoá trên chính máy tính cá nhân của bạn - đây hiện là trọng tâm cốt lõi của chúng tôi, cùng với sự ổn định của nền tảng. -![Kiến trúc](https://supabase.com/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) +![Kiến trúc](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) - [PostgreSQL] (https://www.postgresql.org/) là một hệ thống cơ sở dữ liệu quan hệ đối tượng với hơn 30 năm phát triển tích cực đã mang lại cho nó một danh tiếng mạnh mẽ về độ tin cậy, tính năng mạnh mẽ và hiệu suất. - [Realtime] (https://github.com/supabase/realtime) là một máy chủ Elixir cho phép bạn lắng nghe các lệnh chèn, cập nhật và xóa PostgreSQL bằng cách sử dụng websockets. Supabase lắng nghe chức năng sao chép có sẵn của Postgres, chuyển đổi luồng byte sao chép thành JSON, sau đó phát JSON qua các cổng web. diff --git a/i18n/README.zh-cn.md b/i18n/README.zh-cn.md index ab64bda220061..867a3bc9d29ae 100644 --- a/i18n/README.zh-cn.md +++ b/i18n/README.zh-cn.md @@ -47,7 +47,7 @@ Supabase 是一个开源工具的组合。我们正在使用企业级的开源 Supabase 是一个[托管平台](https://app.supabase.io)。你可以注册并开始使用 Supabase,而无需安装任何软件。我们仍在优化本地开发体验,这和平台稳定性一起作为我们当前的核心目标。 -![架构](https://supabase.com/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) +![架构](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) - [PostgreSQL](https://www.postgresql.org/) 是一个对象关系型数据库系统,经过 30 多年的积极开发,它在可靠性、功能健壮性和性能方面赢得了很好的声誉。 - [Realtime](https://github.com/supabase/realtime) 是一个 Elixir 服务器,允许你使用 WebSocket 监听 PostgreSQL 的插入、更新和删除。Supabase 监听 Postgres 的内置复制功能,将复制的字节流转换为 JSON,然后通过 WebSocket 广播 JSON。 diff --git a/i18n/README.zh-tw.md b/i18n/README.zh-tw.md index 1ef87d31fc033..10951eb177234 100644 --- a/i18n/README.zh-tw.md +++ b/i18n/README.zh-tw.md @@ -47,7 +47,7 @@ Supabase 是一套開放原始碼工具的組合包。我們以企業等級的 Supabase 是[託管平台](https://app.supabase.io)。只要註冊,不必安裝任何東西,就可以開始使用 Supabase。目前還在打造本地端開發體驗:連同平台的穩定度,這是我們專注的核心。 -![架構](https://supabase.com/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) +![架構](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png) - [PostgreSQL](https://www.postgresql.org/) 是經歷 30 年活躍開發的關聯物件資料庫系統,因此擁有可靠度、功能細緻度與效能著稱。 - [Realtime](https://github.com/supabase/realtime) 是利用 Websocket 監聽 PostgreSQL 的 insert、update 和 delete 的 Elixir 伺服器。Supabase 監聽 Postgres 內建的複寫 (Replication) 功能,將複寫的 byte stream 轉換為 JSON 格式,接著透過 Websocket 將 JSON 進行廣播。 diff --git a/package-lock.json b/package-lock.json index 1f021daed271b..f8013e57dbb29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2475,9 +2475,9 @@ } }, "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", "dev": true }, "form-data": { diff --git a/studio/.env b/studio/.env index 6b71a62226e48..db284f3411e40 100644 --- a/studio/.env +++ b/studio/.env @@ -2,5 +2,7 @@ STUDIO_PG_META_URL=http://localhost:8000/pg POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password SUPABASE_URL=http://localhost:8000 -SUPABASE_ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY -SUPABASE_SERVICE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU \ No newline at end of file +SUPABASE_REST_URL=http://localhost:8000/rest/v1/ +SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE +SUPABASE_SERVICE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q + diff --git a/studio/README.md b/studio/README.md index 04e1183377b8f..3ce05dd6a3358 100644 --- a/studio/README.md +++ b/studio/README.md @@ -4,7 +4,7 @@ A dashboard for managing your self-hosted Supabase project, and used on our [hos - [Next.js](https://nextjs.org/) - [Tailwind](https://tailwindcss.com/) -- [Supabase UI](https://ui.supabase.io/) +- [Supabase UI](https://ui.supabase.com/) - [MobX](https://www.mobxjs.com/) ## Disclaimer diff --git a/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.tsx b/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.tsx new file mode 100644 index 0000000000000..ceb818e004f73 --- /dev/null +++ b/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.tsx @@ -0,0 +1,53 @@ +import { FC, useEffect, useState } from 'react' +import { Subscription } from '@supabase/gotrue-js' + +import { auth } from 'lib/gotrue' +import Connecting from 'components/ui/Loading' +import { doesTokenDataExist } from './GoTrueWrapper.utils' + +/** + * On app first load, gotrue client may take a while to refresh access token + * We have to wait for that process to complete before showing children components + */ +const GoTrueWrapper: FC = ({ children }) => { + const [loading, setLoading] = useState(doesTokenDataExist()) + + useEffect(() => { + let subscription: Subscription | null + let timer: any + const currentSession = auth.session() + + function tokenRefreshed() { + setLoading(false) + // clean subscription + if (subscription) subscription.unsubscribe() + // clean timer + if (timer) clearTimeout(timer) + } + + if (currentSession != undefined && currentSession != null) { + // if there is an active session, go ahead + setLoading(false) + } else { + // else wait for TOKEN_REFRESHED event before continue + const response = auth.onAuthStateChange((_event, session) => { + if (loading && _event === 'TOKEN_REFRESHED') { + tokenRefreshed() + } + }) + subscription = response.data ?? null + + // we need a timeout here, in case token refresh fails + timer = setTimeout(() => setLoading(false), 5 * 1000) + } + + return () => { + if (subscription) subscription.unsubscribe() + if (timer) clearTimeout(timer) + } + }, []) + + return <>{loading ? : children} +} + +export default GoTrueWrapper diff --git a/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.utils.ts b/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.utils.ts new file mode 100644 index 0000000000000..6b3c03b60fee0 --- /dev/null +++ b/studio/components/interfaces/App/GoTrueWrapper/GoTrueWrapper.utils.ts @@ -0,0 +1,7 @@ +export function doesTokenDataExist() { + // ignore if server-side + if (typeof window === 'undefined') return false + // check tokenData on localstorage + const tokenData = window?.localStorage['supabase.auth.token'] + return tokenData != undefined && typeof tokenData === 'string' +} diff --git a/studio/components/interfaces/App/PortalToast.tsx b/studio/components/interfaces/App/PortalToast.tsx new file mode 100644 index 0000000000000..7521b9118f788 --- /dev/null +++ b/studio/components/interfaces/App/PortalToast.tsx @@ -0,0 +1,51 @@ +import dynamic from 'next/dynamic' +import { Toaster, ToastBar, toast } from 'react-hot-toast' +import { Button, IconX } from '@supabase/ui' + +const PortalRootWithNoSSR = dynamic( + // @ts-ignore + () => import('@radix-ui/react-portal').then((portal) => portal.Root), + { ssr: false } +) + +const PortalToast = () => ( + // @ts-ignore + + + {(t) => ( + + {({ icon, message }) => ( + <> + {icon} + {message} + {t.type !== 'loading' && ( +
+ +
+ )} + + )} +
+ )} +
+
+) + +export default PortalToast diff --git a/studio/components/interfaces/App/RouteValidationWrapper.tsx b/studio/components/interfaces/App/RouteValidationWrapper.tsx new file mode 100644 index 0000000000000..ac97fd6a19ebc --- /dev/null +++ b/studio/components/interfaces/App/RouteValidationWrapper.tsx @@ -0,0 +1,50 @@ +import { FC, useEffect } from 'react' +import { observer } from 'mobx-react-lite' +import { useRouter } from 'next/router' + +import { useStore } from 'hooks' +import { Organization, Project } from 'types' + +// Ideally these could all be within a _middleware when we use Next 12 +const RouteValidationWrapper: FC = ({ children }) => { + const { ui, app } = useStore() + const userProfile = ui.profile + + const router = useRouter() + const projectRef = router.query.ref + const orgSlug = router.query.slug + + useEffect(() => { + if (userProfile) { + // Check validity of organization that user is trying to access + if (orgSlug) { + const organizations = app.organizations.list() + const organizationSlugs = organizations.map((org: Organization) => org.slug) + const isValidOrg = organizationSlugs.includes(orgSlug as string) + + if (!isValidOrg) { + ui.setNotification({ category: 'error', message: 'This organization does not exist' }) + router.push('/') + return + } + } + + // Check validity of project that the user is trying to access + if (projectRef) { + const projects = app.projects.list() + const projectRefs = projects.map((project: Project) => project.ref) + const isValidProject = projectRefs.includes(projectRef as string) + + if (!isValidProject) { + ui.setNotification({ category: 'error', message: 'This project does not exist' }) + router.push('/') + return + } + } + } + }, [userProfile]) + + return <>{children} +} + +export default observer(RouteValidationWrapper) diff --git a/studio/components/interfaces/App/index.ts b/studio/components/interfaces/App/index.ts new file mode 100644 index 0000000000000..f65fabe020906 --- /dev/null +++ b/studio/components/interfaces/App/index.ts @@ -0,0 +1,5 @@ +import PortalToast from './PortalToast' +import GoTrueWrapper from './GoTrueWrapper/GoTrueWrapper' +import RouteValidationWrapper from './RouteValidationWrapper' + +export { PortalToast, GoTrueWrapper, RouteValidationWrapper } diff --git a/studio/components/interfaces/Database/Pooling/PgBouncerConfig.tsx b/studio/components/interfaces/Database/Pooling/PgBouncerConfig.tsx index 46ef3b80b917d..91849b1ef6a57 100644 --- a/studio/components/interfaces/Database/Pooling/PgBouncerConfig.tsx +++ b/studio/components/interfaces/Database/Pooling/PgBouncerConfig.tsx @@ -1,6 +1,6 @@ import { FC, useState } from 'react' import { observer } from 'mobx-react-lite' -import { Divider } from '@supabase/ui' +import { Divider, Typography } from '@supabase/ui' import { AutoField } from 'uniforms-bootstrap4' import { useStore } from 'hooks' @@ -66,7 +66,6 @@ const PgbouncerConfig: FC = ({ projectRef, config }) => { value: 'statement', }, ], - help: 'Specify when a connection can be returned to the pool. To find out the most suitable mode for your use case, click here.', }, ignore_startup_parameters: { title: 'Ignore Startup Parameters', @@ -102,12 +101,25 @@ const PgbouncerConfig: FC = ({ projectRef, config }) => { showInlineError errorMessage="You must select one of the three options" /> +
+ + Specify when a connection can be returned to the pool. To find out the most + suitable mode for your use case,{' '} + + click here + + . + +
{/* */} + name="default_pool_size" + showInlineError + errorMessage="Value must be within 1 and 20" + /> */} )} diff --git a/studio/components/interfaces/Home/Landing.tsx b/studio/components/interfaces/Home/Landing.tsx index f1a9986f9fe03..7eab0e470c0bb 100644 --- a/studio/components/interfaces/Home/Landing.tsx +++ b/studio/components/interfaces/Home/Landing.tsx @@ -72,7 +72,7 @@ const Landing = () => { Authentication, instant APIs, and realtime subscriptions.

-
+
diff --git a/studio/components/interfaces/Home/ProjectUsage.tsx b/studio/components/interfaces/Home/ProjectUsage.tsx index 02542221b4ee7..e8a0eeee07498 100644 --- a/studio/components/interfaces/Home/ProjectUsage.tsx +++ b/studio/components/interfaces/Home/ProjectUsage.tsx @@ -1,43 +1,83 @@ import useSWR from 'swr' import dayjs from 'dayjs' import Link from 'next/link' -import { FC } from 'react' +import { FC, useState } from 'react' import { useRouter } from 'next/router' -import { IconArchive, IconDatabase, IconKey, IconZap, Typography } from '@supabase/ui' +import { + IconArchive, + IconDatabase, + IconKey, + IconZap, + Typography, + Button, + Dropdown, + IconChevronDown, +} from '@supabase/ui' import Panel from 'components/to-be-cleaned/Panel' import ChartHandler from 'components/to-be-cleaned/Charts/ChartHandler' import { ProjectUsageMinimal } from 'components/to-be-cleaned/Usage' -import { useIsActive } from 'hooks' import { get } from 'lib/common/fetch' import { API_URL, METRICS, DATE_FORMAT } from 'lib/constants' +import { useFlag } from 'hooks' -const DATETIME_FORMAT = 'MMM D, ha' - +const CHART_INTERVALS = [ + { key: 'minutely', label: '60 minutes', startValue: 1, startUnit: 'hour', format: 'MMM D, h:ma' }, + { key: 'hourly', label: '24 hours', startValue: 24, startUnit: 'hour', format: 'MMM D, ha' }, + { key: 'daily', label: '7 days', startValue: 7, startUnit: 'day', format: 'MMM D' }, +] interface Props { project: any } const ProjectUsage: FC = ({ project }) => { + const logsUsageChartIntervals = useFlag('logsUsageChartIntervals') + const [interval, setInterval] = useState('minutely') const router = useRouter() const { ref } = router.query - const isActive = useIsActive() const { data, error }: any = useSWR( // only fetch when browser window is active - `${API_URL}/projects/${ref}/log-stats`, + `${API_URL}/projects/${ref}/log-stats?interval=${interval}`, get // increase refresh rate x10 to 30s when focus lost // conditional fetching will cause cached data to clear (not desirable) // { refreshInterval: isActive ? 3000 : 30000 } ) - const startDate = dayjs().subtract(7, 'day').format(DATE_FORMAT) + const selectedInterval = logsUsageChartIntervals + ? CHART_INTERVALS.find((i) => i.key === interval) || CHART_INTERVALS[0] + : CHART_INTERVALS[2] + const startDate = dayjs() + .subtract(selectedInterval.startValue, selectedInterval.startUnit) + .format(DATE_FORMAT) const endDate = dayjs().format(DATE_FORMAT) const charts = data?.data - + const datetimeFormat = selectedInterval.format || 'MMM D, ha' return (
- Statistics for past 24 hours +
+ Statistics for past {selectedInterval.label} + + {logsUsageChartIntervals && ( + + {CHART_INTERVALS.map((i) => ( + + {i.label} + + ))} + + } + > + + + )} +
{startDate && endDate && (
@@ -56,7 +96,7 @@ const ProjectUsage: FC = ({ project }) => { provider="log-stats" interval="1d" hideChartType - customDateFormat={DATETIME_FORMAT} + customDateFormat={datetimeFormat} data={charts} isLoading={!charts && !error ? true : false} /> @@ -82,7 +122,7 @@ const ProjectUsage: FC = ({ project }) => { provider="log-stats" interval="1d" hideChartType - customDateFormat={DATETIME_FORMAT} + customDateFormat={datetimeFormat} data={charts} isLoading={!charts && !error ? true : false} /> @@ -108,7 +148,7 @@ const ProjectUsage: FC = ({ project }) => { provider="log-stats" interval="1d" hideChartType - customDateFormat={DATETIME_FORMAT} + customDateFormat={datetimeFormat} data={charts} isLoading={!charts && !error ? true : false} /> @@ -130,7 +170,7 @@ const ProjectUsage: FC = ({ project }) => { provider="log-stats" interval="1h" hideChartType - customDateFormat={DATETIME_FORMAT} + customDateFormat={datetimeFormat} data={charts} isLoading={!charts && !error ? true : false} /> diff --git a/studio/components/interfaces/Settings/Logs/LogPanel.tsx b/studio/components/interfaces/Settings/Logs/LogPanel.tsx index ed80630b45e58..368f8ff793841 100644 --- a/studio/components/interfaces/Settings/Logs/LogPanel.tsx +++ b/studio/components/interfaces/Settings/Logs/LogPanel.tsx @@ -100,42 +100,44 @@ const LogPanel: FC = ({
{/* wrap with form so that if user presses enter, the search value will submit automatically */} -
diff --git a/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts b/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts index 5440281630a37..7ccad72a0d888 100644 --- a/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts +++ b/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts @@ -226,7 +226,7 @@ export const generateRowObjectFromFields = ( ): object => { const rowObject = {} as any fields.forEach((field) => { - const value = field.value.length === 0 ? null : field.value + const value = (field?.value ?? '').length === 0 ? null : field.value if (field.format.includes('json') || (field.format.startsWith('_') && value)) { if (typeof field.value === 'object') { rowObject[field.name] = value diff --git a/studio/components/layouts/ProjectLayout/LayoutHeader/HelpPopover.tsx b/studio/components/layouts/ProjectLayout/LayoutHeader/HelpPopover.tsx index ec0cc54483f23..e20cc94453c86 100644 --- a/studio/components/layouts/ProjectLayout/LayoutHeader/HelpPopover.tsx +++ b/studio/components/layouts/ProjectLayout/LayoutHeader/HelpPopover.tsx @@ -7,6 +7,7 @@ import { Popover, Typography, } from '@supabase/ui' +import { useRouter } from 'next/router' import { FC } from 'react' import Link from 'next/link' import Image from 'next/image' @@ -16,6 +17,10 @@ import SVG from 'react-inlinesvg' interface Props {} const HelpPopover: FC = () => { + const router = useRouter() + const projectRef = router.query.ref + const supportUrl = `/support/new${projectRef ? `?ref=${projectRef}` : ''}` + return ( = () => { hosted services.

- + diff --git a/studio/components/to-be-cleaned/BuildingState.tsx b/studio/components/to-be-cleaned/BuildingState.tsx index d7d160ffbe1dc..e6ab914e968da 100644 --- a/studio/components/to-be-cleaned/BuildingState.tsx +++ b/studio/components/to-be-cleaned/BuildingState.tsx @@ -40,8 +40,8 @@ const ProjectBuildingState: React.FC = () => { } React.useEffect(() => { - // check server status every 1s - checkServerInterval.current = window.setInterval(checkServer, 1000) + // check server status every 2s + checkServerInterval.current = window.setInterval(checkServer, 2000) return () => { clearInterval(checkServerInterval.current) } diff --git a/studio/components/to-be-cleaned/Integration/Vercel.utils.ts b/studio/components/to-be-cleaned/Integration/Vercel.utils.ts index 382e8b1317680..ede2f67413b70 100644 --- a/studio/components/to-be-cleaned/Integration/Vercel.utils.ts +++ b/studio/components/to-be-cleaned/Integration/Vercel.utils.ts @@ -16,7 +16,7 @@ export async function fetchVercelProjects({ url = `${url}?${query}` } const response = await get(url, { - headers: { Authorization: `Bearer ${vercelToken}` }, + headers: { vercel_authorization: `Bearer ${vercelToken}` }, }) if (response.error != null) { return { error: `Retrieve vercel projects failed. ${response.error?.message}` } @@ -48,7 +48,7 @@ export async function fetchVercelProject({ url = `${url}?${query}` } const data = await get(url, { - headers: { Authorization: `Bearer ${vercelToken}` }, + headers: { vercel_authorization: `Bearer ${vercelToken}` }, }) if (data.error != null) { return { error: `Retrieve vercel project failed. ${data.error.message}` } @@ -74,7 +74,7 @@ export async function fetchVercelProjectEnvs({ url = `${url}?${query}` } const response = await get(url, { - headers: { Authorization: `Bearer ${vercelToken}` }, + headers: { vercel_authorization: `Bearer ${vercelToken}` }, }) if (response.error != null) { return { error: `Retrieve vercel project envs failed. ${response.error?.message}` } @@ -114,7 +114,7 @@ export async function createVercelEnv({ url, { key, value, type, target }, { - headers: { Authorization: `Bearer ${vercelToken}` }, + headers: { vercel_authorization: `Bearer ${vercelToken}` }, } ) } diff --git a/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.js b/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.js index d7a763b07ea78..3658d22600211 100644 --- a/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.js +++ b/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.js @@ -1,5 +1,5 @@ import { createContext, useContext, useCallback, useState, useEffect } from 'react' -import { debounce, isUndefined } from 'lodash' +import { debounce, isNil } from 'lodash' import { observer, useLocalObservable } from 'mobx-react-lite' import { post } from 'lib/common/fetch' import { Button, IconKey, IconLoader, IconUser, IconX, Input, Typography } from '@supabase/ui' @@ -70,7 +70,7 @@ function InviteMemberModal({ organization, members = [] }) { org_id: orgId, user_id: PageState.selectedProfile.id, }) - if (isUndefined(response)) { + if (isNil(response)) { ui.setNotification({ category: 'error', message: 'Failed to add member' }) } else if (response?.error) { ui.setNotification({ @@ -141,7 +141,7 @@ const InputSearchWithResults = observer(({ className }) => { } setLoading(true) const response = await post(`${API_URL}/profile/search`, { keywords: PageState.keywords }) - if (isUndefined(response)) { + if (isNil(response)) { ui.setNotification({ category: 'error', message: 'Failed to search profile' }) } else if (response.error) { ui.setNotification({ diff --git a/studio/components/to-be-cleaned/SqlEditor/TabSqlQuery.js b/studio/components/to-be-cleaned/SqlEditor/TabSqlQuery.js index c95f034420089..927179bfb1a5a 100644 --- a/studio/components/to-be-cleaned/SqlEditor/TabSqlQuery.js +++ b/studio/components/to-be-cleaned/SqlEditor/TabSqlQuery.js @@ -567,7 +567,7 @@ const Results = ({ results }) => { } function onCopyCell() { - if (cellPosition) { + if (columns && cellPosition) { const { idx, rowIdx } = cellPosition const colKey = columns[idx].key const cellValue = results[rowIdx]?.[colKey] ?? '' diff --git a/studio/hooks/misc/withAuth.tsx b/studio/hooks/misc/withAuth.tsx index 89b0ff9712ad4..680c4c34cb1a3 100644 --- a/studio/hooks/misc/withAuth.tsx +++ b/studio/hooks/misc/withAuth.tsx @@ -24,7 +24,7 @@ export function withAuth( const { app, ui } = rootStore const page = router.pathname.split('/')[3] - const redirectTo = options?.redirectTo ?? (!isUndefined(ref) ? `/project/${ref}` : '/') + const redirectTo = options?.redirectTo ?? defaultRedirectTo(ref) const redirectIfFound = options?.redirectIfFound const returning = @@ -75,6 +75,10 @@ export function withAuth( } } +function defaultRedirectTo(ref: string | string[] | undefined) { + return IS_PLATFORM ? '/' : !isUndefined(ref) ? `/project/${ref}` : '/' +} + function checkRedirectTo( loading: boolean, router: NextRouter, @@ -83,7 +87,7 @@ function checkRedirectTo( redirectIfFound?: boolean ) { if (loading) return false - if (router.asPath == redirectTo) return false + if (router.pathname == redirectTo) return false // If redirectTo is set, redirect if the user was not found. if (redirectTo && !redirectIfFound && !profile) return true diff --git a/studio/jest.config.js b/studio/jest.config.js index b36d3b52c99c5..b07758343ba23 100644 --- a/studio/jest.config.js +++ b/studio/jest.config.js @@ -1,7 +1,7 @@ module.exports = { moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], moduleDirectories: ['', 'node_modules'], - setupFiles: ["jest-canvas-mock"], + setupFiles: ["jest-canvas-mock", "./tests/setup/radix"], testEnvironment: 'jsdom', testRegex: '(.*\\.test.(js|jsx|ts|tsx)$)', transform: { '^.+\\.(t|j)sx?$': 'ts-jest' }, diff --git a/studio/lib/constants/infrastructure.ts b/studio/lib/constants/infrastructure.ts index 5c138eb240abd..b33ebb4ba65d3 100644 --- a/studio/lib/constants/infrastructure.ts +++ b/studio/lib/constants/infrastructure.ts @@ -26,7 +26,7 @@ export const PRICING_PLANS = { // PAYG: 'Pay as you go', } -export const PRICING_PLANS_DEFAULT = PRICING_PLANS.PRO +export const PRICING_PLANS_DEFAULT = PRICING_PLANS.FREE export const PROVIDERS = { AWS: { diff --git a/studio/lib/gotrue.ts b/studio/lib/gotrue.ts index cbdfdf1772b60..5a711db5152c6 100644 --- a/studio/lib/gotrue.ts +++ b/studio/lib/gotrue.ts @@ -1,6 +1,6 @@ import { GoTrueClient, User } from '@supabase/gotrue-js' -export const GOTRUE_URL = process.env.NEXT_PUBLIC_GOTRUE_URL || 'http://localhost:8000/auth/v1' +export const GOTRUE_URL = process.env.NEXT_PUBLIC_GOTRUE_URL || `${process.env.SUPABASE_URL}/auth/v1` export const auth = new GoTrueClient({ url: GOTRUE_URL, diff --git a/studio/package.json b/studio/package.json index a8bf92423e702..346df5c4d2ade 100644 --- a/studio/package.json +++ b/studio/package.json @@ -17,7 +17,7 @@ "@radix-ui/react-tooltip": "^0.1.6", "@sentry/browser": "^6.15.0", "@sentry/nextjs": "^6.15.0", - "@supabase/grid": "^2.3.9", + "@supabase/grid": "^2.4.0", "@supabase/postgres-meta": "^0.26.1", "@supabase/react-data-grid": "^7.1.0-beta.7", "@supabase/supabase-js": "^1.29.1", diff --git a/studio/pages/_app.tsx b/studio/pages/_app.tsx index 9b73864c7b5c0..bd8b42a766f80 100644 --- a/studio/pages/_app.tsx +++ b/studio/pages/_app.tsx @@ -9,120 +9,17 @@ import 'styles/monaco.scss' import 'styles/contextMenu.scss' import Head from 'next/head' -import dynamic from 'next/dynamic' import type { AppProps } from 'next/app' import { useRouter } from 'next/router' -import { FC, useEffect, useState } from 'react' -import { Subscription } from '@supabase/gotrue-js' -import { Toaster, ToastBar, toast } from 'react-hot-toast' -import { Button, IconX } from '@supabase/ui' +import { useEffect, useState } from 'react' import { RootStore } from 'stores' import { StoreProvider } from 'hooks' import { getParameterByName } from 'lib/common/fetch' import { GOTRUE_ERRORS } from 'lib/constants' -import { auth } from 'lib/gotrue' + +import { PortalToast, GoTrueWrapper, RouteValidationWrapper } from 'components/interfaces/App' import PageTelemetry from 'components/ui/PageTelemetry' import FlagProvider from 'components/ui/Flag/FlagProvider' -import Connecting from 'components/ui/Loading' - -const PortalRootWithNoSSR = dynamic( - // @ts-ignore - () => import('@radix-ui/react-portal').then((portal) => portal.Root), - { ssr: false } -) - -const PortalToast = () => ( - // @ts-ignore - - - {(t) => ( - - {({ icon, message }) => ( - <> - {icon} - {message} - {t.type !== 'loading' && ( -
- -
- )} - - )} -
- )} -
-
-) - -function doesTokenDataExist() { - // ignore if server-side - if (typeof window === 'undefined') return false - // check tokenData on localstorage - const tokenData = window?.localStorage['supabase.auth.token'] - return tokenData != undefined && typeof tokenData === 'string' -} - -/** - * On app first load, gotrue client may take a while to refresh access token - * We have to wait for that process to complete before showing children components - */ -const GotrueWrapper: FC = ({ children }) => { - const [loading, setLoading] = useState(doesTokenDataExist()) - - useEffect(() => { - let subscription: Subscription | null - let timer: any - const currentSession = auth.session() - - function tokenRefreshed() { - setLoading(false) - // clean subscription - if (subscription) subscription.unsubscribe() - // clean timer - if (timer) clearTimeout(timer) - } - - if (currentSession != undefined && currentSession != null) { - // if there is an active session, go ahead - setLoading(false) - } else { - // else wait for TOKEN_REFRESHED event before continue - const response = auth.onAuthStateChange((_event, session) => { - if (loading && _event === 'TOKEN_REFRESHED') { - tokenRefreshed() - } - }) - subscription = response.data ?? null - - // we need a timeout here, in case token refresh fails - timer = setTimeout(() => setLoading(false), 5 * 1000) - } - - return () => { - if (subscription) subscription.unsubscribe() - if (timer) clearTimeout(timer) - } - }, []) - - return <>{loading ? : children} -} function MyApp({ Component, pageProps }: AppProps) { const [rootStore] = useState(() => new RootStore()) @@ -147,11 +44,13 @@ function MyApp({ Component, pageProps }: AppProps) { - + - + + + - + diff --git a/studio/pages/account/me.tsx b/studio/pages/account/me.tsx index 3a3190a7cc572..639b2cc3f94fc 100644 --- a/studio/pages/account/me.tsx +++ b/studio/pages/account/me.tsx @@ -1,6 +1,6 @@ import React from 'react' import { observer } from 'mobx-react-lite' -import { IconMoon, IconSun, Select, Typography } from '@supabase/ui' +import { IconMoon, IconSun, Typography, Input, Listbox } from '@supabase/ui' import { useProfile, useStore, withAuth } from 'hooks' import { post } from 'lib/common/fetch' @@ -32,8 +32,10 @@ export default withAuth(User) const ProfileCard = observer(() => { const { ui } = useStore() const { mutateProfile } = useProfile() - const user = ui.profile + + console.log('User', user?.username, user?.primary_email) + const updateUser = async (model: any) => { try { const updatedUser = await post(`${API_URL}/profile/update`, model) @@ -51,6 +53,9 @@ const ProfileCard = observer(() => { return (
+
+ +
{/* @ts-ignore */} { ) }) +const GithubProfile = observer(() => { + const { ui } = useStore() + + return ( + + Account Information + , + ]} + > + +
+ + +
+
+
+ ) +}) + const ThemeSettings = observer(() => { const { ui } = useStore() @@ -89,7 +129,7 @@ const ThemeSettings = observer(() => { ]} > - + System default + Dark + Light + ) diff --git a/studio/pages/api/auth/[ref]/users.ts b/studio/pages/api/auth/[ref]/users.ts index c97de828cfbce..5839d8bb135a3 100644 --- a/studio/pages/api/auth/[ref]/users.ts +++ b/studio/pages/api/auth/[ref]/users.ts @@ -68,6 +68,6 @@ const handleDelete = async (req: NextApiRequest, res: NextApiResponse) => { const payload = req.body const query = { query: `DELETE from auth.users where id='${payload.id}';` } - const response = post(`${PG_META_URL}/query`, { query }, { headers }) + const response = post(`${PG_META_URL}/query`, query, { headers }) return res.status(200).json(response) } diff --git a/studio/pages/api/props/project/[ref]/api.ts b/studio/pages/api/props/project/[ref]/api.ts index efc2e2efacfed..a348d5ba07924 100644 --- a/studio/pages/api/props/project/[ref]/api.ts +++ b/studio/pages/api/props/project/[ref]/api.ts @@ -38,11 +38,11 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { app: { id: 1, name: 'Auto API' }, app_config: { db_schema: 'public', - endpoint: 'localhost:8000', + endpoint: process.env.SUPABASE_URL, realtime_enabled: true, }, - endpoint: 'http://localhost:8000', - restUrl: 'http://localhost:8000/rest/v1/', + endpoint: process.env.SUPABASE_URL || 'http://localhost:8000', + restUrl: process.env.SUPABASE_REST_URL || 'http://localhost:8000/rest/v1/', defaultApiKey: process.env.SUPABASE_ANON_KEY, serviceApiKey: process.env.SUPABASE_SERVICE_KEY, internalApiKey: process.env.SUPABASE_ANON_KEY, @@ -68,11 +68,11 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { app: { id: 1, name: 'Auto API' }, app_config: { db_schema: 'public', - endpoint: 'localhost:8000', + endpoint: process.env.SUPABASE_URL, realtime_enabled: true, }, - endpoint: 'http://localhost:8000', - restUrl: 'http://localhost:8000/rest/v1/', + endpoint: process.env.SUPABASE_URL, + restUrl: `${process.env.SUPABASE_URL}/rest/v1/`, defaultApiKey: process.env.SUPABASE_ANON_KEY, serviceApiKey: process.env.SUPABASE_SERVICE_KEY, internalApiKey: process.env.SUPABASE_ANON_KEY, diff --git a/studio/pages/api/props/project/[ref]/settings.ts b/studio/pages/api/props/project/[ref]/settings.ts index 40a18f06462d6..a5ed9be25e928 100644 --- a/studio/pages/api/props/project/[ref]/settings.ts +++ b/studio/pages/api/props/project/[ref]/settings.ts @@ -55,7 +55,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { app: { id: 1, name: 'Auto API' }, app_config: { db_schema: 'public', - endpoint: 'localhost:8000', + endpoint: process.env.SUPABASE_URL, realtime_enabled: true, }, }, diff --git a/studio/pages/index.tsx b/studio/pages/index.tsx index 2611ff1f69beb..5fd19797cc7f6 100644 --- a/studio/pages/index.tsx +++ b/studio/pages/index.tsx @@ -1,19 +1,21 @@ import { NextPage } from 'next' -import { useState } from 'react' +import { useEffect, useState } from 'react' import { observer } from 'mobx-react-lite' -import { useRouter } from 'next/router' +import { NextRouter, useRouter } from 'next/router' import { isUndefined } from 'lodash' import { Typography } from '@supabase/ui' import { Project } from 'types' import { useProfile, useStore, withAuth } from 'hooks' import { post, delete_ } from 'lib/common/fetch' -import { API_URL, IS_PLATFORM, PROJECT_STATUS, STRIPE_PRODUCT_IDS } from 'lib/constants' +import { API_URL, IS_PLATFORM, PROJECT_STATUS } from 'lib/constants' import { AccountLayout } from 'components/layouts' +import { auth } from 'lib/gotrue' import Landing from 'components/interfaces/Home/Landing' import ProjectList from 'components/interfaces/Home/ProjectList' import OrganizationDropdown from 'components/to-be-cleaned/Dropdown/OrganizationDropdown' import TextConfirmModal from 'components/to-be-cleaned/ModalsDeprecated/TextConfirmModal' +import Connecting from 'components/ui/Loading' const Home: NextPage = () => { const { app, ui } = useStore() @@ -26,7 +28,23 @@ const Home: NextPage = () => { const [selectedProjectToDelete, setSelectedProjectToDelete] = useState() if (!profile) { - return + return + } else { + const isRedirect = isRedirectFromThirdPartyService(router) + if (isRedirect) { + const queryParams = (router.query as any) || {} + const params = new URLSearchParams(queryParams) + if (router.query?.next?.includes('https://vercel.com')) { + router.push(`/vercel/integrate?${params.toString()}`) + } + if (router.query?.next?.includes('new-project')) { + router.push('/new/project') + } + if (router.query['x-amzn-marketplace-token'] != undefined) { + router.push(`/account/associate?${params.toString()}`) + } + return + } } const onSelectDeleteProject = async (project: Project) => { @@ -103,3 +121,29 @@ const Home: NextPage = () => { ) } export default withAuth(observer(Home)) + +// detect for redirect from 3rd party service like vercel, aws... +function isRedirectFromThirdPartyService(router: NextRouter) { + return router.query.next !== undefined || router.query['x-amzn-marketplace-token'] !== undefined +} + +const UnauthorizedLanding = () => { + const router = useRouter() + const autoLogin = isRedirectFromThirdPartyService(router) + + useEffect(() => { + if (autoLogin) { + const queryParams = (router.query as any) || {} + const params = new URLSearchParams(queryParams) + // trigger github signIn + auth.signIn( + { provider: 'github' }, + { + redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}?${params.toString()}`, + } + ) + } + }, []) + + return autoLogin ? : +} diff --git a/studio/pages/new/[slug].tsx b/studio/pages/new/[slug].tsx index 3bcf9db40a127..f5c1c6d1450e2 100644 --- a/studio/pages/new/[slug].tsx +++ b/studio/pages/new/[slug].tsx @@ -342,7 +342,7 @@ const NotOrganizationOwnerWarning = () => { description={

- Only the organization owner can create new projects. Contact your organizaton owner to + Only the organization owner can create new projects. Contact your organization owner to create a new project for this organization.

diff --git a/studio/pages/new/index.tsx b/studio/pages/new/index.tsx index e095e1b16484a..8d2cf5477e129 100644 --- a/studio/pages/new/index.tsx +++ b/studio/pages/new/index.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { observer } from 'mobx-react-lite' import { Button, Typography } from '@supabase/ui' -import Router from 'next/router' +import { useRouter } from 'next/router' import { API_URL } from 'lib/constants' import { useStore, withAuth } from 'hooks' @@ -15,6 +15,8 @@ import Panel from 'components/to-be-cleaned/Panel' */ const Wizard = () => { const { ui, app } = useStore() + const router = useRouter() + const [orgName, setOrgName] = useState('') const [newOrgLoading, setNewOrgLoading] = useState(false) @@ -49,11 +51,7 @@ const Wizard = () => { } else { const org = response app.onOrgAdded(org) - - // Router.push('/new/[slug]', `/new/${org.slug}`) - // Using window.location.href for now as organization metadata needs to refresh - // We do not get is_owner nor stripe_customer_id from the response here - window.location.href = `/new/${org.slug}` + router.push(`/new/${org.slug}`) } } @@ -70,7 +68,7 @@ const Wizard = () => { ]} footer={[
-
diff --git a/studio/pages/org/[slug]/settings.tsx b/studio/pages/org/[slug]/settings.tsx index 24a4a5875298d..d32d70cff71c5 100644 --- a/studio/pages/org/[slug]/settings.tsx +++ b/studio/pages/org/[slug]/settings.tsx @@ -96,7 +96,7 @@ const PageLayout = observer(() => { return ( { } }, [members, products, isOrgDetailError]) + if (!PageState.organization) return
+ return (
@@ -142,7 +144,7 @@ const TabsView = observer(() => {
- {PageState.organization.name || 'Organization'} settings + {PageState.organization?.name || 'Organization'} settings
- {isOwner && } +
diff --git a/studio/pages/project/[ref]/settings/logs/[type].tsx b/studio/pages/project/[ref]/settings/logs/[type].tsx index 295e18d782bfa..6fbe0dba3d86e 100644 --- a/studio/pages/project/[ref]/settings/logs/[type].tsx +++ b/studio/pages/project/[ref]/settings/logs/[type].tsx @@ -180,6 +180,7 @@ export const LogPage: NextPage = () => { ...prev, where: isSelectQuery ? '' : editorValue, sql: isSelectQuery ? editorValue : '', + search_query: '' })) if (!logsQueryParamsSyncing) return router.push({ @@ -192,7 +193,7 @@ export const LogPage: NextPage = () => { }) } const handleSearch = (v: string) => { - setParams((prev) => ({ ...prev, search_query: v || '' })) + setParams((prev) => ({ ...prev, search_query: v || '', where: '', sql: '' })) if (!logsQueryParamsSyncing) return router.push({ pathname: router.pathname, @@ -202,6 +203,7 @@ export const LogPage: NextPage = () => { s: v || '', }, }) + setEditorValue('') } return ( diff --git a/studio/pages/support/new.tsx b/studio/pages/support/new.tsx index 811c2dacbe35e..1b7ebfc0278fc 100644 --- a/studio/pages/support/new.tsx +++ b/studio/pages/support/new.tsx @@ -12,11 +12,13 @@ import { } from '@supabase/ui' import SVG from 'react-inlinesvg' import Link from 'next/link' +import { useRouter } from 'next/router' import { API_URL } from 'lib/constants' import { useStore, withAuth } from 'hooks' import { post } from 'lib/common/fetch' import { Project } from 'types' +import { isUndefined } from 'lodash' const DEFAULT = { category: { @@ -49,6 +51,9 @@ function formReducer(state: any, action: any) { const SupportNew = () => { const { ui, app } = useStore() + const router = useRouter() + const projectRef = router.query.ref + const [formState, formDispatch] = useReducer(formReducer, DEFAULT) const [errors, setErrors] = useState([]) const [loading, setLoading] = useState(false) @@ -72,7 +77,12 @@ const SupportNew = () => { useEffect(() => { // set project default if (sortedProjects.length > 1) { - handleOnChange({ name: 'project', value: sortedProjects[0].ref }) + const selectedProject = sortedProjects.find((project: Project) => project.ref === projectRef) + if (!isUndefined(selectedProject)) { + handleOnChange({ name: 'project', value: selectedProject.ref }) + } else { + handleOnChange({ name: 'project', value: sortedProjects[0].ref }) + } } else { // set as 'No specific project' handleOnChange({ name: 'project', value: projectDefaults[0].ref }) diff --git a/studio/pages/vercel/integrate.tsx b/studio/pages/vercel/integrate.tsx index 89c244c140b3d..4859b8d02dff8 100644 --- a/studio/pages/vercel/integrate.tsx +++ b/studio/pages/vercel/integrate.tsx @@ -226,7 +226,7 @@ const Connecting = () => ( const ProjectLinksEmptyState = () => (
- You haven’t created a Supabase project yet. Get started by creating a new Supabase project, + You haven't created a Supabase project yet. Get started by creating a new Supabase project, then close this window and retry adding integration. diff --git a/studio/pages/vercel/setupProject.tsx b/studio/pages/vercel/setupProject.tsx index 867e48b269c54..7c4ae8ef07357 100644 --- a/studio/pages/vercel/setupProject.tsx +++ b/studio/pages/vercel/setupProject.tsx @@ -200,7 +200,7 @@ const CreateProject = observer(() => { async function createSupabaseProject(dbSql: string) { const data = { cloud_provider: PROVIDERS.AWS.id, // hardcoded for DB instances to be under AWS - org_id: _store.supabaseOrgId, + org_id: Number(_store.supabaseOrgId), name: projectName, db_pass: dbPass, db_region: dbRegion, diff --git a/studio/public/favicon.ico b/studio/public/favicon.ico index d3fca2acb10d8..5c4d1dcc5cf13 100644 Binary files a/studio/public/favicon.ico and b/studio/public/favicon.ico differ diff --git a/studio/stores/app/AppStore.ts b/studio/stores/app/AppStore.ts index b50a0bebfd0f0..4ce562ef5b86b 100644 --- a/studio/stores/app/AppStore.ts +++ b/studio/stores/app/AppStore.ts @@ -1,6 +1,6 @@ import { cloneDeep } from 'lodash' import { values } from 'mobx' -import { Project } from 'types' +import { Organization, Project } from 'types' import { API_URL, STRIPE_PRODUCT_IDS } from 'lib/constants' import { IRootStore } from '../RootStore' @@ -71,19 +71,23 @@ export default class AppStore implements IAppStore { } } - onOrgUpdated(org: any) { - if (org && org.id) { - this.organizations.data[org.id] = { ...org } + onOrgUpdated(updatedOrg: Organization) { + if (updatedOrg && updatedOrg.id) { + const originalOrg = this.organizations.data[updatedOrg.id] + this.organizations.data[updatedOrg.id] = { + ...originalOrg, + ...updatedOrg, + } } } - onOrgAdded(org: any) { + onOrgAdded(org: Organization) { if (org && org.id) { - this.organizations.data[org.id] = { ...org } + this.organizations.data[org.id] = org } } - onOrgDeleted(org: any) { + onOrgDeleted(org: Organization) { if (org && org.id) { const projects = values(this.projects.data) // cleanup projects saved queries diff --git a/studio/tests/components/Home/ProjectUsage.test.js b/studio/tests/components/Home/ProjectUsage.test.js new file mode 100644 index 0000000000000..9864a387cd1e1 --- /dev/null +++ b/studio/tests/components/Home/ProjectUsage.test.js @@ -0,0 +1,97 @@ +import { render, waitFor, screen } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +jest.mock('lib/common/fetch') +import { get } from 'lib/common/fetch' + +// mock the router +jest.mock('next/router') +import { useRouter } from 'next/router' +import { clickDropdown } from 'tests/helpers' +useRouter.mockReturnValue({ query: { ref: '123' } }) + +// need to wrap component with SWRConfig in order to clear cache between tests +// TODO: abstract out to global setup +import { SWRConfig } from 'swr' +const ProjectUsage = jest.fn() +ProjectUsage.mockImplementation((props) => { + const Original = jest.requireActual('components/interfaces/Home/ProjectUsage').default + // wrap with SWR to reset the cache each time + return ( + new Map() }}> + + + ) +}) + +jest.mock('components/ui/Flag/Flag') +import Flag from 'components/ui/Flag/Flag' +Flag.mockImplementation(({ children }) => <>{children}) +jest.mock('hooks') +import { useFlag } from 'hooks' +useFlag.mockReturnValue(true) + + + +beforeEach(() => { + get.mockReset() +}) + +const MOCK_CHART_DATA = { + data: [ + { + total_auth_requests: 123, + total_realtime_requests: 223, + total_storage_requests: 323, + total_rest_requests: 333, + timestamp: new Date().getTime() / 1000, + }, + ], + total: 123 + 223 + 323, + totalAverage: 123 + 223 + 323, + totalGrouped: { + total_auth_requests: 123, + total_realtime_requests: 223, + total_storage_requests: 323, + total_rest_requests: 333, + }, +} + +test('mounts correctly', async () => { + get.mockImplementation((url) => { + if (url.includes('usage')) return {} + return { data: MOCK_CHART_DATA } + }) + render() + await waitFor(() => screen.getByText(/Statistics for past 60 minutes/)) + await waitFor(() => screen.getByText(/123/)) + await waitFor(() => screen.getByText(/223/)) + await waitFor(() => screen.getByText(/323/)) + await waitFor(() => screen.getByText(/333/)) +}) + +test('dropdown options changes chart query', async () => { + get.mockImplementation((url) => { + console.log(url) + if (url.includes('usage')) return {} + return { data: MOCK_CHART_DATA } + }) + render() + await waitFor(() => screen.getByText(/Statistics for past 60 minutes/)) + await waitFor(() => screen.getAllByRole('button', { name: '60 minutes' })) + console.log(get.mock.calls) + await waitFor(()=>{ + expect(get).toHaveBeenCalledWith(expect.stringContaining('interval=minutely')) + + }) + // find button that has radix id + const [btn] = screen.getAllByRole('button', { name: '60 minutes' }).filter((e) => e.id) + clickDropdown(btn) + await waitFor(() => screen.getByText(/7 days/)) + await waitFor(() => screen.getByText(/24 hours/)) + + // simulate changing of dropdown + userEvent.click(screen.getByText(/24 hours/)) + await waitFor(() => screen.getByText(/Statistics for past 24 hours/)) + expect(get).toHaveBeenCalledWith(expect.stringContaining('interval=hourly')) + +}) \ No newline at end of file diff --git a/studio/tests/helpers.ts b/studio/tests/helpers.ts index 2e622dcdc6ba2..0b785005932e5 100644 --- a/studio/tests/helpers.ts +++ b/studio/tests/helpers.ts @@ -1,5 +1,4 @@ -import { screen, getByText } from '@testing-library/react' - +import { screen, getByText, fireEvent } from '@testing-library/react' interface SelectorOptions { container?: HTMLElement } @@ -24,4 +23,14 @@ export const getToggleByText = (text: string | RegExp, options: SelectorOptions return textNode } +} + +export const clickDropdown = (elem: HTMLElement) => { + fireEvent.pointerDown( + elem, + new window.PointerEvent('pointerdown', { + ctrlKey: false, + button: 0, + }) + ); } \ No newline at end of file diff --git a/studio/tests/pages/projects/LogPanel.test.js b/studio/tests/pages/projects/LogPanel.test.js index 35afe931a2719..285cf0838edb0 100644 --- a/studio/tests/pages/projects/LogPanel.test.js +++ b/studio/tests/pages/projects/LogPanel.test.js @@ -17,7 +17,12 @@ test('templates', async () => { // userEvent.click(screen.getByText("Some option")) // expect(mockFn).toBeCalled() }) - +test('custom mode', async () => { + render() + await waitFor(() => { + expect(() => screen.getByPlaceholderText(/Search/)).toThrow() + }) +}) test('filter input change and submit', async () => { const mockFn = jest.fn() render() diff --git a/studio/tests/pages/projects/logs.test.js b/studio/tests/pages/projects/logs.test.js index a5ef1f9f42e41..5ed73bab47f23 100644 --- a/studio/tests/pages/projects/logs.test.js +++ b/studio/tests/pages/projects/logs.test.js @@ -202,6 +202,12 @@ test('where clause will trigger a log refresh', async () => { return { data: [] } }) const { container } = render() + // fill search bar with some value, should be ignored when in custom mode + userEvent.type(screen.getByPlaceholderText(/Search/), 'search_value') + userEvent.click(screen.getByText('Go')) + // clear mock calls, for clean assertions + get.mockClear() + let editor = container.querySelector('.monaco-editor') expect(editor).toBeFalsy() // TODO: abstract this out into a toggle selection helper @@ -229,6 +235,9 @@ test('where clause will trigger a log refresh', async () => { }), }) ) + + // should ignore search bar value + expect(get).not.toHaveBeenCalledWith(expect.stringContaining('search_value')) }, { timeout: 1000 } ) diff --git a/studio/tests/setup/radix.js b/studio/tests/setup/radix.js new file mode 100644 index 0000000000000..de1452ab68d6f --- /dev/null +++ b/studio/tests/setup/radix.js @@ -0,0 +1,50 @@ +/** + * Required setup adapted from https://github.com/radix-ui/primitives/issues/856#issuecomment-928704064 + * + * Implements a custom PointerEvent that can then be used to trigger the radix dropdown. + * This is required as JSdom has not implemented the PointerEvent (see https://github.com/testing-library/react-testing-library/issues/838#issuecomment-735259406) + * + * Furthermore, ResizeObserver and DomRect are both not available in JSdom (see https://github.com/radix-ui/primitives/issues/856) + * + * Effects of this setup file: + * - sets PointerEvent to window + * - sets ResizeObserver to window + * - sets DOMRect to window + * + * Needed to interact with dropdown components, with the `clickDropdown` helper. + */ + +class PointerEvent extends Event { + constructor(type, props) { + super(type, props) + if (props.button != null) { + this.button = props.button + } + if (props.ctrlKey != null) { + this.ctrlKey = props.ctrlKey + } + } +} + +window.PointerEvent = PointerEvent + +// // https://github.com/radix-ui/primitives/issues/420#issuecomment-771615182 +window.ResizeObserver = class ResizeObserver { + constructor(cb) { + this.cb = cb + } + observe() {} + unobserve() {} + disconnect() {} +} + +window.DOMRect = { + fromRect: () => ({ + top: 0, + left: 0, + bottom: 0, + right: 0, + width: 0, + height: 0, + }), +} diff --git a/studio/tsconfig.test.json b/studio/tsconfig.test.json index 4fd5045d7dcc0..386dc102dba7c 100644 --- a/studio/tsconfig.test.json +++ b/studio/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "target": "es6", "jsx": "react-jsx" } } diff --git a/studio/types/base.ts b/studio/types/base.ts index 08799a0c9c0ec..f4ebb0b542f36 100644 --- a/studio/types/base.ts +++ b/studio/types/base.ts @@ -4,9 +4,13 @@ export interface Organization { name: string billing_email: string project_limit: number + members: any[] + projects: any[] + is_owner?: boolean stripe_customer_id?: string + stripe_customer_object?: any total_free_projects?: number - is_owner?: boolean + total_paid_projects?: number } export interface Project { diff --git a/tests/jest-env.js b/tests/jest-env.js index 04916049a19f4..66cd730acd9dd 100644 --- a/tests/jest-env.js +++ b/tests/jest-env.js @@ -1,5 +1,5 @@ process.env.SUPABASE_URL = 'http://localhost:8000' process.env.SUPABASE_KEY_ANON = - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYyNzIwODU0MCwiZXhwIjoxOTc0MzYzNzQwfQ.zcaQfHd3VA7XgJmdGfmV86OLVJT9s2MTmSy-e69BpUY' + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE' process.env.SUPABASE_KEY_ADMIN = - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjI3MjA4NTQwLCJleHAiOjE5NzQzNjM3NDB9.pkT3PNpO4DtO45Ac5HK_TKCx8sGLgNtV__pr_ZrRSAU' \ No newline at end of file + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q' \ No newline at end of file diff --git a/web/docs/guides/client-libraries.mdx b/web/docs/guides/client-libraries.mdx index 698b487486bcd..095d10fa03bee 100755 --- a/web/docs/guides/client-libraries.mdx +++ b/web/docs/guides/client-libraries.mdx @@ -37,7 +37,7 @@ const { error, data } = await supabase.auth.signUp({ ```py import os -from supabase_py import create_client, Client +from supabase import create_client, Client url: str = os.environ.get("SUPABASE_TEST_URL") key: str = os.environ.get("SUPABASE_TEST_KEY") @@ -94,7 +94,7 @@ const { error, data } = await supabase.auth.signIn({ ```py import os -from supabase_py import create_client, Client +from supabase import create_client, Client url: str = os.environ.get("SUPABASE_TEST_URL") key: str = os.environ.get("SUPABASE_TEST_KEY") @@ -149,7 +149,7 @@ const { error, data } = await supabase.auth.signIn({ ```py import os -from supabase_py import create_client, Client +from supabase import create_client, Client url: str = os.environ.get("SUPABASE_TEST_URL") key: str = os.environ.get("SUPABASE_TEST_KEY") @@ -257,7 +257,7 @@ const { data, error } = await supabase ```py import os -from supabase_py import create_client, Client +from supabase import create_client, Client url: str = os.environ.get("SUPABASE_TEST_URL") key: str = os.environ.get("SUPABASE_TEST_KEY") diff --git a/web/docs/guides/database.mdx b/web/docs/guides/database.mdx index 9173dd3942e49..a4cc857341c6c 100644 --- a/web/docs/guides/database.mdx +++ b/web/docs/guides/database.mdx @@ -133,9 +133,7 @@ Migrating projects can be achieved using standard PostgreSQL tooling. This is pa When you create a new project in Supabase we ask for a password. You can use this password to connect directly to your Postgres database. -If you forget your password, you can reset it from the Dashboard SQL editor: - -For example: +If you forget your password, you can reset it from the Dashboard under the database settings page, or through the SQL editor as such: ```sql alter user postgres diff --git a/web/docs/guides/hosting/docker.mdx b/web/docs/guides/hosting/docker.mdx index 838753ab0c83f..013cc6f43842a 100644 --- a/web/docs/guides/hosting/docker.mdx +++ b/web/docs/guides/hosting/docker.mdx @@ -64,6 +64,11 @@ Update the `.env` file with your own secrets. In particular, these are required: - `SITE_URL`: the base URL of your site. - `SMTP_*`: mail server credentials. You can use any SMTP server. + +### Securing the Dashboard + +The Docker setup doesn't include a management database for managing users and logins. If you plan to deploy the Studio to the web we suggest you put it behind a web proxy with Basic Auth or hide it behind a VPN. + ## Configuration To keep the setup simple, we made some choices that may not be optimal for production: diff --git a/web/docs/guides/integrations/auth0.mdx b/web/docs/guides/integrations/auth0.mdx index 7129259f22a80..5919dae707dd2 100644 --- a/web/docs/guides/integrations/auth0.mdx +++ b/web/docs/guides/integrations/auth0.mdx @@ -133,7 +133,7 @@ Restart your Next.js development server to read in the new values from `.env.loc npm run dev ``` -## Step 5: Install Auth0 Next.js library +## Step 6: Install Auth0 Next.js library Install the `@auth0/nextjs-auth0` library. @@ -211,7 +211,7 @@ You should now be able to view the landing page. ![Landing page](/img/guides/integrations/auth0/YdBKRy6.png) -## Step 6: Sign Auth0 token for Supabase +## Step 7: Sign Auth0 token for Supabase Currently, neither Supabase or Auth0 allow for a custom signing secret to be set for their JWT. They also use different [signing algorithms](https://auth0.com/docs/configure/applications/signing-algorithms). @@ -263,7 +263,7 @@ We are signing this JWT using Supabase's signing secret, so Supabase will be abl Now we just need to send the token along with the request to Supabase. -## Step 7: Requesting data from Supabase +## Step 8: Requesting data from Supabase Create a new file called `utils/supabase.js` and add the following: @@ -391,7 +391,7 @@ Either way, when we reload our application, we are still getting the empty state This is because we enabled Row Level Security, which blocks all requests by default. To enable our user to select their `todos` we need to write a policy. -## Step 8: Write a policy to allow select +## Step 9: Write a policy to allow select Our policy will need to know who our currently logged in user is to determine whether or not they should have access. Let's create a PostgreSQL function to extract the current user from our new JWT. diff --git a/web/package-lock.json b/web/package-lock.json index 35b3285ec610e..7d2761e54edba 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -3929,72 +3929,73 @@ } }, "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.2.1.tgz", + "integrity": "sha512-E/5sP0aeK6YPXI/+4QlefvBFgmcyR2jYftId0PrYWv4Y/gW3c3thp1XG4rQzF0eUwV9tR1x05X5eWuJ6rQXvew==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" } }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "requires": { + "internmap": "1 - 2" + } }, "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" }, "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" } }, "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "requires": { - "d3-array": "1", - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-collection": { @@ -4003,183 +4004,199 @@ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" }, "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", "requires": { - "d3-array": "^1.1.1" + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" } }, "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" }, "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "d3-dispatch": "1 - 3", + "d3-selection": "3" } }, "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "requires": { - "commander": "2", - "iconv-lite": "0.4", + "commander": "7", + "iconv-lite": "0.6", "rw": "1" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } } } }, "d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "requires": { - "d3-dsv": "1" + "d3-dsv": "1 - 3" } }, "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", "requires": { - "d3-array": "1" + "d3-array": "2.5.0 - 3" } }, "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==" }, "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "requires": { - "d3-color": "1" + "d3-color": "1 - 3" } }, "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" }, "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" }, "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" }, "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" }, "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } }, "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" } }, "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", "requires": { - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } }, "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "requires": { - "d3-time": "1" + "d3-time": "1 - 3" } }, "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" }, "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-voronoi": { @@ -4188,15 +4205,15 @@ "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" }, "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" } }, "dagre": { @@ -4217,6 +4234,267 @@ "dagre": "^0.8.5", "graphlib": "^2.1.8", "lodash": "^4.17.15" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + } } }, "debug": { @@ -4394,6 +4672,14 @@ "slash": "^3.0.0" } }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4532,9 +4818,9 @@ } }, "dompurify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.1.tgz", - "integrity": "sha512-xGWt+NHAQS+4tpgbOAI08yxW0Pr256Gu/FNE2frZVTbgrBUn8M7tz7/ktS/LZ2MHeGqz6topj0/xY+y8R5FBFw==" + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.4.tgz", + "integrity": "sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ==" }, "domutils": { "version": "1.5.1", @@ -5192,9 +5478,9 @@ } }, "follow-redirects": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", - "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "for-in": { "version": "1.0.2", @@ -6283,6 +6569,11 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7077,15 +7368,15 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "mermaid": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.12.1.tgz", - "integrity": "sha512-0UCcSF0FLoNcPBsRF4f9OIV32t41fV18//z8o3S+FDz2PbDA1CRGKdQF9IX84VP4Tv9kcgJI/oqJdcBEtB/GPA==", + "version": "8.13.8", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.13.8.tgz", + "integrity": "sha512-Z5v31rvo8P7BPTiGicdJl9BbzyUe9s5sXILK8sM1g7ijkagpfFjPtXZVsq5P1WlN8m/fUp2PPNXVF9SqeTM91w==", "requires": { "@braintree/sanitize-url": "^3.1.0", - "d3": "^5.16.0", + "d3": "^7.0.0", "dagre": "^0.8.5", "dagre-d3": "^0.6.4", - "dompurify": "2.3.1", + "dompurify": "2.3.4", "graphlib": "^2.1.8", "khroma": "^1.4.1", "moment-mini": "^2.24.0", @@ -9336,6 +9627,11 @@ "glob": "^7.1.3" } }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, "rtl-detect": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", @@ -10271,9 +10567,9 @@ } }, "stylis": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz", - "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==" + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "supports-color": { "version": "7.2.0", diff --git a/web/package.json b/web/package.json index d9edabcc3d81a..db9df1ca3deb1 100644 --- a/web/package.json +++ b/web/package.json @@ -18,7 +18,7 @@ "@docusaurus/preset-classic": "^2.0.0-beta.6", "@kiwicopple/prism-react-renderer": "github:kiwicopple/prism-react-renderer", "jsrsasign": "^10.4.1", - "mermaid": "^8.6.4", + "mermaid": "^8.13.8", "react": "^17.0.2", "react-dom": "^17.0.2", "react-inlinesvg": "^2.0.1" diff --git a/web/spec/supabase.yml b/web/spec/supabase.yml index 31c5b30149035..25c6d0bb9d467 100644 --- a/web/spec/supabase.yml +++ b/web/spec/supabase.yml @@ -716,6 +716,48 @@ pages: console.log(event, session) }) ``` + - name: Listen to sign in + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'SIGNED_IN') console.log('SIGNED_IN', session) + }) + ``` + - name: Listen to sign out + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'SIGNED_OUT') console.log('SIGNED_OUT', session) + }) + ``` + - name: Listen to token refresh + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'TOKEN_REFRESHED') console.log('TOKEN_REFRESHED', session) + }) + ``` + - name: Listen to user updates + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'USER_UPDATED') console.log('USER_UPDATED', session) + }) + ``` + - name: Listen to user deleted + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'USER_DELETED') console.log('USER_DELETED', session) + }) + ``` + - name: Listen to password recovery events + js: | + ```js + supabase.auth.onAuthStateChange((event, session) => { + if (event == 'PASSWORD_RECOVERY') console.log('PASSWORD_RECOVERY', session) + }) + ``` auth.api.getUser(): title: 'getUser()' $ref: '@supabase/gotrue-js.GoTrueApi.getUser' diff --git a/web/sponsors.js b/web/sponsors.js index 385612ed914b8..f24dd077fba1c 100644 --- a/web/sponsors.js +++ b/web/sponsors.js @@ -3,21 +3,23 @@ var axios = require('axios') var fs = require('fs') const query = ` -query BIO_QUERY($username: String!) { - organization(login: $username) { +query Sponsors { + organization(login: "supabase") { id - sponsorshipsAsMaintainer(first: 100) { - totalCount + sponsors(first: 100) { nodes { - createdAt - privacyLevel - tier { - name + ... on Organization { + id + createdAt + name : login } - sponsor { + ... on User { + id + createdAt login } } + totalCount } } } @@ -39,10 +41,11 @@ const fetchAllSponsors = async () => { }, } ) - return data.data.organization.sponsorshipsAsMaintainer + return data.data.organization.sponsors } const formatResults = (graphqlResponse) => { + console.log('graph', graphqlResponse) return graphqlResponse.nodes .filter((x) => !!x.sponsor) .map((x) => ({ @@ -65,6 +68,7 @@ const writeFile = (data) => { const main = async () => { const sponsorsResponse = await fetchAllSponsors() + // console.log('sponsorsResponse.totalCount', sponsorsResponse.totalCount) const formatted = formatResults(sponsorsResponse) writeFile(formatted) } diff --git a/web/src/data/sponsors.json b/web/src/data/sponsors.json index a456b2121d9b3..1cc4a2eec7e10 100644 --- a/web/src/data/sponsors.json +++ b/web/src/data/sponsors.json @@ -199,4 +199,4 @@ "tier": "$49 a month", "sponsor": "CryptoJobsList" } -] \ No newline at end of file +] diff --git a/web/static/humans.txt b/web/static/humans.txt index 68c291c0760ef..e2ed23f245ab4 100644 --- a/web/static/humans.txt +++ b/web/static/humans.txt @@ -16,6 +16,7 @@ Francesco Ceccon Gurjeet Singh https://gurjeet.singh.im Hieu Pham Inian P +Joel Lee Jon M Jonny Summers-Muir Joshen Lim diff --git a/www/_blog/2021-03-25-launch-week.mdx b/www/_blog/2021-03-25-launch-week.mdx index 062ff053e60e1..68b397a2f61c2 100644 --- a/www/_blog/2021-03-25-launch-week.mdx +++ b/www/_blog/2021-03-25-launch-week.mdx @@ -109,7 +109,7 @@ We are constantly iterating on our own UI, and having multiple devs working on d And now we're doing what we do best at Supabase and making it open source, so that the community can benefit from the UI work done at Supabase, and vice versa. The open source community is an invaluable asset to the work we do every day, and it's genuinely the main driver which enables our relatively small team to work fast and ship often. -Check out the demo and documentation website directly here: [ui.supabase.io](https://ui.supabase.io/) +Check out the demo and documentation website directly here: [ui.supabase.com](https://ui.supabase.com/) ![Supabase UI](/images/blog/launch-week/bernie-4.png) diff --git a/www/_blog/2021-04-02-supabase-workflows.mdx b/www/_blog/2021-04-02-supabase-workflows.mdx index c6e71326c9da2..331fa7ad48b17 100644 --- a/www/_blog/2021-04-02-supabase-workflows.mdx +++ b/www/_blog/2021-04-02-supabase-workflows.mdx @@ -230,5 +230,5 @@ We've already open sourced the Workflow interpreter [here](https://github.com/su so you can find it on Hex [here](https://hexdocs.pm/workflows/Workflows.html). After we've ironed out a few bugs we will integrate it into the Supabase Stack. As with all Supabase features, we'll add a -[nice UI](https://ui.supabase.io/) to make prototyping extremely rapid. We'll integrate the UI with the code (via Git) to make +[nice UI](https://ui.supabase.com/) to make prototyping extremely rapid. We'll integrate the UI with the code (via Git) to make sure everything is version controlled. diff --git a/www/_blog/2021-04-06-supabase-beta-march-2021.mdx b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx index a49e36a9cbde5..fe68f4b32f46b 100644 --- a/www/_blog/2021-04-06-supabase-beta-march-2021.mdx +++ b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx @@ -42,7 +42,7 @@ The Supabase API already handles Connection Pooling, but if you're connecting ## React UI Component Library -We open sourced our internal UI component library, so that anyone can use and contribute to the Supabase aesthetic. It lives at [ui.supabase.io](https://ui.supabase.io/) . It was also the #1 Product of the Day [on Product Hunt](https://www.producthunt.com/posts/supabase-ui). +We open sourced our internal UI component library, so that anyone can use and contribute to the Supabase aesthetic. It lives at [ui.supabase.com](https://ui.supabase.com/) . It was also the #1 Product of the Day [on Product Hunt](https://www.producthunt.com/posts/supabase-ui). ![React UI Library](/images/blog/march-2021/supabase-ui.png) diff --git a/www/_blog/2021-11-30-supabase-studio.mdx b/www/_blog/2021-11-30-supabase-studio.mdx index 257f07f347e7b..0156764d1e59b 100644 --- a/www/_blog/2021-11-30-supabase-studio.mdx +++ b/www/_blog/2021-11-30-supabase-studio.mdx @@ -82,7 +82,7 @@ Studio is a Javascript application with a few key pieces of technology: - [Next.js](https://nextjs.org/) - A frontend Javascript framework built with React. - [Tailwind](https://tailwindcss.com/) - A utility-first CSS framework. -- [Supabase UI](https://ui.supabase.io/) - Our own component library. +- [Supabase UI](https://ui.supabase.com/) - Our own component library. - [MobX](https://www.mobxjs.com/) - A state management library. - A host of other [useful libraries](https://github.com/supabase/supabase/blob/master/studio/package.json), including [Radix UI](https://www.radix-ui.com), [Lottiefiles](https://lottiefiles.com/), [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout), and [zxcvbn](https://github.com/dropbox/zxcvbn). diff --git a/www/components/CTABanner/index.tsx b/www/components/CTABanner/index.tsx index ec6ad84e8bf77..b31df7f570418 100644 --- a/www/components/CTABanner/index.tsx +++ b/www/components/CTABanner/index.tsx @@ -16,7 +16,7 @@ const CTABanner = (props: any) => {
diff --git a/www/components/Nav/index.tsx b/www/components/Nav/index.tsx index 2b7984e661dcf..0c1e65f1a3da9 100644 --- a/www/components/Nav/index.tsx +++ b/www/components/Nav/index.tsx @@ -253,7 +253,7 @@ const Nav = (props: Props) => { - +
@@ -323,7 +323,7 @@ const Nav = (props: Props) => { Developers Company diff --git a/www/data/Announcements.json b/www/data/Announcements.json index 4145701af7561..77b9ce6ccbe0f 100644 --- a/www/data/Announcements.json +++ b/www/data/Announcements.json @@ -1,33 +1,33 @@ [ { "type": "Announcement", - "title": "Launch Week II: The SQL", - "description": "We're launching a product every day for one week in July.", - "imgUrl": "images/case-study-monitoro.jpg", - "logoUrl": "images/logos/monitoro.png", - "organization": "Monitoro", - "url": "/blog/2021/07/22/supabase-launch-week-sql", + "title": "Supabase Launch Week III: Holiday Special", + "description": "Santa's little hackers have been hard at work because we've got another five days of launches ready to go.", + "imgUrl": "images/blog/launch-week-three/launch-week-three-og.jpg", + "logoUrl": "images/blog/launch-week-three/launch-week-three-og.jpg", + "organization": "Supabase", + "url": "/blog/2021/11/26/supabase-launch-week-the-trilogy", "postMeta": { "name": "Paul Copplestone", "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4", - "publishDate": "Mar 16, 2020", - "readLength": 6 + "publishDate": "Nov 26, 2021", + "readLength": 2 }, "ctaText": "View case study" }, { "type": "Announcement", - "title": "Supabase Storage", - "description": "Supabase launches Storage leveraging Postgres.", - "imgUrl": "images/case-study-monitoro.jpg", - "logoUrl": "images/logos/monitoro.png", - "organization": "Monitoro", - "url": "/blog/2021/03/30/supabase-storage", + "title": "Supabase $30m Series A", + "description": "Supabase just raised $30M, bringing our total funding to $36M. How will we spend this? Read on to find out.", + "imgUrl": "images/blog/series-a/supabase-series-a.png", + "logoUrl": "images/blog/series-a/supabase-series-a.png", + "organization": "Supabase", + "url": "/blog/2021/10/28/supabase-series-a", "postMeta": { "name": "Paul Copplestone", "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4", - "publishDate": "Mar 16, 2020", - "readLength": 6 + "publishDate": "Oct 28, 2021", + "readLength": 28 }, "ctaText": "View case study" } diff --git a/www/data/Community.tsx b/www/data/Community.tsx index 0677b741eb575..952ed888365dc 100644 --- a/www/data/Community.tsx +++ b/www/data/Community.tsx @@ -31,7 +31,7 @@ const data: CommunityItem[] = [ }, { title: 'GitHub', - stat: '24,000+', + stat: '26,000+', statLabel: 'Github stars', img: 'github.png', invertImgDarkMode: true, @@ -43,7 +43,7 @@ const data: CommunityItem[] = [ }, { title: 'Twitter', - stat: '20,000+', + stat: '22,000+', statLabel: 'Followers', img: 'twitter.png', detail: () => ( diff --git a/www/data/PricingFAQ.json b/www/data/PricingFAQ.json index 88adacfa878f5..63ab052c5dfce 100644 --- a/www/data/PricingFAQ.json +++ b/www/data/PricingFAQ.json @@ -5,7 +5,7 @@ }, { "question": "Is there a cap on the number of projects for the Free Tier?", - "answer": "Yes, on the Free Tier you can have a maximum of two organizations, each with up to two projects. This means that you can have a maximum of four free projects in your account." + "answer": "Yes, you have can up to 2 free projects in your account across all organizations that you own. You also are able to create as many organizations as you want." }, { "question": "When will I be billed?", diff --git a/www/public/images/blog/launch-week-3/launch-week-3-og.jpg b/www/public/images/blog/launch-week-3/launch-week-3-og.jpg new file mode 100644 index 0000000000000..dcaece66ea8b3 Binary files /dev/null and b/www/public/images/blog/launch-week-3/launch-week-3-og.jpg differ diff --git a/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg b/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg new file mode 100644 index 0000000000000..dcaece66ea8b3 Binary files /dev/null and b/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg differ