From 40a1506982fb730a4dc16f1db59f67fd45393198 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Mon, 28 Dec 2020 16:19:17 -0500 Subject: [PATCH 01/44] scaffold @redwood/auth --- packages/auth/src/authClients/ethereum.ts | 19 +++++++++++++++++++ packages/auth/src/authClients/index.ts | 6 ++++++ 2 files changed, 25 insertions(+) create mode 100644 packages/auth/src/authClients/ethereum.ts diff --git a/packages/auth/src/authClients/ethereum.ts b/packages/auth/src/authClients/ethereum.ts new file mode 100644 index 000000000000..b7cc6b4d650f --- /dev/null +++ b/packages/auth/src/authClients/ethereum.ts @@ -0,0 +1,19 @@ +// import type { Ethereum, EthereumUser } from 'ethereumAuthClient' +type Ethereum = any +type EthereumUser = any + +export type Ethereum = Ethereum +export type EthereumUser = EthereumUser + +import type { AuthClient } from './' + +export const ethereumAuth = (client: Ethereum): AuthClient => { + return { + type: 'ethereum', + client, + login: async () => await client.login(), + logout: async () => await client.logout(), + getToken: async () => await client.getToken(), + getUserMetadata: async () => await client.getUserMetadata(), + } +} diff --git a/packages/auth/src/authClients/index.ts b/packages/auth/src/authClients/index.ts index 130c9440748b..060f27c96834 100644 --- a/packages/auth/src/authClients/index.ts +++ b/packages/auth/src/authClients/index.ts @@ -17,6 +17,8 @@ import type { NetlifyIdentity } from './netlify' import { netlify } from './netlify' import type { Supabase, SupabaseUser } from './supabase' import { supabase } from './supabase' +import type { Ethereum, EthereumUser } from './ethereum' +import { ethereum } from './ethereum' const typesToClients = { netlify, @@ -26,6 +28,7 @@ const typesToClients = { magicLink, firebase, supabase, + ethereum, /** Don't we support your auth client? No problem, define your own the `custom` type! */ custom, } @@ -38,6 +41,7 @@ export type SupportedAuthClients = | MagicLink | Firebase | Supabase + | Ethereum | Custom export type SupportedAuthTypes = keyof typeof typesToClients @@ -47,12 +51,14 @@ export type { AzureActiveDirectoryUser } export type { GoTrueUser } export type { MagicUser } export type { SupabaseUser } +export type { EthereumUser } export type SupportedUserMetadata = | Auth0User | AzureActiveDirectoryUser | GoTrueUser | MagicUser | SupabaseUser + | EthereumUser export interface AuthClient { restoreAuthState?(): void | Promise From e1af54c23ac2b113021a941071eb0eb861e6dbc5 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Mon, 28 Dec 2020 18:28:05 -0500 Subject: [PATCH 02/44] add ethereumAuthPackage --- packages/auth/package.json | 1 + packages/auth/src/authClients/ethereum.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index d3fc588af56e..beb6745c6db4 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -12,6 +12,7 @@ "@supabase/supabase-js": "^1.1.1", "@types/netlify-identity-widget": "^1.4.1", "@types/react": "16.9.53", + "ethereumAuthClient": "^0.0.1", "firebase": "^7.14.5", "firebase-admin": "^9.1.1", "gotrue-js": "git://github.com/netlify/gotrue-js.git#28df09cfcac505feadcb1719714d2a9507cf68eb", diff --git a/packages/auth/src/authClients/ethereum.ts b/packages/auth/src/authClients/ethereum.ts index b7cc6b4d650f..fd6ca07381e7 100644 --- a/packages/auth/src/authClients/ethereum.ts +++ b/packages/auth/src/authClients/ethereum.ts @@ -1,17 +1,23 @@ // import type { Ethereum, EthereumUser } from 'ethereumAuthClient' -type Ethereum = any -type EthereumUser = any +export type Ethereum = any +export type EthereumUser = any -export type Ethereum = Ethereum -export type EthereumUser = EthereumUser +export interface EthereumUser { + address: string | null +} import type { AuthClient } from './' -export const ethereumAuth = (client: Ethereum): AuthClient => { +export const ethereum = (client: Ethereum): AuthClient => { return { type: 'ethereum', client, login: async () => await client.login(), + signup: () => { + throw new Error( + `Ethereum auth does not support "signup". Please use "login" instead.` + ) + }, logout: async () => await client.logout(), getToken: async () => await client.getToken(), getUserMetadata: async () => await client.getUserMetadata(), From 919238cb59fafc57432009a27a2a0b7b46c80494 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Mon, 28 Dec 2020 18:43:47 -0500 Subject: [PATCH 03/44] cleanup types --- packages/auth/package.json | 1 - packages/auth/src/authClients/ethereum.ts | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/auth/package.json b/packages/auth/package.json index beb6745c6db4..d3fc588af56e 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -12,7 +12,6 @@ "@supabase/supabase-js": "^1.1.1", "@types/netlify-identity-widget": "^1.4.1", "@types/react": "16.9.53", - "ethereumAuthClient": "^0.0.1", "firebase": "^7.14.5", "firebase-admin": "^9.1.1", "gotrue-js": "git://github.com/netlify/gotrue-js.git#28df09cfcac505feadcb1719714d2a9507cf68eb", diff --git a/packages/auth/src/authClients/ethereum.ts b/packages/auth/src/authClients/ethereum.ts index fd6ca07381e7..f7625737af42 100644 --- a/packages/auth/src/authClients/ethereum.ts +++ b/packages/auth/src/authClients/ethereum.ts @@ -1,11 +1,14 @@ -// import type { Ethereum, EthereumUser } from 'ethereumAuthClient' -export type Ethereum = any -export type EthereumUser = any - -export interface EthereumUser { +export type EthereumUser = { address: string | null } +export type Ethereum = { + login(): Promise + logout(): Promise + getToken(): Promise + getUserMetadata(): Promise +} + import type { AuthClient } from './' export const ethereum = (client: Ethereum): AuthClient => { From 5d355dbb2798a296511a4cb4ee6a106fcaf328b8 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Mon, 28 Dec 2020 19:18:21 -0500 Subject: [PATCH 04/44] fix lint error --- packages/auth/src/authClients/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/auth/src/authClients/index.ts b/packages/auth/src/authClients/index.ts index 060f27c96834..f6cd532c9138 100644 --- a/packages/auth/src/authClients/index.ts +++ b/packages/auth/src/authClients/index.ts @@ -7,6 +7,8 @@ import type { import { azureActiveDirectory } from './azureActiveDirectory' import type { Custom } from './custom' import { custom } from './custom' +import type { Ethereum, EthereumUser } from './ethereum' +import { ethereum } from './ethereum' import type { Firebase } from './firebase' import { firebase } from './firebase' import type { GoTrue, GoTrueUser } from './goTrue' @@ -17,8 +19,6 @@ import type { NetlifyIdentity } from './netlify' import { netlify } from './netlify' import type { Supabase, SupabaseUser } from './supabase' import { supabase } from './supabase' -import type { Ethereum, EthereumUser } from './ethereum' -import { ethereum } from './ethereum' const typesToClients = { netlify, From aab8844df29dc8c3cb18c1508d65311ffbb6193e Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Mon, 28 Dec 2020 19:20:53 -0500 Subject: [PATCH 05/44] fix failing build for no decoder --- packages/api/src/auth/decoders/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/api/src/auth/decoders/index.ts b/packages/api/src/auth/decoders/index.ts index 97324b13f52e..54cbf49a6af8 100644 --- a/packages/api/src/auth/decoders/index.ts +++ b/packages/api/src/auth/decoders/index.ts @@ -29,6 +29,7 @@ const typesToDecoders: Record< magicLink: noop, firebase: noop, supabase: supabase, + ethereum: noop, custom: noop, } From b9a0c406911b5b435de3aa979fea07dc56d4519e Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 29 Dec 2020 16:48:25 -0500 Subject: [PATCH 06/44] Add decoder --- packages/api/src/auth/decoders/ethereum.ts | 20 ++++++++++++++++++++ packages/api/src/auth/decoders/index.ts | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/api/src/auth/decoders/ethereum.ts diff --git a/packages/api/src/auth/decoders/ethereum.ts b/packages/api/src/auth/decoders/ethereum.ts new file mode 100644 index 000000000000..9a7f9a971e49 --- /dev/null +++ b/packages/api/src/auth/decoders/ethereum.ts @@ -0,0 +1,20 @@ +import jwt from 'jsonwebtoken' + +export const ethereum = (token: string) => { + if (process.env.NODE_ENV === 'production') { + if (!process.env.JWT_SECRET) { + throw new Error('`JWT_SECRET` env var is not set.') + } + + try { + const secret = process.env.JWT_SECRET as string + return Promise.resolve( + jwt.verify(token, secret) as Record + ) + } catch (error) { + return Promise.reject(error) + } + } else { + return Promise.resolve(jwt.decode(token)) + } +} diff --git a/packages/api/src/auth/decoders/index.ts b/packages/api/src/auth/decoders/index.ts index 54cbf49a6af8..a8543903cec2 100644 --- a/packages/api/src/auth/decoders/index.ts +++ b/packages/api/src/auth/decoders/index.ts @@ -6,6 +6,7 @@ import type { GlobalContext } from 'src/globalContext' import { auth0 } from './auth0' import { azureActiveDirectory } from './azureActiveDirectory' +import { ethereum } from './ethereum' import { netlify } from './netlify' import { supabase } from './supabase' const noop = (token: string) => token @@ -29,7 +30,7 @@ const typesToDecoders: Record< magicLink: noop, firebase: noop, supabase: supabase, - ethereum: noop, + ethereum: ethereum, custom: noop, } From 4bbcb5ce5c86e2af29378c90cd9fd7841b9d0b07 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 29 Dec 2020 19:38:36 -0500 Subject: [PATCH 07/44] Add generator --- packages/auth/README.md | 1 + .../cli/src/commands/generate/auth/auth.js | 6 ++- .../generate/auth/providers/ethereum.js | 38 +++++++++++++++++++ .../auth/templates/ethereum.auth.js.template | 19 ++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 packages/cli/src/commands/generate/auth/providers/ethereum.js create mode 100644 packages/cli/src/commands/generate/auth/templates/ethereum.auth.js.template diff --git a/packages/auth/README.md b/packages/auth/README.md index 59ee7142c16c..b7854b11d966 100644 --- a/packages/auth/README.md +++ b/packages/auth/README.md @@ -60,5 +60,6 @@ export type SupportedAuthClients = | MagicLink | Firebase | Supabase + | Ethereum | Custom ``` diff --git a/packages/cli/src/commands/generate/auth/auth.js b/packages/cli/src/commands/generate/auth/auth.js index 7d301a380e27..c6305a1ecf36 100644 --- a/packages/cli/src/commands/generate/auth/auth.js +++ b/packages/cli/src/commands/generate/auth/auth.js @@ -56,12 +56,16 @@ const addWebRender = (content, authProvider) => { return ' ' + line }) const renderContent = + indent + + (authProvider.render ? `<${authProvider.render}>` : '') + indent + `` + indent + redwoodProviderLines.join('\n') + indent + - `` + `` + + indent + + (authProvider.render ? `` : '') return content.replace( /\s+.*<\/RedwoodProvider>/s, diff --git a/packages/cli/src/commands/generate/auth/providers/ethereum.js b/packages/cli/src/commands/generate/auth/providers/ethereum.js new file mode 100644 index 000000000000..640fbb2a0c35 --- /dev/null +++ b/packages/cli/src/commands/generate/auth/providers/ethereum.js @@ -0,0 +1,38 @@ +// the lines that need to be added to index.js +export const config = { + imports: [ + `import EthereumAuthClient from '@oneclickdapp/ethereum-auth'`, + `import { ApolloClient, InMemoryCache } from '@apollo/client'`, + ], + init: `const ApolloInjector = ({ children }) => { + let ethereum + try { + const graphQLClient = new ApolloClient({ + cache: new InMemoryCache(), + uri: \`\${window.__REDWOOD__API_PROXY_PATH}/graphql\`, + }) + ethereum = new EthereumAuthClient({ graphQLClient }) + } catch (e) { + console.log(e) + } + return React.cloneElement(children, { client: ethereum }) +}`, + authProvider: { + client: 'ethereum', + type: 'ethereum', + render: 'ApolloInjector', + }, +} + +// required packages to install +export const webPackages = ['@oneclickdapp/ethereum-auth', '@apollo/client'] +export const apiPackages = ['ethereumjs-util', 'eth-sig-util', 'jsonwebtoken'] + +// any notes to print out when the job is done +export const notes = [ + 'There are a couple more things you need to do!', + 'Please see the readme for instructions:', + 'https://github.com/oneclickdapp/ethereum-auth', + 'This is a FOSS community-maintained package.', + 'Help us make it better!', +] diff --git a/packages/cli/src/commands/generate/auth/templates/ethereum.auth.js.template b/packages/cli/src/commands/generate/auth/templates/ethereum.auth.js.template new file mode 100644 index 000000000000..c92ee6a94d4c --- /dev/null +++ b/packages/cli/src/commands/generate/auth/templates/ethereum.auth.js.template @@ -0,0 +1,19 @@ +import { AuthenticationError } from '@redwoodjs/api' + +import { db } from './db' + +// See https://redwoodjs.com/cookbook/role-based-access-control-rbac +// for how to add Role-based Access Control (RBAC) here. + +export const getCurrentUser = async (decoded) => { + return db.user.findOne({ where: { address: decoded.address } }) +} + +// Use this function in your services to check that a user is logged in, and +// optionally raise an error if they're not. + +export const requireAuth = () => { + if (!context.currentUser) { + throw new AuthenticationError("You don't have permission to do that.") + } +} From cc905f56bc84208d70699d1162d6faf9b2c1faf4 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Wed, 30 Dec 2020 12:25:40 -0500 Subject: [PATCH 08/44] Update ethereum-auth arguments --- .../cli/src/commands/generate/auth/providers/ethereum.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/commands/generate/auth/providers/ethereum.js b/packages/cli/src/commands/generate/auth/providers/ethereum.js index 640fbb2a0c35..691df725946d 100644 --- a/packages/cli/src/commands/generate/auth/providers/ethereum.js +++ b/packages/cli/src/commands/generate/auth/providers/ethereum.js @@ -11,7 +11,11 @@ export const config = { cache: new InMemoryCache(), uri: \`\${window.__REDWOOD__API_PROXY_PATH}/graphql\`, }) - ethereum = new EthereumAuthClient({ graphQLClient }) + const makeRequest = graphQLClient.mutate + ethereum = new EthereumAuthClient({ + makeRequest, + debug: process.NODE_ENV !== 'production', + }) } catch (e) { console.log(e) } From 43d763e06cf7e468e1f69d3305aba6f5e229a28a Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 5 Jan 2021 00:04:59 -0500 Subject: [PATCH 09/44] allow multiple custom render components and add FetchConfigProvider --- .../cli/src/commands/generate/auth/auth.js | 19 +++++++++++---- .../generate/auth/providers/ethereum.js | 24 ++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/commands/generate/auth/auth.js b/packages/cli/src/commands/generate/auth/auth.js index c6305a1ecf36..880a3e9c74db 100644 --- a/packages/cli/src/commands/generate/auth/auth.js +++ b/packages/cli/src/commands/generate/auth/auth.js @@ -55,17 +55,28 @@ const addWebRender = (content, authProvider) => { const redwoodProviderLines = redwoodProvider.split('\n').map((line) => { return ' ' + line }) + const customRenderOpen = authProvider.render + ? authProvider.render.reduce( + (acc, component) => acc + indent + `<${component}>`, + '' + ) + : '' + const customRenderClose = authProvider.render + ? authProvider.render.reduce( + (acc, component) => indent + `` + acc, + '' + ) + : '' + const renderContent = - indent + - (authProvider.render ? `<${authProvider.render}>` : '') + + customRenderOpen + indent + `` + indent + redwoodProviderLines.join('\n') + indent + `` + - indent + - (authProvider.render ? `` : '') + customRenderClose return content.replace( /\s+.*<\/RedwoodProvider>/s, diff --git a/packages/cli/src/commands/generate/auth/providers/ethereum.js b/packages/cli/src/commands/generate/auth/providers/ethereum.js index 691df725946d..9fa12abcc479 100644 --- a/packages/cli/src/commands/generate/auth/providers/ethereum.js +++ b/packages/cli/src/commands/generate/auth/providers/ethereum.js @@ -3,17 +3,35 @@ export const config = { imports: [ `import EthereumAuthClient from '@oneclickdapp/ethereum-auth'`, `import { ApolloClient, InMemoryCache } from '@apollo/client'`, + `import { FetchConfigProvider, useFetchConfig } from '@redwoodjs/web'`, ], init: `const ApolloInjector = ({ children }) => { + const { uri, headers } = useFetchConfig() let ethereum try { const graphQLClient = new ApolloClient({ cache: new InMemoryCache(), - uri: \`\${window.__REDWOOD__API_PROXY_PATH}/graphql\`, + uri, + headers, }) - const makeRequest = graphQLClient.mutate + // Default option using Apollo Client + const makeRequest = (mutation, variables) => + graphQLClient.mutate({ + mutation, + variables, + }) + + // Alternative option using graphql-hooks + // You'll also need to modify graphQLClient + // const makeRequest = (query, variables) => + // graphQLClient.request({ + // query, + // variables, + // }) + ethereum = new EthereumAuthClient({ makeRequest, + // Note: you must set NODE_ENV manually when using Netlify debug: process.NODE_ENV !== 'production', }) } catch (e) { @@ -24,7 +42,7 @@ export const config = { authProvider: { client: 'ethereum', type: 'ethereum', - render: 'ApolloInjector', + render: ['FetchConfigProvider', 'ApolloInjector'], }, } From 13a0c824ccc1e4267cd0ad1f7f7bbe78bb206fa4 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Wed, 6 Jan 2021 12:37:21 -0500 Subject: [PATCH 10/44] simplify customRenders --- .../cli/src/commands/generate/auth/auth.js | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/generate/auth/auth.js b/packages/cli/src/commands/generate/auth/auth.js index 880a3e9c74db..f3acacd8b5e3 100644 --- a/packages/cli/src/commands/generate/auth/auth.js +++ b/packages/cli/src/commands/generate/auth/auth.js @@ -55,18 +55,15 @@ const addWebRender = (content, authProvider) => { const redwoodProviderLines = redwoodProvider.split('\n').map((line) => { return ' ' + line }) - const customRenderOpen = authProvider.render - ? authProvider.render.reduce( - (acc, component) => acc + indent + `<${component}>`, - '' - ) - : '' - const customRenderClose = authProvider.render - ? authProvider.render.reduce( - (acc, component) => indent + `` + acc, - '' - ) - : '' + const customRenderOpen = (authProvider.render || []).reduce( + (acc, component) => acc + indent + `<${component}>`, + '' + ) + + const customRenderClose = (authProvider.render || []).reduce( + (acc, component) => indent + `` + acc, + '' + ) const renderContent = customRenderOpen + From f13e8babd467c6d49a18ae164d6b8e16f69f83a9 Mon Sep 17 00:00:00 2001 From: Rob Cameron Date: Tue, 12 Jan 2021 14:47:50 -0800 Subject: [PATCH 11/44] Replace prisma deprecated fineOne() -> findUnique() (#1629) Co-authored-by: Rob Cameron --- .../src/commands/generate/auth/templates/auth.js.template | 8 ++++---- .../auth/templates/azureActiveDirectory.auth.js.template | 2 +- .../generate/auth/templates/firebase.auth.js.template | 2 +- .../generate/service/__tests__/fixtures/multiWord_crud.js | 2 +- .../generate/service/__tests__/fixtures/multiWord_crud.ts | 2 +- .../service/__tests__/fixtures/singleWord_belongsTo.js | 2 +- .../service/__tests__/fixtures/singleWord_belongsTo.ts | 2 +- .../service/__tests__/fixtures/singleWord_crud.js | 2 +- .../service/__tests__/fixtures/singleWord_crud.ts | 2 +- .../service/__tests__/fixtures/singleWord_hasMany.js | 2 +- .../service/__tests__/fixtures/singleWord_hasMany.ts | 2 +- .../service/__tests__/fixtures/singleWord_multiple.js | 4 ++-- .../service/__tests__/fixtures/singleWord_multiple.ts | 4 ++-- .../generate/service/templates/service.ts.template | 4 ++-- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/commands/generate/auth/templates/auth.js.template b/packages/cli/src/commands/generate/auth/templates/auth.js.template index 232fdd5f53dc..28071ba5a6fd 100644 --- a/packages/cli/src/commands/generate/auth/templates/auth.js.template +++ b/packages/cli/src/commands/generate/auth/templates/auth.js.template @@ -2,7 +2,7 @@ // to return a real user from your database, you could do something like: // // export const getCurrentUser = async ({ email }) => { -// return await db.user.findOne({ where: { email } }) +// return await db.user.findUnique({ where: { email } }) // } // // If you want to enforce role-based access ... @@ -67,7 +67,7 @@ import { AuthenticationError, ForbiddenError, parseJWT } from '@redwoodjs/api' * @example - No role-based access control. * * export const getCurrentUser = async (decoded) => { - * return await db.user.findOne({ where: { decoded.email } }) + * return await db.user.findUnique({ where: { decoded.email } }) * } * * @example - User info is contained in the decoded token and roles extracted @@ -79,7 +79,7 @@ import { AuthenticationError, ForbiddenError, parseJWT } from '@redwoodjs/api' * @example - User record query by email with namespaced app_metadata roles * * export const getCurrentUser = async (decoded) => { - * const currentUser = await db.user.findOne({ where: { email: decoded.email } }) + * const currentUser = await db.user.findUnique({ where: { email: decoded.email } }) * * return { * ...currentUser, @@ -90,7 +90,7 @@ import { AuthenticationError, ForbiddenError, parseJWT } from '@redwoodjs/api' * @example - User record query by an identity with app_metadata roles * * const getCurrentUser = async (decoded) => { - * const currentUser = await db.user.findOne({ where: { userIdentity: decoded.sub } }) + * const currentUser = await db.user.findUnique({ where: { userIdentity: decoded.sub } }) * return { * ...currentUser, * roles: parseJWT({ decoded: decoded }).roles, diff --git a/packages/cli/src/commands/generate/auth/templates/azureActiveDirectory.auth.js.template b/packages/cli/src/commands/generate/auth/templates/azureActiveDirectory.auth.js.template index ef7ced71b8f5..110654b49418 100644 --- a/packages/cli/src/commands/generate/auth/templates/azureActiveDirectory.auth.js.template +++ b/packages/cli/src/commands/generate/auth/templates/azureActiveDirectory.auth.js.template @@ -2,7 +2,7 @@ // to return a real user from your database, you could do something like: // // export const getCurrentUser = async ({ email }) => { -// return await db.user.findOne({ where: { email } }) +// return await db.user.findUnique({ where: { email } }) // } import { AuthenticationError, ForbiddenError, parseJWT } from '@redwoodjs/api' diff --git a/packages/cli/src/commands/generate/auth/templates/firebase.auth.js.template b/packages/cli/src/commands/generate/auth/templates/firebase.auth.js.template index 819eaed53847..6210e0a3da13 100644 --- a/packages/cli/src/commands/generate/auth/templates/firebase.auth.js.template +++ b/packages/cli/src/commands/generate/auth/templates/firebase.auth.js.template @@ -2,7 +2,7 @@ // to return a real user from your database, you could do something like: // // export const getCurrentUser = async ({ email }) => { -// return await db.user.findOne({ where: { email } }) +// return await db.user.findUnique({ where: { email } }) // } import { AuthenticationError } from '@redwoodjs/api' diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.js b/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.js index 8be74a61b2e7..0e95f036e67c 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.js +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.js @@ -5,7 +5,7 @@ export const userProfiles = () => { } export const userProfile = ({ id }) => { - return db.userProfile.findOne({ + return db.userProfile.findUnique({ where: { id }, }) } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.ts b/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.ts index a2bf9912d8f8..7d2ef08e62ba 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.ts +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/multiWord_crud.ts @@ -10,7 +10,7 @@ export const userProfiles = () => { } export const userProfile = ({ id }: UserProfileWhereUniqueInput) => { - return db.userProfile.findOne({ + return db.userProfile.findUnique({ where: { id }, }) } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.js b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.js index 2dbdb567cce2..b38bc09008e5 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.js +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.js @@ -6,5 +6,5 @@ export const users = () => { export const User = { identity: (_obj, { root }) => - db.user.findOne({ where: { id: root.id } }).identity(), + db.user.findUnique({ where: { id: root.id } }).identity(), } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.ts b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.ts index 6dcc0c2b3f24..811a2e66f710 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.ts +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_belongsTo.ts @@ -8,5 +8,5 @@ export const users = () => { export const User = { identity: (_obj, { root }: ResolverArgs) => - db.user.findOne({ where: { id: root.id } }).identity(), + db.user.findUnique({ where: { id: root.id } }).identity(), } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.js b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.js index be53d32bf06f..3d680c99d10e 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.js +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.js @@ -5,7 +5,7 @@ export const posts = () => { } export const post = ({ id }) => { - return db.post.findOne({ + return db.post.findUnique({ where: { id }, }) } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.ts b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.ts index 2b47200240d1..e0124eb49f32 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.ts +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_crud.ts @@ -10,7 +10,7 @@ export const posts = () => { } export const post = ({ id }: PostWhereUniqueInput) => { - return db.post.findOne({ + return db.post.findUnique({ where: { id }, }) } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.js b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.js index 9e66d05df5a7..42bf9c74a650 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.js +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.js @@ -6,5 +6,5 @@ export const users = () => { export const User = { userProfiles: (_obj, { root }) => - db.user.findOne({ where: { id: root.id } }).userProfiles(), + db.user.findUnique({ where: { id: root.id } }).userProfiles(), } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.ts b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.ts index ace7796aeda6..70c2db6cf6c7 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.ts +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_hasMany.ts @@ -8,5 +8,5 @@ export const users = () => { export const User = { userProfiles: (_obj, { root }: ResolverArgs) => - db.user.findOne({ where: { id: root.id } }).userProfiles(), + db.user.findUnique({ where: { id: root.id } }).userProfiles(), } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.js b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.js index 69686c8a7a6b..4f5e2d4a582a 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.js +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.js @@ -6,7 +6,7 @@ export const users = () => { export const User = { userProfiles: (_obj, { root }) => - db.user.findOne({ where: { id: root.id } }).userProfiles(), + db.user.findUnique({ where: { id: root.id } }).userProfiles(), identity: (_obj, { root }) => - db.user.findOne({ where: { id: root.id } }).identity(), + db.user.findUnique({ where: { id: root.id } }).identity(), } diff --git a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.ts b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.ts index b1b76038928b..c1cbb45edaa5 100644 --- a/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.ts +++ b/packages/cli/src/commands/generate/service/__tests__/fixtures/singleWord_multiple.ts @@ -8,7 +8,7 @@ export const users = () => { export const User = { userProfiles: (_obj, { root }: ResolverArgs) => - db.user.findOne({ where: { id: root.id } }).userProfiles(), + db.user.findUnique({ where: { id: root.id } }).userProfiles(), identity: (_obj, { root }: ResolverArgs) => - db.user.findOne({ where: { id: root.id } }).identity(), + db.user.findUnique({ where: { id: root.id } }).identity(), } diff --git a/packages/cli/src/commands/generate/service/templates/service.ts.template b/packages/cli/src/commands/generate/service/templates/service.ts.template index 4249f33cea3c..4b50491d5ce1 100644 --- a/packages/cli/src/commands/generate/service/templates/service.ts.template +++ b/packages/cli/src/commands/generate/service/templates/service.ts.template @@ -11,7 +11,7 @@ export const ${pluralCamelName} = () => { }<% if (crud) { %> export const ${singularCamelName} = ({ id }: ${singularPascalName}WhereUniqueInput) => { - return db.${singularCamelName}.findOne({ + return db.${singularCamelName}.findUnique({ where: { id }, }) } @@ -45,5 +45,5 @@ export const delete${singularPascalName} = ({ id }: ${singularPascalName}WhereUn }<% } %><% if (relations.length) { %> export const ${singularPascalName} = {<% relations.forEach(relation => { %> - ${relation}: (_obj, { root }: ResolverArgs<${singularPascalName}WhereUniqueInput>) => db.${singularCamelName}.findOne({ where: { id: root.id } }).${relation}(),<% }) %> + ${relation}: (_obj, { root }: ResolverArgs<${singularPascalName}WhereUniqueInput>) => db.${singularCamelName}.findUnique({ where: { id: root.id } }).${relation}(),<% }) %> }<% } %> From c6adf9ddcf815a22abfcdf99c6d167ebd99a6a97 Mon Sep 17 00:00:00 2001 From: Dominic Saadi <32992335+jtoar@users.noreply.github.com> Date: Tue, 12 Jan 2021 15:10:24 -0800 Subject: [PATCH 12/44] Resolve promises in the console (#1619) * feat: resolve promises in the console * fix: link to source Co-authored-by: dominic saadi Co-authored-by: David Price --- packages/cli/src/commands/console.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/cli/src/commands/console.js b/packages/cli/src/commands/console.js index b23603fca0d4..f2d95a28a6a6 100644 --- a/packages/cli/src/commands/console.js +++ b/packages/cli/src/commands/console.js @@ -28,6 +28,25 @@ export const handler = () => { const r = repl.start() + // always await promises. + // source: https://github.com/nodejs/node/issues/13209#issuecomment-619526317 + const defaultEval = r.eval; + r.eval = (cmd, context, filename, callback) => { + defaultEval(cmd, context, filename, async (err, result) => { + if (err) { + // propagate errors. + callback(err); + } else { + // await the promise and either return the result or error. + try { + callback(null, await Promise.resolve(result)); + } catch (err) { + callback(err); + } + } + }); + }; + // Make the project's db (i.e. Prisma Client) available mapDBToContext(r.context) } From 9e1b9a82a5ee85d4be969215cddc81b7fe0a2a4c Mon Sep 17 00:00:00 2001 From: David Price Date: Tue, 12 Jan 2021 15:36:09 -0800 Subject: [PATCH 13/44] sync yarn.lock (#1632) --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index e6cbb2a54daa..53b2baa5d490 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18824,7 +18824,7 @@ whatwg-fetch@3.4.1: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== -whatwg-fetch@^3.0.0: +whatwg-fetch@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== From 702a82304f2b526338b0c84ea8430f77c27c3154 Mon Sep 17 00:00:00 2001 From: Adithya Sunil Date: Wed, 13 Jan 2021 07:33:52 +0400 Subject: [PATCH 14/44] Updated All-Contributors Data (#1621) * Updated All-Contributors Data * remove core team profiles Co-authored-by: David S Price --- README.md | 9 +++ tasks/all-contributors/.all-contributorsrc | 70 ++++++++++++++++++- .../all-contributors/.crwa.all-contributorsrc | 9 +++ .../.rwjs.com.all-contributorsrc | 63 +++++++++++++++++ 4 files changed, 149 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 643c2738ad96..babaf555f9f7 100644 --- a/README.md +++ b/README.md @@ -431,6 +431,15 @@ And there you have it.
William

