diff --git a/docs/expressjs/rest-api-http-methods/rest-api-http-methods.md b/docs/expressjs/rest-api-http-methods/rest-api-http-methods.md new file mode 100644 index 00000000..7a85be33 --- /dev/null +++ b/docs/expressjs/rest-api-http-methods/rest-api-http-methods.md @@ -0,0 +1,247 @@ +# 1️⃣ What is a REST API? + +**REST** stands for **Representational State Transfer**. +It’s an **architectural style** for designing networked applications. + +In REST: + +- Everything is treated as a **resource** (e.g., a user, a product, a blog post). +- Each resource is accessed via a **unique URL**. +- Standard **HTTP methods** are used to retrieve or modify data. + +--- + +# 2️⃣ REST API Workflow (Diagram) + +![REST API Diagram](/static/expressjs/rest-api-http-methods/rest-api-architecture.jpg) +_Figure: A simple REST API communication between Client, Server, and Database._ + +**How it works:** + +1. The **Client** (browser, mobile app, etc.) sends an HTTP request to the **API server**. +2. The **Server** processes the request and, if needed, communicates with a **Database**. +3. The **Server** sends back a **JSON response** to the client. + +--- + +## 3️⃣ Key Features of REST + +1. **Stateless** – Each request is independent; the server does not store client data between requests. + +2. **Client-Server Architecture** – Frontend (client) and backend (server) work independently. + +3. **Cacheable** – Responses can be stored (cached) for faster access. + +4. **Uniform Interface** – Consistent way to interact with resources. + +5. **Layered System** – Multiple layers (like load balancers, cache servers) can exist between client and server. + +--- + +## 4️⃣ HTTP Methods in REST API + +| Method | Purpose | Example Endpoint | +| ---------- | ---------------------------- | ---------------- | +| **GET** | Retrieve data | `/users` | +| **POST** | Create a new resource | `/users` | +| **PUT** | Replace an existing resource | `/users/:id` | +| **PATCH** | Update part of a resource | `/users/:id` | +| **DELETE** | Remove a resource | `/users/:id` | + +--- + +## 5️⃣ Setup: Creating a REST API in Node.js + +### Step 1: Install Node.js and Express + +```bash +npm init -y +npm install express +``` + +### Step 2: Basic Server Setup + +```js +const express = require("express"); +const app = express(); +const PORT = 3000; + +app.use(express.json()); + +//sample array data +let users = [ + { id: 1, name: "Alice", email: "alice@example.com" }, + { id: 2, name: "Bob", email: "bob@example.com" }, +]; +``` + +--- + +## 6️⃣ API Endpoints + +### 1. 🟢 GET – Retrieve All Users + +```js +app.get("/users", (req, res) => { + res.json({ + success: true, + message: "All users fetched successfully", + data: users, + }); +}); +``` + +✅ **Use Case**: View all users. + +--- + +### 2. 🟡 POST – Create New User + +```js +app.post("/users", (req, res) => { + const { name, email } = req.body; + + if (!name || !email) { + return res.json({ + success: false, + message: "Name and email are required", + data: null, + }); + } + + const newUser = { + id: Math.floor(Math.random() * 1000000), + name, + email, + }; + + users.push(newUser); + + res.json({ + success: true, + message: "User created successfully", + data: newUser, + }); +}); +``` + +✅ **Use Case**: Register a new user. + +--- + +### 3. 🔵 PUT – Replace User by ID + +```js +app.put("/users/:id", (req, res) => { + const { id } = req.params; + const { name, email } = req.body; + + const index = users.findIndex((u) => u.id == id); + + if (index === -1) { + return res.json({ + success: false, + message: "User not found", + data: null, + }); + } + + const updatedUser = { + id: parseInt(id), + name, + email, + }; + + users[index] = updatedUser; + + res.json({ + success: true, + message: "User updated successfully", + data: updatedUser, + }); +}); +``` + +✅ **Use Case**: Replace all details of a user. + +--- + +### 4. 🟣 PATCH – Update Part of a User + +```js +app.patch("/users/:id", (req, res) => { + const { id } = req.params; + const { name, email } = req.body; + + const user = users.find((u) => u.id == id); + + if (!user) { + return res.json({ + success: false, + message: `User with id ${id} not found`, + data: null, + }); + } + + if (name) user.name = name; + if (email) user.email = email; + + res.json({ + success: true, + message: `User with id ${id} updated successfully`, + data: user, + }); +}); +``` + +✅ **Use Case**: Update only a user’s email or name. + +--- + +### 5. 🔴 DELETE – Remove a User by ID + +```js +app.delete("/users/:id", (req, res) => { + const { id } = req.params; + + const index = users.findIndex((u) => u.id == id); + + if (index === -1) { + return res.json({ + success: false, + message: `User with id ${id} not found`, + data: null, + }); + } + + users.splice(index, 1); + + res.json({ + success: true, + message: `User with id ${id} deleted successfully`, + data: users, + }); +}); +``` + +✅ **Use Case**: Delete a user by ID. + +--- + +## 7️⃣ Starting the Server + +```js +app.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); +``` + +--- + +## 📌 How the API Works + +1. **Client** sends a request (GET, POST, PUT, PATCH, DELETE). +2. **Server** processes it and interacts with the **database** (or array in this example). +3. **Server** sends a JSON response back to the client. + +--- diff --git a/package-lock.json b/package-lock.json index a8679b29..a2155072 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2898,147 +2898,6 @@ "node": ">=16.14" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "license": "MIT", - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3054,72 +2913,6 @@ "@hapi/hoek": "^9.0.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4281,16 +4074,6 @@ "acorn": "^8.14.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", @@ -6172,13 +5955,6 @@ "node": ">=4.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT", - "peer": true - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -6727,67 +6503,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, "node_modules/eslint-plugin-markdownlint": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/eslint-plugin-markdownlint/-/eslint-plugin-markdownlint-0.4.1.tgz", @@ -6803,67 +6518,6 @@ "eslint": ">=7.5.0" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -6877,19 +6531,6 @@ "node": ">=4" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7126,13 +6767,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT", - "peer": true - }, "node_modules/fast-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", @@ -7212,19 +6846,6 @@ "node": ">=0.4.0" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -7359,27 +6980,6 @@ "flat": "cli.js" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "license": "ISC", - "peer": true - }, "node_modules/flux": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", @@ -7764,19 +7364,6 @@ "which": "bin/which" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -9014,13 +8601,6 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT", - "peer": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9033,13 +8613,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT", - "peer": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9064,16 +8637,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9123,20 +8686,6 @@ "node": ">=6" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -9229,13 +8778,6 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT", - "peer": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -9706,13 +9248,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT", - "peer": true - }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", @@ -9969,24 +9504,6 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -11089,16 +10606,6 @@ "postcss": "^8.2.15" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -12376,13 +11883,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -13495,19 +12995,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -13563,20 +13050,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/ua-parser-js": { "version": "1.0.40", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", @@ -14828,16 +14301,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", diff --git a/static/expressjs/rest-api-http-methods/rest-api-architecture.jpg b/static/expressjs/rest-api-http-methods/rest-api-architecture.jpg new file mode 100644 index 00000000..c97c33f9 Binary files /dev/null and b/static/expressjs/rest-api-http-methods/rest-api-architecture.jpg differ diff --git a/static/tip-and-tools/01/01.5.png b/static/react/tip-and-tools/01/01.5.png similarity index 100% rename from static/tip-and-tools/01/01.5.png rename to static/react/tip-and-tools/01/01.5.png diff --git a/static/tip-and-tools/01/01.png b/static/react/tip-and-tools/01/01.png similarity index 100% rename from static/tip-and-tools/01/01.png rename to static/react/tip-and-tools/01/01.png diff --git a/static/tip-and-tools/01/02.png b/static/react/tip-and-tools/01/02.png similarity index 100% rename from static/tip-and-tools/01/02.png rename to static/react/tip-and-tools/01/02.png diff --git a/static/tip-and-tools/01/03.png b/static/react/tip-and-tools/01/03.png similarity index 100% rename from static/tip-and-tools/01/03.png rename to static/react/tip-and-tools/01/03.png diff --git a/static/tip-and-tools/01/04.png b/static/react/tip-and-tools/01/04.png similarity index 100% rename from static/tip-and-tools/01/04.png rename to static/react/tip-and-tools/01/04.png diff --git a/static/tip-and-tools/01/05.png b/static/react/tip-and-tools/01/05.png similarity index 100% rename from static/tip-and-tools/01/05.png rename to static/react/tip-and-tools/01/05.png diff --git a/static/tip-and-tools/01/06.png b/static/react/tip-and-tools/01/06.png similarity index 100% rename from static/tip-and-tools/01/06.png rename to static/react/tip-and-tools/01/06.png diff --git a/static/tip-and-tools/01/07.png b/static/react/tip-and-tools/01/07.png similarity index 100% rename from static/tip-and-tools/01/07.png rename to static/react/tip-and-tools/01/07.png diff --git a/static/tip-and-tools/01/08.png b/static/react/tip-and-tools/01/08.png similarity index 100% rename from static/tip-and-tools/01/08.png rename to static/react/tip-and-tools/01/08.png diff --git a/static/tip-and-tools/01/screenshot-1.png b/static/react/tip-and-tools/01/screenshot-1.png similarity index 100% rename from static/tip-and-tools/01/screenshot-1.png rename to static/react/tip-and-tools/01/screenshot-1.png diff --git a/static/tip-and-tools/01/screenshot-2.png b/static/react/tip-and-tools/01/screenshot-2.png similarity index 100% rename from static/tip-and-tools/01/screenshot-2.png rename to static/react/tip-and-tools/01/screenshot-2.png diff --git a/static/tip-and-tools/01/screenshot-3.png b/static/react/tip-and-tools/01/screenshot-3.png similarity index 100% rename from static/tip-and-tools/01/screenshot-3.png rename to static/react/tip-and-tools/01/screenshot-3.png diff --git a/static/tip-and-tools/01/screenshot-4.png b/static/react/tip-and-tools/01/screenshot-4.png similarity index 100% rename from static/tip-and-tools/01/screenshot-4.png rename to static/react/tip-and-tools/01/screenshot-4.png diff --git a/static/tip-and-tools/01/screenshot-5.png b/static/react/tip-and-tools/01/screenshot-5.png similarity index 100% rename from static/tip-and-tools/01/screenshot-5.png rename to static/react/tip-and-tools/01/screenshot-5.png diff --git a/static/tip-and-tools/01/screenshot-6.png b/static/react/tip-and-tools/01/screenshot-6.png similarity index 100% rename from static/tip-and-tools/01/screenshot-6.png rename to static/react/tip-and-tools/01/screenshot-6.png diff --git a/static/tip-and-tools/01/screenshot-7.png b/static/react/tip-and-tools/01/screenshot-7.png similarity index 100% rename from static/tip-and-tools/01/screenshot-7.png rename to static/react/tip-and-tools/01/screenshot-7.png diff --git a/static/tip-and-tools/02/screenshot-1.png b/static/react/tip-and-tools/02/screenshot-1.png similarity index 100% rename from static/tip-and-tools/02/screenshot-1.png rename to static/react/tip-and-tools/02/screenshot-1.png diff --git a/static/tip-and-tools/02/screenshot-2.png b/static/react/tip-and-tools/02/screenshot-2.png similarity index 100% rename from static/tip-and-tools/02/screenshot-2.png rename to static/react/tip-and-tools/02/screenshot-2.png diff --git a/static/tip-and-tools/02/screenshot-3.png b/static/react/tip-and-tools/02/screenshot-3.png similarity index 100% rename from static/tip-and-tools/02/screenshot-3.png rename to static/react/tip-and-tools/02/screenshot-3.png diff --git a/static/tip-and-tools/02/screenshot-4.png b/static/react/tip-and-tools/02/screenshot-4.png similarity index 100% rename from static/tip-and-tools/02/screenshot-4.png rename to static/react/tip-and-tools/02/screenshot-4.png diff --git a/static/tip-and-tools/02/screenshot-5.png b/static/react/tip-and-tools/02/screenshot-5.png similarity index 100% rename from static/tip-and-tools/02/screenshot-5.png rename to static/react/tip-and-tools/02/screenshot-5.png diff --git a/static/tip-and-tools/02/screenshot-6.png b/static/react/tip-and-tools/02/screenshot-6.png similarity index 100% rename from static/tip-and-tools/02/screenshot-6.png rename to static/react/tip-and-tools/02/screenshot-6.png diff --git a/static/tip-and-tools/02/screenshot-7.png b/static/react/tip-and-tools/02/screenshot-7.png similarity index 100% rename from static/tip-and-tools/02/screenshot-7.png rename to static/react/tip-and-tools/02/screenshot-7.png diff --git a/static/tip-and-tools/02/screenshot-8.png b/static/react/tip-and-tools/02/screenshot-8.png similarity index 100% rename from static/tip-and-tools/02/screenshot-8.png rename to static/react/tip-and-tools/02/screenshot-8.png diff --git a/static/tip-and-tools/03/screenshot-1.png b/static/react/tip-and-tools/03/screenshot-1.png similarity index 100% rename from static/tip-and-tools/03/screenshot-1.png rename to static/react/tip-and-tools/03/screenshot-1.png diff --git a/static/tip-and-tools/03/screenshot-2.png b/static/react/tip-and-tools/03/screenshot-2.png similarity index 100% rename from static/tip-and-tools/03/screenshot-2.png rename to static/react/tip-and-tools/03/screenshot-2.png diff --git a/static/tip-and-tools/03/screenshot-3.png b/static/react/tip-and-tools/03/screenshot-3.png similarity index 100% rename from static/tip-and-tools/03/screenshot-3.png rename to static/react/tip-and-tools/03/screenshot-3.png diff --git a/static/tip-and-tools/03/screenshot-4.png b/static/react/tip-and-tools/03/screenshot-4.png similarity index 100% rename from static/tip-and-tools/03/screenshot-4.png rename to static/react/tip-and-tools/03/screenshot-4.png diff --git a/static/tip-and-tools/03/screenshot-5.png b/static/react/tip-and-tools/03/screenshot-5.png similarity index 100% rename from static/tip-and-tools/03/screenshot-5.png rename to static/react/tip-and-tools/03/screenshot-5.png diff --git a/static/tip-and-tools/03/screenshot-6.png b/static/react/tip-and-tools/03/screenshot-6.png similarity index 100% rename from static/tip-and-tools/03/screenshot-6.png rename to static/react/tip-and-tools/03/screenshot-6.png diff --git a/static/tip-and-tools/03/screenshot-7.png b/static/react/tip-and-tools/03/screenshot-7.png similarity index 100% rename from static/tip-and-tools/03/screenshot-7.png rename to static/react/tip-and-tools/03/screenshot-7.png diff --git a/static/tip-and-tools/04/screenshot-1.png b/static/react/tip-and-tools/04/screenshot-1.png similarity index 100% rename from static/tip-and-tools/04/screenshot-1.png rename to static/react/tip-and-tools/04/screenshot-1.png diff --git a/static/tip-and-tools/04/screenshot-2.png b/static/react/tip-and-tools/04/screenshot-2.png similarity index 100% rename from static/tip-and-tools/04/screenshot-2.png rename to static/react/tip-and-tools/04/screenshot-2.png diff --git a/static/tip-and-tools/04/screenshot-3.png b/static/react/tip-and-tools/04/screenshot-3.png similarity index 100% rename from static/tip-and-tools/04/screenshot-3.png rename to static/react/tip-and-tools/04/screenshot-3.png diff --git a/static/tip-and-tools/05/screenshot-1.png b/static/react/tip-and-tools/05/screenshot-1.png similarity index 100% rename from static/tip-and-tools/05/screenshot-1.png rename to static/react/tip-and-tools/05/screenshot-1.png diff --git a/static/tip-and-tools/05/screenshot-2.png b/static/react/tip-and-tools/05/screenshot-2.png similarity index 100% rename from static/tip-and-tools/05/screenshot-2.png rename to static/react/tip-and-tools/05/screenshot-2.png diff --git a/static/tip-and-tools/05/screenshot-3.png b/static/react/tip-and-tools/05/screenshot-3.png similarity index 100% rename from static/tip-and-tools/05/screenshot-3.png rename to static/react/tip-and-tools/05/screenshot-3.png diff --git a/static/tip-and-tools/05/screenshot-4.png b/static/react/tip-and-tools/05/screenshot-4.png similarity index 100% rename from static/tip-and-tools/05/screenshot-4.png rename to static/react/tip-and-tools/05/screenshot-4.png diff --git a/static/tip-and-tools/05/screenshot-5.png b/static/react/tip-and-tools/05/screenshot-5.png similarity index 100% rename from static/tip-and-tools/05/screenshot-5.png rename to static/react/tip-and-tools/05/screenshot-5.png diff --git a/static/tip-and-tools/05/screenshot-6.png b/static/react/tip-and-tools/05/screenshot-6.png similarity index 100% rename from static/tip-and-tools/05/screenshot-6.png rename to static/react/tip-and-tools/05/screenshot-6.png diff --git a/static/tip-and-tools/05/screenshot-7.png b/static/react/tip-and-tools/05/screenshot-7.png similarity index 100% rename from static/tip-and-tools/05/screenshot-7.png rename to static/react/tip-and-tools/05/screenshot-7.png diff --git a/static/tip-and-tools/06/screenshot-0.png b/static/react/tip-and-tools/06/screenshot-0.png similarity index 100% rename from static/tip-and-tools/06/screenshot-0.png rename to static/react/tip-and-tools/06/screenshot-0.png diff --git a/static/tip-and-tools/06/screenshot-1.png b/static/react/tip-and-tools/06/screenshot-1.png similarity index 100% rename from static/tip-and-tools/06/screenshot-1.png rename to static/react/tip-and-tools/06/screenshot-1.png diff --git a/static/tip-and-tools/06/screenshot-2.png b/static/react/tip-and-tools/06/screenshot-2.png similarity index 100% rename from static/tip-and-tools/06/screenshot-2.png rename to static/react/tip-and-tools/06/screenshot-2.png diff --git a/static/tip-and-tools/06/screenshot-3.png b/static/react/tip-and-tools/06/screenshot-3.png similarity index 100% rename from static/tip-and-tools/06/screenshot-3.png rename to static/react/tip-and-tools/06/screenshot-3.png diff --git a/static/tip-and-tools/06/screenshot-4.png b/static/react/tip-and-tools/06/screenshot-4.png similarity index 100% rename from static/tip-and-tools/06/screenshot-4.png rename to static/react/tip-and-tools/06/screenshot-4.png diff --git a/static/tip-and-tools/06/screenshot-5.png b/static/react/tip-and-tools/06/screenshot-5.png similarity index 100% rename from static/tip-and-tools/06/screenshot-5.png rename to static/react/tip-and-tools/06/screenshot-5.png diff --git a/static/tip-and-tools/06/screenshot-6.png b/static/react/tip-and-tools/06/screenshot-6.png similarity index 100% rename from static/tip-and-tools/06/screenshot-6.png rename to static/react/tip-and-tools/06/screenshot-6.png diff --git a/static/tip-and-tools/06/screenshot-7.png b/static/react/tip-and-tools/06/screenshot-7.png similarity index 100% rename from static/tip-and-tools/06/screenshot-7.png rename to static/react/tip-and-tools/06/screenshot-7.png diff --git a/static/tip-and-tools/08/screenshot1.png b/static/react/tip-and-tools/08/screenshot1.png similarity index 100% rename from static/tip-and-tools/08/screenshot1.png rename to static/react/tip-and-tools/08/screenshot1.png diff --git a/static/tip-and-tools/09/color-picker.png b/static/react/tip-and-tools/09/color-picker.png similarity index 100% rename from static/tip-and-tools/09/color-picker.png rename to static/react/tip-and-tools/09/color-picker.png diff --git a/static/tip-and-tools/09/color1.png b/static/react/tip-and-tools/09/color1.png similarity index 100% rename from static/tip-and-tools/09/color1.png rename to static/react/tip-and-tools/09/color1.png diff --git a/static/tip-and-tools/09/color2.png b/static/react/tip-and-tools/09/color2.png similarity index 100% rename from static/tip-and-tools/09/color2.png rename to static/react/tip-and-tools/09/color2.png diff --git a/static/tip-and-tools/10/step1.jpg b/static/react/tip-and-tools/10/step1.jpg similarity index 100% rename from static/tip-and-tools/10/step1.jpg rename to static/react/tip-and-tools/10/step1.jpg diff --git a/static/tip-and-tools/10/step2.jpg b/static/react/tip-and-tools/10/step2.jpg similarity index 100% rename from static/tip-and-tools/10/step2.jpg rename to static/react/tip-and-tools/10/step2.jpg diff --git a/static/tip-and-tools/10/step3.jpg b/static/react/tip-and-tools/10/step3.jpg similarity index 100% rename from static/tip-and-tools/10/step3.jpg rename to static/react/tip-and-tools/10/step3.jpg diff --git a/static/tip-and-tools/10/step4.jpg b/static/react/tip-and-tools/10/step4.jpg similarity index 100% rename from static/tip-and-tools/10/step4.jpg rename to static/react/tip-and-tools/10/step4.jpg diff --git a/static/tip-and-tools/10/step5.jpg b/static/react/tip-and-tools/10/step5.jpg similarity index 100% rename from static/tip-and-tools/10/step5.jpg rename to static/react/tip-and-tools/10/step5.jpg diff --git a/static/tip-and-tools/10/step6.jpg b/static/react/tip-and-tools/10/step6.jpg similarity index 100% rename from static/tip-and-tools/10/step6.jpg rename to static/react/tip-and-tools/10/step6.jpg diff --git a/static/tip-and-tools/10/step7.jpg b/static/react/tip-and-tools/10/step7.jpg similarity index 100% rename from static/tip-and-tools/10/step7.jpg rename to static/react/tip-and-tools/10/step7.jpg diff --git a/static/tip-and-tools/11/s1.png b/static/react/tip-and-tools/11/s1.png similarity index 100% rename from static/tip-and-tools/11/s1.png rename to static/react/tip-and-tools/11/s1.png diff --git a/static/tip-and-tools/11/s2.png b/static/react/tip-and-tools/11/s2.png similarity index 100% rename from static/tip-and-tools/11/s2.png rename to static/react/tip-and-tools/11/s2.png diff --git a/static/tip-and-tools/11/s3.png b/static/react/tip-and-tools/11/s3.png similarity index 100% rename from static/tip-and-tools/11/s3.png rename to static/react/tip-and-tools/11/s3.png diff --git a/static/tip-and-tools/11/s4.png b/static/react/tip-and-tools/11/s4.png similarity index 100% rename from static/tip-and-tools/11/s4.png rename to static/react/tip-and-tools/11/s4.png diff --git a/static/tip-and-tools/11/s5.png b/static/react/tip-and-tools/11/s5.png similarity index 100% rename from static/tip-and-tools/11/s5.png rename to static/react/tip-and-tools/11/s5.png diff --git a/static/tip-and-tools/11/s6.png b/static/react/tip-and-tools/11/s6.png similarity index 100% rename from static/tip-and-tools/11/s6.png rename to static/react/tip-and-tools/11/s6.png diff --git a/static/tip-and-tools/11/s7.png b/static/react/tip-and-tools/11/s7.png similarity index 100% rename from static/tip-and-tools/11/s7.png rename to static/react/tip-and-tools/11/s7.png diff --git a/static/tip-and-tools/12/output-1.png b/static/react/tip-and-tools/12/output-1.png similarity index 100% rename from static/tip-and-tools/12/output-1.png rename to static/react/tip-and-tools/12/output-1.png diff --git a/static/tip-and-tools/12/output-2.png b/static/react/tip-and-tools/12/output-2.png similarity index 100% rename from static/tip-and-tools/12/output-2.png rename to static/react/tip-and-tools/12/output-2.png diff --git a/static/tip-and-tools/12/output-3.png b/static/react/tip-and-tools/12/output-3.png similarity index 100% rename from static/tip-and-tools/12/output-3.png rename to static/react/tip-and-tools/12/output-3.png diff --git a/static/tip-and-tools/12/output-5.png b/static/react/tip-and-tools/12/output-5.png similarity index 100% rename from static/tip-and-tools/12/output-5.png rename to static/react/tip-and-tools/12/output-5.png diff --git a/static/tip-and-tools/12/output-6.png b/static/react/tip-and-tools/12/output-6.png similarity index 100% rename from static/tip-and-tools/12/output-6.png rename to static/react/tip-and-tools/12/output-6.png diff --git a/static/tip-and-tools/12/output-7.png b/static/react/tip-and-tools/12/output-7.png similarity index 100% rename from static/tip-and-tools/12/output-7.png rename to static/react/tip-and-tools/12/output-7.png diff --git a/static/tip-and-tools/13/s1 - Copy.png b/static/react/tip-and-tools/13/s1 - Copy.png similarity index 100% rename from static/tip-and-tools/13/s1 - Copy.png rename to static/react/tip-and-tools/13/s1 - Copy.png diff --git a/static/tip-and-tools/13/s1.png b/static/react/tip-and-tools/13/s1.png similarity index 100% rename from static/tip-and-tools/13/s1.png rename to static/react/tip-and-tools/13/s1.png diff --git a/static/tip-and-tools/13/s10.png b/static/react/tip-and-tools/13/s10.png similarity index 100% rename from static/tip-and-tools/13/s10.png rename to static/react/tip-and-tools/13/s10.png diff --git a/static/tip-and-tools/13/s11.png b/static/react/tip-and-tools/13/s11.png similarity index 100% rename from static/tip-and-tools/13/s11.png rename to static/react/tip-and-tools/13/s11.png diff --git a/static/tip-and-tools/13/s12.png b/static/react/tip-and-tools/13/s12.png similarity index 100% rename from static/tip-and-tools/13/s12.png rename to static/react/tip-and-tools/13/s12.png diff --git a/static/tip-and-tools/13/s13.png b/static/react/tip-and-tools/13/s13.png similarity index 100% rename from static/tip-and-tools/13/s13.png rename to static/react/tip-and-tools/13/s13.png diff --git a/static/tip-and-tools/13/s14.png b/static/react/tip-and-tools/13/s14.png similarity index 100% rename from static/tip-and-tools/13/s14.png rename to static/react/tip-and-tools/13/s14.png diff --git a/static/tip-and-tools/13/s15.png b/static/react/tip-and-tools/13/s15.png similarity index 100% rename from static/tip-and-tools/13/s15.png rename to static/react/tip-and-tools/13/s15.png diff --git a/static/tip-and-tools/13/s2.png b/static/react/tip-and-tools/13/s2.png similarity index 100% rename from static/tip-and-tools/13/s2.png rename to static/react/tip-and-tools/13/s2.png diff --git a/static/tip-and-tools/13/s3.png b/static/react/tip-and-tools/13/s3.png similarity index 100% rename from static/tip-and-tools/13/s3.png rename to static/react/tip-and-tools/13/s3.png diff --git a/static/tip-and-tools/13/s4.png b/static/react/tip-and-tools/13/s4.png similarity index 100% rename from static/tip-and-tools/13/s4.png rename to static/react/tip-and-tools/13/s4.png diff --git a/static/tip-and-tools/13/s5.png b/static/react/tip-and-tools/13/s5.png similarity index 100% rename from static/tip-and-tools/13/s5.png rename to static/react/tip-and-tools/13/s5.png diff --git a/static/tip-and-tools/13/s6.png b/static/react/tip-and-tools/13/s6.png similarity index 100% rename from static/tip-and-tools/13/s6.png rename to static/react/tip-and-tools/13/s6.png diff --git a/static/tip-and-tools/13/s7.png b/static/react/tip-and-tools/13/s7.png similarity index 100% rename from static/tip-and-tools/13/s7.png rename to static/react/tip-and-tools/13/s7.png diff --git a/static/tip-and-tools/13/s8.png b/static/react/tip-and-tools/13/s8.png similarity index 100% rename from static/tip-and-tools/13/s8.png rename to static/react/tip-and-tools/13/s8.png diff --git a/static/tip-and-tools/13/s9.png b/static/react/tip-and-tools/13/s9.png similarity index 100% rename from static/tip-and-tools/13/s9.png rename to static/react/tip-and-tools/13/s9.png diff --git a/static/tip-and-tools/14/1.png b/static/react/tip-and-tools/14/1.png similarity index 100% rename from static/tip-and-tools/14/1.png rename to static/react/tip-and-tools/14/1.png diff --git a/static/tip-and-tools/14/2.jpg b/static/react/tip-and-tools/14/2.jpg similarity index 100% rename from static/tip-and-tools/14/2.jpg rename to static/react/tip-and-tools/14/2.jpg diff --git a/static/tip-and-tools/14/3.jpg b/static/react/tip-and-tools/14/3.jpg similarity index 100% rename from static/tip-and-tools/14/3.jpg rename to static/react/tip-and-tools/14/3.jpg diff --git a/static/tip-and-tools/14/4.jpg b/static/react/tip-and-tools/14/4.jpg similarity index 100% rename from static/tip-and-tools/14/4.jpg rename to static/react/tip-and-tools/14/4.jpg diff --git a/static/tip-and-tools/14/5.png b/static/react/tip-and-tools/14/5.png similarity index 100% rename from static/tip-and-tools/14/5.png rename to static/react/tip-and-tools/14/5.png diff --git a/static/tip-and-tools/14/6img.png b/static/react/tip-and-tools/14/6img.png similarity index 100% rename from static/tip-and-tools/14/6img.png rename to static/react/tip-and-tools/14/6img.png diff --git a/static/tip-and-tools/14/7.png b/static/react/tip-and-tools/14/7.png similarity index 100% rename from static/tip-and-tools/14/7.png rename to static/react/tip-and-tools/14/7.png diff --git a/static/tip-and-tools/14/8.png b/static/react/tip-and-tools/14/8.png similarity index 100% rename from static/tip-and-tools/14/8.png rename to static/react/tip-and-tools/14/8.png diff --git a/static/tip-and-tools/14/9.png b/static/react/tip-and-tools/14/9.png similarity index 100% rename from static/tip-and-tools/14/9.png rename to static/react/tip-and-tools/14/9.png diff --git a/static/tip-and-tools/15/1.png b/static/react/tip-and-tools/15/1.png similarity index 100% rename from static/tip-and-tools/15/1.png rename to static/react/tip-and-tools/15/1.png diff --git a/static/tip-and-tools/15/2.png b/static/react/tip-and-tools/15/2.png similarity index 100% rename from static/tip-and-tools/15/2.png rename to static/react/tip-and-tools/15/2.png diff --git a/static/tip-and-tools/16/readme.png b/static/react/tip-and-tools/16/readme.png similarity index 100% rename from static/tip-and-tools/16/readme.png rename to static/react/tip-and-tools/16/readme.png