diff --git a/waspc/ChangeLog.md b/waspc/ChangeLog.md index 6fc461166..b441199b3 100644 --- a/waspc/ChangeLog.md +++ b/waspc/ChangeLog.md @@ -1,6 +1,10 @@ # Changelog -## 0.12.4 (2024-03-12) +## 0.13.0 (2024-03-18) + +### 🎉 New features + +- Wasp now supports defining the `WASP_SERVER_URL` environment variable and exposes it as `serverUrl` in the server config which can be imported from `wasp/server`. ### 🐞 Bug fixes @@ -173,13 +177,13 @@ By adding a `vite.config.ts` or `vite.config.js` to your `client` directory, you not to open the browser automatically: ```ts -import { defineConfig } from 'vite' +import { defineConfig } from "vite"; export default defineConfig({ server: { open: false, }, -}) +}); ``` ⚠️ Be careful when changing the dev server port, you'll need to update the `WASP_WEB_CLIENT_URL` env var in your `.env.server` file. @@ -221,27 +225,27 @@ app crudTesting { Then, you need to define the `fields` object in your `auth.js` file: ```js -import { defineAdditionalSignupFields } from '@wasp/auth/index.js' +import { defineAdditionalSignupFields } from "@wasp/auth/index.js"; export const fields = defineAdditionalSignupFields({ address: (data) => { // Validate the address field - if (typeof data.address !== 'string') { - throw new Error('Address is required.') + if (typeof data.address !== "string") { + throw new Error("Address is required."); } if (data.address.length < 10) { - throw new Error('Address must be at least 10 characters long.') + throw new Error("Address must be at least 10 characters long."); } // Return the address field - return data.address + return data.address; }, -}) +}); ``` Finally, you can extend the `SignupForm` component on the client: ```jsx -import { SignupForm } from '@wasp/auth/forms/Signup' +import { SignupForm } from "@wasp/auth/forms/Signup"; export const SignupPage = () => { return ( @@ -251,19 +255,19 @@ export const SignupPage = () => { - ) -} + ); +}; ``` ### 🎉 [New Feature] Support for PostgreSQL Extensions @@ -305,8 +309,8 @@ job simplePrintJob { ``` ```typescript -import { SimplePrintJob } from '@wasp/jobs/simplePrintJob' -import { Task } from '@wasp/entities' +import { SimplePrintJob } from "@wasp/jobs/simplePrintJob"; +import { Task } from "@wasp/entities"; export const simplePrint: SimplePrintJob< { name: string }, @@ -314,11 +318,11 @@ export const simplePrint: SimplePrintJob< > = async (args, context) => { // 👆 args are typed e.g. { name: string } // 👆 context is typed e.g. { entitites: { Task: ... } } - const tasks = await context.entities.Task.findMany({}) + const tasks = await context.entities.Task.findMany({}); return { tasks, - } -} + }; +}; ``` When you use the job, you can pass the arguments and receive the result with the correct types: @@ -373,9 +377,9 @@ export const TaskList = () => { You can also get all the pages in your app with the `routes` object: ```jsx -import { routes } from '@wasp/router' +import { routes } from "@wasp/router"; -const linkToTask = routes.TaskRoute({ params: { id: 1 } }) +const linkToTask = routes.TaskRoute({ params: { id: 1 } }); ``` ### 🐞 Bug fixes @@ -499,67 +503,67 @@ app todoApp { Then implement it on the server with optional types: ```typescript -import type { WebSocketDefinition } from '@wasp/webSocket' +import type { WebSocketDefinition } from "@wasp/webSocket"; export const webSocketFn: WebSocketFn = (io, context) => { - io.on('connection', (socket) => { + io.on("connection", (socket) => { // ... - }) -} + }); +}; type WebSocketFn = WebSocketDefinition< ClientToServerEvents, ServerToClientEvents -> +>; interface ServerToClientEvents { - chatMessage: (msg: { id: string; username: string; text: string }) => void + chatMessage: (msg: { id: string; username: string; text: string }) => void; } interface ClientToServerEvents { - chatMessage: (msg: string) => void + chatMessage: (msg: string) => void; } ``` And use it on the client with automatic type inference: ```typescript -import React, { useState } from 'react' +import React, { useState } from "react"; import { useSocket, useSocketListener, ServerToClientPayload, -} from '@wasp/webSocket' +} from "@wasp/webSocket"; export const ChatPage = () => { const [messageText, setMessageText] = useState< // We are using a helper type to get the payload type for the "chatMessage" event. - ClientToServerPayload<'chatMessage'> - >('') + ClientToServerPayload<"chatMessage"> + >(""); const [messages, setMessages] = useState< - ServerToClientPayload<'chatMessage'>[] - >([]) + ServerToClientPayload<"chatMessage">[] + >([]); // The "socket" instance is typed with the types you defined on the server. - const { socket, isConnected } = useSocket() + const { socket, isConnected } = useSocket(); // This is a type-safe event handler: "chatMessage" event and its payload type // are defined on the server. - useSocketListener('chatMessage', logMessage) + useSocketListener("chatMessage", logMessage); - function logMessage(msg: ServerToClientPayload<'chatMessage'>) { - setMessages((priorMessages) => [msg, ...priorMessages]) + function logMessage(msg: ServerToClientPayload<"chatMessage">) { + setMessages((priorMessages) => [msg, ...priorMessages]); } function handleSubmit(e: React.FormEvent) { - e.preventDefault() + e.preventDefault(); // This is a type-safe event emitter: "chatMessage" event and its payload type // are defined on the server. - socket.emit('chatMessage', messageText) + socket.emit("chatMessage", messageText); // ... } // ... -} +}; ``` ### 🎉 [New feature] Automatic CRUD backend generation @@ -588,21 +592,21 @@ crud Tasks { This gives us the following operations: `getAll`, `get`, `create`, `update` and `delete`, which we can use in our client like this: ```typescript -import { Tasks } from '@wasp/crud/Tasks' -import { useState } from 'react' +import { Tasks } from "@wasp/crud/Tasks"; +import { useState } from "react"; export const MainPage = () => { - const { data: tasks, isLoading, error } = Tasks.getAll.useQuery() - const createTask = Tasks.create.useAction() + const { data: tasks, isLoading, error } = Tasks.getAll.useQuery(); + const createTask = Tasks.create.useAction(); // ... function handleCreateTask() { - createTask({ description: taskDescription, isDone: false }) - setTaskDescription('') + createTask({ description: taskDescription, isDone: false }); + setTaskDescription(""); } // ... -} +}; ``` ### 🎉 [New feature] IDE tooling improvements @@ -723,20 +727,20 @@ Frontend code can now infer correct payload/response types for Queries and Actio Define a Query on the server: ```typescript -export const getTask: GetTaskInfo, Task> = async ( +export const getTask: GetTaskInfo, Task> = async ( { id }, context ) => { // ... -} +}; ``` Get properly typed functions and data on the frontend: ```typescript -import { useQuery } from '@wasp/queries' +import { useQuery } from "@wasp/queries"; // Wasp knows the type of `getTask` thanks to your backend definition. -import getTask from '@wasp/queries/getTask' +import getTask from "@wasp/queries/getTask"; export const TaskInfo = () => { const { @@ -749,10 +753,12 @@ export const TaskInfo = () => { error, // TypeScript knows the second argument must be a `Pick` thanks // to the backend definition. - } = useQuery(getTask, { id: 1 }) + } = useQuery(getTask, { id: 1 }); if (isError) { - return
Error during fetching tasks: {error.message || 'unknown'}
+ return ( +
Error during fetching tasks: {error.message || "unknown"}
+ ); } // TypeScript forces you to perform this check. @@ -760,8 +766,8 @@ export const TaskInfo = () => {
Waiting for info...
) : (
{taskInfo}
- ) -} + ); +}; ``` The same feature is available for Actions. @@ -773,25 +779,25 @@ Client and the server can now communicate with richer payloads. Return a Superjson-compatible object from your Operation: ```typescript -type FooInfo = { foos: Foo[]; message: string; queriedAt: Date } +type FooInfo = { foos: Foo[]; message: string; queriedAt: Date }; const getFoos: GetFoo = (_args, context) => { - const foos = context.entities.Foo.findMany() + const foos = context.entities.Foo.findMany(); return { foos, - message: 'Here are some foos!', + message: "Here are some foos!", queriedAt: new Date(), - } -} + }; +}; ``` And seamlessly use it on the frontend: ```typescript -import getfoos from '@wasp/queries/getTask' +import getfoos from "@wasp/queries/getTask"; -const { data } = useQuery(getfoos) -const { foos, message, queriedAt } = data +const { data } = useQuery(getfoos); +const { foos, message, queriedAt } = data; // foos: Foo[] // message: string // queriedAt: Date @@ -834,11 +840,11 @@ Wasp now provides a set of UI components for authentication. You can use them to We provide `LoginForm`, `SignupForm`, `ForgotPassworForm`, `ResetPasswordForm` and`VerifyEmailForm` components. You can import them from `@wasp/auth/forms` like: ```js -import { LoginForm } from '@wasp/auth/forms/Login' -import { SignupForm } from '@wasp/auth/forms/Signup' -import { ForgotPasswordForm } from '@wasp/auth/forms/ForgotPassword' -import { ResetPasswordForm } from '@wasp/auth/forms/ResetPassword' -import { VerifyEmailForm } from '@wasp/auth/forms/VerifyEmail' +import { LoginForm } from "@wasp/auth/forms/Login"; +import { SignupForm } from "@wasp/auth/forms/Signup"; +import { ForgotPasswordForm } from "@wasp/auth/forms/ForgotPassword"; +import { ResetPasswordForm } from "@wasp/auth/forms/ResetPassword"; +import { VerifyEmailForm } from "@wasp/auth/forms/VerifyEmail"; ``` ### Database seeding @@ -858,18 +864,18 @@ app MyApp { ``` ```js -import { createTask } from './actions.js' +import { createTask } from "./actions.js"; export const devSeedSimple = async (prismaClient) => { const { password, ...newUser } = await prismaClient.user.create({ - username: 'RiuTheDog', - password: 'bark1234', - }) + username: "RiuTheDog", + password: "bark1234", + }); await createTask( - { description: 'Chase the cat' }, + { description: "Chase the cat" }, { user: newUser, entities: { Task: prismaClient.task } } - ) -} + ); +}; //... ``` @@ -1011,17 +1017,17 @@ And here's how you can to the same in a frontend file: ```typescript // ... -import { useQuery } from '@wasp/queries' -import getTasks from '@wasp/queries/getTasks.js' -import { Task } from '@wasp/entities' +import { useQuery } from "@wasp/queries"; +import getTasks from "@wasp/queries/getTasks.js"; +import { Task } from "@wasp/entities"; -type TaskPayload = Pick +type TaskPayload = Pick; const Todo = (props: any) => { // The variable 'task' will now have the type Task. - const { data: task } = useQuery(getTask, { id: taskId }) + const { data: task } = useQuery(getTask, { id: taskId }); // ... -} +}; ``` ### Automatically generated types for Queries and Actions @@ -1041,10 +1047,10 @@ query getTasks { You'll get the following feature: ```typescript -import { Task } from '@wasp/entities' -import { GetTasks } from '@wasp/queries' +import { Task } from "@wasp/entities"; +import { GetTasks } from "@wasp/queries"; -type Payload = Pick +type Payload = Pick; // Use the type parameters to specify the Query's argument and return types. const getTasks: GetTasks = (args, context) => { @@ -1056,7 +1062,7 @@ const getTasks: GetTasks = (args, context) => { // // Thanks to the second type argument in `GetTasks`, the compiler knows the // function must return a value of type `Task[]`. -} +}; ``` ### Uninstall command diff --git a/waspc/data/Generator/templates/sdk/wasp/client/config.ts b/waspc/data/Generator/templates/sdk/wasp/client/config.ts index e9234e6f2..77367f7bf 100644 --- a/waspc/data/Generator/templates/sdk/wasp/client/config.ts +++ b/waspc/data/Generator/templates/sdk/wasp/client/config.ts @@ -1,9 +1,10 @@ +{{={= =}=}} import { stripTrailingSlash } from 'wasp/universal/url' -const apiUrl = stripTrailingSlash(import.meta.env.REACT_APP_API_URL) || 'http://localhost:3001'; +const apiUrl = stripTrailingSlash(import.meta.env.REACT_APP_API_URL) || '{= defaultServerUrl =}'; const config = { apiUrl, } -export default config +export default config \ No newline at end of file diff --git a/waspc/data/Generator/templates/sdk/wasp/server/config.ts b/waspc/data/Generator/templates/sdk/wasp/server/config.ts index fcdc0b666..a247438a6 100644 --- a/waspc/data/Generator/templates/sdk/wasp/server/config.ts +++ b/waspc/data/Generator/templates/sdk/wasp/server/config.ts @@ -28,6 +28,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -40,7 +41,7 @@ const config: { all: { env, isDevelopment: env === 'development', - port: parseInt(process.env.PORT) || 3001, + port: parseInt(process.env.PORT) || {= defaultServerPort =}, databaseUrl: process.env.{= databaseUrlEnvVarName =}, allowedCORSOrigins: [], {=# isAuthEnabled =} @@ -59,8 +60,10 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || '{= defaultClientUrl =}'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || '{= defaultServerUrl =}'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', {=# isAuthEnabled =} auth: { @@ -72,8 +75,10 @@ function getDevelopmentConfig(): EnvConfig { function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], {=# isAuthEnabled =} auth: { diff --git a/waspc/data/Generator/templates/server/scripts/validate-env.mjs b/waspc/data/Generator/templates/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/data/Generator/templates/server/scripts/validate-env.mjs +++ b/waspc/data/Generator/templates/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums index cccecec5f..e6a57ddfc 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/.waspchecksums @@ -242,7 +242,7 @@ "file", "../out/sdk/wasp/server/config.ts" ], - "4976e545d8fcf019508e95f472305e9ef27dfb3423c71e428a5414e35cdd52be" + "e5388a9259a22671ee2d2ef46d2c09fdd46c3b3ec24248c7a0b471c0fbf7aa54" ], [ [ @@ -424,7 +424,7 @@ "file", "server/scripts/validate-env.mjs" ], - "65168a764fc6cbe785ee40a8e8533b4694ef9019fc5a73f60f7252152330d0a2" + "100177b4326ccab7362eff378315d532ad1cc17cd28d1ed5978cb167fd627746" ], [ [ diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.d.ts index 223bb1b22..68bb448c5 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.d.ts @@ -9,6 +9,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js index 6de1c8d25..dabd38b4b 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js @@ -17,15 +17,19 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', }; } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], }; } diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js.map index 4b121ba37..f4ad188c9 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAwBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAyBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/server/config.ts index 07c90ee26..52699d800 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/sdk/wasp/server/config.ts @@ -22,6 +22,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -48,16 +49,20 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', } } function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], } } diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/scripts/validate-env.mjs b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/scripts/validate-env.mjs +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/build/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.d.ts index 223bb1b22..68bb448c5 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.d.ts @@ -9,6 +9,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js index 6de1c8d25..dabd38b4b 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js @@ -17,15 +17,19 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', }; } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], }; } diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js.map index 4b121ba37..f4ad188c9 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAwBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAyBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/server/config.ts index 07c90ee26..52699d800 100644 --- a/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspBuild-golden/waspBuild/.wasp/out/sdk/wasp/server/config.ts @@ -22,6 +22,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -48,16 +49,20 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', } } function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], } } diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums index 49b42b1ff..4332d9cec 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/.waspchecksums @@ -242,7 +242,7 @@ "file", "../out/sdk/wasp/server/config.ts" ], - "4976e545d8fcf019508e95f472305e9ef27dfb3423c71e428a5414e35cdd52be" + "e5388a9259a22671ee2d2ef46d2c09fdd46c3b3ec24248c7a0b471c0fbf7aa54" ], [ [ @@ -431,7 +431,7 @@ "file", "server/scripts/validate-env.mjs" ], - "65168a764fc6cbe785ee40a8e8533b4694ef9019fc5a73f60f7252152330d0a2" + "100177b4326ccab7362eff378315d532ad1cc17cd28d1ed5978cb167fd627746" ], [ [ diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.d.ts index 223bb1b22..68bb448c5 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.d.ts @@ -9,6 +9,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js index 6de1c8d25..dabd38b4b 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js @@ -17,15 +17,19 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', }; } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], }; } diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js.map index 4b121ba37..f4ad188c9 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAwBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAyBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/server/config.ts index 07c90ee26..52699d800 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/sdk/wasp/server/config.ts @@ -22,6 +22,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -48,16 +49,20 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', } } function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], } } diff --git a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/scripts/validate-env.mjs b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/scripts/validate-env.mjs +++ b/waspc/e2e-test/test-outputs/waspCompile-golden/waspCompile/.wasp/out/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/.waspchecksums index 882a3b118..52bcba631 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/.waspchecksums @@ -529,7 +529,7 @@ "file", "../out/sdk/wasp/server/config.ts" ], - "5d933eb55d44f4c3c42df7e8387dbd4b8b02f47191e59ee50d59c08a1f86634e" + "0cb590d15087323479f4a0e3622c464b6f172979e01a35c71521d31f6457a46f" ], [ [ @@ -823,7 +823,7 @@ "file", "server/scripts/validate-env.mjs" ], - "65168a764fc6cbe785ee40a8e8533b4694ef9019fc5a73f60f7252152330d0a2" + "100177b4326ccab7362eff378315d532ad1cc17cd28d1ed5978cb167fd627746" ], [ [ diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.d.ts index 623a32bd9..56da48e81 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.d.ts @@ -12,6 +12,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js index 1a38557c0..7fd7f5e7e 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js @@ -20,8 +20,10 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', auth: { jwtSecret: 'DEVJWTSECRET' @@ -30,8 +32,10 @@ function getDevelopmentConfig() { } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], auth: { jwtSecret: process.env.JWT_SECRET diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js.map index 9f40b26c5..d2f0e1bb1 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AA2BjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;QACtB,IAAI,EAAE;YACJ,SAAS,EAAE,SAAS;SACrB;KACF;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;QACvB,IAAI,EAAE;YACJ,SAAS,EAAE,cAAc;SAC1B;KACF,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;QACjC,IAAI,EAAE;YACJ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;SAClC;KACF,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AA4BjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;QACtB,IAAI,EAAE;YACJ,SAAS,EAAE,SAAS;SACrB;KACF;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;QACvB,IAAI,EAAE;YACJ,SAAS,EAAE,cAAc;SAC1B;KACF,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;QACjC,IAAI,EAAE;YACJ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;SAClC;KACF,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/server/config.ts index 5c22ee596..90bc82125 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/sdk/wasp/server/config.ts @@ -25,6 +25,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -54,8 +55,10 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', auth: { jwtSecret: 'DEVJWTSECRET' @@ -65,8 +68,10 @@ function getDevelopmentConfig(): EnvConfig { function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], auth: { jwtSecret: process.env.JWT_SECRET diff --git a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/server/scripts/validate-env.mjs b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/server/scripts/validate-env.mjs +++ b/waspc/e2e-test/test-outputs/waspComplexTest-golden/waspComplexTest/.wasp/out/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums index 351b1c914..12348ec0e 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/.waspchecksums @@ -249,7 +249,7 @@ "file", "../out/sdk/wasp/server/config.ts" ], - "4976e545d8fcf019508e95f472305e9ef27dfb3423c71e428a5414e35cdd52be" + "e5388a9259a22671ee2d2ef46d2c09fdd46c3b3ec24248c7a0b471c0fbf7aa54" ], [ [ @@ -487,7 +487,7 @@ "file", "server/scripts/validate-env.mjs" ], - "65168a764fc6cbe785ee40a8e8533b4694ef9019fc5a73f60f7252152330d0a2" + "100177b4326ccab7362eff378315d532ad1cc17cd28d1ed5978cb167fd627746" ], [ [ diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.d.ts index 223bb1b22..68bb448c5 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.d.ts @@ -9,6 +9,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js index 6de1c8d25..dabd38b4b 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js @@ -17,15 +17,19 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', }; } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], }; } diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js.map index 4b121ba37..f4ad188c9 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAwBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAyBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/server/config.ts index 07c90ee26..52699d800 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/sdk/wasp/server/config.ts @@ -22,6 +22,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -48,16 +49,20 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', } } function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], } } diff --git a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/scripts/validate-env.mjs b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/scripts/validate-env.mjs +++ b/waspc/e2e-test/test-outputs/waspJob-golden/waspJob/.wasp/out/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums index 7d035b56e..0eb61fa0c 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/.waspchecksums @@ -242,7 +242,7 @@ "file", "../out/sdk/wasp/server/config.ts" ], - "4976e545d8fcf019508e95f472305e9ef27dfb3423c71e428a5414e35cdd52be" + "e5388a9259a22671ee2d2ef46d2c09fdd46c3b3ec24248c7a0b471c0fbf7aa54" ], [ [ @@ -431,7 +431,7 @@ "file", "server/scripts/validate-env.mjs" ], - "65168a764fc6cbe785ee40a8e8533b4694ef9019fc5a73f60f7252152330d0a2" + "100177b4326ccab7362eff378315d532ad1cc17cd28d1ed5978cb167fd627746" ], [ [ diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/client/config.ts b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/client/config.ts index e9234e6f2..b87c9515d 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/client/config.ts +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/client/config.ts @@ -1,6 +1,7 @@ +{{={= =}=}} import { stripTrailingSlash } from 'wasp/universal/url' -const apiUrl = stripTrailingSlash(import.meta.env.REACT_APP_API_URL) || 'http://localhost:3001'; +const apiUrl = stripTrailingSlash(import.meta.env.REACT_APP_API_URL) || '{= defaultServerUrl =}'; const config = { apiUrl, diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.d.ts b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.d.ts index 223bb1b22..68bb448c5 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.d.ts +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.d.ts @@ -9,6 +9,7 @@ type CommonConfig = BaseConfig & { }; type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; }; type Config = CommonConfig & EnvConfig; declare const resolvedConfig: Config; diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js index 6de1c8d25..dabd38b4b 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js @@ -17,15 +17,19 @@ const resolvedConfig = merge(config.all, config[env]); export default resolvedConfig; function getDevelopmentConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', }; } function getProductionConfig() { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], }; } diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js.map b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js.map index 4b121ba37..f4ad188c9 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js.map +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/dist/server/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAwBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AAyBjD,MAAM,MAAM,GAIR;IACF,GAAG,EAAE;QACH,GAAG;QACH,aAAa,EAAE,GAAG,KAAK,aAAa;QACpC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,kBAAkB,EAAE,EAAE;KACvB;IACD,WAAW,EAAE,oBAAoB,EAAE;IACnC,UAAU,EAAE,mBAAmB,EAAE;CAClC,CAAA;AAED,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7D,aAAa;AACb,eAAe,cAAc,CAAA;AAE7B,SAAS,oBAAoB;IAC3B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;IAC7F,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,GAAG;KACxB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAW,CAAC;KAClC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/server/config.ts b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/server/config.ts index 07c90ee26..52699d800 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/server/config.ts +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/sdk/wasp/server/config.ts @@ -22,6 +22,7 @@ type CommonConfig = BaseConfig & { type EnvConfig = BaseConfig & { frontendUrl: string; + serverUrl: string; } type Config = CommonConfig & EnvConfig @@ -48,16 +49,20 @@ export default resolvedConfig function getDevelopmentConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL || 'http://localhost:3000/'); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL || 'http://localhost:3001'); return { frontendUrl, + serverUrl, allowedCORSOrigins: '*', } } function getProductionConfig(): EnvConfig { const frontendUrl = stripTrailingSlash(process.env.WASP_WEB_CLIENT_URL); + const serverUrl = stripTrailingSlash(process.env.WASP_SERVER_URL); return { frontendUrl, + serverUrl, allowedCORSOrigins: [frontendUrl], } } diff --git a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/scripts/validate-env.mjs b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/scripts/validate-env.mjs index ac264b796..f6e50acec 100644 --- a/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/scripts/validate-env.mjs +++ b/waspc/e2e-test/test-outputs/waspMigrate-golden/waspMigrate/.wasp/out/server/scripts/validate-env.mjs @@ -2,3 +2,4 @@ import { throwIfNotValidAbsoluteURL } from 'wasp/universal/validators'; console.info("🔍 Validating environment variables..."); throwIfNotValidAbsoluteURL(process.env.WASP_WEB_CLIENT_URL, 'Environment variable WASP_WEB_CLIENT_URL'); +throwIfNotValidAbsoluteURL(process.env.WASP_SERVER_URL, 'Environment variable WASP_SERVER_URL'); diff --git a/waspc/packages/deploy/src/providers/fly/setup/setup.ts b/waspc/packages/deploy/src/providers/fly/setup/setup.ts index d229cf2d4..9509e344d 100644 --- a/waspc/packages/deploy/src/providers/fly/setup/setup.ts +++ b/waspc/packages/deploy/src/providers/fly/setup/setup.ts @@ -119,6 +119,7 @@ Press any key to continue or Ctrl+C to cancel.`); // doesn't provide a way to set envars that persist to fly.toml. 'PORT=8080', `WASP_WEB_CLIENT_URL=${deploymentInfo.clientUrl}`, + `WASP_SERVER_URL=${deploymentInfo.serverUrl}`, ]; if (deploymentInfo.options.serverSecret.length > 0) { diff --git a/waspc/src/Wasp/Generator/SdkGenerator.hs b/waspc/src/Wasp/Generator/SdkGenerator.hs index 0b6dc6e95..b72d39152 100644 --- a/waspc/src/Wasp/Generator/SdkGenerator.hs +++ b/waspc/src/Wasp/Generator/SdkGenerator.hs @@ -53,6 +53,7 @@ import qualified Wasp.Generator.SdkGenerator.Server.OperationsGenerator as Serve import Wasp.Generator.SdkGenerator.ServerApiG (genServerApi) import Wasp.Generator.SdkGenerator.WebSocketGenerator (depsRequiredByWebSockets, genWebSockets) import qualified Wasp.Generator.ServerGenerator.AuthG as ServerAuthG +import qualified Wasp.Generator.ServerGenerator.Common as Server import qualified Wasp.Generator.WebAppGenerator.Common as WebApp import qualified Wasp.Node.Version as NodeVersion import Wasp.Project.Common (WaspProjectDir) @@ -82,7 +83,6 @@ genSdkReal spec = [ genFileCopy [relfile|vite-env.d.ts|], genFileCopy [relfile|api/index.ts|], genFileCopy [relfile|api/events.ts|], - genFileCopy [relfile|client/config.ts|], genFileCopy [relfile|core/storage.ts|], genFileCopy [relfile|server/index.ts|], genFileCopy [relfile|server/HttpError.ts|], @@ -90,6 +90,7 @@ genSdkReal spec = genFileCopy [relfile|client/test/index.ts|], genFileCopy [relfile|client/index.ts|], genFileCopy [relfile|dev/index.ts|], + genClientConfigFile, genServerConfigFile spec, genTsConfigJson, genServerUtils spec, @@ -259,9 +260,17 @@ genServerConfigFile spec = return $ C.mkTmplFdWithData relConfigFilePath tmplDat object [ "isAuthEnabled" .= isAuthEnabled spec, "databaseUrlEnvVarName" .= Db.databaseUrlEnvVarName, - "defaultClientUrl" .= WebApp.getDefaultClientUrl spec + "defaultClientUrl" .= WebApp.getDefaultDevClientUrl spec, + "defaultServerUrl" .= Server.defaultDevServerUrl, + "defaultServerPort" .= Server.defaultServerPort ] +genClientConfigFile :: Generator FileDraft +genClientConfigFile = return $ C.mkTmplFdWithData relConfigFilePath tmplData + where + relConfigFilePath = [relfile|client/config.ts|] + tmplData = object ["defaultServerUrl" .= Server.defaultDevServerUrl] + -- todo(filip): remove this duplication, we have almost the same thing in the -- ServerGenerator. genTsConfigJson :: Generator FileDraft diff --git a/waspc/src/Wasp/Generator/ServerGenerator/Common.hs b/waspc/src/Wasp/Generator/ServerGenerator/Common.hs index 3319bb4bd..cd85159be 100644 --- a/waspc/src/Wasp/Generator/ServerGenerator/Common.hs +++ b/waspc/src/Wasp/Generator/ServerGenerator/Common.hs @@ -17,6 +17,8 @@ module Wasp.Generator.ServerGenerator.Common ServerSrcDir, ServerTemplatesDir, ServerTemplatesSrcDir, + defaultDevServerUrl, + defaultServerPort, ) where @@ -124,3 +126,9 @@ toESModulesImportPath :: FilePath -> FilePath toESModulesImportPath = changeExtensionTo "js" where changeExtensionTo ext = (++ '.' : ext) . fst . splitExtension + +defaultServerPort :: Int +defaultServerPort = 3001 + +defaultDevServerUrl :: String +defaultDevServerUrl = "http://localhost:" ++ show defaultServerPort diff --git a/waspc/src/Wasp/Generator/WebAppGenerator/Common.hs b/waspc/src/Wasp/Generator/WebAppGenerator/Common.hs index 96420b860..3e3c6d623 100644 --- a/waspc/src/Wasp/Generator/WebAppGenerator/Common.hs +++ b/waspc/src/Wasp/Generator/WebAppGenerator/Common.hs @@ -22,7 +22,7 @@ module Wasp.Generator.WebAppGenerator.Common staticAssetsDirInWebAppDir, WebAppStaticAssetsDir, getBaseDir, - getDefaultClientUrl, + getDefaultDevClientUrl, defaultClientPort, ) where @@ -148,5 +148,5 @@ getBaseDir spec = fromMaybe [absdirP|/|] maybeBaseDir defaultClientPort :: Int defaultClientPort = 3000 -getDefaultClientUrl :: AppSpec -> String -getDefaultClientUrl spec = "http://localhost:" ++ show defaultClientPort ++ SP.fromAbsDirP (getBaseDir spec) +getDefaultDevClientUrl :: AppSpec -> String +getDefaultDevClientUrl spec = "http://localhost:" ++ show defaultClientPort ++ SP.fromAbsDirP (getBaseDir spec) diff --git a/web/docs/advanced/deployment/manually.md b/web/docs/advanced/deployment/manually.md index d394ab745..95fdd3f9d 100644 --- a/web/docs/advanced/deployment/manually.md +++ b/web/docs/advanced/deployment/manually.md @@ -71,6 +71,11 @@ Here are the environment variables your server will be looking for: The URL where you plan to deploy your frontend app is running (e.g., `https://.netlify.app`). The server needs to know about it to properly configure Same-Origin Policy (CORS) headers. +- `WASP_SERVER_URL` + + The URL where the server is running (e.g., `https://.fly.dev`). + The server needs it to properly redirect users when logging in with OAuth providers like Google or GitHub. + - `JWT_SECRET` ( if using Wasp Auth) You only need this environment variable if you're using Wasp's `auth` features. @@ -178,11 +183,12 @@ Next, let's add a few more environment variables: ```bash flyctl secrets set PORT=8080 flyctl secrets set JWT_SECRET= -flyctl secrets set WASP_WEB_CLIENT_URL= +flyctl secrets set WASP_WEB_CLIENT_URL= +flyctl secrets set WASP_SERVER_URL= ``` :::note -If you do not know what your frontend URL is yet, don't worry. You can set `WASP_WEB_CLIENT_URL` after you deploy your frontend. +If you do not know what your client URL is yet, don't worry. You can set `WASP_WEB_CLIENT_URL` after you deploy your client. ::: @@ -199,7 +205,7 @@ flyctl deploy --remote-only --config ../../fly.toml This will build and deploy the backend of your Wasp app on Fly.io to `https://.fly.dev` 🤘🎸 -Now, if you haven't, you can deploy your frontend and add the client url by running `flyctl secrets set WASP_WEB_CLIENT_URL=`. We suggest using [Netlify](#netlify) for your frontend, but you can use any static hosting provider. +Now, if you haven't, you can deploy your client and add the client URL by running `flyctl secrets set WASP_WEB_CLIENT_URL=`. We suggest using [Netlify](#netlify) for your client, but you can use any static hosting provider. Additionally, some useful `flyctl` commands: @@ -325,6 +331,7 @@ Let's deploy our server first: - click **Variable reference** and select `DATABASE_URL` (it will populate it with the correct value) - add `WASP_WEB_CLIENT_URL` - enter the the `client` domain (e.g. `https://client-production-XXXX.up.railway.app`) + - add `WASP_SERVER_URL` - enter the the `server` domain (e.g. `https://server-production-XXXX.up.railway.app`) - add `JWT_SECRET` - enter a random string at least 32 characters long (use an [online generator](https://djecrety.ir/)) @@ -502,15 +509,16 @@ Heroku does not offer a free plan anymore and `mini` is their cheapest database Heroku will also set `DATABASE_URL` env var for us at this point. If you are using an external database, you will have to set it up yourself. -The `PORT` env var will also be provided by Heroku, so the only two left to set are the `JWT_SECRET` and `WASP_WEB_CLIENT_URL` env vars: +The `PORT` env var will also be provided by Heroku, so the ones left to set are the `JWT_SECRET`, `WASP_WEB_CLIENT_URL` and `WASP_SERVER_URL` env vars: ``` heroku config:set --app JWT_SECRET= -heroku config:set --app WASP_WEB_CLIENT_URL= +heroku config:set --app WASP_WEB_CLIENT_URL= +heroku config:set --app WASP_SERVER_URL= ``` :::note -If you do not know what your frontend URL is yet, don't worry. You can set `WASP_WEB_CLIENT_URL` after you deploy your frontend. +If you do not know what your client URL is yet, don't worry. You can set `WASP_WEB_CLIENT_URL` after you deploy your client. ::: ### Deploy to a Heroku App