Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b0f9560
pnpm package workspace mode
rsproule Sep 19, 2025
96a545c
update ci script for pnpm
rsproule Sep 19, 2025
a3bca35
use turbo for dep guaranteed builds
rsproule Sep 19, 2025
933c747
format the registry
rsproule Sep 19, 2025
82aa00e
dockerfile for railway use turbo
rsproule Sep 19, 2025
5686159
gitignor
rsproule Sep 19, 2025
09b1fd2
env local
rsproule Sep 19, 2025
6c11c0d
fix types in sdks
jasonhedman Sep 19, 2025
3b92b49
remove ts sdk as control dependency
jasonhedman Sep 19, 2025
dbcd33a
Merge branch 'rfs/workspace-deps' into json/update-sdks
jasonhedman Sep 19, 2025
22aae12
rm generate types from control prebuild
jasonhedman Sep 19, 2025
7969f73
global env for integ tests
jasonhedman Sep 19, 2025
e3bb90b
debug log for integ test workflow
jasonhedman Sep 19, 2025
038bdd3
env loose mode
jasonhedman Sep 19, 2025
de03b3d
skip env validation during build
jasonhedman Sep 19, 2025
0c71b14
dont build examples turbo
jasonhedman Sep 19, 2025
61f7cda
update publish env vars
jasonhedman Sep 19, 2025
0020389
skip env validation
jasonhedman Sep 19, 2025
226d1a5
filter examples from prepare
jasonhedman Sep 19, 2025
936a8b0
exclude registry from prepare
jasonhedman Sep 19, 2025
a9ce8ad
update free balance route params schema
jasonhedman Sep 19, 2025
12f4681
add oauth error type
jasonhedman Sep 19, 2025
7abbb47
add oauth routes
jasonhedman Sep 19, 2025
4e24a73
adhere to oauth error message standards
jasonhedman Sep 19, 2025
75f6b14
fix type inference
jasonhedman Sep 19, 2025
33cc9e1
dont skip env validation in build
jasonhedman Sep 19, 2025
895c286
use handle internal error in validation errors
jasonhedman Sep 19, 2025
ac69ca7
utilize handleInternalError
jasonhedman Sep 19, 2025
e841a35
update some tests
jasonhedman Sep 19, 2025
5e99af3
fix broken tests
jasonhedman Sep 19, 2025
0f20c5c
please final integ test fixes
jasonhedman Sep 19, 2025
fd31c1d
missing params test
jasonhedman Sep 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 91 additions & 24 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,50 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30

env:
# Database Configuration
DATABASE_URL: postgresql://test:test@localhost:5433/echo_integration_test

# Service URLs
ECHO_CONTROL_URL: http://localhost:3001
ECHO_DATA_SERVER_URL: http://localhost:3069

# Authentication Secrets
JWT_SECRET: ${{ secrets.TEST_JWT_SECRET }}
JWT_ISSUER: http://localhost:3001
JWT_AUDIENCE: echo-proxy

# Auth.js Configuration
AUTH_SECRET: ${{ secrets.TEST_AUTH_SECRET }}

# Integration Test JWTs
INTEGRATION_TEST_JWT: ${{ secrets.INTEGRATION_TEST_JWT }}
INTEGRATION_TEST_JWT_USER_2: ${{ secrets.INTEGRATION_TEST_JWT_USER_2 }}

# API Keys for Echo Server
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

# OAuth Configuration
OAUTH_REFRESH_TOKEN_EXPIRY_SECONDS: 2592000
OAUTH_ACCESS_TOKEN_EXPIRY_SECONDS: 86400

# Environment Flags
CI: true
NODE_ENV: test
INTEGRATION_TEST_MODE: true

NEXT_PUBLIC_ECHO_APP_ID: 74d9c979-e036-4e43-904f-32d214b361fc

# Optional Stripe Configuration
STRIPE_SECRET_KEY: ${{ secrets.TEST_STRIPE_SECRET_KEY }}
STRIPE_PUBLISHABLE_KEY: ${{ secrets.TEST_STRIPE_PUBLISHABLE_KEY }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.TEST_STRIPE_WEBHOOK_SECRET }}

# Test Configuration
HEADLESS: true
LOG_LEVEL: error

