Skip to content

Commit

Permalink
Updates types
Browse files Browse the repository at this point in the history
  • Loading branch information
infomiho committed Aug 17, 2023
1 parent 472f3b2 commit df44a08
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ export const LoginSignupForm = ({
isLogin,
onError: onErrorHandler,
showEmailVerificationPending() {
hookForm.reset()
setSuccessMessage(`You've signed up successfully! Check your email for the confirmation link.`)
},
onLoginSuccess() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AdditionalSignupFieldsConfig as AdditionalSignupFieldsConfigGeneric } from '../types'
import { createDefineAdditionalSignupFieldsFn } from '../types.js'

export type GetVerificationEmailContentFn = (params: { verificationLink: string }) => EmailContent;

Expand All @@ -14,4 +14,4 @@ export const tokenVerificationErrors = {
TokenExpiredError: 'TokenExpiredError',
};

export type AdditionalSignupFieldsConfig = AdditionalSignupFieldsConfigGeneric<"email" | "password">
export const defineAdditionalSignupFields = createDefineAdditionalSignupFieldsFn<"email" | "password">()
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { AdditionalSignupFieldsConfig as AdditionalSignupFieldsConfigGeneric } from '../types'
import { createDefineAdditionalSignupFieldsFn } from '../types.js'

export type AdditionalSignupFieldsConfig = AdditionalSignupFieldsConfigGeneric<"username" | "password">
export const defineAdditionalSignupFields = createDefineAdditionalSignupFieldsFn<"username" | "password">()
28 changes: 12 additions & 16 deletions waspc/data/Generator/templates/server/src/auth/providers/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,17 @@ export type InitData = {

export type RequestWithWasp = Request & { wasp?: { [key: string]: any } }

export type AdditionalSignupFieldsConfig<
ExistingUserFields extends keyof User,
> = Expand<
Omit<
Partial<{ [key in keyof User]: AdditionalFieldDefinition }>,
ExistingUserFields
>
>

type AdditionalFieldDefinition = {
get: (data: PossibleUserFields) => unknown;
// Expected to throw an error if validation fails
validate: (value: unknown) => void;
export function createDefineAdditionalSignupFieldsFn<AlreadyIncludedUserFields extends keyof User>() {
return function defineFields(config: {
[key in keyof Partial<Omit<User, AlreadyIncludedUserFields>>]: FieldDefinition<Partial<Omit<User, AlreadyIncludedUserFields>>[key]>
}) {
return config
}
}

type PossibleUserFields = Partial<{
[key in keyof User]: unknown
}>
type FieldDefinition<T> = {
get: (data: Partial<{
[key in keyof User]: unknown
}>) => T | undefined;
validate: (value: T | undefined) => void;
}
6 changes: 2 additions & 4 deletions waspc/data/Generator/templates/server/src/auth/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import { isValidEmail } from '../core/auth/validators.js'
import { emailSender } from '../email/index.js';
import { Email } from '../email/core/types.js';
{=/ isEmailAuthEnabled =}
import { AdditionalSignupFieldsConfig } from './providers/types.js'
{=# additionalSignupFieldsFn.isDefined =}
{=& additionalSignupFieldsFn.importStatement =}
{=/ additionalSignupFieldsFn.isDefined =}
Expand All @@ -22,7 +21,7 @@ import { AdditionalSignupFieldsConfig } from './providers/types.js'
const _waspAdditionalSignupFieldsConfig = {= additionalSignupFieldsFn.importIdentifier =}
{=/ additionalSignupFieldsFn.isDefined =}
{=^ additionalSignupFieldsFn.isDefined =}
const _waspAdditionalSignupFieldsConfig = (): AdditionalSignupFieldsConfig<never> => ({})
const _waspAdditionalSignupFieldsConfig = {}
{=/ additionalSignupFieldsFn.isDefined =}

type {= userEntityUpper =}Id = {= userEntityUpper =}['id']
Expand Down Expand Up @@ -234,9 +233,8 @@ function throwValidationError(message: string): void {


export function validateAndGetAdditionalFields(data: unknown) {
const additionalFieldsDefinition = _waspAdditionalSignupFieldsConfig()
const result: Record<string, any> = {};
for (const [field, options] of Object.entries(additionalFieldsDefinition)) {
for (const [field, options] of Object.entries(_waspAdditionalSignupFieldsConfig)) {
const value = options.get(data)
validate(options, value)
result[field] = value
Expand Down
4 changes: 2 additions & 2 deletions waspc/data/Generator/templates/server/src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ export type { GetUserFieldsFn } from '../auth/providers/oauth/types';
{=/ isExternalAuthEnabled =}

{=# isEmailAuthEnabled =}
export type { GetVerificationEmailContentFn, GetPasswordResetEmailContentFn, AdditionalSignupFieldsConfig } from '../auth/providers/email/types';
export { type GetVerificationEmailContentFn, type GetPasswordResetEmailContentFn, defineAdditionalSignupFields } from '../auth/providers/email/types.js';
{=/ isEmailAuthEnabled =}

{=# isLocalAuthEnabled =}
export type { AdditionalSignupFieldsConfig } from '../auth/providers/local/types';
export { defineAdditionalSignupFields } from '../auth/providers/local/types.js';
{=/ isLocalAuthEnabled =}
2 changes: 1 addition & 1 deletion waspc/examples/crud-testing/main.wasp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ app crudTesting {
},
onAuthFailedRedirectTo: "/login",
signupCustomization: {
additionalFieldsFn: import { getAdditionalFields } from "@server/auth.js",
additionalFieldsFn: import { fields } from "@server/auth.js",
},
},
}
Expand Down
34 changes: 16 additions & 18 deletions waspc/examples/crud-testing/src/server/auth.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
import { AdditionalSignupFieldsConfig } from "@wasp/types";
import { defineAdditionalSignupFields } from "@wasp/types/index.js";

export function getAdditionalFields() {
return {
address: {
get: (data): string => {
return ensureString(data.address, "Address is required");
},
validate: (value) => {
const address = ensureString(value, "Address is required");
if (!address) {
throw new Error("Address is required");
}
if (address.length < 5) {
throw new Error("Address must be at least 5 characters long");
}
},
export const fields = defineAdditionalSignupFields({
address: {
get: (data) => {
return ensureString(data.address, "Address is required");
},
} satisfies AdditionalSignupFieldsConfig;
}
validate: (value) => {
const address = ensureString(value, "Address is required");
if (!address) {
throw new Error("Address is required");
}
if (address.length < 5) {
throw new Error("Address must be at least 5 characters long");
}
},
},
});

function ensureString(value: unknown, message: string): string {
if (typeof value !== "string") {
Expand Down
22 changes: 11 additions & 11 deletions waspc/examples/todoApp/src/server/auth/signup.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
export function getAdditionalFields() {
return {
address: {
get: (value) => value,
validate: (value) => {
if (!value || value.length < 5) {
throw new Error('Address is required')
}
},
import { defineAdditionalSignupFields } from '@wasp/types/index.js'

export const fields = defineAdditionalSignupFields({
address: {
get: (data) => data.address,
validate: (value) => {
if (!value || value.length < 5) {
throw new Error('Address is required')
}
},
}
}
},
})
2 changes: 1 addition & 1 deletion waspc/examples/todoApp/todoApp.wasp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ app todoApp {
},
},
signupCustomization: {
additionalFieldsFn: import { getAdditionalFields } from "@server/auth/signup.js",
additionalFieldsFn: import { fields } from "@server/auth/signup.js",
},
onAuthFailedRedirectTo: "/login",
onAuthSucceededRedirectTo: "/profile"
Expand Down

0 comments on commit df44a08

Please sign in to comment.