From 44e6d4b26a86cbeb2834215e5b9e96a20fdc7949 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 10 Oct 2018 16:25:26 +0000 Subject: [PATCH 01/15] [next] GraphiQL Fixes (#1967) * fix: fixed playground middleware * fix: replaced express middleware with custom html based middleware --- package-lock.json | 8 ----- package.json | 2 +- src/core/server/app/middleware/playground.ts | 36 ++++++++++++-------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index c08064188..76ca05f4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11515,14 +11515,6 @@ } } }, - "graphql-playground-middleware-express": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.2.tgz", - "integrity": "sha512-JvKsVOR/U5QguBtEvTt0ozQ49uh1C6cW8O1xR6krQpJZIxjLYqpgusLUddTiVkka6Q/A4/AXBohY85jPudxYDg==", - "requires": { - "graphql-playground-html": "1.6.0" - } - }, "graphql-redis-subscriptions": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/graphql-redis-subscriptions/-/graphql-redis-subscriptions-1.5.0.tgz", diff --git a/package.json b/package.json index 9f72204d7..8768e7e0a 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "graphql": "^0.13.2", "graphql-config": "^2.0.1", "graphql-fields": "^1.1.0", - "graphql-playground-middleware-express": "^1.7.2", + "graphql-playground-html": "^1.6.0", "graphql-redis-subscriptions": "^1.5.0", "graphql-tools": "^3.0.5", "html-to-text": "^4.0.0", diff --git a/src/core/server/app/middleware/playground.ts b/src/core/server/app/middleware/playground.ts index 0364d10aa..697d34152 100644 --- a/src/core/server/app/middleware/playground.ts +++ b/src/core/server/app/middleware/playground.ts @@ -1,17 +1,25 @@ import { RequestHandler } from "express"; -import { MiddlewareOptions } from "graphql-playground-html"; -import playground from "graphql-playground-middleware-express"; -export default (options: MiddlewareOptions): RequestHandler => ( - req, - res, - next -) => { - try { - playground(options)(req, res, () => { - // The playground calls next() when it's not supposed to. - }); - } catch (err) { - return next(err); - } +import { + MiddlewareOptions, + RenderPageOptions, + renderPlaygroundPage, +} from "graphql-playground-html"; + +export default (options: MiddlewareOptions): RequestHandler => { + const middlewareOptions: RenderPageOptions = { + ...options, + version: "1.6.0", + }; + + return (req, res, next) => { + try { + res.setHeader("Content-Type", "text/html"); + const playground = renderPlaygroundPage(middlewareOptions); + res.write(playground); + res.end(); + } catch (err) { + return next(err); + } + }; }; From 8184c3932ee8dfc2bf7976b24780960a66da6cf5 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Thu, 11 Oct 2018 22:13:02 +0000 Subject: [PATCH 02/15] [next] Install (#1957) * Wip * Adding Wizard and initial step <3 * Wip * Adding more steps to the Install Wizard * Mantaining state across steps * Adding Steps * Step Component * wip * feat: improved logging * feat: added tenant install route * Progress * Refactor * Adding rest install mutation * Wip * Done * Addding snapshots * URL validators * Adding validation for url, and final step * Header component and main variants * fix: resolved router * fix: corrected spec for prop * fix: updated test snapshot * Translations * Translations * Adding extra validation * prefixing events with On - onSaveData * prefixing events with On - onSaveData * Adding translations, and colors from the palette * Centering steps * Ready * feat: added production redirects * fix: fixes during production * fix: removed dead code * Placeholder translations * removing submit from cancel * Adding a description for the URL field * typo * Refactor and renaming * Using white as var * Refactor and renaming * feat: use new palette colors * fix: extracted styles * Adding await to avoid race condition with setState :) * lint * feat: added urls * fix: wizard leaking styles * fix: simplify icon style * fix: adjust global body css to remove padding to allow seamless integration * fix: types and small refactors * fix: correctly filter wizard children * refactor: simplify step containers * fix: better typecheck * test: remove obsolete snapshots * fix: don't export FormProps --- config/watcher.ts | 19 ++ package-lock.json | 26 +- package.json | 3 + src/core/build/createWebpackConfig.ts | 30 +++ src/core/build/paths.ts | 4 + src/core/client/embed/StreamEmbed.ts | 11 +- .../__snapshots__/StreamEmbed.spec.ts.snap | 4 +- .../embed/__snapshots__/index.spec.ts.snap | 4 +- src/core/client/embed/tsconfig.json | 2 +- .../embed/utils/ensureNoEndSlash.spec.ts | 11 + .../client/embed/utils/ensureNoEndSlash.ts | 3 + src/core/client/embed/utils/index.ts | 1 + src/core/client/framework/helpers/index.ts | 1 + src/core/client/framework/helpers/urls.tsx | 15 ++ src/core/client/framework/lib/messages.tsx | 6 + src/core/client/framework/lib/validation.tsx | 12 + src/core/client/framework/rest/index.ts | 1 + src/core/client/framework/rest/install.ts | 22 ++ src/core/client/install/.babelrc.js | 10 + src/core/client/install/components/App.css | 25 ++ .../client/install/components/App.spec.tsx | 9 + src/core/client/install/components/App.tsx | 20 ++ src/core/client/install/components/Header.css | 20 ++ src/core/client/install/components/Header.tsx | 42 ++++ .../client/install/components/MainBar.css | 26 ++ .../client/install/components/MainBar.tsx | 19 ++ src/core/client/install/components/Wizard.css | 13 + src/core/client/install/components/Wizard.tsx | 57 +++++ .../__snapshots__/App.spec.tsx.snap | 14 ++ .../install/containers/WizardContainer.tsx | 124 +++++++++ src/core/client/install/index.html | 15 ++ src/core/client/install/index.tsx | 25 ++ src/core/client/install/locales.ts | 9 + .../install/mutations/InstallMutation.ts | 21 ++ src/core/client/install/mutations/index.ts | 1 + .../steps/components/AddOrganization.tsx | 204 +++++++++++++++ .../install/steps/components/BackButton.tsx | 30 +++ .../steps/components/CreateYourAccount.tsx | 235 ++++++++++++++++++ .../install/steps/components/FinalStep.tsx | 41 +++ .../install/steps/components/InitialStep.tsx | 38 +++ .../install/steps/components/NextButton.tsx | 27 ++ .../steps/components/PermittedDomains.tsx | 126 ++++++++++ .../containers/AddOrganizationContainer.tsx | 39 +++ .../containers/CreateYourAccountContainer.tsx | 39 +++ .../containers/PermittedDomainsContainer.tsx | 42 ++++ src/core/client/stream/components/App.css | 2 +- .../stream/containers/UserBoxContainer.tsx | 3 +- .../UserBoxContainer.spec.tsx.snap | 2 +- .../tabs/comments/components/Counter.css | 8 + .../client/ui/components/Button/Button.css | 10 +- .../client/ui/components/Message/Message.css | 2 +- .../client/ui/components/Steps/Circle.css | 23 ++ .../client/ui/components/Steps/Circle.tsx | 23 ++ src/core/client/ui/components/Steps/Line.css | 12 + src/core/client/ui/components/Steps/Line.tsx | 17 ++ src/core/client/ui/components/Steps/Step.css | 11 + src/core/client/ui/components/Steps/Step.tsx | 39 +++ .../client/ui/components/Steps/StepBar.css | 6 + .../client/ui/components/Steps/StepBar.tsx | 41 +++ src/core/client/ui/components/Steps/index.ts | 2 + src/core/client/ui/components/Steps/steps.mdx | 18 ++ src/core/client/ui/components/index.ts | 1 + src/core/client/ui/theme/variables.ts | 5 + src/core/server/app/handlers/auth/local.ts | 9 +- .../server/app/handlers/install/tenant.ts | 101 ++++++++ src/core/server/app/middleware/installed.ts | 27 ++ src/core/server/app/middleware/tenant.ts | 8 +- src/core/server/app/router/api/tenant.ts | 12 + src/core/server/app/router/index.ts | 34 ++- src/core/server/logger.ts | 20 +- src/core/server/models/tenant.ts | 6 + src/core/server/services/mongodb/index.ts | 12 +- .../server/services/tenant/cache/index.ts | 42 ++++ src/core/server/services/tenant/index.ts | 57 ++++- src/locales/en-US/framework.ftl | 1 + src/locales/en-US/install.ftl | 52 ++++ 76 files changed, 2009 insertions(+), 43 deletions(-) create mode 100644 src/core/client/embed/utils/ensureNoEndSlash.spec.ts create mode 100644 src/core/client/embed/utils/ensureNoEndSlash.ts create mode 100644 src/core/client/framework/helpers/urls.tsx create mode 100644 src/core/client/framework/rest/install.ts create mode 100644 src/core/client/install/.babelrc.js create mode 100644 src/core/client/install/components/App.css create mode 100644 src/core/client/install/components/App.spec.tsx create mode 100644 src/core/client/install/components/App.tsx create mode 100644 src/core/client/install/components/Header.css create mode 100644 src/core/client/install/components/Header.tsx create mode 100644 src/core/client/install/components/MainBar.css create mode 100644 src/core/client/install/components/MainBar.tsx create mode 100644 src/core/client/install/components/Wizard.css create mode 100644 src/core/client/install/components/Wizard.tsx create mode 100644 src/core/client/install/components/__snapshots__/App.spec.tsx.snap create mode 100644 src/core/client/install/containers/WizardContainer.tsx create mode 100644 src/core/client/install/index.html create mode 100644 src/core/client/install/index.tsx create mode 100644 src/core/client/install/locales.ts create mode 100644 src/core/client/install/mutations/InstallMutation.ts create mode 100644 src/core/client/install/mutations/index.ts create mode 100644 src/core/client/install/steps/components/AddOrganization.tsx create mode 100644 src/core/client/install/steps/components/BackButton.tsx create mode 100644 src/core/client/install/steps/components/CreateYourAccount.tsx create mode 100644 src/core/client/install/steps/components/FinalStep.tsx create mode 100644 src/core/client/install/steps/components/InitialStep.tsx create mode 100644 src/core/client/install/steps/components/NextButton.tsx create mode 100644 src/core/client/install/steps/components/PermittedDomains.tsx create mode 100644 src/core/client/install/steps/containers/AddOrganizationContainer.tsx create mode 100644 src/core/client/install/steps/containers/CreateYourAccountContainer.tsx create mode 100644 src/core/client/install/steps/containers/PermittedDomainsContainer.tsx create mode 100644 src/core/client/stream/tabs/comments/components/Counter.css create mode 100644 src/core/client/ui/components/Steps/Circle.css create mode 100644 src/core/client/ui/components/Steps/Circle.tsx create mode 100644 src/core/client/ui/components/Steps/Line.css create mode 100644 src/core/client/ui/components/Steps/Line.tsx create mode 100644 src/core/client/ui/components/Steps/Step.css create mode 100644 src/core/client/ui/components/Steps/Step.tsx create mode 100644 src/core/client/ui/components/Steps/StepBar.css create mode 100644 src/core/client/ui/components/Steps/StepBar.tsx create mode 100644 src/core/client/ui/components/Steps/index.ts create mode 100644 src/core/client/ui/components/Steps/steps.mdx create mode 100644 src/core/server/app/handlers/install/tenant.ts create mode 100644 src/core/server/app/middleware/installed.ts create mode 100644 src/locales/en-US/install.ftl diff --git a/config/watcher.ts b/config/watcher.ts index 916d3dcd2..e83e7d5b4 100644 --- a/config/watcher.ts +++ b/config/watcher.ts @@ -65,6 +65,23 @@ const config: Config = { runOnInit: true, }), }, + compileRelayInstall: { + paths: [ + "core/client/install/**/*.ts", + "core/client/install/**/*.tsx", + "core/client/install/**/*.graphql", + "core/server/**/*.graphql", + ], + ignore: [ + "core/**/*.d.ts", + "core/**/*.graphql.ts", + "**/test/**/*", + "core/**/*.spec.*", + ], + executor: new CommandExecutor("npm run compile:relay-install", { + runOnInit: true, + }), + }, compileCSSTypes: { paths: ["**/*.css"], executor: new CommandExecutor("npm run compile:css-types", { @@ -94,6 +111,7 @@ const config: Config = { "compileCSSTypes", "compileRelayStream", "compileRelayAuth", + "compileRelayInstall", "compileRelayAdmin", "compileSchema", ], @@ -103,6 +121,7 @@ const config: Config = { "compileCSSTypes", "compileRelayStream", "compileRelayAuth", + "compileRelayInstall", ], }, }; diff --git a/package-lock.json b/package-lock.json index 76ca05f4d..09d01caac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1675,6 +1675,15 @@ "@types/node": "*" } }, + "@types/bunyan-prettystream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/@types/bunyan-prettystream/-/bunyan-prettystream-0.1.31.tgz", + "integrity": "sha512-NE7fq2ZcX7OSMK+VhTNJkVEHlo+hm0uVXpuLeH1ifGm52Qwuo/kLD2GHo7UcEXMFu3duKver/AFo8C4TME93zw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/case-sensitive-paths-webpack-plugin": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz", @@ -5714,6 +5723,11 @@ "safe-json-stringify": "~1" } }, + "bunyan-prettystream": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/bunyan-prettystream/-/bunyan-prettystream-0.1.3.tgz", + "integrity": "sha1-bDtxMmb2rTIAfHtqsemYokU0nZg=" + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -6671,6 +6685,13 @@ "moment": "2.22.2", "validator": "7.2.0", "yargs-parser": "10.0.0" + }, + "dependencies": { + "validator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-7.2.0.tgz", + "integrity": "sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg==" + } } }, "cookie": { @@ -25297,11 +25318,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "validator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-7.2.0.tgz", - "integrity": "sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg==" - }, "value-equal": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", diff --git a/package.json b/package.json index 8768e7e0a..22ec9c61d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "compile:css-types": "tcm src/core/client/", "compile:relay-stream": "ts-node ./scripts/compileRelay --src ./src/core/client/stream --schema tenant", "compile:relay-auth": "ts-node ./scripts/compileRelay --src ./src/core/client/auth --schema tenant", + "compile:relay-install": "ts-node ./scripts/compileRelay --src ./src/core/client/install --schema tenant", "compile:relay-admin": "ts-node ./scripts/compileRelay --src ./src/core/client/admin --schema tenant", "compile:schema": "node ./scripts/generateSchemaTypes.js", "docz": "docz", @@ -38,6 +39,7 @@ "bcryptjs": "^2.4.3", "bull": "^3.4.4", "bunyan": "^1.8.12", + "bunyan-prettystream": "^0.1.3", "cheerio": "^1.0.0-rc.2", "consolidate": "0.14.0", "convict": "^4.3.1", @@ -96,6 +98,7 @@ "@types/bcryptjs": "^2.4.1", "@types/bull": "^3.3.16", "@types/bunyan": "^1.8.4", + "@types/bunyan-prettystream": "^0.1.31", "@types/case-sensitive-paths-webpack-plugin": "^2.1.2", "@types/cheerio": "^0.22.8", "@types/chokidar": "^1.7.5", diff --git a/src/core/build/createWebpackConfig.ts b/src/core/build/createWebpackConfig.ts index 54cf4b3ca..8e0b32ddd 100644 --- a/src/core/build/createWebpackConfig.ts +++ b/src/core/build/createWebpackConfig.ts @@ -255,6 +255,22 @@ export default function createWebpackConfig({ }, ], }, + { + test: paths.appInstallLocalesTemplate, + use: [ + // This is the locales loader that loads available locales + // from a particular target. + { + loader: "locales-loader", + options: { + ...localesOptions, + // Target specifies the prefix for fluent files to be loaded. + // ${target}-xyz.ftl and ${†arget}.ftl are loaded into the locales. + target: "install", + }, + }, + ], + }, // Loader for our fluent files. { test: /\.ftl$/, @@ -432,6 +448,12 @@ export default function createWebpackConfig({ paths.appAuthIndex, // Remove deactivated entries. ], + install: [ + // We ship polyfills by default + paths.appPolyfill, + ...devServerEntries, + paths.appInstallIndex, + ], admin: [ // We ship polyfills by default paths.appPolyfill, @@ -457,6 +479,14 @@ export default function createWebpackConfig({ inject: "body", ...htmlWebpackConfig, }), + // Generates an `install.html` file with the