diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 838b34004..ed7c9d47e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1,51 @@ -Check [waspc README](waspc) for detailed contributing guidelines. +# Contributing to Wasp + +Wasp's compiler is built with Haskell and under the hood it generates a web application in React and NodeJS. Given that, there are several ways in which you can contribute: +- [Wasp compiler/CLI/LSP internals](#wasp-compilerclilsp-internals) (Haskell) +- [Wasp as a web framework](#wasp-as-a-web-framework) (React, Node, HTML/CSS, database and so on) +- [Tutorials or Example apps](#tutorials-or-example-apps) +- [Documentation](#documentation) + +## Before you begin + +- Check out the [**Getting Started**](https://wasp-lang.dev/docs) guide to get familiar with Wasp's fundamentals. Ideally, you'd also build an app from the [**Pick a Tutorial**](https://wasp-lang.dev/docs/pick-a-tutorial) page to really get a feel for it! +- Figure out what you'd like to help with. It can be code, documentation, tutorials, etc. More on this is below. +- Join our Discord [![**Discord**](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX) for faster communication and feedback. We'd be happy to help you find the issue you'll enjoy working on, depending on your interests and skill set! +- Below you can find links to the good first issues. If you'd like to filter the issues on your own — please, use [this link](https://github.com/wasp-lang/wasp/issues) + +Let's jump right in! + +## Wasp compiler/CLI/LSP internals + +Wasp compiler is implemented in Haskell, but you will also see a lot of Javascript and other web technologies because Wasp compiles it's own code into them. + +While you will need to know some Haskell, you don't have to be an expert in Haskell to contribute or understand the code since we don't use complicated Haskell features much -> most of the code is relatively straightforward, and we are happy to help with the part that is not. + +Check the [**Wasp compiler README**](https://github.com/wasp-lang/wasp/blob/main/waspc/README.md) for all the detailed instructions and guides. + +[**Haskell-related issues for beginners can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Ahaskell) + +Feel free to contact us via Discord to ask for an appropriate issue for yourself, or just open a new one if you have something specific in mind and it isn't already there! + +## Wasp as a web framework + +Wasp is a language for developing full-stack web apps. This means there are plenty of tasks related to web development itself. + +[**Web dev issues for beginners can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Awebdev) + +## Tutorials or Example apps + +Another great way to help is to create an app with Wasp! We have an [Examples](https://wasp-lang.dev/docs/examples) section on our website, as well as the [Tutorials](https://wasp-lang.dev/docs/pick-a-tutorial) page. Both of them can be improved and updated with your projects. + +All that's required is to create an app. And make a tutorial or a blog post to help other people reproduce your work. Some prominent examples are: [Waspello](https://wasp-lang.dev/blog/2021/12/02/waspello), [Waspleau](https://wasp-lang.dev/blog/2022/01/27/waspleau), [It Wasps on My Machine](https://wasp-lang.dev/blog/2022/09/05/dev-excuses-app-tutrial) and [To-Do app](https://wasp-lang.dev/docs/tutorials/todo-app). + +Or you can re-build your existing pet project with Wasp. That would be cool! + +## Documentation + +It may sound like the simplest one, but it's super valuable! If you've found an issue, a broken link or if something was unclear on our [website](https://wasp-lang.dev/) - please, feel free to fix it :) + +[**Documentation issues for beginners can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Adocumentation) + + +Happy hacking! \ No newline at end of file diff --git a/examples/tutorials/ItWaspsOnMyMachine/ext/queries.js b/examples/tutorials/ItWaspsOnMyMachine/ext/queries.js index dced04be9..531f28e79 100644 --- a/examples/tutorials/ItWaspsOnMyMachine/ext/queries.js +++ b/examples/tutorials/ItWaspsOnMyMachine/ext/queries.js @@ -1,14 +1,8 @@ import axios from 'axios'; export const getExcuse = async () => { - return axios - .get('https://api.devexcus.es/') - .then(res => { - return res.data; - }) - .catch(error => { - console.error(error); - }); + const response = await axios.get('https://api.devexcus.es/') + return response.data } export const getAllSavedExcuses = async (_args, context) => { diff --git a/waspc/README.md b/waspc/README.md index 77177e356..eab5766cf 100644 --- a/waspc/README.md +++ b/waspc/README.md @@ -17,7 +17,7 @@ If you would like to make your first contribution, here is a handy checklist we ## Quick overview -Wasp compiler is implemented in Haskell, but you will also see a lot of Javascript and other web technologies because Wasp compiler transpiles Wasp code into them. +Wasp compiler is implemented in Haskell, but you will also see a lot of Javascript and other web technologies because Wasp compiles it's own code into them. You don't have to be expert in Haskell to contribute or understand the code, since we don't use complicated Haskell features much -> most of the code is relatively simple and straight-forward, and we are happy to help with the part that is not. diff --git a/web/blog/2022-09-05-dev-excuses-app-tutrial.md b/web/blog/2022-09-05-dev-excuses-app-tutrial.md index 050ed3b6f..e3699c355 100644 --- a/web/blog/2022-09-05-dev-excuses-app-tutrial.md +++ b/web/blog/2022-09-05-dev-excuses-app-tutrial.md @@ -149,14 +149,8 @@ export const saveExcuse = async (excuse, context) => { import axios from 'axios'; export const getExcuse = async () => { - return axios - .get('https://api.devexcus.es/') - .then(res => { - return res.data; - }) - .catch(error => { - console.error(error); - }); + const response = await axios.get('https://api.devexcus.es/') + return response.data } export const getAllSavedExcuses = async (_args, context) => { diff --git a/web/blog/components/DiscordLink.js b/web/blog/components/DiscordLink.js new file mode 100644 index 000000000..0e4061276 --- /dev/null +++ b/web/blog/components/DiscordLink.js @@ -0,0 +1,11 @@ +import React from "react"; + +const DiscordLink = (props) => { + return ( + + Discord + + ); +}; + +export default DiscordLink; \ No newline at end of file diff --git a/web/docs/contributing.md b/web/docs/contributing.md index bacc91bef..4dc0a25c5 100644 --- a/web/docs/contributing.md +++ b/web/docs/contributing.md @@ -4,9 +4,16 @@ sidebar_label: Contributing slug: /contributing --- -Any way you want to contribute is a good way, and we are happy to meet you :)! +import DiscordLink from '../blog/components/DiscordLink'; -Some typical ways to contribute: -1. Join us on discord [![Discord](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX) and let's talk! We can discuss language design, new/existing features, weather, or you can just tell us how you feel about Wasp :). -2. If there is something in docs that you think could be improved or clarified, go to [docs Github repo](https://github.com/wasp-lang/wasp) and make an issue/PR! Or, you can do it directly from here by clicking on "edit this page" at the bottom of each page. -3. Create an issue/PR on [core Wasp repo](https://github.com/wasp-lang/wasp) to contribute directly to the language and/or compiler! Check [wapsc README](https://github.com/wasp-lang/wasp/tree/main/waspc) for more details. +Any way you want to contribute is a good way, and we'd be happy to meet you! A single entry point for all contributors is the [CONTRIBUTING.md](https://github.com/wasp-lang/wasp/blob/main/CONTRIBUTING.md) file in our Github repo. All the requirements and instructions are there, so please check [CONTRIBUTING.md](https://github.com/wasp-lang/wasp/blob/main/CONTRIBUTING.md) for more details. + +Some side notes to make your journey easier: + +1. Join us on and let's talk! We can discuss language design, new/existing features, and weather, or you can tell us how you feel about Wasp :). + +2. Wasp's compiler is built with Haskell. That means you'll need to be somewhat familiar with this language if you'd like to contribute to the compiler itself. But Haskell is just a part of Wasp, and you can contribute to lot of parts that require web dev skills, either by coding or by suggesting how to improve Wasp and its design as a web framework. If you don't have Haskell knowledge (or any dev experience at all) - no problem. There are a lot of JS-related tasks and documentation updates as well! + +3. If there's something you'd like to bring to our attention, go to [docs GitHub repo](https://github.com/wasp-lang/wasp) and make an issue/PR! + +Happy hacking! \ No newline at end of file diff --git a/web/docs/getting-started.md b/web/docs/getting-started.md index 54d43353f..d1d8c9687 100644 --- a/web/docs/getting-started.md +++ b/web/docs/getting-started.md @@ -123,7 +123,7 @@ That's it :tada:! You have successfully created and served a new web app at + +[The To-Do app](tutorials/todo-app) is a relatively deep dive into many of Wasp's concepts. If you'd like to get familiar with Wasp on a more detailed level - this is what to go with! Things like auth, dependency management, and operations will all be covered while you build a To-Do app. + +[Dev excuses app](tutorials/dev-excuses-app) is a fun, quick overview of how you can build a full-stack app with Wasp in a matter of minutes. Do not expect any detailed concept explanations, and refer to this tutorial if you'd like to get a fast overview of Wasp's possibilities. + +Let's build! + +P.S: If you decided to build an app on your own - we'd love to see it! If it's simple enough, let's turn it into a tutorial! Please check our [contribution guide](contributing) for detailed instructions and reach us on Discord. \ No newline at end of file diff --git a/web/docs/tutorials/dev-excuses-app.md b/web/docs/tutorials/dev-excuses-app.md new file mode 100644 index 000000000..c6263b0e9 --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app.md @@ -0,0 +1,25 @@ +--- +title: Introduction +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; +import DiscordLink from '../../blog/components/DiscordLink'; + +:::info +Make sure you've set up Wasp! Check out [Getting Started](/getting-started.md) first for installation instructions, and then continue with the tutorial. In case of any issues - please, ping us on . +::: + +We’ll build a web app to solve every developer's most common problem – finding an excuse to justify our messy work! We will start with a single config file that outlines the full-stack architecture of our app plus several dozen lines of code for our specific business logic. There's no faster way to do it, so we can’t excuse ourselves from building it! + +We’ll use Michele Gerarduzzi’s [open-source project](https://github.com/michelegera/devexcuses-api). It provides a simple API and a solid number of predefined excuses. A perfect fit for our needs. Let’s define the requirements for the project: + +- The app must be able to pull excuses data from a public API. +- Users can save the excuses they like (and your boss doesn't) to the database for future reference. +- Building an app shouldn’t take more than 15 minutes. +- Use modern web dev technologies (NodeJS + React) + +As a result – we’ll get a simple and fun pet project. You can find the complete codebase [here](https://github.com/wasp-lang/wasp/tree/main/examples/tutorials/ItWaspsOnMyMachine). + +Final result \ No newline at end of file diff --git a/web/docs/tutorials/dev-excuses-app/01-creating-the-project.md b/web/docs/tutorials/dev-excuses-app/01-creating-the-project.md new file mode 100644 index 000000000..ac67ae1f8 --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app/01-creating-the-project.md @@ -0,0 +1,28 @@ +--- +id: 01-creating-the-project +title: Creating the project +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +By now you've already learned [how to install Wasp and create a new project](/getting-started.md). So let’s create a new web app appropriately named `ItWaspsOnMyMachine`. + +``` +wasp new ItWaspsOnMyMachine +``` + +Changing the working directory: +``` +cd ItWaspsOnMyMachine +``` + +Starting the app: +``` +wasp start +``` + +Now your default browser should open up with a simple predefined text message. That’s it! 🥳 For now – the codebase consists of only two files! `main.wasp` is the config file that defines the application’s functionality. And `MainPage.js` is the front-end. You can delete `Main.css`, we won't use that. And don't forget to remove `import './Main.css'` from `MainPage.js` file. + +Initial page \ No newline at end of file diff --git a/web/docs/tutorials/dev-excuses-app/02-modifying-main-wasp-file.md b/web/docs/tutorials/dev-excuses-app/02-modifying-main-wasp-file.md new file mode 100644 index 000000000..a7fe93871 --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app/02-modifying-main-wasp-file.md @@ -0,0 +1,103 @@ +--- +id: 02-modifying-main-wasp-file +title: Modifying main.wasp file +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +First and foremost, we need to add some dependencies and introduce operations to our project. We’ll add Tailwind to make our UI prettier and Axios for making API requests. + +Also, we’ll declare a database entity called `Excuse`, queries, and action. The `Excuse` entity consists of the entity’s ID and the text. + +`Queries` are here when we need to fetch/read something, while `actions` are here when we need to change/update data. Both query and action declaration consists of two lines – a reference to the file that contains implementation and a data model to operate on. You can find more info [in the docs section below](/docs/language/features#queries-and-actions-aka-operations). Let's move on! + +Let's add the following code to the `main.wasp` file's `app` section: + +```js title="main.wasp | Adding dependencies" + head: [ + "" + ], + + dependencies: [ + ("axios", "^0.21.1") + ] +``` + +Next, we'll add an Excuse entity to the bottom of the file. You'll also need to define queries and an action that operates on nit. + +```js title="main.wasp | Defining Excuse entity, queries and action" +entity Excuse {=psl + id Int @id @default(autoincrement()) + text String +psl=} + +query getExcuse { + fn: import { getExcuse } from "@ext/queries.js", + entities: [Excuse] +} + +query getAllSavedExcuses { + fn: import { getAllSavedExcuses } from "@ext/queries.js", + entities: [Excuse] +} + +action saveExcuse { + fn: import { saveExcuse } from "@ext/actions.js", + entities: [Excuse] +} +``` +The resulting `main.wasp` file should look like this: + +```js title="main.wasp | Final result" + +// Main declaration, defines a new web app. +app ItWaspsOnMyMachine { + + // Used as a browser tab title. + title: "It Wasps On My Machine", + + head: [ + // Adding Tailwind to make our UI prettier + "" + ], + + dependencies: [ + // Adding Axios for making HTTP requests + ("axios", "^0.21.1") + ] +} + +// Render page MainPage on url `/` (default url). +route RootRoute { path: "/", to: MainPage } + +// ReactJS implementation of our page located in `ext/MainPage.js` as a default export +page MainPage { + component: import Main from "@ext/MainPage.js" +} + +// Prisma database entity +entity Excuse {=psl + id Int @id @default(autoincrement()) + text String +psl=} + +// Query declaration to get a new excuse +query getExcuse { + fn: import { getExcuse } from "@ext/queries.js", + entities: [Excuse] +} + +// Query declaration to get all excuses +query getAllSavedExcuses { + fn: import { getAllSavedExcuses } from "@ext/queries.js", + entities: [Excuse] +} + +// Action to save current excuse +action saveExcuse { + fn: import { saveExcuse } from "@ext/actions.js", + entities: [Excuse] +} +``` + +Perfect! We've set up all the architecture of our app. Now let's add some logic. diff --git a/web/docs/tutorials/dev-excuses-app/03-adding-operations.md b/web/docs/tutorials/dev-excuses-app/03-adding-operations.md new file mode 100644 index 000000000..cba4300f0 --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app/03-adding-operations.md @@ -0,0 +1,35 @@ +--- +id: 03-adding-operations +title: Adding operations +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +Now you'll need to create two files: `actions.js` and `queries.js` in the `ext` folder. + +Let’s add `saveExcuse()` action to our `actions.js` file. This action will save the text of our excuse to the database. + +```js title=".../ext/actions.js | Defining an action" +export const saveExcuse = async (excuse, context) => { + return context.entities.Excuse.create({ + data: { text: excuse.text } + }) +} +``` + +Then we need to create two queries in the `queries.js` file. First, one `getExcuse` will call an external API and fetch a new excuse. The second one, named `getAllSavedExcuses`, will pull all the excuses we’ve saved to our database. + +```js title=".../ext/queries.js | Defining queries" +import axios from 'axios'; + +export const getExcuse = async () => { + const response = await axios.get('https://api.devexcus.es/') + return response.data +} + +export const getAllSavedExcuses = async (_args, context) => { + return context.entities.Excuse.findMany() +} +``` + +That’s it! We finished our back-end. 🎉 Now, let’s use those queries/actions on our UI. diff --git a/web/docs/tutorials/dev-excuses-app/04-updating-main-page-js-file.md b/web/docs/tutorials/dev-excuses-app/04-updating-main-page-js-file.md new file mode 100644 index 000000000..a216a66cd --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app/04-updating-main-page-js-file.md @@ -0,0 +1,74 @@ +--- +id: 04-updating-main-page-js-file +title: Updating MainPage.js file +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +This is the most complex part, but it really comes down to mostly writing React. To make our life easier - let’s erase everything we had in the `MainPage.js` file and substitute it with our new UI markup. + +```js title=".../ext/MainPage.js | Updating the UI" +import React, { useState } from 'react' +import { useQuery } from '@wasp/queries' +import getExcuse from '@wasp/queries/getExcuse' +import getAllSavedExcuses from '@wasp/queries/getAllSavedExcuses' +import saveExcuse from '@wasp/actions/saveExcuse' + +const MainPage = () => { + const [currentExcuse, setCurrentExcuse] = useState({ text: "" }) + const { data: excuses } = useQuery(getAllSavedExcuses) + + const handleGetExcuse = async () => { + try { + setCurrentExcuse(await getExcuse()) + } catch (err) { + window.alert('Error while getting the excuse: ' + err.message) + } + } + + const handleSaveExcuse = async () => { + if (currentExcuse.text) { + try { + await saveExcuse(currentExcuse) + } catch (err) { + window.alert('Error while saving the excuse: ' + err.message) + } + } + } + + return ( +
+
+ + + +
+
+
Saved excuses:
+ {excuses && } +
+
+ ) +} + +const ExcuseList = (props) => { + return props.excuses?.length ? props.excuses.map((excuse, idx) => ) : 'No saved excuses' +} + +const Excuse = ({ excuse }) => { + return ( +
+ {excuse.text} +
+ ) +} + +export default MainPage +``` + +Our page consists of three components: `MainPage`, `ExcuseList`, and `Excuse`. It may seem at first that this file is pretty complex, but let's take a closer look: + +`Excuse` is just a div with an excuse text, `ExcuseList` checks if there are any excuses. If the list is empty – show a message `No saved excuses`. In other case – excuses will be displayed. + +`MainPage` contains info about the current excuses and the list of already saved excuses. Two button click handlers are `handleGetExcuse` and `handleSaveExcuse`. Plus, the markup itself with some Tailwind flavor. + diff --git a/web/docs/tutorials/dev-excuses-app/05-perform-migration-and-run.md b/web/docs/tutorials/dev-excuses-app/05-perform-migration-and-run.md new file mode 100644 index 000000000..28a7a627b --- /dev/null +++ b/web/docs/tutorials/dev-excuses-app/05-perform-migration-and-run.md @@ -0,0 +1,44 @@ +--- +id: 05-perform-migration-and-run +title: Perform migration and run the app +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; +import DiscordLink from '../../../blog/components/DiscordLink'; + +Before we run our app, we need to execute a database migration. We changed the DB schema by adding new entities. By doing the migration, we sync the database schema with the entities we defined. If you’ve had something running in the terminal – stop it and run: + +``` +wasp db migrate-dev +``` + +You’ll be prompted to enter a name for the migration. Something like `init` will be ok. Now we can start the application! + +``` +wasp start +``` +Final empty result + +Now you can click the “Get excuse” button to receive an excuse. You should also be able to save the ones you like with the “Save excuse” button. Our final project should look like this: + +Final result + +Now we can think of some additional improvements. For example: + +- Add a unique constraint to Entity’s ID so we won’t be able to save duplicated excuses. +- Add exceptions and edge cases handling. +- Make the markup prettier. +- Optimize and polish the code + +So, we’ve been able to build a full-stack application with a database and external API call in a couple of minutes. And now we have a box full of excuses for all our development needs. + +Box of excuses for the win! + + +P.S: now you're familiar with Wasp and can build full-stack apps, horaay! 🎉 How did it go? Was it fun? Drop us a message at our . Now it's time to look at [Todo App in Wasp](/docs/tutorials/todo-app) if you haven't already. It will introduce some additional concepts so you'd be able to become a true Wasp overlord! \ No newline at end of file diff --git a/web/docs/tutorials/todo-app/creating-new-project.md b/web/docs/tutorials/todo-app/01-creating-new-project.md similarity index 99% rename from web/docs/tutorials/todo-app/creating-new-project.md rename to web/docs/tutorials/todo-app/01-creating-new-project.md index 779402aff..76f907827 100644 --- a/web/docs/tutorials/todo-app/creating-new-project.md +++ b/web/docs/tutorials/todo-app/01-creating-new-project.md @@ -1,4 +1,5 @@ --- +id: 01-creating-new-project title: "Creating new project" --- diff --git a/web/docs/tutorials/todo-app/task-entity.md b/web/docs/tutorials/todo-app/02-task-entity.md similarity index 98% rename from web/docs/tutorials/todo-app/task-entity.md rename to web/docs/tutorials/todo-app/02-task-entity.md index 55d029ec6..2217fdd7f 100644 --- a/web/docs/tutorials/todo-app/task-entity.md +++ b/web/docs/tutorials/todo-app/02-task-entity.md @@ -1,4 +1,5 @@ --- +id: 02-task-entity title: "Task entity" --- diff --git a/web/docs/tutorials/todo-app/listing-tasks.md b/web/docs/tutorials/todo-app/03-listing-tasks.md similarity index 99% rename from web/docs/tutorials/todo-app/listing-tasks.md rename to web/docs/tutorials/todo-app/03-listing-tasks.md index 779408c5e..3aa78db99 100644 --- a/web/docs/tutorials/todo-app/listing-tasks.md +++ b/web/docs/tutorials/todo-app/03-listing-tasks.md @@ -1,4 +1,5 @@ --- +id: 03-listing-tasks title: "Listing tasks" --- diff --git a/web/docs/tutorials/todo-app/creating-tasks.md b/web/docs/tutorials/todo-app/04-creating-tasks.md similarity index 99% rename from web/docs/tutorials/todo-app/creating-tasks.md rename to web/docs/tutorials/todo-app/04-creating-tasks.md index 46cc09689..8047c622e 100644 --- a/web/docs/tutorials/todo-app/creating-tasks.md +++ b/web/docs/tutorials/todo-app/04-creating-tasks.md @@ -1,4 +1,5 @@ --- +id: 04-creating-tasks title: "Creating tasks" --- diff --git a/web/docs/tutorials/todo-app/updating-tasks.md b/web/docs/tutorials/todo-app/05-updating-tasks.md similarity index 98% rename from web/docs/tutorials/todo-app/updating-tasks.md rename to web/docs/tutorials/todo-app/05-updating-tasks.md index ed17265b7..f4e583123 100644 --- a/web/docs/tutorials/todo-app/updating-tasks.md +++ b/web/docs/tutorials/todo-app/05-updating-tasks.md @@ -1,4 +1,5 @@ --- +id: 05-updating-tasks title: "Updating tasks" --- diff --git a/web/docs/tutorials/todo-app/auth.md b/web/docs/tutorials/todo-app/06-auth.md similarity index 99% rename from web/docs/tutorials/todo-app/auth.md rename to web/docs/tutorials/todo-app/06-auth.md index 35498ed85..5bdcf00ee 100644 --- a/web/docs/tutorials/todo-app/auth.md +++ b/web/docs/tutorials/todo-app/06-auth.md @@ -1,4 +1,5 @@ --- +id: 06-auth title: "Authentication" --- diff --git a/web/docs/tutorials/todo-app/dependencies.md b/web/docs/tutorials/todo-app/07-dependencies.md similarity index 98% rename from web/docs/tutorials/todo-app/dependencies.md rename to web/docs/tutorials/todo-app/07-dependencies.md index 8389cb0d7..831d5b6a7 100644 --- a/web/docs/tutorials/todo-app/dependencies.md +++ b/web/docs/tutorials/todo-app/07-dependencies.md @@ -1,4 +1,5 @@ --- +id: 07-dependencies title: "Dependencies" --- diff --git a/web/docs/tutorials/todo-app/the-end.md b/web/docs/tutorials/todo-app/08-the-end.md similarity index 98% rename from web/docs/tutorials/todo-app/the-end.md rename to web/docs/tutorials/todo-app/08-the-end.md index 88d74d281..3941c9503 100644 --- a/web/docs/tutorials/todo-app/the-end.md +++ b/web/docs/tutorials/todo-app/08-the-end.md @@ -1,4 +1,5 @@ --- +id: 08-the-end title: "The End" --- diff --git a/web/sidebars.js b/web/sidebars.js index d61d5afe9..d79669745 100644 --- a/web/sidebars.js +++ b/web/sidebars.js @@ -7,7 +7,8 @@ module.exports = { items: [ 'getting-started', 'about', - 'how-it-works' + 'how-it-works', + 'pick-a-tutorial' ] }, { @@ -26,16 +27,29 @@ module.exports = { label: 'Basics', collapsed: true, items: [ - 'tutorials/todo-app/creating-new-project', - 'tutorials/todo-app/task-entity', - 'tutorials/todo-app/listing-tasks', - 'tutorials/todo-app/creating-tasks', - 'tutorials/todo-app/updating-tasks' + 'tutorials/todo-app/01-creating-new-project', + 'tutorials/todo-app/02-task-entity', + 'tutorials/todo-app/03-listing-tasks', + 'tutorials/todo-app/04-creating-tasks', + 'tutorials/todo-app/05-updating-tasks' ] }, - 'tutorials/todo-app/auth', - 'tutorials/todo-app/dependencies', - 'tutorials/todo-app/the-end' + 'tutorials/todo-app/06-auth', + 'tutorials/todo-app/07-dependencies', + 'tutorials/todo-app/08-the-end' + ] + }, + { + type: 'category', + label: 'Dev Excuses app', + collapsed: true, + items: [ + 'tutorials/dev-excuses-app', + 'tutorials/dev-excuses-app/01-creating-the-project', + 'tutorials/dev-excuses-app/02-modifying-main-wasp-file', + 'tutorials/dev-excuses-app/03-adding-operations', + 'tutorials/dev-excuses-app/04-updating-main-page-js-file', + 'tutorials/dev-excuses-app/05-perform-migration-and-run', ] } ] diff --git a/web/static/img/dev-excuses-live-preview.gif b/web/static/img/dev-excuses-live-preview.gif new file mode 100644 index 000000000..1cd753339 Binary files /dev/null and b/web/static/img/dev-excuses-live-preview.gif differ diff --git a/web/static/img/develop-an-app.jpg b/web/static/img/develop-an-app.jpg new file mode 100644 index 000000000..0090a0905 Binary files /dev/null and b/web/static/img/develop-an-app.jpg differ diff --git a/web/static/img/init-page.png b/web/static/img/init-page.png index cdf283ce3..cfb6810ef 100644 Binary files a/web/static/img/init-page.png and b/web/static/img/init-page.png differ