dcgoodwin2112
+
Bennett Rogers
+
Daniel O'Neill
+
David Yu
+ + +
Adithya Sunil
+
Edward Jiang
+
Manuel Kallenbach
+
Nick Schmitt
diff --git a/tasks/all-contributors/.all-contributorsrc b/tasks/all-contributors/.all-contributorsrc index 947c664e4979..512aed3ea93b 100644 --- a/tasks/all-contributors/.all-contributorsrc +++ b/tasks/all-contributors/.all-contributorsrc @@ -405,7 +405,8 @@ "avatar_url": "https://avatars2.githubusercontent.com/u/865493?v=4", "profile": "https://github.com/jeliasson", "contributions": [ - "code" + "code", + "doc" ] }, { @@ -567,7 +568,8 @@ "profile": "https://github.com/forresthayes", "contributions": [ "code", - "doc" + "doc", + "tool" ] }, { @@ -1330,6 +1332,70 @@ "contributions": [ "doc" ] + }, + { + "login": "bennettrogers", + "name": "Bennett Rogers", + "avatar_url": "https://avatars1.githubusercontent.com/u/933251?v=4", + "profile": "https://github.com/bennettrogers", + "contributions": [ + "code" + ] + }, + { + "login": "byudaniel", + "name": "Daniel O'Neill", + "avatar_url": "https://avatars0.githubusercontent.com/u/7226285?v=4", + "profile": "https://github.com/byudaniel", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "noobling", + "name": "David Yu", + "avatar_url": "https://avatars2.githubusercontent.com/u/23206864?v=4", + "profile": "https://github.com/noobling", + "contributions": [ + "doc" + ] + }, + { + "login": "adithyasunil26", + "name": "Adithya Sunil", + "avatar_url": "https://avatars0.githubusercontent.com/u/51863389?v=4", + "profile": "https://github.com/adithyasunil26", + "contributions": [ + "doc" + ] + }, + { + "login": "edjiang", + "name": "Edward Jiang", + "avatar_url": "https://avatars1.githubusercontent.com/u/918770?v=4", + "profile": "https://edjiang.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "manukall", + "name": "Manuel Kallenbach", + "avatar_url": "https://avatars0.githubusercontent.com/u/117418?v=4", + "profile": "http://manukall.de/", + "contributions": [ + "doc" + ] + }, + { + "login": "NickSchmitt", + "name": "Nick Schmitt", + "avatar_url": "https://avatars3.githubusercontent.com/u/23244885?v=4", + "profile": "https://github.com/NickSchmitt", + "contributions": [ + "doc" + ] } ] } \ No newline at end of file diff --git a/tasks/all-contributors/.crwa.all-contributorsrc b/tasks/all-contributors/.crwa.all-contributorsrc index 1df7282d9682..90c5c340e25f 100644 --- a/tasks/all-contributors/.crwa.all-contributorsrc +++ b/tasks/all-contributors/.crwa.all-contributorsrc @@ -136,6 +136,15 @@ "contributions": [ "tool" ] + }, + { + "login": "forresthayes", + "name": "Forrest Hayes", + "avatar_url": "https://avatars0.githubusercontent.com/u/44448047?v=4", + "profile": "https://github.com/forresthayes", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 7 diff --git a/tasks/all-contributors/.rwjs.com.all-contributorsrc b/tasks/all-contributors/.rwjs.com.all-contributorsrc index dbce13e2bffb..e225a41442f6 100644 --- a/tasks/all-contributors/.rwjs.com.all-contributorsrc +++ b/tasks/all-contributors/.rwjs.com.all-contributorsrc @@ -757,6 +757,69 @@ "contributions": [ "doc" ] + }, + { + "login": "noobling", + "name": "David Yu", + "avatar_url": "https://avatars2.githubusercontent.com/u/23206864?v=4", + "profile": "https://github.com/noobling", + "contributions": [ + "doc" + ] + }, + { + "login": "jeliasson", + "name": "Johan Eliasson", + "avatar_url": "https://avatars2.githubusercontent.com/u/865493?v=4", + "profile": "https://github.com/jeliasson", + "contributions": [ + "doc" + ] + }, + { + "login": "adithyasunil26", + "name": "Adithya Sunil", + "avatar_url": "https://avatars0.githubusercontent.com/u/51863389?v=4", + "profile": "https://github.com/adithyasunil26", + "contributions": [ + "doc" + ] + }, + { + "login": "byudaniel", + "name": "Daniel O'Neill", + "avatar_url": "https://avatars0.githubusercontent.com/u/7226285?v=4", + "profile": "https://github.com/byudaniel", + "contributions": [ + "doc" + ] + }, + { + "login": "edjiang", + "name": "Edward Jiang", + "avatar_url": "https://avatars1.githubusercontent.com/u/918770?v=4", + "profile": "https://edjiang.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "manukall", + "name": "Manuel Kallenbach", + "avatar_url": "https://avatars0.githubusercontent.com/u/117418?v=4", + "profile": "http://manukall.de/", + "contributions": [ + "doc" + ] + }, + { + "login": "NickSchmitt", + "name": "Nick Schmitt", + "avatar_url": "https://avatars3.githubusercontent.com/u/23244885?v=4", + "profile": "https://github.com/NickSchmitt", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7 From d879f22ad754ff898540c10b13cea5a066cc3ea7 Mon Sep 17 00:00:00 2001 From: David S Price Date: Tue, 12 Jan 2021 20:32:47 -0800 Subject: [PATCH 15/44] update PR Package Action formatting --- .github/workflows/publish_pr_packages.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_pr_packages.yaml b/.github/workflows/publish_pr_packages.yaml index 36eb99a95619..83e604b91ba6 100644 --- a/.github/workflows/publish_pr_packages.yaml +++ b/.github/workflows/publish_pr_packages.yaml @@ -46,11 +46,17 @@ jobs: pr_number=${{ steps.pr_number.outputs.pr_number }} cd pr-packages/$pr_number v_sha=$(ls | grep "\.tgz$" | sed 's/\.tgz$//' | head -n1 | awk -F"-" '{ print $(NF-1)"-"$NF }') - msg="๐Ÿ“ฆ Packages for this PR can be downloaded from%0A" + msg="### ๐Ÿ“ฆ PR Packages%0A" + msg+="%0A" + msg+="
Click to Show Package Download Links" + msg+="%0A" for p in *; do msg+="https://rw-pr-redwoodjs-com.s3.amazonaws.com/$pr_number/$p%0A" done - msg+="%0AInstall this PR by running \`yarn rw upgrade --pr $pr_number:$v_sha\`" + msg+="%0A" + msg+="
" + msg+="%0A" + msg+="Install this PR by running \`yarn rw upgrade --pr $pr_number:$v_sha\`" echo "::set-output name=msg::$msg" - name: Find Comment From 49d6dba044e1929e1921f94bc3f4c13e27d109ac Mon Sep 17 00:00:00 2001 From: David Price Date: Tue, 12 Jan 2021 20:36:50 -0800 Subject: [PATCH 16/44] add learn.rwjs.com repo to contributors (#1634) --- README.md | 4 +++ tasks/all-contributors/.all-contributorsrc | 21 ++++++++++- .../all-contributors/.crwa.all-contributorsrc | 2 +- .../.learn.all-contributorsrc | 34 ++++++++++++++++++ .../.rwjs.com.all-contributorsrc | 11 +++++- tasks/all-contributors/README.md | 35 +++++++++++++++++-- tasks/all-contributors/mergeContributors.js | 1 + 7 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 tasks/all-contributors/.learn.all-contributorsrc diff --git a/README.md b/README.md index babaf555f9f7..1c8984b00fd2 100644 --- a/README.md +++ b/README.md @@ -440,6 +440,10 @@ And there you have it.
Edward Jiang

Manuel Kallenbach

Nick Schmitt
+
Jon Meyers
+ + +
Matthew Bush
diff --git a/tasks/all-contributors/.all-contributorsrc b/tasks/all-contributors/.all-contributorsrc index 512aed3ea93b..33be452db7e7 100644 --- a/tasks/all-contributors/.all-contributorsrc +++ b/tasks/all-contributors/.all-contributorsrc @@ -250,7 +250,8 @@ "contributions": [ "code", "doc", - "tool" + "tool", + "tutorial" ] }, { @@ -1396,6 +1397,24 @@ "contributions": [ "doc" ] + }, + { + "login": "dijonmusters", + "name": "Jon Meyers", + "avatar_url": "https://avatars0.githubusercontent.com/u/13792200?v=4", + "profile": "https://monoglot.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "mbush92", + "name": "Matthew Bush", + "avatar_url": "https://avatars0.githubusercontent.com/u/15862774?v=4", + "profile": "https://github.com/mbush92", + "contributions": [ + "tutorial" + ] } ] } \ No newline at end of file diff --git a/tasks/all-contributors/.crwa.all-contributorsrc b/tasks/all-contributors/.crwa.all-contributorsrc index 90c5c340e25f..cab0faf0c9ad 100644 --- a/tasks/all-contributors/.crwa.all-contributorsrc +++ b/tasks/all-contributors/.crwa.all-contributorsrc @@ -147,5 +147,5 @@ ] } ], - "contributorsPerLine": 7 + "contributorsPerLine": 5 } diff --git a/tasks/all-contributors/.learn.all-contributorsrc b/tasks/all-contributors/.learn.all-contributorsrc new file mode 100644 index 000000000000..687c19b3de3f --- /dev/null +++ b/tasks/all-contributors/.learn.all-contributorsrc @@ -0,0 +1,34 @@ +{ + "projectName": "learn.redwoodjs.com", + "projectOwner": "redwoodjs", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 100, + "contributorTemplate": "\">\" width=\"<%= options.imageSize %>px;\" alt=\"\"/>
<%= contributor.name %>
", + "commit": false, + "commitConvention": "none", + "contributors": [ + { + "login": "mbush92", + "name": "Matthew Bush", + "avatar_url": "https://avatars0.githubusercontent.com/u/15862774?v=4", + "profile": "https://github.com/mbush92", + "contributions": [ + "tutorial" + ] + }, + { + "login": "Thieffen", + "name": "Thieffen", + "avatar_url": "https://avatars1.githubusercontent.com/u/847877?v=4", + "profile": "https://github.com/Thieffen", + "contributions": [ + "tutorial" + ] + } + ], + "contributorsPerLine": 5 +} diff --git a/tasks/all-contributors/.rwjs.com.all-contributorsrc b/tasks/all-contributors/.rwjs.com.all-contributorsrc index e225a41442f6..ddd8032499a6 100644 --- a/tasks/all-contributors/.rwjs.com.all-contributorsrc +++ b/tasks/all-contributors/.rwjs.com.all-contributorsrc @@ -820,7 +820,16 @@ "contributions": [ "doc" ] + }, + { + "login": "dijonmusters", + "name": "Jon Meyers", + "avatar_url": "https://avatars0.githubusercontent.com/u/13792200?v=4", + "profile": "https://monoglot.dev/", + "contributions": [ + "doc" + ] } ], - "contributorsPerLine": 7 + "contributorsPerLine": 5 } diff --git a/tasks/all-contributors/README.md b/tasks/all-contributors/README.md index f2aecbb4396a..b6a25bcedb78 100644 --- a/tasks/all-contributors/README.md +++ b/tasks/all-contributors/README.md @@ -16,7 +16,7 @@ Redwood has a vibrant community that we want to highlight as much as possible. U ## Managing All-Contributors Data In general, this is a three-part process: -1. Update the three `*.all-contributorsrc` files with new contributors +1. Update the four `*.all-contributorsrc` files with new contributors 2. Merge changes into the main `.all-contributorsrc` file 3. Update README.md#Contributors with changes @@ -33,16 +33,38 @@ _note: this file is also used for all aggregated contributors_ **Website** `redwoodjs/redwoodjs.com` project: - `.rwjs.com.all-contributorsrc` +**Learn** `redwoodjs/learn.redwoodjs.com` project: +- `.learn.all-contributorsrc` + >When adding contributors, use this "type" key for specific repos: >- ๐Ÿ’ปย (code) == Framework >- ๐Ÿ“–ย (doc) == Redwoodjs.com >- ๐Ÿ”งย (tool) == Create-Redwood-App +>- โœ…ย (tutorial) == Learn.Redwoodjs.com > >The "type" is required. ### Step 1: Check for new contributors and add to `*rc` files -'cd tasks/all-contributors' +`cd tasks/all-contributors` +`yarn install` + +> **NOTE:** +> Do not add [bot] accounts to the files. +> +> Also, members of the Core Team are manually added to the #core-team section. To avoid duplication, do not add the following profiles to the files below: +> - peterp +> - thedavidprice +> - mojombo +> - cannikin +> - jtoar +> - Tobbe +> - RobertBroersma +> - dthyresson +> - dac09 +> - aldonline +> - clairefro +> - ajcwebdev #### Framework ```js @@ -71,6 +93,15 @@ yarn all-contributors check --config .crwa.all-contributorsrc yarn all-contributors add --config .crwa.all-contributorsrc tool ``` +#### Learn.Redwoodjs.com +```js +yarn all-contributors check --config .learn.all-contributorsrc + +// For each contributor listed in output, repeat the following: + +yarn all-contributors add --config .learn.all-contributorsrc tutorial +``` + ### Step 2: Merge contributors into main file This script will add contributors from Redwoodjs.com and CRWA repos into the Framework file (if they don't already exist). It will also update the "type" of contribution for existing contributors. diff --git a/tasks/all-contributors/mergeContributors.js b/tasks/all-contributors/mergeContributors.js index 35fef962bbf6..837643a73d9d 100644 --- a/tasks/all-contributors/mergeContributors.js +++ b/tasks/all-contributors/mergeContributors.js @@ -11,6 +11,7 @@ const mainContribFile = JSON.parse(fs.readFileSync(targetFile)) const contribFiles = [ '.crwa.all-contributorsrc', '.rwjs.com.all-contributorsrc', + '.learn.all-contributorsrc', ] async function main() { From 3bb740ac8a800ed6b9b171f4ade16e0a3c16c840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Pi=C3=B1era?= Date: Wed, 13 Jan 2021 17:37:10 +0100 Subject: [PATCH 17/44] Add template --- packages/create-redwood-app/package.json | 3 +- .../create-redwood-app/vendor/.editorconfig | 10 + packages/create-redwood-app/vendor/.env | 9 + .../create-redwood-app/vendor/.env.defaults | 10 + .../create-redwood-app/vendor/.env.example | 2 + packages/create-redwood-app/vendor/.gitignore | 8 + .../create-redwood-app/vendor/.gitignore.app | 11 + .../vendor/.vscode/extensions.json | 15 + .../vendor/.vscode/launch.json | 22 + .../vendor/.vscode/settings.json | 11 + packages/create-redwood-app/vendor/LICENSE | 21 + packages/create-redwood-app/vendor/README.md | 19 + .../create-redwood-app/vendor/README_APP.md | 24 + .../create-redwood-app/vendor/api/.babelrc.js | 1 + .../vendor/api/db/schema.prisma | 20 + .../create-redwood-app/vendor/api/db/seeds.js | 26 + .../vendor/api/jest.config.js | 6 + .../vendor/api/jsconfig.json | 9 + .../vendor/api/package.json | 8 + .../vendor/api/src/functions/graphql.js | 20 + .../vendor/api/src/graphql/.keep | 0 .../vendor/api/src/lib/db.js | 6 + .../vendor/api/src/services/.keep | 0 .../create-redwood-app/vendor/babel.config.js | 3 + .../vendor/graphql.config.js | 7 + .../create-redwood-app/vendor/package.json | 19 + .../vendor/prettier.config.js | 17 + .../create-redwood-app/vendor/redwood.toml | 15 + .../create-redwood-app/vendor/web/.babelrc.js | 1 + .../vendor/web/jest.config.js | 6 + .../vendor/web/jsconfig.json | 10 + .../vendor/web/package.json | 23 + .../vendor/web/public/README.md | 36 + .../vendor/web/public/favicon.png | Bin 0 -> 1877 bytes .../vendor/web/public/robots.txt | 2 + .../vendor/web/src/Routes.js | 20 + .../vendor/web/src/components/.keep | 0 .../vendor/web/src/index.css | 0 .../vendor/web/src/index.html | 12 + .../vendor/web/src/index.js | 16 + .../vendor/web/src/layouts/.keep | 0 .../pages/FatalErrorPage/FatalErrorPage.js | 53 + .../src/pages/NotFoundPage/NotFoundPage.js | 44 + packages/create-redwood-app/vendor/yarn.lock | 15229 ++++++++++++++++ 44 files changed, 15773 insertions(+), 1 deletion(-) create mode 100644 packages/create-redwood-app/vendor/.editorconfig create mode 100644 packages/create-redwood-app/vendor/.env create mode 100644 packages/create-redwood-app/vendor/.env.defaults create mode 100644 packages/create-redwood-app/vendor/.env.example create mode 100644 packages/create-redwood-app/vendor/.gitignore create mode 100644 packages/create-redwood-app/vendor/.gitignore.app create mode 100644 packages/create-redwood-app/vendor/.vscode/extensions.json create mode 100644 packages/create-redwood-app/vendor/.vscode/launch.json create mode 100644 packages/create-redwood-app/vendor/.vscode/settings.json create mode 100644 packages/create-redwood-app/vendor/LICENSE create mode 100644 packages/create-redwood-app/vendor/README.md create mode 100644 packages/create-redwood-app/vendor/README_APP.md create mode 100644 packages/create-redwood-app/vendor/api/.babelrc.js create mode 100644 packages/create-redwood-app/vendor/api/db/schema.prisma create mode 100644 packages/create-redwood-app/vendor/api/db/seeds.js create mode 100644 packages/create-redwood-app/vendor/api/jest.config.js create mode 100644 packages/create-redwood-app/vendor/api/jsconfig.json create mode 100644 packages/create-redwood-app/vendor/api/package.json create mode 100644 packages/create-redwood-app/vendor/api/src/functions/graphql.js create mode 100644 packages/create-redwood-app/vendor/api/src/graphql/.keep create mode 100644 packages/create-redwood-app/vendor/api/src/lib/db.js create mode 100644 packages/create-redwood-app/vendor/api/src/services/.keep create mode 100644 packages/create-redwood-app/vendor/babel.config.js create mode 100644 packages/create-redwood-app/vendor/graphql.config.js create mode 100644 packages/create-redwood-app/vendor/package.json create mode 100644 packages/create-redwood-app/vendor/prettier.config.js create mode 100644 packages/create-redwood-app/vendor/redwood.toml create mode 100644 packages/create-redwood-app/vendor/web/.babelrc.js create mode 100644 packages/create-redwood-app/vendor/web/jest.config.js create mode 100644 packages/create-redwood-app/vendor/web/jsconfig.json create mode 100644 packages/create-redwood-app/vendor/web/package.json create mode 100644 packages/create-redwood-app/vendor/web/public/README.md create mode 100644 packages/create-redwood-app/vendor/web/public/favicon.png create mode 100644 packages/create-redwood-app/vendor/web/public/robots.txt create mode 100644 packages/create-redwood-app/vendor/web/src/Routes.js create mode 100644 packages/create-redwood-app/vendor/web/src/components/.keep create mode 100644 packages/create-redwood-app/vendor/web/src/index.css create mode 100644 packages/create-redwood-app/vendor/web/src/index.html create mode 100644 packages/create-redwood-app/vendor/web/src/index.js create mode 100644 packages/create-redwood-app/vendor/web/src/layouts/.keep create mode 100644 packages/create-redwood-app/vendor/web/src/pages/FatalErrorPage/FatalErrorPage.js create mode 100644 packages/create-redwood-app/vendor/web/src/pages/NotFoundPage/NotFoundPage.js create mode 100644 packages/create-redwood-app/vendor/yarn.lock diff --git a/packages/create-redwood-app/package.json b/packages/create-redwood-app/package.json index 8b2920eb76be..7db34c81ad91 100644 --- a/packages/create-redwood-app/package.json +++ b/packages/create-redwood-app/package.json @@ -4,7 +4,8 @@ "license": "MIT", "bin": "./dist/create-redwood-app.js", "files": [ - "dist" + "dist", + "vendor" ], "dependencies": { "@babel/runtime-corejs3": "^7.9.2", diff --git a/packages/create-redwood-app/vendor/.editorconfig b/packages/create-redwood-app/vendor/.editorconfig new file mode 100644 index 000000000000..ae10a5cce3b2 --- /dev/null +++ b/packages/create-redwood-app/vendor/.editorconfig @@ -0,0 +1,10 @@ +# editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/packages/create-redwood-app/vendor/.env b/packages/create-redwood-app/vendor/.env new file mode 100644 index 000000000000..5d1e7a566f30 --- /dev/null +++ b/packages/create-redwood-app/vendor/.env @@ -0,0 +1,9 @@ +# THIS FILE SHOULD NOT BE CHECKED INTO YOUR VERSION CONTROL SYSTEM +# +# Environment variables set here will override those in .env.defaults. +# Any environment variables you need in production you will need to setup with +# your hosting provider. For example in Netlify you can add environment +# variables in Settings > Build & Deploy > environment +# +# DATABASE_URL=postgres://user:pass@postgreshost.com:5432/database_name +# BINARY_TARGET=rhel-openssl-1.0.x diff --git a/packages/create-redwood-app/vendor/.env.defaults b/packages/create-redwood-app/vendor/.env.defaults new file mode 100644 index 000000000000..bc5fb1d0a6f1 --- /dev/null +++ b/packages/create-redwood-app/vendor/.env.defaults @@ -0,0 +1,10 @@ +# These environment variables will be used by default if you do not create any +# yourself in .env. This file should be safe to check into your version control +# system. Any custom values should go in .env and .env should *not* be checked +# into version control. + +# schema.prisma defaults +DATABASE_URL=file:./dev.db + +# disables Prisma CLI update notifier +PRISMA_HIDE_UPDATE_MESSAGE=true diff --git a/packages/create-redwood-app/vendor/.env.example b/packages/create-redwood-app/vendor/.env.example new file mode 100644 index 000000000000..28853d166dcb --- /dev/null +++ b/packages/create-redwood-app/vendor/.env.example @@ -0,0 +1,2 @@ +# DATABASE_URL=file:./dev.db +# BINARY_TARGET=native \ No newline at end of file diff --git a/packages/create-redwood-app/vendor/.gitignore b/packages/create-redwood-app/vendor/.gitignore new file mode 100644 index 000000000000..60b021f34792 --- /dev/null +++ b/packages/create-redwood-app/vendor/.gitignore @@ -0,0 +1,8 @@ +.idea +.DS_Store +.redwood +dist +dist-babel +node_modules +yarn-error.log + diff --git a/packages/create-redwood-app/vendor/.gitignore.app b/packages/create-redwood-app/vendor/.gitignore.app new file mode 100644 index 000000000000..e7b00ebdb915 --- /dev/null +++ b/packages/create-redwood-app/vendor/.gitignore.app @@ -0,0 +1,11 @@ +.idea +.DS_Store +.env +.netlify +.redwood +dev.db +dist +dist-babel +node_modules +yarn-error.log +web/public/mockServiceWorker.js diff --git a/packages/create-redwood-app/vendor/.vscode/extensions.json b/packages/create-redwood-app/vendor/.vscode/extensions.json new file mode 100644 index 000000000000..b4230c7a53cd --- /dev/null +++ b/packages/create-redwood-app/vendor/.vscode/extensions.json @@ -0,0 +1,15 @@ +{ + "recommendations": [ + "redwoodjs.redwood", + "dbaeumer.vscode-eslint", + "eamodio.gitlens", + "ofhumanbondage.react-proptypes-intellisense", + "mgmcdermott.vscode-language-babel", + "wix.vscode-import-cost", + "pflannery.vscode-versionlens", + "editorconfig.editorconfig", + "prisma.prisma", + "graphql.vscode-graphql" + ], + "unwantedRecommendations": [] +} diff --git a/packages/create-redwood-app/vendor/.vscode/launch.json b/packages/create-redwood-app/vendor/.vscode/launch.json new file mode 100644 index 000000000000..6530c372490e --- /dev/null +++ b/packages/create-redwood-app/vendor/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "yarn redwood dev", + "name": "launch development", + "request": "launch", + "type": "node-terminal" + }, + { + "type": "pwa-node", + "request": "launch", + "name": "launch api", + "skipFiles": [ + "/**" + ], + "cwd": "${workspaceFolder}/api", + "envFile": "${workspaceFolder}/.env.defaults", + "program": "${workspaceFolder}/node_modules/.bin/dev-server" + } + ] +} diff --git a/packages/create-redwood-app/vendor/.vscode/settings.json b/packages/create-redwood-app/vendor/.vscode/settings.json new file mode 100644 index 000000000000..bb0578ddbbf8 --- /dev/null +++ b/packages/create-redwood-app/vendor/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "[prisma]": { + "editor.formatOnSave": true + } +} diff --git a/packages/create-redwood-app/vendor/LICENSE b/packages/create-redwood-app/vendor/LICENSE new file mode 100644 index 000000000000..f943bbba4cb0 --- /dev/null +++ b/packages/create-redwood-app/vendor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Redwood + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/create-redwood-app/vendor/README.md b/packages/create-redwood-app/vendor/README.md new file mode 100644 index 000000000000..f024db994a61 --- /dev/null +++ b/packages/create-redwood-app/vendor/README.md @@ -0,0 +1,19 @@ +# Redwood +>๐Ÿ‘‰ **"This is not the Repo you are looking for"** _...most likely_. If your goal is to start building an app using RedwoodJS, you'll want to read through the [Tutorial](https://redwoodjs.com/tutorial/welcome-to-redwood) and get started from the command line: +>$ `yarn create redwood-app ` +> +**This repo is a template used by the RedwoodJS app bootstrap package 'Create Redwood App'**, which is located at [`redwood/packages/create-redwood-app/`](https://github.com/redwoodjs/redwood/tree/main/packages/create-redwood-app). If you're looking to do things like contributing to RedwoodJS development or reference Redwood's full-stack building blocks, then you're in the right place!๐ŸŒฒ๐ŸŽ‰ + +## Releases +To ensure `yarn.lock` is in sync with latest @redwoodjs packages, follow these steps: +1. confirm your local branch is up to date with `main`, then run `git clean -fxd` +2. update root, web/, and api/ `package.json` to latest @redwoodjs package version +3. run `yarn` +4. Commit all changes including `yarn.lock` +5. Create new release + +## Development: Getting Started +Before you begin, please read the RedwoodJS [Contributor Covenant Code of Conduct](https://github.com/redwoodjs/redwood/blob/main/CODE_OF_CONDUCT.md) + +Most likely, you'll need to set up a development environment linked to packages from a local clone of [`redwoodjs/redwood/packages`](https://github.com/redwoodjs/redwood/tree/main/packages). This doc will help get you started: +[Contributing to RedwoodJS](https://github.com/redwoodjs/redwood/blob/main/CONTRIBUTING.md) diff --git a/packages/create-redwood-app/vendor/README_APP.md b/packages/create-redwood-app/vendor/README_APP.md new file mode 100644 index 000000000000..69cbc0686851 --- /dev/null +++ b/packages/create-redwood-app/vendor/README_APP.md @@ -0,0 +1,24 @@ +# Redwood + +> **WARNING:** RedwoodJS software has not reached a stable version 1.0 and should not be considered suitable for production use. In the "make it work; make it right; make it fast" paradigm, Redwood is in the later stages of the "make it work" phase. + +## Getting Started +- [Tutorial](https://redwoodjs.com/tutorial/welcome-to-redwood): getting started and complete overview guide. +- [Docs](https://redwoodjs.com/docs/introduction): using the Redwood Router, handling assets and files, list of command-line tools, and more. +- [Redwood Community](https://community.redwoodjs.com): get help, share tips and tricks, and collaborate on everything about RedwoodJS. + +### Setup + +We use Yarn as our package manager. To get the dependencies installed, just do this in the root directory: + +```terminal +yarn install +``` + +### Fire it up + +```terminal +yarn redwood dev +``` + +Your browser should open automatically to `http://localhost:8910` to see the web app. Lambda functions run on `http://localhost:8911` and are also proxied to `http://localhost:8910/.redwood/functions/*`. diff --git a/packages/create-redwood-app/vendor/api/.babelrc.js b/packages/create-redwood-app/vendor/api/.babelrc.js new file mode 100644 index 000000000000..562431e7d380 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/.babelrc.js @@ -0,0 +1 @@ +module.exports = { extends: "../babel.config.js" } diff --git a/packages/create-redwood-app/vendor/api/db/schema.prisma b/packages/create-redwood-app/vendor/api/db/schema.prisma new file mode 100644 index 000000000000..d2cf1e8fdc96 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/db/schema.prisma @@ -0,0 +1,20 @@ +datasource DS { + // optionally set multiple providers + // example: provider = ["sqlite", "postgresql"] + provider = "sqlite" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = "native" +} + +// Define your own datamodels here and run `yarn redwood db save` to create +// migrations for them. +// TODO: Please remove the following example: +model UserExample { + id Int @id @default(autoincrement()) + email String @unique + name String? +} diff --git a/packages/create-redwood-app/vendor/api/db/seeds.js b/packages/create-redwood-app/vendor/api/db/seeds.js new file mode 100644 index 000000000000..1dddcf83d04e --- /dev/null +++ b/packages/create-redwood-app/vendor/api/db/seeds.js @@ -0,0 +1,26 @@ +/* eslint-disable no-console */ +const { PrismaClient } = require('@prisma/client') +const dotenv = require('dotenv') + +dotenv.config() +const db = new PrismaClient() + +async function main() { + // Seed data is database data that needs to exist for your app to run. + // Ideally this file should be idempotent: running it multiple times + // will result in the same database state (usually by checking for the + // existence of a record before trying to create it). For example: + // + // const existing = await db.user.findMany({ where: { email: 'admin@email.com' }}) + // if (!existing.length) { + // await db.user.create({ data: { name: 'Admin', email: 'admin@email.com' }}) + // } + + console.info('No data to seed. See api/db/seeds.js for info.') +} + +main() + .catch((e) => console.error(e)) + .finally(async () => { + await db.$disconnect() + }) diff --git a/packages/create-redwood-app/vendor/api/jest.config.js b/packages/create-redwood-app/vendor/api/jest.config.js new file mode 100644 index 000000000000..09205b869121 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/jest.config.js @@ -0,0 +1,6 @@ +const { getConfig } = require('@redwoodjs/core') + +const config = getConfig({ type: 'jest', target: 'node' }) +config.displayName.name = 'api' + +module.exports = config diff --git a/packages/create-redwood-app/vendor/api/jsconfig.json b/packages/create-redwood-app/vendor/api/jsconfig.json new file mode 100644 index 000000000000..a41e54d10425 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "src/*": ["./src/*"] + } + }, + "include": ["src/**/*", "../.redwood/index.d.ts"] +} diff --git a/packages/create-redwood-app/vendor/api/package.json b/packages/create-redwood-app/vendor/api/package.json new file mode 100644 index 000000000000..a921241f2705 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/package.json @@ -0,0 +1,8 @@ +{ + "name": "api", + "version": "0.0.0", + "private": true, + "dependencies": { + "@redwoodjs/api": "^0.22.1" + } +} diff --git a/packages/create-redwood-app/vendor/api/src/functions/graphql.js b/packages/create-redwood-app/vendor/api/src/functions/graphql.js new file mode 100644 index 000000000000..2d3f47b6c399 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/src/functions/graphql.js @@ -0,0 +1,20 @@ +import { + createGraphQLHandler, + makeMergedSchema, + makeServices, +} from '@redwoodjs/api' + +import schemas from 'src/graphql/**/*.{js,ts}' +import services from 'src/services/**/*.{js,ts}' +import { db } from 'src/lib/db' + +export const handler = createGraphQLHandler({ + schema: makeMergedSchema({ + schemas, + services: makeServices({ services }), + }), + onException: () => { + // Disconnect from your database with an unhandled exception. + db.$disconnect() + }, +}) diff --git a/packages/create-redwood-app/vendor/api/src/graphql/.keep b/packages/create-redwood-app/vendor/api/src/graphql/.keep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/create-redwood-app/vendor/api/src/lib/db.js b/packages/create-redwood-app/vendor/api/src/lib/db.js new file mode 100644 index 000000000000..465626a85be0 --- /dev/null +++ b/packages/create-redwood-app/vendor/api/src/lib/db.js @@ -0,0 +1,6 @@ +// See https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client/constructor +// for options. + +import { PrismaClient } from '@prisma/client' + +export const db = new PrismaClient() diff --git a/packages/create-redwood-app/vendor/api/src/services/.keep b/packages/create-redwood-app/vendor/api/src/services/.keep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/create-redwood-app/vendor/babel.config.js b/packages/create-redwood-app/vendor/babel.config.js new file mode 100644 index 000000000000..0bb758f7df49 --- /dev/null +++ b/packages/create-redwood-app/vendor/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['@redwoodjs/core/config/babel-preset'], +} diff --git a/packages/create-redwood-app/vendor/graphql.config.js b/packages/create-redwood-app/vendor/graphql.config.js new file mode 100644 index 000000000000..802b5d1519ae --- /dev/null +++ b/packages/create-redwood-app/vendor/graphql.config.js @@ -0,0 +1,7 @@ +const { getConfig } = require('@redwoodjs/internal') + +const config = getConfig() + +module.exports = { + schema: `http://${config.api.host}:${config.api.port}/graphql`, +} diff --git a/packages/create-redwood-app/vendor/package.json b/packages/create-redwood-app/vendor/package.json new file mode 100644 index 000000000000..a93b403ce449 --- /dev/null +++ b/packages/create-redwood-app/vendor/package.json @@ -0,0 +1,19 @@ +{ + "private": true, + "workspaces": { + "packages": [ + "api", + "web" + ] + }, + "devDependencies": { + "@redwoodjs/core": "^0.22.1" + }, + "eslintConfig": { + "extends": "@redwoodjs/eslint-config" + }, + "engines": { + "node": ">=12", + "yarn": ">=1.15" + } +} diff --git a/packages/create-redwood-app/vendor/prettier.config.js b/packages/create-redwood-app/vendor/prettier.config.js new file mode 100644 index 000000000000..5187cd4fdc96 --- /dev/null +++ b/packages/create-redwood-app/vendor/prettier.config.js @@ -0,0 +1,17 @@ +// https://prettier.io/docs/en/options.html +module.exports = { + trailingComma: 'es5', + bracketSpacing: true, + tabWidth: 2, + semi: false, + singleQuote: true, + arrowParens: 'always', + overrides: [ + { + files: 'Routes.js', + options: { + printWidth: 200, + }, + }, + ], +} diff --git a/packages/create-redwood-app/vendor/redwood.toml b/packages/create-redwood-app/vendor/redwood.toml new file mode 100644 index 000000000000..568e730dc050 --- /dev/null +++ b/packages/create-redwood-app/vendor/redwood.toml @@ -0,0 +1,15 @@ +# This file contains the configuration settings for your Redwood app. +# This file is also what makes your Redwood app a Redwood app. +# If you remove it and try to run `yarn rw dev`, you'll get an error. +# +# For the full list of options, see the "App Configuration: redwood.toml" doc: +# https://redwoodjs.com/docs/app-configuration-redwood-toml + +[web] + port = 8910 + apiProxyPath = "/.redwood/functions" +[api] + port = 8911 + schemaPath = "./api/db/schema.prisma" +[browser] + open = true diff --git a/packages/create-redwood-app/vendor/web/.babelrc.js b/packages/create-redwood-app/vendor/web/.babelrc.js new file mode 100644 index 000000000000..562431e7d380 --- /dev/null +++ b/packages/create-redwood-app/vendor/web/.babelrc.js @@ -0,0 +1 @@ +module.exports = { extends: "../babel.config.js" } diff --git a/packages/create-redwood-app/vendor/web/jest.config.js b/packages/create-redwood-app/vendor/web/jest.config.js new file mode 100644 index 000000000000..29595385d5f6 --- /dev/null +++ b/packages/create-redwood-app/vendor/web/jest.config.js @@ -0,0 +1,6 @@ +const { getConfig } = require('@redwoodjs/core') + +const config = getConfig({ type: 'jest', target: 'browser' }) +config.displayName.name = 'web' + +module.exports = config diff --git a/packages/create-redwood-app/vendor/web/jsconfig.json b/packages/create-redwood-app/vendor/web/jsconfig.json new file mode 100644 index 000000000000..9da84044905a --- /dev/null +++ b/packages/create-redwood-app/vendor/web/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "src/*": ["./src/*"] + }, + "jsx": "preserve" + }, + "include": ["src/**/*", "../.redwood/index.d.ts"] +} diff --git a/packages/create-redwood-app/vendor/web/package.json b/packages/create-redwood-app/vendor/web/package.json new file mode 100644 index 000000000000..24ffc3b20e5a --- /dev/null +++ b/packages/create-redwood-app/vendor/web/package.json @@ -0,0 +1,23 @@ +{ + "name": "web", + "version": "0.0.0", + "private": true, + "browserslist": { + "development": [ + "last 1 version" + ], + "production": [ + "defaults", + "not IE 11", + "not IE_Mob 11" + ] + }, + "dependencies": { + "@redwoodjs/forms": "^0.22.1", + "@redwoodjs/router": "^0.22.1", + "@redwoodjs/web": "^0.22.1", + "prop-types": "^15.7.2", + "react": "^17.0.1", + "react-dom": "^17.0.1" + } +} diff --git a/packages/create-redwood-app/vendor/web/public/README.md b/packages/create-redwood-app/vendor/web/public/README.md new file mode 100644 index 000000000000..6df2fa250b09 --- /dev/null +++ b/packages/create-redwood-app/vendor/web/public/README.md @@ -0,0 +1,36 @@ +# Static Assets +Use this folder to add static files directly to your app. All included files and folders will be copied directly into the `/dist` folder (created when Webpack builds for production). They will also be available during development when you run `yarn rw dev`. +>Note: files will *not* hot reload while the development server is running. You'll need to manually stop/start to access file changes. + +### Example Use +A file like `favicon.png` will be copied to `/dist/favicon.png`. A folder containing a file such as `static-files/my-logo.jpg` will be copied to `/dist/static-files/my-logo.jpg`. These can be referenced in your code directly without any special handling, e.g. +``` + +``` +and +``` + alt="Logo" /> +``` + +Behind the scenes, we are using Webpack's ["copy-webpack-plugin"](https://github.com/webpack-contrib/copy-webpack-plugin). + +## Best Practices +Because assets in this folder are bypassing the javascript module system, **this folder should be used sparingly** for assets such as favicons, robots.txt, manifests, libraries incompatible with Webpack, etc. + +In general, it's best to import files directly into a template, page, or component. This allows Webpack to include that file in the bundle, which ensures Webpack will correctly process and move assets into the distribution folder, providing error checks and correct paths along the way. + +### Example Asset Import with Webpack +Instead of handling our logo image as a static file per the example above, we can do the following: +``` +import React from "react" +import logo from "./my-logo.jpg" + + +function Header() { + return Logo +} + +export default Header +``` + +Behind the scenes, we are using Webpack's ["file-loader"](https://webpack.js.org/loaders/file-loader/) and ["url-loader](https://webpack.js.org/loaders/url-loader/) (for files smaller than 10kb). diff --git a/packages/create-redwood-app/vendor/web/public/favicon.png b/packages/create-redwood-app/vendor/web/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cdd00c8655692cdd610e596b26d7ddb3708ddd GIT binary patch literal 1877 zcmV-b2demqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$_zez+vR9Fd}R(nuXRTw|#?A--Q zz-&mTl*wHX3m-W+iYDxC>FlnrnR0L{1Cc4Um)7K?$!UhN(H{QeI5}ob8a9oI^#=&c zhRyB*0a@dt#AI18F~WRDA_9Bw>37h3y}K+AJ2SiIobP?U^ZUMgDES}5TWFI={ki9% zx{eakO$hzK>TWtnDdl%-4*J6%!ZAJ4n#&csiEwVwYr^>{c;9Tx%soI03l%+Yu=TJ4 z_+@2=v9tA`JkFI(a58=fgQuy1Y|fsMw|_W+3>g5=$uamkj{Zal<>cB##p6wRxJK zh@?mEStOy~K0Tcy%8q{Yp$L?>4J9J@g9cFLN=d3~@WfbW<<2FHt|ycNa6^txNW5gL zXvuAIrNq>`QW6H!7%%{z)BLQ$m9sq^7aFVUi|lrH^EM-=835bS0S!|6qlvMpc2CQ$ zDyR9$Hib9cRFtzmm&G-ZPQL)eo%@}Zk2xn_;}^#XAE$6q>33Lm#F`S%@XT>D31#o% zjzgMJWCnq4Km}ySNQv!2R_F*_fOaG*=8(^k^0p?gTZDnIHYa^lPe<2&D9zK!XiG{- zfK#^I?he*_=bNWfg?s_#O>UqC_Oj-aURO#cRd^8`r)o;!i*HFnT)w@y;krr=3&86z z*Ml)rWk#JTkr`)et)Ac~dcN0Xew}c#4L^gP9=XOLz6U-WDn0B9kjCFs#(*;%D3tfl z5T^@=axQFA&Q9rVhXr8G%w2^bcIX8n*Eqq>QAzhM6Ic2ZGx|5!0)oWiPCHLEwI?F?v@Y1S`MW53LzNyipR!J zww47B`<#|FA<}zHbuRd*mMl3WpMZ^(){0;WF-eo4bFfbrAZ5(3R5)wJ8on~wWkDFuC*0fyl8xXsftO$z{#Jw{~tm}ZiaMteoeM0GDZqM|4P z1UOQq4K^c)3$cu*X1aq~3m4f%rpBmx%w#lMOB>JhT>+K(Qz}D5M~Rdx_5xgDmPRC@ zZs{el9_F~vHFN9@A*&!)SMKw93j>sogyU=I_pezKGNzA6jz8{mST^|U z_g(WkEqhJ(^@JFsvvIFKs|E&|AyZ?J?#U*95D9qs#$Q)-+3zr~%^ESS=7IRQDU6Y~ zpxeoTN?`+j1&BC3wRDm(y||&r>zFW?lF$yMTe|`XRZ20&CGm+d%GC><#lS(--VXeH z$H$CYCSAN7C(E5BNckLLUkn8HE8)_sHcz0sAt&7=dmCJHGpEYhV9PJf!{eXj==p#Ao>bWFYzEPuhF66ME!bzwKK8j4&yZa6< z=(nx_i)$CJTak$zL5w!Qn?~iXTItAnv#p|e1!Z)LDu)KN3GMZjsv|||N;j#4?4v3# zat1HAO<{fgL-4c!9;ECC?Ej8b(C?9n@gcdlR(yzT?&eKsOgWUX#WqiHi`QwMqsXKh zM}0`I({D}5S!=@7T9vK^km?S0Q$}{GjDcrF5<8cc~|J=j3D zw$tKbS(VWO5CkqsJ8_p?Dl>8hubol)J~2uH$zg-D*fqG8kARPhVGP{{ybj4^_*_T2 za|MEEFAZGcgcj)qfEMv4tYnld;hD+F){5qL7@_fKEL-sTK96#3L&tlM8E+bKEgO^K zW5*)U=Ky=Z-i}xUh@YWD{;Q{JXjF;fL(@w_C&1`HUiTOY-Tk;b*xdIzzJ7EO9wDn> z$^krt>*AdNLOJ8))2vx}Zt*1dFGzg^9ds4tJP)N5Cz(jvoYIz7)t8vVjojwcFP=0y zK89aaYgK$ih@$Ko5@5IWVYHP=mTioLO+-1ChXQT4MYKuMR=P!I$;q&4 zz%y$y%4cwN>-3SGWD??OAoT?>ySPr^s-JVA5;X&Y5joJ3^C7$)feiZ0hRhW_T36dD zg2j HomePage +// 'src/pages/Admin/BooksPage/BooksPage.js' -> AdminBooksPage + +import { Router, Route } from '@redwoodjs/router' + +const Routes = () => { + return ( + + + + ) +} + +export default Routes diff --git a/packages/create-redwood-app/vendor/web/src/components/.keep b/packages/create-redwood-app/vendor/web/src/components/.keep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/create-redwood-app/vendor/web/src/index.css b/packages/create-redwood-app/vendor/web/src/index.css new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/create-redwood-app/vendor/web/src/index.html b/packages/create-redwood-app/vendor/web/src/index.html new file mode 100644 index 000000000000..8f69230b3384 --- /dev/null +++ b/packages/create-redwood-app/vendor/web/src/index.html @@ -0,0 +1,12 @@ + + + + + + + <%= htmlWebpackPlugin.options.title %> + + +
+ + diff --git a/packages/create-redwood-app/vendor/web/src/index.js b/packages/create-redwood-app/vendor/web/src/index.js new file mode 100644 index 000000000000..63dd948e3b7f --- /dev/null +++ b/packages/create-redwood-app/vendor/web/src/index.js @@ -0,0 +1,16 @@ +import ReactDOM from 'react-dom' +import { RedwoodProvider, FatalErrorBoundary } from '@redwoodjs/web' +import FatalErrorPage from 'src/pages/FatalErrorPage' + +import Routes from 'src/Routes' + +import './index.css' + +ReactDOM.render( + + + + + , + document.getElementById('redwood-app') +) diff --git a/packages/create-redwood-app/vendor/web/src/layouts/.keep b/packages/create-redwood-app/vendor/web/src/layouts/.keep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/create-redwood-app/vendor/web/src/pages/FatalErrorPage/FatalErrorPage.js b/packages/create-redwood-app/vendor/web/src/pages/FatalErrorPage/FatalErrorPage.js new file mode 100644 index 000000000000..b21e3ccbdd82 --- /dev/null +++ b/packages/create-redwood-app/vendor/web/src/pages/FatalErrorPage/FatalErrorPage.js @@ -0,0 +1,53 @@ +// This page will be rendered when an error makes it all the way to the top of the +// application without being handled by a Javascript catch statement or React error +// boundary. +// +// You can modify this page as you wish, but it is important to keep things simple to +// avoid the possibility that it will cause its own error. If it does, Redwood will +// still render a generic error page, but your users will prefer something a bit more +// thoughtful. =) + +export default () => ( +
+