services:
postgres:
image: postgres:15-alpine
Expand Down Expand Up @@ -88,6 +132,9 @@ jobs:
INTEGRATION_TEST_JWT=${{ secrets.INTEGRATION_TEST_JWT }}
INTEGRATION_TEST_JWT_USER_2=${{ secrets.INTEGRATION_TEST_JWT_USER_2 }}

# Next.js Configuration
NEXT_PUBLIC_ECHO_APP_ID=74d9c979-e036-4e43-904f-32d214b361fc

# API Keys for Echo Server
OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
Expand Down Expand Up @@ -120,34 +167,10 @@ jobs:

- name: Setup Prisma schema
working-directory: packages/app/control
env:
DATABASE_URL: postgresql://test:test@localhost:5433/echo_integration_test
run: pnpm prisma:generate

- name: Setup integration test environment
working-directory: packages/tests/integration
env:
DATABASE_URL: postgresql://test:test@localhost:5433/echo_integration_test
ECHO_CONTROL_URL: http://localhost:3001
ECHO_DATA_SERVER_URL: http://localhost:3069
JWT_SECRET: ${{ secrets.TEST_JWT_SECRET }}
JWT_ISSUER: http://localhost:3001
JWT_AUDIENCE: echo-proxy
INTEGRATION_TEST_JWT: ${{ secrets.INTEGRATION_TEST_JWT }}
INTEGRATION_TEST_JWT_USER_2: ${{ secrets.INTEGRATION_TEST_JWT_USER_2 }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OAUTH_REFRESH_TOKEN_EXPIRY_SECONDS: 2592000
OAUTH_ACCESS_TOKEN_EXPIRY_SECONDS: 86400
CI: true
NODE_ENV: test
INTEGRATION_TEST_MODE: true
STRIPE_SECRET_KEY: ${{ secrets.TEST_STRIPE_SECRET_KEY }}
STRIPE_PUBLISHABLE_KEY: ${{ secrets.TEST_STRIPE_PUBLISHABLE_KEY }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.TEST_STRIPE_WEBHOOK_SECRET }}
HEADLESS: true
LOG_LEVEL: error
AUTH_SECRET: ${{ secrets.TEST_AUTH_SECRET }}
run: |
chmod +x scripts/setup-integration-env.sh
pnpm run env:setup
Expand Down Expand Up @@ -188,6 +211,50 @@ jobs:
needs: integration-tests
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'run-e2e')

env:
# Database Configuration
DATABASE_URL: postgresql://test:test@postgres-test:5432/echo_integration_test

# Service URLs
ECHO_CONTROL_URL: http://echo-control-test:3000
ECHO_DATA_SERVER_URL: http://echo-data-server-test:3069

# Authentication Secrets
JWT_SECRET: ${{ secrets.TEST_JWT_SECRET }}
JWT_ISSUER: http://echo-control-test:3000
JWT_AUDIENCE: echo-proxy

# Auth.js Configuration
AUTH_SECRET: ${{ secrets.TEST_AUTH_SECRET }}

# Integration Test JWTs
INTEGRATION_TEST_JWT: ${{ secrets.INTEGRATION_TEST_JWT }}
INTEGRATION_TEST_JWT_USER_2: ${{ secrets.INTEGRATION_TEST_JWT_USER_2 }}

# API Keys for Echo Server
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

# OAuth Configuration
OAUTH_REFRESH_TOKEN_EXPIRY_SECONDS: 2592000
OAUTH_ACCESS_TOKEN_EXPIRY_SECONDS: 86400

# Environment Flags
CI: true
NODE_ENV: test
INTEGRATION_TEST_MODE: true

# Optional Stripe Configuration
STRIPE_SECRET_KEY: ${{ secrets.TEST_STRIPE_SECRET_KEY }}
STRIPE_PUBLISHABLE_KEY: ${{ secrets.TEST_STRIPE_PUBLISHABLE_KEY }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.TEST_STRIPE_WEBHOOK_SECRET }}

NEXT_PUBLIC_ECHO_APP_ID: 74d9c979-e036-4e43-904f-32d214b361fc

# Test Configuration
HEADLESS: true
LOG_LEVEL: error

