@jaypie/mcp 0.8.45 → 0.8.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/suites/docs/index.js +1 -1
- package/package.json +1 -1
- package/release-notes/mcp/0.8.46.md +11 -0
- package/release-notes/mcp/0.8.47.md +12 -0
- package/skills/agents.md +2 -2
- package/skills/cdk.md +2 -1
- package/skills/dns.md +2 -1
- package/skills/infrastructure.md +2 -1
- package/skills/monorepo.md +4 -2
- package/skills/repokit.md +97 -0
- package/skills/skills.md +2 -2
- package/skills/variables.md +16 -1
- package/skills/web.md +205 -0
|
@@ -9,7 +9,7 @@ import { gt } from 'semver';
|
|
|
9
9
|
/**
|
|
10
10
|
* Docs Suite - Documentation services (skill, version, release_notes)
|
|
11
11
|
*/
|
|
12
|
-
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.
|
|
12
|
+
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.47#d4678bbc"
|
|
13
13
|
;
|
|
14
14
|
const __filename$1 = fileURLToPath(import.meta.url);
|
|
15
15
|
const __dirname$1 = path.dirname(__filename$1);
|
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.46
|
|
3
|
+
date: 2026-04-19
|
|
4
|
+
summary: Add repokit skill documenting the @jaypie/repokit tooling bundle
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added `skill("repokit")` covering what ships in `@jaypie/repokit` (`dotenv`, `env-cmd`, `rimraf`, `sort-package-json`, `tsx`), when to reach for it, and usage patterns — including the `env-cmd -f .env -- <cmd>` `--` separator gotcha
|
|
10
|
+
- Registered `repokit` under the development category in `skill("skills")` and `skill("agents")`
|
|
11
|
+
- Cross-linked from `skill("monorepo")` (added to related, recommended as root devDependency) and `skill("variables")` (added "Loading from `.env` Files" section)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.47
|
|
3
|
+
date: 2026-04-22
|
|
4
|
+
summary: Add web skill covering JaypieWebDeploymentBucket, JaypieStaticWebBucket, and related CloudFront/S3 web hosting patterns
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added `skill("web")` covering static site hosting with `@jaypie/constructs`: `JaypieWebDeploymentBucket`, `JaypieStaticWebBucket`, and pointers to `JaypieDistribution` for dynamic origins
|
|
10
|
+
- Documented the OIDC deploy role flow, CfnOutputs consumed by CI/CD (`DestinationBucketName`, `DestinationBucketDeployRoleArn`, `DistributionId`, `CertificateArn`), and production caching behavior
|
|
11
|
+
- Registered `web` under the infrastructure category in `skill("skills")`, `skill("agents")`, and `skill("infrastructure")`
|
|
12
|
+
- Cross-linked from `skill("cdk")` (added to See Also) and `skill("dns")` (added to related + See Also)
|
package/skills/agents.md
CHANGED
|
@@ -33,8 +33,8 @@ Complete stack styles, techniques, and traditions.
|
|
|
33
33
|
`mcp__jaypie__skill(alias: String)`
|
|
34
34
|
|
|
35
35
|
Contents: index, releasenotes
|
|
36
|
-
Development: apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests, tools
|
|
37
|
-
Infrastructure: apigateway, aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, migrations, secrets, sqs, streaming, variables, websockets
|
|
36
|
+
Development: apikey, documentation, errors, llm, logs, mocks, monorepo, repokit, style, subpackages, tests, tools
|
|
37
|
+
Infrastructure: apigateway, aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, migrations, secrets, sqs, streaming, variables, web, websockets
|
|
38
38
|
Patterns: api, fabric, handlers, models, services, vocabulary
|
|
39
39
|
Recipes: recipe-api-server
|
|
40
40
|
Meta: issues, jaypie, mcp, skills
|
package/skills/cdk.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: CDK constructs and deployment patterns
|
|
3
|
-
related: apikey, aws, cicd, dynamodb, express, lambda, migrations, secrets, streaming, websockets
|
|
3
|
+
related: apikey, aws, cicd, dynamodb, express, lambda, migrations, secrets, streaming, web, websockets
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# CDK Constructs
|
|
@@ -422,4 +422,5 @@ new JaypieOrganizationTrail(this, "OrgTrail", {
|
|
|
422
422
|
- **`skill("secrets")`** - Secret management with JaypieEnvSecret
|
|
423
423
|
- **`skill("streaming")`** - JaypieDistribution and JaypieNextJs streaming configuration
|
|
424
424
|
- **`skill("variables")`** - Environment variables reference
|
|
425
|
+
- **`skill("web")`** - JaypieWebDeploymentBucket and JaypieStaticWebBucket for static sites
|
|
425
426
|
- **`skill("websockets")`** - JaypieWebSocket and JaypieWebSocketTable constructs
|
package/skills/dns.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: DNS and domain configuration
|
|
3
|
-
related: cdk,
|
|
3
|
+
related: aws, cdk, web
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# DNS Configuration
|
|
@@ -135,4 +135,5 @@ openssl s_client -connect app.example.com:443 -servername app.example.com
|
|
|
135
135
|
## See Also
|
|
136
136
|
|
|
137
137
|
- **`skill("cdk")`** - CDK constructs including JaypieDistribution and JaypieNextJs
|
|
138
|
+
- **`skill("web")`** - Static site hosting with JaypieWebDeploymentBucket and JaypieStaticWebBucket
|
|
138
139
|
|
package/skills/infrastructure.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: AWS, CDK, CI/CD, and observability
|
|
3
|
-
related: aws, cdk, cicd, cicd-actions, cicd-deploy, cicd-environments, datadog, dns, dynamodb, secrets, variables, websockets
|
|
3
|
+
related: aws, cdk, cicd, cicd-actions, cicd-deploy, cicd-environments, datadog, dns, dynamodb, secrets, variables, web, websockets
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Infrastructure
|
|
@@ -23,4 +23,5 @@ Cloud infrastructure and deployment patterns.
|
|
|
23
23
|
| `migrations` | DynamoDB migration custom resources |
|
|
24
24
|
| `secrets` | AWS Secrets Manager |
|
|
25
25
|
| `variables` | Environment variables reference |
|
|
26
|
+
| `web` | Static site and web content hosting |
|
|
26
27
|
| `websockets` | WebSocket API Gateway constructs |
|
package/skills/monorepo.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Initialize a Jaypie monorepo project
|
|
3
|
-
related: subpackage, cicd, style, tests
|
|
3
|
+
related: subpackage, cicd, repokit, style, tests
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Jaypie Monorepo Setup
|
|
@@ -130,9 +130,11 @@ npm-debug.log*
|
|
|
130
130
|
Install root dev dependencies:
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
|
-
npm install --save-dev @jaypie/eslint @jaypie/testkit eslint
|
|
133
|
+
npm install --save-dev @jaypie/eslint @jaypie/repokit @jaypie/testkit eslint vite vite-plugin-dts vitest
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
+
`@jaypie/repokit` bundles `dotenv`, `env-cmd`, `rimraf`, `sort-package-json`, and `tsx` at consistent versions. See `skill("repokit")`.
|
|
137
|
+
|
|
136
138
|
## Workspace Conventions
|
|
137
139
|
|
|
138
140
|
| Directory | Purpose |
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Bundled development tooling for Jaypie repositories (dotenv, env-cmd, rimraf, sort-package-json, tsx)
|
|
3
|
+
related: monorepo, subpackages, variables
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Repokit
|
|
7
|
+
|
|
8
|
+
`@jaypie/repokit` is a convenience bundle that consolidates common development tooling used across Jaypie repositories into a single devDependency. Install once and get `dotenv`, `env-cmd`, `rimraf`, `sort-package-json`, and `tsx` at consistent versions.
|
|
9
|
+
|
|
10
|
+
## What Ships
|
|
11
|
+
|
|
12
|
+
| Tool | Purpose |
|
|
13
|
+
|------|---------|
|
|
14
|
+
| `dotenv` | Load environment variables from `.env` files (re-exported for programmatic use) |
|
|
15
|
+
| `env-cmd` | Run commands with env file loaded (CLI; use in npm scripts) |
|
|
16
|
+
| `rimraf` | Cross-platform `rm -rf` (re-exported and available as CLI) |
|
|
17
|
+
| `sort-package-json` | Enforce consistent `package.json` key ordering (CLI) |
|
|
18
|
+
| `tsx` | Run TypeScript files directly without precompilation (CLI) |
|
|
19
|
+
|
|
20
|
+
## When to Reach for It
|
|
21
|
+
|
|
22
|
+
- **Monorepo root devDependency** — single install so every package has access to the same tooling versions
|
|
23
|
+
- **Subpackages** — add as a devDependency where build/clean/script tooling is needed
|
|
24
|
+
- **Avoid** listing each of the five underlying packages individually — let `@jaypie/repokit` pin them
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install --save-dev @jaypie/repokit
|
|
30
|
+
# Or in a monorepo root:
|
|
31
|
+
npm install --save-dev @jaypie/repokit -w .
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Programmatic Exports
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { config, rimraf } from "@jaypie/repokit";
|
|
38
|
+
|
|
39
|
+
config(); // dotenv — loads process.env from .env
|
|
40
|
+
await rimraf("./dist"); // cross-platform directory removal
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Re-exports:
|
|
44
|
+
|
|
45
|
+
- Everything from `dotenv` (`config`, `parse`, `populate`, etc.)
|
|
46
|
+
- `rimraf` from `rimraf`
|
|
47
|
+
|
|
48
|
+
## CLI Usage in `package.json` Scripts
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"scripts": {
|
|
53
|
+
"clean": "rimraf ./dist",
|
|
54
|
+
"clean:all": "rimraf ./packages/*/dist",
|
|
55
|
+
"format:package": "sort-package-json ./package.json ./packages/*/package.json",
|
|
56
|
+
"script:setup": "tsx scripts/setup.ts",
|
|
57
|
+
"start:dev": "env-cmd -f .env.development -- node server.js"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### `env-cmd` — the `--` separator is required
|
|
63
|
+
|
|
64
|
+
`env-cmd -f <file> -- <command>` passes the env file to the process and runs the command with those variables loaded. **Omit the `--` and env-cmd treats the file as an rc/JSON config instead of a dotenv file, which silently does the wrong thing.**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Correct — `.env.dev` is read as a dotenv file
|
|
68
|
+
env-cmd -f .env.dev -- node server.js
|
|
69
|
+
|
|
70
|
+
# Wrong — `.env.dev` is parsed as JSON/rc config; server.js still runs but without env vars
|
|
71
|
+
env-cmd -f .env.dev node server.js
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Use this pattern to load repo-level `.env` files into scripts without hard-coding variables in `package.json`.
|
|
75
|
+
|
|
76
|
+
### `tsx` — for TypeScript scripts
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
tsx scripts/seed.ts
|
|
80
|
+
env-cmd -f .env.local -- tsx scripts/seed.ts # combine with env-cmd
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `sort-package-json` — for consistency
|
|
84
|
+
|
|
85
|
+
Add a `format:package` script and run it before committing, or enforce it in a pre-commit hook.
|
|
86
|
+
|
|
87
|
+
## Why Not the Five Packages Directly?
|
|
88
|
+
|
|
89
|
+
- **One devDependency vs five** — fewer entries in `package.json` and `package-lock.json`
|
|
90
|
+
- **Pinned versions** — every Jaypie repo using repokit gets the same `dotenv`/`rimraf`/etc. version
|
|
91
|
+
- **Easier upgrades** — bump repokit once, all tooling updates together
|
|
92
|
+
|
|
93
|
+
## See Also
|
|
94
|
+
|
|
95
|
+
- `skill("monorepo")` — repokit is a recommended devDependency for the monorepo root
|
|
96
|
+
- `skill("subpackages")` — use repokit as a devDependency in any package that needs build/clean/script tooling
|
|
97
|
+
- `skill("variables")` — pair `env-cmd` with `.env` files to load project environment variables
|
package/skills/skills.md
CHANGED
|
@@ -16,8 +16,8 @@ Look up skills by alias: `mcp__jaypie__skill(alias)`
|
|
|
16
16
|
| Category | Skills |
|
|
17
17
|
|----------|--------|
|
|
18
18
|
| contents | index, releasenotes |
|
|
19
|
-
| development | apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests, tools |
|
|
20
|
-
| infrastructure | apigateway, aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, migrations, secrets, sqs, streaming, variables, websockets |
|
|
19
|
+
| development | apikey, documentation, errors, llm, logs, mocks, monorepo, repokit, style, subpackages, tests, tools |
|
|
20
|
+
| infrastructure | apigateway, aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, migrations, secrets, sqs, streaming, variables, web, websockets |
|
|
21
21
|
| patterns | api, fabric, handlers, models, services, vocabulary |
|
|
22
22
|
| recipes | recipe-api-server |
|
|
23
23
|
| meta | issues, jaypie, mcp, skills |
|
package/skills/variables.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Environment variables reference
|
|
3
|
-
related: apikey, cdk, datadog, secrets
|
|
3
|
+
related: apikey, cdk, datadog, repokit, secrets
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Environment Variables
|
|
@@ -49,6 +49,21 @@ LOG_LEVEL=trace npm run dev
|
|
|
49
49
|
LOG_LEVEL=debug npm run dev
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
+
### Loading from `.env` Files
|
|
53
|
+
|
|
54
|
+
Use `env-cmd` (bundled with `@jaypie/repokit`) to load a dotenv file into a script. The `--` separator is required — without it, `env-cmd` treats the file as rc/JSON config and silently does the wrong thing:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"scripts": {
|
|
59
|
+
"start:dev": "env-cmd -f .env.development -- node server.js",
|
|
60
|
+
"script:seed": "env-cmd -f .env.local -- tsx scripts/seed.ts"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
See `skill("repokit")` for the full tooling bundle.
|
|
66
|
+
|
|
52
67
|
## CDK Infrastructure Variables
|
|
53
68
|
|
|
54
69
|
| Variable | Description |
|
package/skills/web.md
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Static site and web content hosting with CloudFront, S3, and DNS
|
|
3
|
+
related: cdk, cicd-deploy, dns, secrets, streaming
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Web Hosting
|
|
7
|
+
|
|
8
|
+
Deploying static websites and web content through `@jaypie/constructs`. Pair an S3 origin with a CloudFront distribution, Route53 alias, ACM certificate, and (optionally) an OIDC deploy role for GitHub Actions — all wired up by one construct.
|
|
9
|
+
|
|
10
|
+
## Constructs
|
|
11
|
+
|
|
12
|
+
| Construct | Purpose |
|
|
13
|
+
|-----------|---------|
|
|
14
|
+
| `JaypieWebDeploymentBucket` | S3 + CloudFront + Route53 + OIDC deploy role for a static site |
|
|
15
|
+
| `JaypieStaticWebBucket` | Pre-configured `JaypieWebDeploymentBucket` that defaults to the `static` subdomain |
|
|
16
|
+
| `JaypieDistribution` | CloudFront in front of a dynamic handler (Lambda / Function URL / origin) |
|
|
17
|
+
| `JaypieNextJs` | Server-rendered Next.js deployment (see `skill("cdk")`) |
|
|
18
|
+
|
|
19
|
+
Use `JaypieWebDeploymentBucket` / `JaypieStaticWebBucket` for pre-built assets (SPA bundles, static docs). Use `JaypieDistribution` when CloudFront fronts an Express Lambda or streaming handler. Use `JaypieNextJs` for SSR Next.js.
|
|
20
|
+
|
|
21
|
+
## JaypieWebDeploymentBucket
|
|
22
|
+
|
|
23
|
+
Static site on S3 fronted by CloudFront, wired to Route53 and ACM. Setting `CDK_ENV_REPO` also provisions an OIDC deploy role with scoped S3 and CloudFront invalidation permissions for GitHub Actions.
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { JaypieWebDeploymentBucket } from "@jaypie/constructs";
|
|
27
|
+
|
|
28
|
+
new JaypieWebDeploymentBucket(this, "Web", {
|
|
29
|
+
host: "app.example.com",
|
|
30
|
+
zone: "example.com",
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Props
|
|
35
|
+
|
|
36
|
+
| Prop | Type | Default |
|
|
37
|
+
|------|------|---------|
|
|
38
|
+
| `host` | `string` | `mergeDomain(CDK_ENV_WEB_SUBDOMAIN, CDK_ENV_WEB_HOSTED_ZONE \|\| CDK_ENV_HOSTED_ZONE)` |
|
|
39
|
+
| `zone` | `string \| IHostedZone \| JaypieHostedZone` | `CDK_ENV_WEB_HOSTED_ZONE \|\| CDK_ENV_HOSTED_ZONE` |
|
|
40
|
+
| `certificate` | `boolean \| ICertificate` | `true` (creates via `resolveCertificate`) |
|
|
41
|
+
| `name` | `string` | `constructEnvName("web")` |
|
|
42
|
+
| `roleTag` | `string` | `CDK.ROLE.HOSTING` |
|
|
43
|
+
|
|
44
|
+
Also accepts all `s3.BucketProps` — the bucket defaults to `autoDeleteObjects: true`, `publicReadAccess: true`, `websiteIndexDocument: "index.html"`, `websiteErrorDocument: "index.html"` (SPA-friendly).
|
|
45
|
+
|
|
46
|
+
### CloudFront
|
|
47
|
+
|
|
48
|
+
- Default behavior: S3 static website origin, `REDIRECT_TO_HTTPS`, `CACHING_DISABLED`.
|
|
49
|
+
- In production (`isProductionEnv()`), a second behavior on `/*` enables `CACHING_OPTIMIZED` — `index.html` stays uncached so SPA deploys are visible immediately; hashed assets get edge cache.
|
|
50
|
+
|
|
51
|
+
### DNS
|
|
52
|
+
|
|
53
|
+
Creates an A record alias to the distribution. Tags the record with `CDK.ROLE.NETWORKING`.
|
|
54
|
+
|
|
55
|
+
### Deploy Role (OIDC)
|
|
56
|
+
|
|
57
|
+
When `CDK_ENV_REPO` is set (e.g., `finlaysonstudio/jaypie`), the construct creates an IAM role assumed via GitHub OIDC with:
|
|
58
|
+
|
|
59
|
+
- `s3:PutObject`, `s3:DeleteObject`, `s3:GetObject`, `s3:ListObjectsV2` on the bucket
|
|
60
|
+
- `s3:ListBucket` on the bucket
|
|
61
|
+
- `cloudformation:DescribeStacks` on the owning stack (so workflows can read outputs)
|
|
62
|
+
- `cloudfront:CreateInvalidation` on the distribution
|
|
63
|
+
|
|
64
|
+
Exposed as `CfnOutput`s for workflow consumption:
|
|
65
|
+
|
|
66
|
+
| Output | Contents |
|
|
67
|
+
|--------|----------|
|
|
68
|
+
| `DestinationBucketName` | Target bucket for `aws s3 sync` |
|
|
69
|
+
| `DestinationBucketDeployRoleArn` | Role ARN for `aws-actions/configure-aws-credentials` |
|
|
70
|
+
| `DistributionId` | CloudFront distribution for `aws cloudfront create-invalidation` |
|
|
71
|
+
| `CertificateArn` | ACM certificate ARN (when a certificate is created) |
|
|
72
|
+
|
|
73
|
+
See `skill("cicd-deploy")` for the workflow pattern that reads these outputs and deploys content.
|
|
74
|
+
|
|
75
|
+
## JaypieStaticWebBucket
|
|
76
|
+
|
|
77
|
+
`JaypieWebDeploymentBucket` with `static` as the default subdomain. Use for a "static.example.com" asset site sharing the project's hosted zone.
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { JaypieStaticWebBucket } from "@jaypie/constructs";
|
|
81
|
+
|
|
82
|
+
// Minimal — host defaults to `envHostname({ subdomain: "static" })`,
|
|
83
|
+
// zone defaults to CDK_ENV_DOMAIN || CDK_ENV_HOSTED_ZONE
|
|
84
|
+
new JaypieStaticWebBucket(this, "Static");
|
|
85
|
+
|
|
86
|
+
// Override host/zone when needed
|
|
87
|
+
new JaypieStaticWebBucket(this, "Docs", {
|
|
88
|
+
host: "docs.example.com",
|
|
89
|
+
zone: "example.com",
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The default `name` is `constructEnvName("static")` so the bucket is namespaced per environment.
|
|
94
|
+
|
|
95
|
+
## Environment-Aware Hosts
|
|
96
|
+
|
|
97
|
+
`envHostname()` resolves a hostname from `PROJECT_ENV`, producing apex for production and a prefixed subdomain otherwise.
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import { envHostname, JaypieStaticWebBucket } from "@jaypie/constructs";
|
|
101
|
+
|
|
102
|
+
// production → "jaypie.net"
|
|
103
|
+
// sandbox → "sandbox.jaypie.net"
|
|
104
|
+
// development → "development.jaypie.net"
|
|
105
|
+
const host = envHostname({ domain: "jaypie.net" });
|
|
106
|
+
|
|
107
|
+
new JaypieStaticWebBucket(this, "Bucket", { host, zone: "jaypie.net" });
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
See `skill("variables")` for the `PROJECT_ENV` / `CDK_ENV_*` variables involved.
|
|
111
|
+
|
|
112
|
+
## JaypieDistribution (dynamic origins)
|
|
113
|
+
|
|
114
|
+
For CloudFront in front of an Express Lambda, Function URL, or custom origin — not a static S3 site — reach for `JaypieDistribution`. It ships with ACM, Route53 alias, WAF, and security headers by default.
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { JaypieDistribution, JaypieExpressLambda } from "@jaypie/constructs";
|
|
118
|
+
|
|
119
|
+
const api = new JaypieExpressLambda(this, "Api", {
|
|
120
|
+
code: "../api/dist",
|
|
121
|
+
handler: "index.handler",
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
new JaypieDistribution(this, "Distribution", {
|
|
125
|
+
handler: api,
|
|
126
|
+
host: "api.example.com",
|
|
127
|
+
zone: "example.com",
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Security headers (`ResponseHeadersPolicy`) and WAFv2 WebACL are covered in `skill("cdk")`. Response streaming with `createLambdaStreamHandler` is covered in `skill("streaming")`.
|
|
132
|
+
|
|
133
|
+
### Certificate Sharing
|
|
134
|
+
|
|
135
|
+
`resolveCertificate` caches certificates at the stack level by domain, so swapping `JaypieDistribution` ↔ `JaypieApiGateway` on the same hostname does not tear down or recreate the certificate. For explicit control:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { JaypieCertificate, JaypieDistribution } from "@jaypie/constructs";
|
|
139
|
+
|
|
140
|
+
const cert = new JaypieCertificate(this, "ApiCert", {
|
|
141
|
+
domainName: "api.example.com",
|
|
142
|
+
zone: "example.com",
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
new JaypieDistribution(this, "Dist", { handler: api, certificate: cert });
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Environment Variables
|
|
149
|
+
|
|
150
|
+
| Variable | Purpose |
|
|
151
|
+
|----------|---------|
|
|
152
|
+
| `CDK_ENV_HOSTED_ZONE` | Default hosted zone for all web constructs |
|
|
153
|
+
| `CDK_ENV_WEB_HOSTED_ZONE` | Override hosted zone for web buckets specifically |
|
|
154
|
+
| `CDK_ENV_WEB_SUBDOMAIN` | Subdomain under the hosted zone |
|
|
155
|
+
| `CDK_ENV_WEB_HOST` | Full host override (skips subdomain + zone composition) |
|
|
156
|
+
| `CDK_ENV_REPO` | `owner/repo` — when set, provisions the OIDC deploy role |
|
|
157
|
+
| `CDK_ENV_DOMAIN` | Default domain for `JaypieStaticWebBucket` zone resolution |
|
|
158
|
+
|
|
159
|
+
See `skill("variables")` for the full environment variable reference.
|
|
160
|
+
|
|
161
|
+
## Deployment Workflow
|
|
162
|
+
|
|
163
|
+
A typical `feat/*` branch deploy:
|
|
164
|
+
|
|
165
|
+
1. CDK deploys the bucket, distribution, and deploy role.
|
|
166
|
+
2. Workflow reads `DestinationBucketName`, `DestinationBucketDeployRoleArn`, and `DistributionId` from stack outputs.
|
|
167
|
+
3. Workflow assumes the deploy role, runs `aws s3 sync ./dist s3://$BUCKET`, then invalidates `/*` on the distribution.
|
|
168
|
+
|
|
169
|
+
See `skill("cicd-deploy")` for the reusable action pattern.
|
|
170
|
+
|
|
171
|
+
## Stack Example
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { Construct } from "constructs";
|
|
175
|
+
import {
|
|
176
|
+
envHostname,
|
|
177
|
+
JaypieAppStack,
|
|
178
|
+
JaypieStaticWebBucket,
|
|
179
|
+
} from "@jaypie/constructs";
|
|
180
|
+
|
|
181
|
+
export class DocumentationStack extends JaypieAppStack {
|
|
182
|
+
public readonly bucket: JaypieStaticWebBucket;
|
|
183
|
+
|
|
184
|
+
constructor(scope: Construct, id?: string) {
|
|
185
|
+
super(scope, id ?? "JaypieDocumentationStack", { key: "documentation" });
|
|
186
|
+
|
|
187
|
+
const zone = process.env.CDK_ENV_HOSTED_ZONE ?? "example.com";
|
|
188
|
+
const host = envHostname({ domain: zone });
|
|
189
|
+
|
|
190
|
+
this.bucket = new JaypieStaticWebBucket(this, "DocumentationBucket", {
|
|
191
|
+
host,
|
|
192
|
+
zone,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## See Also
|
|
199
|
+
|
|
200
|
+
- **`skill("cdk")`** — core constructs, `JaypieDistribution` WAF and security headers, `JaypieNextJs`
|
|
201
|
+
- **`skill("cicd-deploy")`** — workflows that consume `DestinationBucketName` / `DeployRoleArn` / `DistributionId`
|
|
202
|
+
- **`skill("dns")`** — hosted zones, ACM certificates, DNS debugging
|
|
203
|
+
- **`skill("secrets")`** — `JaypieEnvSecret` provider/consumer pattern
|
|
204
|
+
- **`skill("streaming")`** — `JaypieDistribution` streaming configuration
|
|
205
|
+
- **`skill("variables")`** — environment variable reference
|