From a1de3131c26d7c1656d2da39c98507db978a7f82 Mon Sep 17 00:00:00 2001 From: Kyell182 Date: Thu, 27 Nov 2025 23:13:11 +0000 Subject: [PATCH 1/2] added the commands to build the abb file an api for the stores --- client/eas.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/client/eas.json b/client/eas.json index 37e5adf..4694626 100644 --- a/client/eas.json +++ b/client/eas.json @@ -15,7 +15,17 @@ } }, "production": { - "autoIncrement": true + "autoIncrement": true, + "distribution": "store", + "env":{ + "EXPO_PUBLIC_API_URL":"https://api.smart-gestures.devbitapp.be" + }, + "android": { + "buildType": "app-bundle" + }, + "ios": { + "image": "latest" + } } }, "submit": { From 6538719db4f8426bdc58f095803e9dc939adbc00 Mon Sep 17 00:00:00 2001 From: Kyell182 Date: Thu, 4 Dec 2025 15:45:21 +0100 Subject: [PATCH 2/2] adjusted scripts to be easier to build and adjusted mk files --- client/app.json | 3 +- client/package.json | 6 + .../Development/buildingGuide.md | 47 +++ docs/MkDocs/structure.md | 40 ++ docs/assets/cli.png | Bin 0 -> 11803 bytes docs/assets/logo-wordmark.png | Bin 0 -> 12245 bytes docs/assets/node.js_logo.png | Bin 0 -> 7760 bytes docs/assets/npm vs npx.png | Bin 0 -> 17067 bytes docs/assets/npm.png | Bin 0 -> 27747 bytes docs/info/eas-cli.md | 9 +- docs/info/expo.md | 352 ++++++++++++++++++ docs/info/node.js.md | 346 +++++++++++++++++ docs/info/npm-npx.md | 12 +- 13 files changed, 805 insertions(+), 10 deletions(-) create mode 100644 docs/assets/cli.png create mode 100644 docs/assets/logo-wordmark.png create mode 100644 docs/assets/node.js_logo.png create mode 100644 docs/assets/npm vs npx.png create mode 100644 docs/assets/npm.png diff --git a/client/app.json b/client/app.json index 5fc73c6..de4c789 100644 --- a/client/app.json +++ b/client/app.json @@ -11,7 +11,8 @@ "ios": { "supportsTablet": true, "infoPlist": { - "NSCameraUsageDescription": "deze app gebruikt de camera om de signs te kunnen vertalen." + "NSCameraUsageDescription": "deze app gebruikt de camera om de signs te kunnen vertalen.", + "ITSAppUsesNonExemptEncryption": false }, "bundleIdentifier": "com.anonymous.signapse" }, diff --git a/client/package.json b/client/package.json index 8662428..19f0aed 100644 --- a/client/package.json +++ b/client/package.json @@ -8,6 +8,12 @@ "ios": "expo start --ios", "web": "expo start --web", "export": "expo export -p web", + "prod:build:android": "npx eas build --platform android --profile production --clear-cache", + "prod:build:ios": "npx eas build --platform ios --profile production --clear-cache", + "dev:build:android": "npx eas build --platform android --profile development --clear-cache", + "dev:build:ios": "npx eas build --platform ios --profile development --clear-cache", + "preview:build:android": "npx eas build --platform android --profile preview --clear-cache", + "preview:build:ios": "npx eas build --platform ios --profile preview --clear-cache", "serve": "expo serve", "lint": "expo lint", "prepare": "husky" diff --git a/docs/Getting Started/Development/buildingGuide.md b/docs/Getting Started/Development/buildingGuide.md index cc950c4..6fe034f 100644 --- a/docs/Getting Started/Development/buildingGuide.md +++ b/docs/Getting Started/Development/buildingGuide.md @@ -1,3 +1,6 @@ +
+ Beschrijving van afbeelding +
# EAS Build Guide This guide describes how to perform three types of builds with **EAS (Expo Application Services)**: cloud builds, local builds, and iOS builds. This is suitable for beginners and other developers who want to get started quickly. @@ -72,6 +75,7 @@ This will build the app in the cloud for iOS using the `production` build profil 4. Choose the build profile when prompted (for example `preview`, `production`, or `development`). 5. EAS will show a link where you can monitor the build status. + #### Example terminal output: ```bash @@ -107,6 +111,30 @@ With a local build, the app is built on your own computer. Useful for quick test npx eas build --platform android '--local' --profile preview npx eas build --platform ios '--local' --profile preview ``` +!!!! note + for ease we pre programmed the command in scripts in package.json like so: + ```json + "scripts": + { + "prod:build:android": "npx eas build --platform android --profile production --clear-cache", + "prod:build:ios": "npx eas build --platform ios --profile production --clear-cache", + "dev:build:android": "npx eas build --platform android --profile development --clear-cache", + "dev:build:ios": "npx eas build --platform ios --profile development --clear-cache", + "preview:build:android": "npx eas build --platform android --profile preview --clear-cache", + "preview:build:ios": "npx eas build --platform ios --profile preview --clear-cache", + } + ``` + + You can run these commands via: + ```bash + npm run prod:build:android # this will trigger a production build for android + npm run prod:build:ios # this will trigger a production build for ios + npm run dev:build:android # this will trigger a development build for android + npm run dev:build:ios # this will trigger a development build for ios + npm run preview:build:android # this will trigger a preview build for android + npm run preview:build:ios # this will trigger a preview build for ios + ``` + you can still add extra flags like `--local` if needed. You can rename the file afterward using F2. 3. The build runs locally and the result is in the `./build` folder of your project. @@ -145,6 +173,25 @@ npx eas build --platform ios --profile production * Choose a provisioning profile (EAS can handle this automatically) 4. EAS will start the cloud build and provide a link to monitor the status. +!!!! note + for ease we pre programmed the command in scripts in package.json like so: + ```json + "scripts": + { + "prod:build:ios": "npx eas build --platform ios --profile production --clear-cache", + "dev:build:ios": "npx eas build --platform ios --profile development --clear-cache", + "preview:build:ios": "npx eas build --platform ios --profile preview --clear-cache", + } + ``` + + You can run these commands via: + ```bash + npm run prod:build:ios # this will trigger a production build for ios + npm run dev:build:ios # this will trigger a development build for ios + npm run preview:build:ios # this will trigger a preview build for ios + ``` + you can still add extra flags like `--non-interactive` if needed. + #### Example terminal output: ```bash diff --git a/docs/MkDocs/structure.md b/docs/MkDocs/structure.md index 875b5b2..6cb973c 100644 --- a/docs/MkDocs/structure.md +++ b/docs/MkDocs/structure.md @@ -2,6 +2,46 @@ This document provides a comprehensive overview of how the MkDocs documentation system is structured and configured in the Smart Glasses project. +## Table of Contents +- [MkDocs Structure Guide](#mkdocs-structure-guide) + - [Table of Contents ](#table-of-contents-) + - [Directory Structure](#directory-structure) + - [Configuration Architecture](#configuration-architecture) + - [1. Main Configuration (`config/mkdocs/mkdocs.yml`)](#1-main-configuration-configmkdocsmkdocsyml) + - [Site Information](#site-information) + - [File Structure](#file-structure) + - [Theme Configuration](#theme-configuration) + - [Markdown Extensions](#markdown-extensions) + - [Plugins](#plugins) + - [2. Docker Configuration (`config/mkdocs/Dockerfile`)](#2-docker-configuration-configmkdocsdockerfile) + - [Base Image](#base-image) + - [Dependencies](#dependencies) + - [File Structure Setup](#file-structure-setup) + - [Service Configuration](#service-configuration) + - [3. Service Orchestration (`docker-compose.yaml`)](#3-service-orchestration-docker-composeyaml) + - [Service Definition](#service-definition) + - [Content Organization](#content-organization) + - [Development Workflow](#development-workflow) + - [1. Local Development](#1-local-development) + - [2. Content Creation](#2-content-creation) + - [3. Configuration Updates](#3-configuration-updates) + - [Advanced Features](#advanced-features) + - [Mermaid Diagrams](#mermaid-diagrams) + - [Code Highlighting](#code-highlighting) + - [Admonitions](#admonitions) + - [Customization Points](#customization-points) + - [Theme Customization](#theme-customization) + - [Navigation Structure](#navigation-structure) + - [Plugin Extensions](#plugin-extensions) + - [Deployment Considerations](#deployment-considerations) + - [Production Deployment](#production-deployment) + - [Performance Optimization](#performance-optimization) + - [Security](#security) + - [Troubleshooting](#troubleshooting) + - [Common Issues](#common-issues) + - [Debug Mode](#debug-mode) + - [Log Access](#log-access) + ## Directory Structure ```text diff --git a/docs/assets/cli.png b/docs/assets/cli.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e9daeea26fc35dd00f5991ef196c75fcacb421 GIT binary patch literal 11803 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 literal 0 HcmV?d00001 diff --git a/docs/assets/logo-wordmark.png b/docs/assets/logo-wordmark.png new file mode 100644 index 0000000000000000000000000000000000000000..597a5a6649dd766d069ac011575bfec8e5a45e3f GIT binary patch literal 12245 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 A?f?J) literal 0 HcmV?d00001 diff --git a/docs/assets/npm vs npx.png b/docs/assets/npm vs npx.png new file mode 100644 index 0000000000000000000000000000000000000000..5e78fe67b871589df606cd98d1293edce0dfa759 GIT binary patch literal 17067 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 literal 0 HcmV?d00001 diff --git a/docs/assets/npm.png b/docs/assets/npm.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4342fa6c6813b9d6ee69eb45c72861a207a65c GIT binary patch literal 27747 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 U8(i%x0b5XBKG#sJl!t`;ACsENegFUf literal 0 HcmV?d00001 diff --git a/docs/info/eas-cli.md b/docs/info/eas-cli.md index 8ab6f67..f40d020 100644 --- a/docs/info/eas-cli.md +++ b/docs/info/eas-cli.md @@ -1,12 +1,11 @@ -!!! warning - This file serves as a reference for understanding EAS-CLI. For installation or setup, see the [Getting Started](../Getting%20Started/README.md) folder of your Expo project. + +![EAS-CLI Logo](/assets/cli.png) # EAS-CLI — Info (Expo Application Services Command Line Interface) - - - +!!! warning + This file serves as a reference for understanding EAS-CLI. For installation or setup, see the [Getting Started](../Getting%20Started/README.md) folder of your Expo project. --- ## What is EAS-CLI? diff --git a/docs/info/expo.md b/docs/info/expo.md index 8eb0cfb..def43cd 100644 --- a/docs/info/expo.md +++ b/docs/info/expo.md @@ -1,2 +1,354 @@ !!! warning This file serves as a reference for understanding expo. For installation or setup, see the [Getting Started](../Getting%20Started/README.md) folder. + +# Expo Reference Guide + +![expo logo](/assets/logo-wordmark.png) + +## What is Expo? + +Expo is a framework and toolchain built on top of React Native. +It lets you build mobile apps for iOS, Android, and Web using one JavaScript or TypeScript codebase. +It provides a preconfigured native runtime, access to native APIs, fast development through Expo Go, and cloud builds using EAS (Expo Application Services). + +--- + +## Why use Expo? + +- Create mobile apps without Xcode or Android Studio. +- Cross-platform: iOS, Android, and web from one codebase. +- Instant reload and rapid iteration with Expo Go. +- Access to Camera, Haptics, Sensors, FileSystem, Notifications, and more. +- Production-ready builds with EAS. +- Strong TypeScript support. +- Excellent developer experience. + +--- + +## Project Structure + +Create a new Expo project: + +```bash +npx create-expo-app my-app +``` + +Typical structure: + +- `app/` — screens and routes (Expo Router) +- `app.json` or `app.config.js` — configuration +- `package.json` — dependencies and scripts +- `assets/` — images, fonts, icons +- `metro.config.js` — bundler config (optional) + +Example `app.json`: + +```json +{ + "expo": { + "name": "my-expo-app", + "slug": "my-expo-app", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "android": { + "package": "com.example.myexpoapp" + } + } +} +``` + +--- + +## Running Expo Apps + +Start the development server: + +```bash +npx expo start +``` + +Options when running: + +- Scan the QR code with Expo Go +- Run in an Android emulator +- Run in an iOS simulator +- Open the web preview + +--- + +## Expo Modules & Native APIs + +Use built-in native modules: + +```javascript +import * as Haptics from "expo-haptics"; +import * as FileSystem from "expo-file-system"; +import * as Battery from "expo-battery"; +``` + +Example: + +```javascript +Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); +``` + +Install a new module the Expo way: + +```bash +npx expo install expo-camera +``` + +Expo will choose compatible native versions for your SDK. + +--- + +## Expo Router + +Expo Router uses the filesystem as navigation. + +Example structure: + +``` +app/ + ├── index.js + ├── profile.js + ├── settings.js + └── (more routes...) +``` + +Each file becomes a route: + +- `/` -> `index.js` +- `/profile` -> `profile.js` +- `/settings` -> `settings.js` + +Basic screen example: + +```javascript +import { View, Text } from "react-native"; + +export default function Screen() { + return ( + + Hello from Expo! + + ); +} +``` + +--- + +## EAS (Expo Application Services) + +EAS provides cloud-based building, submitting, and over-the-air updates. + +Install the EAS CLI: + +```bash +npm install -g eas-cli +``` + +Initial configuration: + +```bash +eas build:configure +``` + +Build binaries for platforms: + +```bash +eas build -p android +eas build -p ios +``` + +Submit to stores: + +```bash +eas submit -p android +eas submit -p ios +``` + +Use `eas update` for OTA updates to JavaScript and assets. + +--- + +## Environment Variables + +Manage environment and configuration via `app.config.js` or `app.json` `extra` fields. + +Example `app.config.js`: + +```javascript +export default ({ config }) => ({ + ...config, + extra: { + apiUrl: process.env.API_URL, + }, +}); +``` + +Start with variables: + +```bash +API_URL="https://api.example.com" npx expo start +``` + +Access them in app code: + +```javascript +import Constants from "expo-constants"; + +const apiUrl = Constants.expoConfig.extra.apiUrl; +console.log(apiUrl); +``` + +For secrets in production, use a secure environment (CI secrets, EAS secrets). + +--- + +## Prebuilding and Bare Workflow + +If you need custom native code or modules, use prebuild: + +```bash +npx expo prebuild +``` + +This generates native `ios/` and `android/` folders so you can edit native code. If you choose this path, you move from managed Expo workflow toward a "bare" React Native project with Expo tooling still available. + +--- + +## Debugging and Development Tools + +- Expo DevTools: browser UI that comes up with `npx expo start`. +- React Native Debugger and Flipper for deeper inspection. +- Use `console.log`, breakpoints in VS Code, and React DevTools. +- `npx expo start --tunnel` to debug across networks. + +--- + +## Useful Expo Commands — Reference + +### General + +| Command | Description | +| ---------------------- | ---------------------------------- | +| `npx expo start` | Start development server | +| `npx expo install` | Install Expo-compatible packages | +| `npx expo prebuild` | Generate native Android/iOS code | +| `npx expo run:android` | Run on Android device/emulator | +| `npx expo run:ios` | Run on iOS simulator/device | +| `npx expo export` | Export a static web build | +| `npx expo doctor` | Diagnose project issues | +| `npx expo upgrade` | Upgrade Expo SDK version | +| `npx expo publish` | Publish an OTA update | + +### Flags +| Flag | Description | +| ---------------------- | ---------------------------------- | +| `--clear` | Clear Metro bundler cache | +| `--tunnel` | Use tunnel connection for devices | +| `--lan` | Use LAN connection for devices | +| `--localhost` | Use localhost connection for devices| + +- `--tunnel`, `--lan`, and `--localhost` specify how devices connect to the dev server. + - `--tunnel` works when your testing device is on a different network. + - `--lan` is faster but requires devices to be on the same network. + - `--localhost` is for local development on the same machine. + +- `--clear` helps resolve caching issues. + +💡 Use `npx expo --help` to see all available commands and options. +the terminal shows the different options available and shorthands. + + +### EAS Tools + +| Command | Description | +| ----------------------- | ---------------------------------- | +| `eas build` | Build Android/iOS binaries | +| `eas submit` | Submit to app stores | +| `eas update` | Push OTA updates | +| `eas build:configure` | Configure project for EAS builds | + +--- + +## Example: Creating a Basic Expo App + +1. Create the project: + +```bash +npx create-expo-app my-app +cd my-app +``` + +2. Start development: + +```bash +npx expo start +``` + +3. Create a simple screen at `app/index.js`: + +```javascript +import { View, Text } from "react-native"; + +export default function App() { + return ( + + Expo app running! + + ); +} +``` + +4. Open the app: + +- Scan QR code with Expo Go +- Or run in emulator/simulator + +--- + +## Best Practices + +- Use `expo install` to preserve compatibility with your SDK. +- Prefer EAS builds for production and store submissions. +- Keep your Expo SDK version updated; follow upgrade guides. +- Store secrets outside the repository; use CI or EAS secret stores. +- Use TypeScript for larger projects to catch errors early. +- Modularize code: separate screens, components, hooks, and services. +- Add tests for critical flows (unit and integration). + +--- + +## Troubleshooting Tips + +- If a module fails, run `expo doctor` to diagnose version mismatches. +- Clear caches: `npx expo start -c`. +- If native build fails in EAS, check build logs in the EAS dashboard. +- Use `expo diagnostics` to collect environment info for bug reports. + +--- + +## Comparison: Expo vs Bare React Native + +**Expo (Managed)** +- Fast iteration, fewer native worries +- Easier access to many native APIs +- Best for most apps and rapid prototyping + +**Bare React Native** +- Full native control and custom native modules +- Required for some advanced native features +- Slightly more complex setup and maintenance + +--- + +## Additional Resources + +- [docs.expo.dev](https://docs.expo.dev/) +- [reactnative.dev](https://reactnative.dev/) +- [github.com/expo/expo](https://github.com/expo/expo) +--- + diff --git a/docs/info/node.js.md b/docs/info/node.js.md index 4b01e54..5481aec 100644 --- a/docs/info/node.js.md +++ b/docs/info/node.js.md @@ -1,2 +1,348 @@ +# Node.js Reference Guide + +![node.js logo](/assets/node.js_logo.png) +## What is Node.js? + +Node.js is a [**JavaScript runtime**](https://nodejs.org/en/about/) built on the [**V8 engine**](https://nodejs.org/en/learn/getting-started/the-v8-javascript-engine), the same engine that powers Google Chrome. Instead of running JavaScript inside a browser, Node.js allows you to run JavaScript directly on your machine as a backend or scripting environment. + +It was designed around a simple but powerful idea: [**non-blocking, event‑driven I/O**](https://nodejs.org/en/learn/asynchronous-work/overview-of-blocking-vs-non-blocking). This lets Node.js handle massive numbers of concurrent connections with very little overhead. + +Node.js powers everything from tiny automation scripts to full-scale backend servers and real-time platforms. + !!! warning This file serves as a reference for understanding node.js. For installation or setup, see the [Getting Started](../Getting%20Started/README.md) folder. +--- + +## Why use Node.js? + +* Run JavaScript outside the browser. +* Build fast, scalable network applications. +* Handle thousands of concurrent requests efficiently. +* Use one language for both frontend and backend. +* Massive ecosystem through **npm**, the world’s largest package registry. +* Perfect for real‑time systems (chat apps, live dashboards, IoT). +* Plays well inside CI/CD pipelines. +* Lightweight and highly portable. + +Node.js modernizes the full-stack JavaScript workflow by giving developers a simple, powerful backend environment. + +--- + +## Project Structure + +A typical Node.js project uses a `package.json` file in the project root. This file describes: + +* dependencies +* scripts +* metadata +* engine version +* configuration for tools and frameworks + +Here is an example `package.json`: + +```json +{ + "name": "example-node-project", + "version": "1.0.0", + "description": "Simple Node.js example project", + "main": "index.js", + "scripts": { + "start": "node index.js", + "dev": "nodemon index.js" + }, + "dependencies": { + "express": "^4.19.0" + }, + "devDependencies": { + "nodemon": "^3.1.0" + }, + "engines": { + "node": ">=18" + } +} +``` + +This file acts as the configuration backbone of your Node.js project. + +--- + +## Running Node.js Scripts + +A Node.js application starts with a simple JavaScript file. For example, `index.js`: + +```javascript +console.log("Hello from Node.js!"); +``` + +Run it using: + +```bash +node index.js +``` + +Or use a development watcher like `nodemon`: + +```bash +npx nodemon index.js +``` + +--- + +## Node.js Modules and Packages + +Node.js uses a module system. You can load modules using: + +```javascript +const fs = require("fs"); +``` + +or ES module syntax: + +```javascript +import fs from "fs"; +``` + +To install packages from npm: + +```bash +npm install express +``` + +This installs the package into the `node_modules` folder and registers it in `package.json`. + +--- + +## Express.js — the most common Node.js server + +A minimal Express server: + +```javascript +import express from "express"; + +const app = express(); +const port = 3000; + +app.get("/", (req, res) => { + res.send("Hello from Express!"); +}); + +app.listen(port, () => { + console.log(`Server running on port ${port}`); +}); +``` +- `import express from "express";` — Import the Express module. +- `const app = express();` — Create an Express application. +- `const port = 3000;` — Define the port number (3000). +- `app.get("/", (req, res) => { ... });` — Define a route for GET requests to the root URL. +- `res.send("Hello from Express!");` — Send a response to the client (Hello from Express!). +- `app.listen(port, () => { ... });` — Start the server on the specified port. + +Run it via: + +```bash +npm start +``` + +Or: + +```bash +node index.js +``` + +--- + +## Node.js Package Management + +### Check installed Node.js versions: + +```bash +node -v # Check the installed Node.js version +npm -v # Check the installed npm version +``` +### Install a package: + +```bash +npm install # Install a package and add it to package.json +``` + +### Uninstall a package: + +```bash +npm uninstall # Remove a package and update package.json +``` + +### Update packages: + +```bash +npm update # Update all packages to their latest versions +``` + +### Install dev dependencies: + +```bash +npm install nodemon --save-dev # Install nodemon as a development dependency +``` + +### Install a specific version: + +```bash +npm install express@4.19.0 # Install a specific version of a package +``` + +--- + +## Node.js in Development vs Production + +### Development + +* Use hot‑reload tools like `nodemon`. +* Enable logging. +* Use environment variables via `.env`. + +### Production + +* Use `pm2` or Docker to run the server. +* Minimize debugging overhead. +* Use reverse proxies like Nginx. +* Configure environment variables securely. + +Start a production process via PM2: + +```bash +pm2 start index.js # Start the Node.js app with PM2 +``` + +--- + +## Working With Environment Variables + +Create a `.env` file: + +```bash +PORT=3000 # Server port +API_KEY=my-secret-key # API key for authentication +``` + +Load it in your app using **dotenv**: + +```bash +npm install dotenv # Install dotenv package +``` + +```javascript +import "dotenv/config"; //Load environment variables from .env file +console.log(process.env.PORT); // Access the PORT variable +``` + +--- + +## Useful Node.js Commands — Reference + +### General + +| Command | Description | +| --------------------- | ------------------------- | +| `node ` | Run a JavaScript file | +| `node -v` | Check Node.js version | +| `npm -v` | Check npm version | +| `node --watch ` | Watch mode for Node 18+ | +| `npm init -y` | Initialize a new project with default settings | +| `npm install` or `npm i`| Install all dependencies | +| `npm run