steps:
- name: Checkout code
uses: actions/checkout@v4
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/publish-sdks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
if [ "$FORCE_PUBLISH" = "true" ]; then
echo "⚠️ Version $PACKAGE_VERSION of $PACKAGE_NAME already exists on npm, but force_publish is enabled"
echo "🚀 Publishing $PACKAGE_NAME to npm..."
npm publish --access public
pnpm publish --access public --no-git-checks
echo "published=true" >> $GITHUB_OUTPUT
echo "✅ Successfully published $PACKAGE_NAME"
else
Expand Down Expand Up @@ -126,7 +126,7 @@ jobs:
if [ "$FORCE_PUBLISH" = "true" ]; then
echo "⚠️ Version $PACKAGE_VERSION of $PACKAGE_NAME already exists on npm, but force_publish is enabled"
echo "🚀 Publishing $PACKAGE_NAME to npm..."
npm publish --access public
pnpm publish --access public --no-git-checks
echo "published=true" >> $GITHUB_OUTPUT
echo "✅ Successfully published $PACKAGE_NAME"
else
Expand Down Expand Up @@ -170,7 +170,7 @@ jobs:
if [ "$FORCE_PUBLISH" = "true" ]; then
echo "⚠️ Version $PACKAGE_VERSION of $PACKAGE_NAME already exists on npm, but force_publish is enabled"
echo "🚀 Publishing $PACKAGE_NAME to npm..."
npm publish --access public
pnpm publish --access public --no-git-checks
echo "published=true" >> $GITHUB_OUTPUT
echo "✅ Successfully published $PACKAGE_NAME"
else
Expand Down Expand Up @@ -214,7 +214,7 @@ jobs:
if [ "$FORCE_PUBLISH" = "true" ]; then
echo "⚠️ Version $PACKAGE_VERSION of $PACKAGE_NAME already exists on npm, but force_publish is enabled"
echo "🚀 Publishing $PACKAGE_NAME to npm..."
npm publish --access public
pnpm publish --access public --no-git-checks
echo "published=true" >> $GITHUB_OUTPUT
echo "✅ Successfully published $PACKAGE_NAME"
else
Expand Down
44 changes: 44 additions & 0 deletions .github/workflows/test-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,50 @@ jobs:
next-version: ${{ steps.get-versions.outputs.next-version }}
echo-start-version: ${{ steps.get-versions.outputs.echo-start-version }}

env:
# Database Configuration
DATABASE_URL: postgresql://test:test@localhost:5433/echo_integration_test

# Service URLs
ECHO_CONTROL_URL: http://localhost:3001
ECHO_DATA_SERVER_URL: http://localhost:3069

# Authentication Secrets
JWT_SECRET: ${{ secrets.TEST_JWT_SECRET }}
JWT_ISSUER: http://localhost:3001
JWT_AUDIENCE: echo-proxy

# Auth.js Configuration
AUTH_SECRET: ${{ secrets.TEST_AUTH_SECRET }}

# Integration Test JWTs
INTEGRATION_TEST_JWT: ${{ secrets.INTEGRATION_TEST_JWT }}
INTEGRATION_TEST_JWT_USER_2: ${{ secrets.INTEGRATION_TEST_JWT_USER_2 }}

# API Keys for Echo Server
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

# OAuth Configuration
OAUTH_REFRESH_TOKEN_EXPIRY_SECONDS: 2592000
OAUTH_ACCESS_TOKEN_EXPIRY_SECONDS: 86400

# Environment Flags
CI: true
NODE_ENV: test
INTEGRATION_TEST_MODE: true

NEXT_PUBLIC_ECHO_APP_ID: 74d9c979-e036-4e43-904f-32d214b361fc

# Optional Stripe Configuration
STRIPE_SECRET_KEY: ${{ secrets.TEST_STRIPE_SECRET_KEY }}
STRIPE_PUBLISHABLE_KEY: ${{ secrets.TEST_STRIPE_PUBLISHABLE_KEY }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.TEST_STRIPE_WEBHOOK_SECRET }}

# Test Configuration
HEADLESS: true
LOG_LEVEL: error

steps:
- name: Checkout code
uses: actions/checkout@v4
Expand Down
20 changes: 7 additions & 13 deletions Dockerfile.railway
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ COPY pnpm-lock.yaml ./
COPY pnpm-workspace.yaml ./
COPY package.json ./
COPY tsconfig.base.json ./
COPY turbo.json ./

