-
Notifications
You must be signed in to change notification settings - Fork 5
6.2 Build System and Tooling
Relevant source files
The following files were used as context for generating this wiki page:
This document covers the build system configuration, bundling setup, and development tooling used in AudioScape. It focuses on Metro bundler configuration, TypeScript compilation, linting setup, and the JavaScript transpilation pipeline. For overall project dependencies and EAS build configuration, see Project Configuration. For static assets handling, see Assets and Resources.
AudioScape uses Metro as its primary JavaScript bundler, configured through metro.config.js. The configuration extends Expo's default Metro setup with several customizations for the project's specific needs.
graph TB
subgraph "Metro Bundler Pipeline"
CONFIG["metro.config.js"]
EXPO_DEFAULT["getDefaultConfig()"]
RESOLVER["Resolver Configuration"]
SOURCEMAP["Source Extension Mapping"]
BLOCKLIST["File Exclusion Rules"]
end
subgraph "File Processing"
TS_FILES["TypeScript Files (.ts, .tsx)"]
DTS_FILES["Declaration Files (.d.ts)"]
JS_FILES["JavaScript Files (.js, .jsx)"]
DOCS_EXCLUDED["docs/ Directory (Excluded)"]
end
subgraph "Output"
BUNDLE["JavaScript Bundle"]
SOURCEMAPS["Source Maps"]
end
CONFIG --> EXPO_DEFAULT
CONFIG --> RESOLVER
CONFIG --> SOURCEMAP
CONFIG --> BLOCKLIST
RESOLVER --> TS_FILES
SOURCEMAP --> DTS_FILES
BLOCKLIST --> DOCS_EXCLUDED
TS_FILES --> BUNDLE
DTS_FILES --> BUNDLE
JS_FILES --> BUNDLE
BUNDLE --> SOURCEMAPS
Metro Configuration Details
The Metro configuration enables several key features:
-
Package Exports Support:
config.resolver.unstable_enablePackageExports = trueenables modern package.json exports field support -
TypeScript Declaration Files:
config.resolver.sourceExts.push("d.ts")adds support for TypeScript declaration files in the resolver -
Documentation Exclusion:
config.resolver.blockList = exclusionList([/\/docs\/.*/])prevents the docs directory from being included in bundles
Sources: metro.config.js:1-11
AudioScape uses TypeScript with strict type checking enabled. The TypeScript configuration extends Expo's base configuration while adding project-specific compiler options.
graph LR
subgraph "TypeScript Compilation"
TSCONFIG["tsconfig.json"]
EXPO_BASE["expo/tsconfig.base"]
COMPILER_OPTS["Compiler Options"]
PATH_MAPPING["Path Mapping"]
end
subgraph "Source Files"
TS_SRC["**/*.ts"]
TSX_SRC["**/*.tsx"]
EXPO_TYPES[".expo/types/**/*.ts"]
ENV_TYPES["expo-env.d.ts"]
end
subgraph "Compilation Features"
STRICT_MODE["Strict Type Checking"]
DOM_LIB["DOM Library Support"]
ALIAS_RESOLUTION["@/* Path Aliases"]
end
TSCONFIG --> EXPO_BASE
TSCONFIG --> COMPILER_OPTS
COMPILER_OPTS --> STRICT_MODE
COMPILER_OPTS --> DOM_LIB
COMPILER_OPTS --> PATH_MAPPING
PATH_MAPPING --> ALIAS_RESOLUTION
TS_SRC --> TSCONFIG
TSX_SRC --> TSCONFIG
EXPO_TYPES --> TSCONFIG
ENV_TYPES --> TSCONFIG
Key TypeScript Features:
-
Strict Mode:
"strict": trueenables all strict type checking options -
DOM Library:
"lib": ["dom"]provides DOM type definitions for web compatibility -
Path Aliases:
"@/*": ["./*"]enables absolute imports using the@/prefix - Expo Integration: Includes Expo-generated type definitions and environment types
Sources: tsconfig.json:1-11
ESLint is configured to maintain code quality standards across the project using Expo's recommended configuration.
| Configuration | Value | Purpose |
|---|---|---|
extends |
"expo" |
Uses Expo's ESLint configuration preset |
ignorePatterns |
["docs/"] |
Excludes documentation from linting |
The ESLint configuration leverages Expo's preset which includes:
- React and React Native specific rules
- JavaScript ES6+ syntax support
- TypeScript integration
- Accessibility linting rules
Sources: .eslintrc.js:1-4
AudioScape uses Babel for JavaScript transpilation, with configuration managed through package dependencies. The Babel pipeline handles modern JavaScript features and React Native specific transformations.
graph TB
subgraph "Babel Transpilation"
BABEL_CORE["@babel/core"]
PLUGIN_SYNTAX["Syntax Plugins"]
PLUGIN_TRANSFORM["Transform Plugins"]
BABEL_CONFIG["Babel Configuration"]
end
subgraph "Key Babel Plugins"
DECORATORS["@babel/plugin-proposal-decorators"]
EXPORT_DEFAULT["@babel/plugin-proposal-export-default-from"]
CLASS_PROPS["@babel/plugin-proposal-class-properties"]
NULLISH["@babel/plugin-proposal-nullish-coalescing-operator"]
OPTIONAL_CHAIN["@babel/plugin-proposal-optional-chaining"]
DOTENV["babel-plugin-dotenv-import"]
end
subgraph "Transform Features"
MODERN_JS["Modern JavaScript Features"]
REACT_NATIVE["React Native Transformations"]
ENV_VARS["Environment Variable Injection"]
ASYNC_AWAIT["Async/Await Support"]
end
BABEL_CORE --> PLUGIN_SYNTAX
BABEL_CORE --> PLUGIN_TRANSFORM
DECORATORS --> MODERN_JS
EXPORT_DEFAULT --> MODERN_JS
CLASS_PROPS --> MODERN_JS
NULLISH --> MODERN_JS
OPTIONAL_CHAIN --> MODERN_JS
DOTENV --> ENV_VARS
PLUGIN_TRANSFORM --> REACT_NATIVE
PLUGIN_TRANSFORM --> ASYNC_AWAIT
Babel Plugin Configuration:
The project includes several Babel plugins for modern JavaScript feature support:
- Decorators: Enables experimental decorator syntax for future language features
-
Export Extensions: Supports
export fromsyntax for cleaner module exports - Class Properties: Enables class property syntax without constructor assignment
-
Nullish Coalescing: Supports
??operator for null/undefined handling -
Optional Chaining: Enables
?.operator for safe property access -
Environment Variables:
babel-plugin-dotenv-importinjects environment variables at build time
Sources: package-lock.json:57-72
AudioScape includes several development tools to enhance the development experience and maintain code quality.
| Tool | Package | Purpose |
|---|---|---|
| TypeScript Compiler | typescript@^5.7.3 |
Type checking and compilation |
| Type Documentation | typedoc@^0.28.7 |
Generates API documentation from TypeScript |
| GitHub Theme | typedoc-github-theme@^0.3.0 |
Custom theme for generated documentation |
| Bundle Analyzer | expo-atlas@^0.4.1 |
Analyzes bundle size and dependencies |
Documentation Generation:
The project uses TypeDoc for generating API documentation from TypeScript source code:
- TypeDoc: Automatically generates documentation from TypeScript comments and type annotations
- GitHub Theme: Provides a GitHub-compatible theme for the generated documentation
Bundle Analysis:
Expo Atlas provides bundle analysis capabilities to monitor application size and identify optimization opportunities.
Sources: package-lock.json:69-71
The build system integrates with Expo's development and production build pipeline, providing hot reloading during development and optimized bundles for production.
graph LR
subgraph "Development Mode"
DEV_SERVER["Metro Dev Server"]
HOT_RELOAD["Hot Reloading"]
FAST_REFRESH["Fast Refresh"]
SOURCE_MAPS["Source Maps"]
end
subgraph "Production Build"
BUNDLE_OPT["Bundle Optimization"]
MINIFICATION["Code Minification"]
TREE_SHAKE["Tree Shaking"]
ASSET_OPT["Asset Optimization"]
end
subgraph "Build Pipeline"
TYPESCRIPT["TypeScript Compilation"]
BABEL["Babel Transpilation"]
METRO["Metro Bundling"]
EXPO_BUILD["Expo Build Process"]
end
TYPESCRIPT --> BABEL
BABEL --> METRO
METRO --> DEV_SERVER
METRO --> BUNDLE_OPT
DEV_SERVER --> HOT_RELOAD
DEV_SERVER --> FAST_REFRESH
DEV_SERVER --> SOURCE_MAPS
BUNDLE_OPT --> MINIFICATION
BUNDLE_OPT --> TREE_SHAKE
BUNDLE_OPT --> ASSET_OPT
EXPO_BUILD --> BUNDLE_OPT
The build process provides different behaviors for development and production environments:
Development Features:
- Hot module reloading for instant code updates
- Fast refresh for React component changes
- Detailed source maps for debugging
- Unminified code for easier debugging
Production Optimizations:
- Dead code elimination through tree shaking
- JavaScript minification for smaller bundle sizes
- Asset optimization and compression
- Source map generation for error tracking
Sources: metro.config.js:1-11, tsconfig.json:1-11, package-lock.json:57-72