{"_id":"@donswayo/pulumi-react-router-aws","_rev":"3-4f48cc57bd44ee09eea07848deaf0d7a","name":"@donswayo/pulumi-react-router-aws","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@donswayo/pulumi-react-router-aws","version":"0.1.0","license":"MIT","_id":"@donswayo/pulumi-react-router-aws@0.1.0","maintainers":[{"name":"donswayo","email":"DJWAYOMIX@gmail.com"}],"dist":{"shasum":"f6062fecacc26c28c5657637db93f6c57364f3fc","tarball":"https://registry.npmjs.org/@donswayo/pulumi-react-router-aws/-/pulumi-react-router-aws-0.1.0.tgz","fileCount":12,"integrity":"sha512-m0BPoeoCNMRnI726K2vSt00WJgG06k1od8PrxVZhjf//pABW7WoJX+mSQxUnYXEM8+SUU6a75BVM2NjWWe/5+A==","signatures":[{"sig":"MEQCIC7ii6Cdm4UObxGKMDB7T5Vu0gFB50ZAD5BhCV5p9olUAiBpufeufSVXg9Xqbh2nth3LY+WTY3nml0yMShAoLOpalg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46776},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./adapter":{"types":"./dist/adapter/index.d.ts","import":"./dist/adapter/index.js"}},"gitHead":"9df25ca6d429c65111ecddb4e5d1b79d93eb7a99","scripts":{"dev":"tsc --watch","build":"tsc && cp -r templates dist/","check-types":"tsc --noEmit"},"_npmUser":{"name":"donswayo","email":"DJWAYOMIX@gmail.com"},"_npmVersion":"10.9.2","description":"React Router v7 adapter and Pulumi components for deploying to AWS Lambda, CloudFront, and S3","directories":{},"_nodeVersion":"22.14.0","dependencies":{"globby":"^14.0.2","archiver":"^7.0.1","mime-types":"^2.1.35","@pulumi/aws":"^6.83.0","@pulumi/pulumi":"^3.147.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.2","@types/node":"^22.16.3","@types/archiver":"^6.0.3","@react-router/dev":"^7.8.2","@types/mime-types":"^2.1.4","@repo/typescript-config":"workspace:*"},"peerDependencies":{"@react-router/dev":"^7.0.0","@react-router/node":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-react-router-aws_0.1.0_1756637955883_0.6547711781029701","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@donswayo/pulumi-react-router-aws","version":"0.1.1","license":"MIT","_id":"@donswayo/pulumi-react-router-aws@0.1.1","maintainers":[{"name":"donswayo","email":"DJWAYOMIX@gmail.com"}],"dist":{"shasum":"eb7e8ace24c6d22b8c71406cd9472d7438409a8e","tarball":"https://registry.npmjs.org/@donswayo/pulumi-react-router-aws/-/pulumi-react-router-aws-0.1.1.tgz","fileCount":12,"integrity":"sha512-ZpKG81cz02zXjQt6O63gzJe+39dMiazHAxVggEBosV2xXb9P8T2n1hwgkmF2gWAx5UhuGnEb+WF2uokg3wANCg==","signatures":[{"sig":"MEQCICQYs9dZAscMUIFHqJkXwDI6rBZ88M89sBF5c0sk/kLzAiBSNUWLEx1Nw7GGv4WbggtJh1hRQ2R7sW0U2fCjmbQNGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46793},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./adapter":{"types":"./dist/adapter/index.d.ts","import":"./dist/adapter/index.js"}},"gitHead":"978ca5530d85e18dce798bb2359e353b34cfad9a","scripts":{"dev":"tsc --watch","build":"tsc && cp -r templates dist/","check-types":"tsc --noEmit"},"_npmUser":{"name":"donswayo","email":"DJWAYOMIX@gmail.com"},"_npmVersion":"10.9.2","description":"React Router v7 adapter and Pulumi components for deploying to AWS Lambda, CloudFront, and S3","directories":{},"_nodeVersion":"22.14.0","dependencies":{"globby":"catalog:","archiver":"catalog:","mime-types":"catalog:","@pulumi/aws":"catalog:","@pulumi/pulumi":"catalog:"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"catalog:","@types/node":"catalog:","@types/archiver":"catalog:","@react-router/dev":"catalog:","@types/mime-types":"catalog:","@repo/typescript-config":"workspace:*"},"peerDependencies":{"@react-router/dev":"catalog:","@react-router/node":"catalog:"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-react-router-aws_0.1.1_1756643960466_0.6737723917260485","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@donswayo/pulumi-react-router-aws","version":"0.1.2","description":"React Router v7 adapter and Pulumi components for deploying to AWS Lambda, CloudFront, and S3","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./adapter":{"types":"./dist/adapter/index.d.ts","import":"./dist/adapter/index.js"}},"dependencies":{"@pulumi/aws":"^7.6.0","@pulumi/pulumi":"^3.192.0","archiver":"^7.0.1","globby":"^14.0.2","mime-types":"^3.0.1"},"devDependencies":{"@react-router/dev":"^7.8.2","@types/archiver":"^6.0.3","@types/mime-types":"^3.0.1","@types/node":"^24.3.0","typescript":"^5.9.2","@repo/typescript-config":"0.0.0"},"peerDependencies":{"@react-router/dev":"^7.8.2","@react-router/node":"^7.8.2"},"license":"MIT","publishConfig":{"access":"public"},"scripts":{"build":"tsc && cp -r templates dist/","dev":"tsc --watch","check-types":"tsc --noEmit"},"_id":"@donswayo/pulumi-react-router-aws@0.1.2","_integrity":"sha512-UKMZopKUkoK6869jSbqbd16njYrMmQwvHlugzrdkeUtYy+yPAyHgGZEqHk6i8U6xwkuAlThVQ17rCookdPZHFA==","_resolved":"/private/var/folders/ty/jq_9rtsx1gbdyj0szz_8l8dh0000gn/T/8d0121fd1205b2e19983bb32b0b16d0c/donswayo-pulumi-react-router-aws-0.1.2.tgz","_from":"file:donswayo-pulumi-react-router-aws-0.1.2.tgz","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-UKMZopKUkoK6869jSbqbd16njYrMmQwvHlugzrdkeUtYy+yPAyHgGZEqHk6i8U6xwkuAlThVQ17rCookdPZHFA==","shasum":"fef7e7647651732c0c827fae5aec85d8550fba5a","tarball":"https://registry.npmjs.org/@donswayo/pulumi-react-router-aws/-/pulumi-react-router-aws-0.1.2.tgz","fileCount":12,"unpackedSize":46767,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC3nAikis9B3+UBvdr10EiYKVkyM9OZq+nZMh4UXtjPGQIhALUxYgXSRahjckr2qSExEsIvsVQKlCgpDWeuKNEqsOt1"}]},"_npmUser":{"name":"donswayo","email":"DJWAYOMIX@gmail.com"},"directories":{},"maintainers":[{"name":"donswayo","email":"DJWAYOMIX@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pulumi-react-router-aws_0.1.2_1756645834749_0.14703058386079038"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-31T10:59:15.808Z","modified":"2025-08-31T13:10:35.172Z","0.1.0":"2025-08-31T10:59:16.117Z","0.1.1":"2025-08-31T12:39:20.660Z","0.1.2":"2025-08-31T13:10:34.958Z"},"license":"MIT","description":"React Router v7 adapter and Pulumi components for deploying to AWS Lambda, CloudFront, and S3","maintainers":[{"name":"donswayo","email":"DJWAYOMIX@gmail.com"}],"readme":"# @donswayo/pulumi-react-router-aws\n\nA React Router v7 adapter and Pulumi library for deploying React Router applications to AWS using Lambda, S3, and CloudFront.\n\n## Features\n\n- Serverless deployment with AWS Lambda\n- Global CDN with CloudFront\n- Static asset hosting with S3\n- Server-side rendering support\n- API routes and streaming responses\n- Infrastructure as Code with Pulumi\n- Simple configuration\n- TypeScript support\n\n## Installation\n\n```bash\npnpm add @donswayo/pulumi-react-router-aws\n```\n\n## Usage\n\n### 1. Configure the Adapter\n\nIn your `react-router.config.ts`:\n\n```typescript\nimport type { Config } from \"@react-router/dev/config\";\nimport reactRouterAwsAdapter from \"@donswayo/pulumi-react-router-aws/adapter\";\n\nconst adapter = reactRouterAwsAdapter({\n  out: '.react-router-aws',\n  polyfill: true,\n  precompress: false,\n});\n\nexport default {\n  ssr: true,\n  buildDirectory: \"build\",\n  serverBuildFile: \"index.js\",\n  \n  // Run the adapter after build completes\n  async buildEnd({ buildManifest, serverBuildPath }) {\n    await adapter.build({\n      serverBuildFile: 'build/server/index.js',\n      buildDirectory: 'build/client',\n      routes: buildManifest?.routes || {},\n    });\n  },\n} satisfies Config;\n```\n\n### 2. Build Your App\n\n```bash\npnpm build\n```\n\nThis will create a `.react-router-aws` directory with:\n- `server/` - Lambda function code with dependencies\n- `client/` - Static assets for S3/CloudFront\n- `metadata.json` - Deployment metadata\n\n### 3. Deploy with Pulumi\n\nCreate a Pulumi program:\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport { ReactRouterAwsDeployment } from \"@donswayo/pulumi-react-router-aws\";\n\nconst app = new ReactRouterAwsDeployment(\"my-react-router-app\", {\n  buildPath: \"./apps/react-router/.react-router-aws\",\n  \n  environment: {\n    NODE_ENV: \"production\",\n    PUBLIC_API_URL: \"https://api.example.com\",\n  },\n  \n  lambda: {\n    memory: 512,\n    timeout: 30,\n    architecture: \"arm64\",\n  },\n  \n  domain: {\n    name: \"app.example.com\",\n    certificateArn: \"arn:aws:acm:us-east-1:...:certificate/...\",\n  },\n  \n  priceClass: \"PriceClass_100\",\n  \n  tags: {\n    Environment: \"production\",\n    Team: \"frontend\",\n  },\n});\n\nexport const url = app.url;\nexport const distributionId = app.distributionId;\nexport const bucketName = app.bucketName;\nexport const functionArn = app.functionArn;\n```\n\nDeploy:\n\n```bash\npulumi up\n```\n\n## Configuration\n\n### Adapter Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `out` | `string` | `.react-router-aws` | Output directory for build |\n| `polyfill` | `boolean` | `true` | Add Node.js polyfills |\n| `precompress` | `boolean` | `false` | Precompress static assets |\n| `envPrefix` | `string` | `\"\"` | Environment variable prefix filter |\n\n### Deployment Options\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `buildPath` | `string` | Path to adapter build output |\n| `environment` | `Record<string, string>` | Environment variables for Lambda |\n| `domain` | `{ name, certificateArn }` | Custom domain configuration |\n| `lambda` | `{ memory, timeout, architecture }` | Lambda configuration |\n| `priceClass` | `string` | CloudFront price class |\n| `tags` | `Record<string, string>` | AWS resource tags |\n\n### Lambda Configuration\n\n```typescript\nlambda: {\n  memory: 512,      // Memory in MB (128-10240)\n  timeout: 30,      // Timeout in seconds (1-900)\n  architecture: \"arm64\", // \"x86_64\" or \"arm64\"\n}\n```\n\n## Architecture\n\nThe deployment creates:\n\n1. **Lambda Function** - Handles server-side rendering and API routes\n2. **Lambda Function URL** - Public endpoint for the Lambda function\n3. **S3 Bucket** - Stores static assets (JS, CSS, images)\n4. **CloudFront Distribution** - Global CDN with intelligent routing\n5. **IAM Roles** - Proper permissions for all services\n\n### Request Flow\n\n1. CloudFront receives request\n2. Static assets (`/assets/*`, `*.js`, `*.css`, etc.) are served from S3\n3. Dynamic requests are forwarded to Lambda Function URL\n4. Lambda renders the page or handles API routes\n5. Response is cached and delivered through CloudFront\n\n### Supported Features\n\n- **Server-Side Rendering (SSR)** - Full support for React Router SSR\n- **API Routes** - All React Router API route patterns\n- **Streaming Responses** - Server-sent events and streaming API support\n- **File-based Routing** - Automatic route discovery with `@react-router/fs-routes`\n- **Dynamic Routes** - Parameters like `products.$id.tsx`\n- **Nested Routes** - Outlet-based nested routing\n- **Data Loading** - Loader and action functions\n- **Meta Tags** - Dynamic meta tag generation\n\n## Prerequisites\n\n### 1. Configure Package Manager (Important for monorepo)\n\nIf you're using pnpm in a monorepo, you must configure it to avoid symlinks.\n\nAdd this to your root `.npmrc`:\n```\nnode-linker=node-modules\n```\n\nor \n\n```\nnode-linker=hoisted\nshamefully-hoist=true\nhoist=true\n```\n\nThis ensures that dependencies are copied as real files instead of symlinks, which is required for Lambda bundling.\n\n### 2. React Router Dependencies\n\nEnsure your React Router app has the required dependencies:\n\n```json\n{\n  \"dependencies\": {\n    \"@react-router/architect\": \"^7.0.0\",\n    \"@react-router/fs-routes\": \"^7.0.0\",\n    \"@react-router/node\": \"^7.0.0\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"react-router\": \"^7.0.0\"\n  },\n  \"devDependencies\": {\n    \"@react-router/dev\": \"^7.0.0\",\n    \"@donswayo/pulumi-react-router-aws\": \"workspace:*\"\n  }\n}\n```\n\n### 3. Configure AWS\n\nEnsure AWS credentials are configured:\n```bash\naws configure\n```\n\n## Advanced Usage\n\n### Custom Lambda Handler\n\nThe adapter uses `@react-router/architect` for request handling, supporting both API Gateway v2 and Lambda Function URL formats.\n\n### Environment Variables\n\nPass environment variables to your Lambda function:\n\n```typescript\nenvironment: {\n  NODE_ENV: \"production\",\n  DATABASE_URL: process.env.DATABASE_URL,\n  API_KEY: process.env.API_KEY,\n}\n```\n\n### Custom Domain\n\nConfigure a custom domain with ACM certificate:\n\n```typescript\ndomain: {\n  name: \"app.example.com\",\n  certificateArn: \"arn:aws:acm:us-east-1:123456789012:certificate/...\"\n}\n```\n\n### CloudFront Price Classes\n\n- `PriceClass_100` - US, Canada, Europe\n- `PriceClass_200` - US, Canada, Europe, Asia, Middle East, Africa\n- `PriceClass_All` - All edge locations\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Build the package\npnpm build\n\n# Type check\npnpm check-types\n```\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Routes not working**: Ensure `react-router.config.ts` has `ssr: true`\n2. **Static assets 404**: Check CloudFront cache behaviors for `/assets/*`\n3. **Lambda timeout**: Increase timeout in lambda configuration\n4. **Build failures**: Ensure all dependencies are installed with `--production` flag\n\n### Debugging\n\nEnable Lambda logging:\n```typescript\nenvironment: {\n  DEBUG: \"true\",\n  NODE_ENV: \"development\",\n}\n```\n\nView CloudWatch logs:\n```bash\naws logs tail /aws/lambda/[function-name] --follow\n```\n\n## License\n\nMIT","readmeFilename":"README.md"}