# Copy all project files first
COPY packages/app/control/ ./packages/app/control/
Expand All @@ -82,28 +83,21 @@ COPY packages/sdk/ts/ ./packages/sdk/ts/
COPY packages/sdk/next/ ./packages/sdk/next/
COPY packages/sdk/react/ ./packages/sdk/react/

# Install dependencies for both projects (including dev dependencies for build)
WORKDIR /app/packages/app/control
# Install all workspace dependencies
WORKDIR /app
RUN pnpm install

WORKDIR /app/packages/app/server
RUN pnpm install
# Build all packages in correct dependency order using Turbo
WORKDIR /app
RUN pnpm run build

# Step 1: Build echo-control and generate Prisma client
# Generate Prisma client and copy schema for server
WORKDIR /app/packages/app/control
RUN pnpm run prisma:generate
RUN pnpm run build

WORKDIR /app/packages/sdk/ts
RUN pnpm install
RUN pnpm run build

WORKDIR /app/packages/app/server
RUN pnpm run copy-prisma

# Step 3: Build echo-server
RUN pnpm run build

# Set NODE_OPTIONS to enable OpenTelemetry for echo-server

# Step 4: Install production dependencies only
Expand Down
8 changes: 6 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,19 @@
"packageManager": "pnpm@10.11.0",
"scripts": {
"dev": "turbo run dev --filter=echo-control --filter=echo-server",
"build": "pnpm run --recursive build",
"build": "turbo run build --env-mode=loose",
"prepare": "SKIP_ENV_VALIDATION=true turbo run build --env-mode=loose --filter=./packages/sdk/* --filter=!echo-next-template --filter=!echo-vite-template --filter=!registry",
"test:unit": "pnpm -C packages/sdk/ts run build && pnpm -r --filter=!packages/app/server run test:unit",
"test:integration": "pnpm -C packages/tests/integration test",
"test:all": "pnpm run test:unit && pnpm run test:integration",
"lint": "pnpm run --recursive lint",
"lint:fix": "pnpm run --recursive lint:fix",
"type-check": "pnpm run --recursive type-check",
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\""
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\"",
"publish:test": "pnpm -r publish --dry-run --no-git-checks",
"publish:sdks": "pnpm --filter @merit-systems/echo-typescript-sdk publish --no-git-checks && pnpm --filter @merit-systems/echo-react-sdk publish --no-git-checks && pnpm --filter @merit-systems/echo-next-sdk publish --no-git-checks && pnpm --filter echo-start publish --no-git-checks",
"publish:sdks:test": "pnpm --filter @merit-systems/echo-typescript-sdk publish --dry-run --no-git-checks && pnpm --filter @merit-systems/echo-react-sdk publish --dry-run --no-git-checks && pnpm --filter @merit-systems/echo-next-sdk publish --dry-run --no-git-checks && pnpm --filter echo-start publish --dry-run --no-git-checks"
},
"devDependencies": {
"@eslint/js": "^9.13.0",
Expand Down
7 changes: 1 addition & 6 deletions packages/app/control/knip.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,7 @@
"src/app/**/route.{js,jsx,ts,tsx}",
"src/mdx-components.{js,jsx,ts,tsx}"
],
"ignoreDependencies": [
"eslint-config-next",
"husky",
"tw-animate-css",
"@merit-systems/echo-typescript-sdk"
],
"ignoreDependencies": ["eslint-config-next", "husky", "tw-animate-css"],
"ignore": [
"/scripts/**",
"/source.config.ts",
Expand Down
3 changes: 1 addition & 2 deletions packages/app/control/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"scripts": {
"predev": "docker-compose -f docker-local-db.yml up -d && sleep 3 && prisma generate && prisma migrate deploy",
"dev": "next dev --turbopack",
"prebuild": "prisma generate && npm run generate-api-types",
"prebuild": "prisma generate",
"build": "next build",
"generate-api-types": "tsx scripts/generate-api-types.ts",
"start": "next start",
Expand All @@ -31,7 +31,6 @@
"@coinbase/x402": "^0.5.0",
"@hookform/resolvers": "^5.2.1",
"@icons-pack/react-simple-icons": "^13.7.0",
"@merit-systems/echo-typescript-sdk": "1.0.14",
"@merit-systems/sdk": "0.0.8",
"@number-flow/react": "^0.5.10",
"@opentelemetry/api": "^1.9.0",
Expand Down
Loading
Loading