From 84e491a22a006e972d7279f9994648f0a1717662 Mon Sep 17 00:00:00 2001 From: Kevin De Porre Date: Thu, 23 Jan 2025 17:01:44 +0100 Subject: [PATCH 01/21] GH workflow + example change --- .github/workflows/deploy_examples.yml | 2 ++ examples/todo-app/sst.config.ts | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index ee5b44db3d..ef2a851725 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -26,6 +26,8 @@ jobs: ELECTRIC_API: ${{ secrets.ELECTRIC_API }} ELECTRIC_ADMIN_API: ${{ secrets.ELECTRIC_ADMIN_API }} ELECTRIC_TEAM_ID: ${{ secrets.ELECTRIC_TEAM_ID }} + ELECTRIC_ADMIN_API_TOKEN_ID: ${{ secrets.ELECTRIC_ADMIN_API_TOKEN_ID }} + ELECTRIC_ADMIN_API_TOKEN_SECRET: ${{ secrets.ELECTRIC_ADMIN_API_TOKEN_SECRET }} # HONEYCOMB_API_KEY: ${{ secrets.HONEYCOMB_API_KEY }} TODO steps: diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 4426d77776..e4b2d1088f 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -133,7 +133,11 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { "Content-Type": `application/json` }, + headers: { + "Content-Type": `application/json`, + "CF-Access-Client-Id": process.env.ELECTRIC_ADMIN_API_TOKEN_ID, + "CF-Access-Client-Secret": process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET, + }, body: JSON.stringify({ database_url: uri, region: `us-east-1`, From 781d6a3387d82e54022dd65fdbbc1666dbcc3a83 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Tue, 28 Jan 2025 17:54:03 +0000 Subject: [PATCH 02/21] Deploy linearlite-read-only, nextjs, todoapp --- .github/workflows/deploy_examples.yml | 14 ++++++++++++++ examples/linearlite-read-only/sst.config.ts | 6 +++++- examples/nextjs/sst.config.ts | 6 +++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index ef2a851725..1e6534abbd 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -73,6 +73,18 @@ jobs: exit 123 fi + - name: Deploy TODO App example + working-directory: ./examples/todo-app + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + todoapp=$(jq -r '.website' .sst/outputs.json) + echo "todoapp=$todoapp" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Add comment to PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 @@ -81,11 +93,13 @@ jobs: script: | const linearlite_read_only = process.env.linearlite_read_only; const nextjs = process.env.nextjs; + const todoapp = process.env.todoapp; const prNumber = context.issue.number; const commentBody = `## Examples - linearlite-read-only: ${linearlite_read_only} - nextjs: ${nextjs} + - todoapp: ${todoapp} `; const { data: comments } = await github.rest.issues.listComments({ diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index dea22f1285..78f28a9eab 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -109,7 +109,11 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { 'Content-Type': `application/json` }, + headers: { + 'Content-Type': `application/json`, + 'CF-Access-Client-Id': process.env.ELECTRIC_ADMIN_API_TOKEN_ID!, + 'CF-Access-Client-Secret': process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET!, + }, body: JSON.stringify({ database_url: uri, region: `us-east-1`, diff --git a/examples/nextjs/sst.config.ts b/examples/nextjs/sst.config.ts index 3065b4a6b8..ccbd8e5a7a 100644 --- a/examples/nextjs/sst.config.ts +++ b/examples/nextjs/sst.config.ts @@ -98,7 +98,11 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { "Content-Type": `application/json` }, + headers: { + "Content-Type": `application/json`, + "CF-Access-Client-Id": process.env.ELECTRIC_ADMIN_API_TOKEN_ID!, + "CF-Access-Client-Secret": process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET!, + }, body: JSON.stringify({ database_url: uri, region: `us-east-1`, From 88ae749d8981d0dc32ddf6bed5a383018885ae38 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Tue, 28 Jan 2025 23:20:58 +0000 Subject: [PATCH 03/21] prepare more examples; throw if admin-api token is not set --- examples/linearlite-read-only/sst.config.ts | 15 +- examples/linearlite/sst.config.ts | 17 +- examples/proxy-auth/sst.config.ts | 180 ++++++++++++++++---- examples/todo-app/sst.config.ts | 15 +- examples/write-patterns/sst.config.ts | 17 +- examples/yjs/sst.config.ts | 18 +- 6 files changed, 218 insertions(+), 44 deletions(-) diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index 78f28a9eab..8fc7b4e259 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -3,6 +3,17 @@ import { execSync } from 'child_process' +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + export default $config({ app(input) { return { @@ -111,8 +122,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { 'Content-Type': `application/json`, - 'CF-Access-Client-Id': process.env.ELECTRIC_ADMIN_API_TOKEN_ID!, - 'CF-Access-Client-Secret': process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET!, + 'CF-Access-Client-Id': adminApiTokenId, + 'CF-Access-Client-Secret': adminApiTokenSecret, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index dee0c8e83b..42143664eb 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -6,6 +6,17 @@ import { execSync } from 'child_process' const isProduction = (stage: string) => stage.toLocaleLowerCase() === `production` +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + export default $config({ app(input) { return { @@ -83,7 +94,11 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { 'Content-Type': `application/json` }, + headers: { + 'Content-Type': `application/json`, + 'CF-Access-Client-Id': adminApiTokenId, + 'CF-Access-Client-Secret': adminApiTokenSecret, + }, body: JSON.stringify({ database_url: uri, region: `us-east-1`, diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index 8b1b10a133..98b4ea0927 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -4,6 +4,18 @@ import { execSync } from "child_process" const isProduction = (stage: string) => stage.toLowerCase() === `production` +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + + export default $config({ app(input) { return { @@ -28,30 +40,29 @@ export default $config({ `Env variables ELECTRIC_API and ELECTRIC_ADMIN_API must be set` ) - if ( - !process.env.EXAMPLES_DATABASE_HOST || - !process.env.EXAMPLES_DATABASE_PASSWORD - ) { - throw new Error( - `Env variables EXAMPLES_DATABASE_HOST and EXAMPLES_DATABASE_PASSWORD must be set` - ) - } - - const provider = new postgresql.Provider(`neon`, { - host: process.env.EXAMPLES_DATABASE_HOST, - database: `neondb`, - username: `neondb_owner`, - password: process.env.EXAMPLES_DATABASE_PASSWORD, + const project = neon.getProjectOutput({ + id: process.env.NEON_PROJECT_ID!, }) - const dbName = isProduction($app.stage) + const dbName = isProduction() ? `proxy-auth-production` : `proxy-auth-${$app.stage}` - const pg = new postgresql.Database(dbName, {}, { provider }) - const pgUri = $interpolate`postgresql://${provider.username}:${provider.password}@${provider.host}/${pg.name}?sslmode=require` - const electricInfo = pgUri.apply((uri) => { - return addDatabaseToElectric(uri, `eu-west-1`) + const { ownerName, dbName: resultingDbName } = createNeonDb({ + projectId: project.id, + branchId: project.defaultBranchId, + dbName, + }) + + const databaseUri = getNeonConnectionString({ + project, + roleName: ownerName, + databaseName: resultingDbName, + pooled: false, + }) + + const electricInfo = databaseUri.apply((uri) => { + return addDatabaseToElectric(uri) }) const staticSite = new sst.aws.Nextjs(`proxy-auth`, { @@ -66,10 +77,10 @@ export default $config({ }, }) - pgUri.apply((uri) => applyMigrations(uri)) + databaseUri.apply(applyMigrations) return { - pgUri, + databaseUri, databaseId: electricInfo.id, token: electricInfo.token, url: staticSite.url, @@ -86,33 +97,128 @@ function applyMigrations(uri: string) { }) } async function addDatabaseToElectric( - uri: string, - region: string -): Promise<{ - id: string - token: string -}> { + uri: string +): Promise<{ id: string; token: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID - const url = new URL(`/v1/sources`, adminApi) - const result = await fetch(url, { + + const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { "Content-Type": `application/json` }, + headers: { + "Content-Type": `application/json`, + "CF-Access-Client-Id": adminApiTokenId, + "CF-Access-Client-Secret": adminApiTokenSecret, + }, body: JSON.stringify({ database_url: uri, - region, + region: `us-east-1`, team_id: teamId, }), }) + if (!result.ok) { throw new Error( - `Could not add database to Electric (${ - result.status - }): ${await result.text()}` + `Could not add database to Electric (${result.status}): ${await result.text()}` ) } - return (await result.json()) as { - token: string - id: string + + return await result.json() +} + +function getNeonConnectionString({ + project, + roleName, + databaseName, + pooled, +}: { + project: $util.Output + roleName: $util.Input + databaseName: $util.Input + pooled: boolean +}): $util.Output { + const passwordOutput = neon.getBranchRolePasswordOutput({ + projectId: project.id, + branchId: project.defaultBranchId, + roleName: roleName, + }) + + const endpoint = neon.getBranchEndpointsOutput({ + projectId: project.id, + branchId: project.defaultBranchId, + }) + const databaseHost = pooled + ? endpoint.endpoints?.apply((endpoints) => + endpoints![0].host.replace( + endpoints![0].id, + endpoints![0].id + `-pooler` + ) + ) + : project.databaseHost + return $interpolate`postgresql://${passwordOutput.roleName}:${passwordOutput.password}@${databaseHost}/${databaseName}?sslmode=require` +} + +/** + * Uses the [Neon API](https://neon.tech/docs/manage/databases) along with + * a Pulumi Command resource and `curl` to create and delete Neon databases. + */ +function createNeonDb({ + projectId, + branchId, + dbName, +}: { + projectId: $util.Input + branchId: $util.Input + dbName: $util.Input +}): $util.Output<{ + dbName: string + ownerName: string +}> { + if (!process.env.NEON_API_KEY) { + throw new Error(`NEON_API_KEY is not set`) } + + const ownerName = `neondb_owner` + + const createCommand = `curl -f -s "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches/$BRANCH_ID/databases" \ + -H 'Accept: application/json' \ + -H "Authorization: Bearer $NEON_API_KEY" \ + -H 'Content-Type: application/json' \ + -d '{ + "database": { + "name": "'$DATABASE_NAME'", + "owner_name": "${ownerName}" + } + }' \ + && echo " SUCCESS" || echo " FAILURE"` + + const updateCommand = `echo "Cannot update Neon database with this provisioning method SUCCESS"` + + const deleteCommand = `curl -f -s -X 'DELETE' \ + "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches/$BRANCH_ID/databases/$DATABASE_NAME" \ + -H 'Accept: application/json' \ + -H "Authorization: Bearer $NEON_API_KEY" \ + && echo " SUCCESS" || echo " FAILURE"` + + const result = new command.local.Command(`neon-db-command:${dbName}`, { + create: createCommand, + update: updateCommand, + delete: deleteCommand, + environment: { + NEON_API_KEY: process.env.NEON_API_KEY, + PROJECT_ID: projectId, + BRANCH_ID: branchId, + DATABASE_NAME: dbName, + }, + }) + return $resolve([result.stdout, dbName]).apply(([stdout, dbName]) => { + if (stdout.endsWith(`SUCCESS`)) { + console.log(`Created Neon database ${dbName}`) + return { + dbName, + ownerName, + } + } else { + throw new Error(`Failed to create Neon database ${dbName}: ${stdout}`) + } + }) } diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index e4b2d1088f..7292d02ccc 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -6,6 +6,17 @@ import { execSync } from "child_process" const isProduction = (stage: string) => stage.toLocaleLowerCase() === `production` +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + export default $config({ app(input) { return { @@ -135,8 +146,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": `application/json`, - "CF-Access-Client-Id": process.env.ELECTRIC_ADMIN_API_TOKEN_ID, - "CF-Access-Client-Secret": process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET, + "CF-Access-Client-Id": adminApiTokenId, + "CF-Access-Client-Secret": adminApiTokenSecret, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index e072182e0f..0bfefb8d0e 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -6,6 +6,17 @@ import { execSync } from 'child_process' const isProduction = (stage) => stage.toLocaleLowerCase() === 'production' +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + export default $config({ app(input) { return { @@ -142,7 +153,11 @@ async function addDatabaseToElectric( const result = await fetch(new URL('v1/sources', adminApi), { method: 'PUT', - headers: { 'Content-Type': 'application/json' }, + headers: { + 'Content-Type': `application/json`, + 'CF-Access-Client-Id': adminApiTokenId!, + 'CF-Access-Client-Secret': adminApiTokenSecret, + }, body: JSON.stringify({ database_url, region, diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index b97dd17b3d..c2f8b81d88 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -5,6 +5,18 @@ import { execSync } from "child_process" const isProduction = () => $app.stage.toLocaleLowerCase() === `production` +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") +} + +const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID +const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET + + export default $config({ app(input) { return { @@ -138,7 +150,11 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, - headers: { "Content-Type": `application/json` }, + headers: { + "Content-Type": `application/json`, + "CF-Access-Client-Id": adminApiTokenId, + "CF-Access-Client-Secret": adminApiTokenSecret, + }, body: JSON.stringify({ database_url: uri, region: `us-east-1`, From ee8526ef471b09136796e949ad7704cb31b3cbb0 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 11:01:55 +0000 Subject: [PATCH 04/21] Missing base.json --- examples/todo-app/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/todo-app/Dockerfile b/examples/todo-app/Dockerfile index 2151a4b833..d3e517907b 100644 --- a/examples/todo-app/Dockerfile +++ b/examples/todo-app/Dockerfile @@ -8,6 +8,7 @@ RUN npm install -g pnpm COPY pnpm-*.yaml ./ COPY package.json ./ +COPY tsconfig.base.json ./ COPY tsconfig.build.json ./ COPY packages/typescript-client packages/typescript-client/ COPY packages/react-hooks packages/react-hooks/ From 29a7dd3fa989290d2cdf7866cebb4acdff344f58 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 11:02:10 +0000 Subject: [PATCH 05/21] Fixed provider version --- examples/todo-app/sst.config.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 7292d02ccc..69b05a01ba 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -6,14 +6,6 @@ import { execSync } from "child_process" const isProduction = (stage: string) => stage.toLocaleLowerCase() === `production` -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET @@ -26,7 +18,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, profile: process.env.CI ? undefined : `marketing`, }, neon: `0.6.3`, @@ -35,6 +27,14 @@ export default $config({ } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + } + try { const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID!, From fa5b7d52dc44a0e29c39847e627dd133ae0221e8 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 11:13:26 +0000 Subject: [PATCH 06/21] Deploy Yjs and Writes examples --- .github/workflows/deploy_examples.yml | 27 +++++++++++++++++++++++++++ examples/write-patterns/sst.config.ts | 18 +++++++++--------- examples/yjs/Dockerfile | 1 + examples/yjs/sst.config.ts | 17 ++++++++--------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 1e6534abbd..247d40202c 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -85,6 +85,30 @@ jobs: exit 123 fi + - name: Deploy yjs example + working-directory: ./examples/yjs + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + yjs=$(jq -r '.website' .sst/outputs.json) + echo "yjs=$yjs" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + + - name: Deploy Write Patterns example + working-directory: ./examples/write-patterns + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + writes=$(jq -r '.website' .sst/outputs.json) + echo "writes=$writes" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Add comment to PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 @@ -94,12 +118,15 @@ jobs: const linearlite_read_only = process.env.linearlite_read_only; const nextjs = process.env.nextjs; const todoapp = process.env.todoapp; + const yjs = process.env.yjs; + const writes = process.env.writes; const prNumber = context.issue.number; const commentBody = `## Examples - linearlite-read-only: ${linearlite_read_only} - nextjs: ${nextjs} - todoapp: ${todoapp} + - yjs: ${yjs} `; const { data: comments } = await github.rest.issues.listComments({ diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index 0bfefb8d0e..d7fb96f3c2 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -6,14 +6,6 @@ import { execSync } from 'child_process' const isProduction = (stage) => stage.toLocaleLowerCase() === 'production' -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET @@ -35,6 +27,14 @@ export default $config({ } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') + } + const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID! }) const dbName = isProduction($app.stage) @@ -156,7 +156,7 @@ async function addDatabaseToElectric( headers: { 'Content-Type': `application/json`, 'CF-Access-Client-Id': adminApiTokenId!, - 'CF-Access-Client-Secret': adminApiTokenSecret, + 'CF-Access-Client-Secret': adminApiTokenSecret!, }, body: JSON.stringify({ database_url, diff --git a/examples/yjs/Dockerfile b/examples/yjs/Dockerfile index a1f6b8a52e..32365f78c5 100644 --- a/examples/yjs/Dockerfile +++ b/examples/yjs/Dockerfile @@ -8,6 +8,7 @@ RUN npm install -g pnpm COPY pnpm-*.yaml ./ COPY package.json ./ +COPY tsconfig.base.json ./ COPY tsconfig.build.json ./ COPY packages/typescript-client packages/typescript-client/ COPY packages/react-hooks packages/react-hooks/ diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index c2f8b81d88..3cba315e2d 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -5,18 +5,9 @@ import { execSync } from "child_process" const isProduction = () => $app.stage.toLocaleLowerCase() === `production` -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET - export default $config({ app(input) { return { @@ -36,6 +27,14 @@ export default $config({ } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + } + try { const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID!, From a956bdd4271cda71563357735de1807804b8b9f8 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 11:17:09 +0000 Subject: [PATCH 07/21] tinny cleanup --- examples/write-patterns/sst.config.ts | 4 ++-- examples/yjs/sst.config.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index d7fb96f3c2..8477d3ba6d 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -155,8 +155,8 @@ async function addDatabaseToElectric( method: 'PUT', headers: { 'Content-Type': `application/json`, - 'CF-Access-Client-Id': adminApiTokenId!, - 'CF-Access-Client-Secret': adminApiTokenSecret!, + 'CF-Access-Client-Id': adminApiTokenId ?? '', + 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', }, body: JSON.stringify({ database_url, diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index 3cba315e2d..2835f80a68 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -28,11 +28,11 @@ export default $config({ }, async run() { if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } try { From 33f134c7e690ee4a3e94da9d82932e8ea60ae8fb Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 11:45:06 +0000 Subject: [PATCH 08/21] Remaining examples --- .github/workflows/deploy_examples.yml | 28 ++++++++++++++++++++- examples/linearlite-read-only/sst.config.ts | 22 ++++++++-------- examples/linearlite/sst.config.ts | 22 ++++++++-------- examples/proxy-auth/sst.config.ts | 25 +++++++++--------- examples/todo-app/sst.config.ts | 4 +-- examples/write-patterns/sst.config.ts | 6 ++--- examples/yjs/sst.config.ts | 6 ++--- 7 files changed, 70 insertions(+), 43 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 247d40202c..07b122c607 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -61,6 +61,18 @@ jobs: exit 123 fi + - name: Deploy Linearlite + working-directory: ./examples/linearlite + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + linearlite=$(jq -r '.website' .sst/outputs.json) + echo "linearlite=$linearlite" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Deploy NextJs example working-directory: ./examples/nextjs run: | @@ -85,7 +97,7 @@ jobs: exit 123 fi - - name: Deploy yjs example + - name: Deploy Yjs example working-directory: ./examples/yjs run: | pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} @@ -109,6 +121,18 @@ jobs: exit 123 fi + - name: Deploy proxy-auth example + working-directory: ./examples/proxy-auth + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + auth=$(jq -r '.website' .sst/outputs.json) + echo "auth=$auth" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Add comment to PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 @@ -116,10 +140,12 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const linearlite_read_only = process.env.linearlite_read_only; + const linearlite = process.env.linearlite; const nextjs = process.env.nextjs; const todoapp = process.env.todoapp; const yjs = process.env.yjs; const writes = process.env.writes; + const auth = process.env.auth; const prNumber = context.issue.number; const commentBody = `## Examples diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index 8fc7b4e259..780d0b1678 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -3,14 +3,6 @@ import { execSync } from 'child_process' -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET @@ -32,6 +24,14 @@ export default $config({ } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID! }) const dbName = `linearlite-read-only-${$app.stage}` @@ -121,9 +121,9 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, headers: { - 'Content-Type': `application/json`, - 'CF-Access-Client-Id': adminApiTokenId, - 'CF-Access-Client-Secret': adminApiTokenSecret, + 'Content-Type': 'application/json', + 'CF-Access-Client-Id': adminApiTokenId ?? '', + 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', }, body: JSON.stringify({ database_url: uri, diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index 42143664eb..89edbe4767 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -6,14 +6,6 @@ import { execSync } from 'child_process' const isProduction = (stage: string) => stage.toLocaleLowerCase() === `production` -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET @@ -33,6 +25,14 @@ export default $config({ } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + try { const databaseUri = $interpolate`postgresql://postgres:${process.env.LINEARLITE_SUPABASE_PROJECT_PASSWORD}@db.${process.env.LINEARLITE_SUPABASE_PROJECT_ID}.supabase.co:5432/postgres` @@ -95,9 +95,9 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, headers: { - 'Content-Type': `application/json`, - 'CF-Access-Client-Id': adminApiTokenId, - 'CF-Access-Client-Secret': adminApiTokenSecret, + 'Content-Type': 'application/json', + 'CF-Access-Client-Id': adminApiTokenId ?? '', + 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', }, body: JSON.stringify({ database_url: uri, diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index 98b4ea0927..3e27f4d997 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -4,18 +4,9 @@ import { execSync } from "child_process" const isProduction = (stage: string) => stage.toLowerCase() === `production` -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - -if (!process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") -} - const adminApiTokenId = process.env.ELECTRIC_ADMIN_API_TOKEN_ID const adminApiTokenSecret = process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET - export default $config({ app(input) { return { @@ -31,10 +22,20 @@ export default $config({ profile: process.env.CI ? undefined : `marketing`, }, postgresql: `3.14.0`, + neon: `0.6.3`, + command: `1.0.1`, }, } }, async run() { + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + + if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) + } + if (!process.env.ELECTRIC_API || !process.env.ELECTRIC_ADMIN_API) throw new Error( `Env variables ELECTRIC_API and ELECTRIC_ADMIN_API must be set` @@ -44,7 +45,7 @@ export default $config({ id: process.env.NEON_PROJECT_ID!, }) - const dbName = isProduction() + const dbName = isProduction($app.stage) ? `proxy-auth-production` : `proxy-auth-${$app.stage}` @@ -106,8 +107,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": `application/json`, - "CF-Access-Client-Id": adminApiTokenId, - "CF-Access-Client-Secret": adminApiTokenSecret, + "CF-Access-Client-Id": adminApiTokenId ?? "", + "CF-Access-Client-Secret": adminApiTokenSecret ?? "", }, body: JSON.stringify({ database_url: uri, diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 69b05a01ba..93af103161 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -28,11 +28,11 @@ export default $config({ }, async run() { if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error("ELECTRIC_ADMIN_API_TOKEN_ID is not set") + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } try { diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index 8477d3ba6d..c0e0419567 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -28,11 +28,11 @@ export default $config({ }, async run() { if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_ID) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { - throw new Error('ELECTRIC_ADMIN_API_TOKEN_ID is not set') + throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID! }) @@ -154,7 +154,7 @@ async function addDatabaseToElectric( const result = await fetch(new URL('v1/sources', adminApi), { method: 'PUT', headers: { - 'Content-Type': `application/json`, + 'Content-Type': 'application/json', 'CF-Access-Client-Id': adminApiTokenId ?? '', 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', }, diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index 2835f80a68..c3dca8c6c1 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -150,9 +150,9 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, headers: { - "Content-Type": `application/json`, - "CF-Access-Client-Id": adminApiTokenId, - "CF-Access-Client-Secret": adminApiTokenSecret, + "Content-Type": "application/json", + "CF-Access-Client-Id": adminApiTokenId ?? "", + "CF-Access-Client-Secret": adminApiTokenSecret ?? "", }, body: JSON.stringify({ database_url: uri, From 84ea27d3e07a1f8273631f2cf8d859a6497bbc03 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 12:03:44 +0000 Subject: [PATCH 09/21] Linearlite CI deployment needs more work --- .github/workflows/deploy_examples.yml | 37 +++++++++------------------ examples/linearlite/sst.config.ts | 2 +- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 07b122c607..808076f0a4 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -61,18 +61,6 @@ jobs: exit 123 fi - - name: Deploy Linearlite - working-directory: ./examples/linearlite - run: | - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} - if [ -f ".sst/outputs.json" ]; then - linearlite=$(jq -r '.website' .sst/outputs.json) - echo "linearlite=$linearlite" >> $GITHUB_ENV - else - echo "sst outputs file not found. Exiting." - exit 123 - fi - - name: Deploy NextJs example working-directory: ./examples/nextjs run: | @@ -97,18 +85,6 @@ jobs: exit 123 fi - - name: Deploy Yjs example - working-directory: ./examples/yjs - run: | - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} - if [ -f ".sst/outputs.json" ]; then - yjs=$(jq -r '.website' .sst/outputs.json) - echo "yjs=$yjs" >> $GITHUB_ENV - else - echo "sst outputs file not found. Exiting." - exit 123 - fi - - name: Deploy Write Patterns example working-directory: ./examples/write-patterns run: | @@ -133,6 +109,18 @@ jobs: exit 123 fi + - name: Deploy Yjs example + working-directory: ./examples/yjs + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + yjs=$(jq -r '.website' .sst/outputs.json) + echo "yjs=$yjs" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Add comment to PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 @@ -140,7 +128,6 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const linearlite_read_only = process.env.linearlite_read_only; - const linearlite = process.env.linearlite; const nextjs = process.env.nextjs; const todoapp = process.env.todoapp; const yjs = process.env.yjs; diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index 89edbe4767..c6013eced1 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -19,7 +19,7 @@ export default $config({ cloudflare: `5.42.0`, aws: { version: `6.57.0`, - profile: process.env.CI ? undefined : `marketing`, + // profile: process.env.CI ? undefined : `marketing`, }, }, } From bd1a7a7b856429abbb9a7a456a5fe5fa9af7fd6b Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 12:21:05 +0000 Subject: [PATCH 10/21] debug write-patterns --- .github/workflows/deploy_examples.yml | 24 ++++++++++++------------ examples/write-patterns/index.html | 1 - 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 808076f0a4..9e966bb4de 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -49,6 +49,18 @@ jobs: restore-keys: | sst-cache-main-${{ runner.os }} + - name: Deploy Write Patterns example + working-directory: ./examples/write-patterns + run: | + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + writes=$(jq -r '.website' .sst/outputs.json) + echo "writes=$writes" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + - name: Deploy Linearlite Read Only working-directory: ./examples/linearlite-read-only run: | @@ -85,18 +97,6 @@ jobs: exit 123 fi - - name: Deploy Write Patterns example - working-directory: ./examples/write-patterns - run: | - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} - if [ -f ".sst/outputs.json" ]; then - writes=$(jq -r '.website' .sst/outputs.json) - echo "writes=$writes" >> $GITHUB_ENV - else - echo "sst outputs file not found. Exiting." - exit 123 - fi - - name: Deploy proxy-auth example working-directory: ./examples/proxy-auth run: | diff --git a/examples/write-patterns/index.html b/examples/write-patterns/index.html index b9b77ebd17..825dcd7f5f 100644 --- a/examples/write-patterns/index.html +++ b/examples/write-patterns/index.html @@ -1,4 +1,3 @@ - From bc3eb23b5b5d72512aaf531c4789a24080132c77 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 12:42:35 +0000 Subject: [PATCH 11/21] unlock --- .github/workflows/deploy_examples.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 9e966bb4de..d1dd39b2f6 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -52,6 +52,7 @@ jobs: - name: Deploy Write Patterns example working-directory: ./examples/write-patterns run: | + pnpm sst unlock --stage ${{ env.DEPLOY_ENV }} pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then writes=$(jq -r '.website' .sst/outputs.json) From 244135127802a4d2dbeca145ff84324a828af246 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:08:56 +0000 Subject: [PATCH 12/21] unstuck --- .github/workflows/deploy_examples.yml | 3 +-- examples/write-patterns/index.html | 1 + examples/write-patterns/sst.config.ts | 17 +++++++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index d1dd39b2f6..9cad79b6a2 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -52,8 +52,7 @@ jobs: - name: Deploy Write Patterns example working-directory: ./examples/write-patterns run: | - pnpm sst unlock --stage ${{ env.DEPLOY_ENV }} - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} --print-logs if [ -f ".sst/outputs.json" ]; then writes=$(jq -r '.website' .sst/outputs.json) echo "writes=$writes" >> $GITHUB_ENV diff --git a/examples/write-patterns/index.html b/examples/write-patterns/index.html index 825dcd7f5f..b9b77ebd17 100644 --- a/examples/write-patterns/index.html +++ b/examples/write-patterns/index.html @@ -1,3 +1,4 @@ + diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index c0e0419567..3f29b05ae2 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -145,31 +145,28 @@ function applyMigrations(uri: string) { } async function addDatabaseToElectric( - database_url: string, - region: 'us-east-1' | 'eu-west-1' = 'us-east-1' + uri: string ): Promise<{ id: string; token: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID - const result = await fetch(new URL('v1/sources', adminApi), { - method: 'PUT', + const result = await fetch(`${adminApi}/v1/sources`, { + method: `PUT`, headers: { - 'Content-Type': 'application/json', + 'Content-Type': `application/json`, 'CF-Access-Client-Id': adminApiTokenId ?? '', 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', }, body: JSON.stringify({ - database_url, - region, + database_url: uri, + region: `us-east-1`, team_id: teamId, }), }) if (!result.ok) { throw new Error( - `Could not add database to Electric (${ - result.status - }): ${await result.text()}` + `Could not add database to Electric (${result.status}): ${await result.text()}` ) } From 4485864b46a7cc383f9efb03ce1583e96937043b Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:19:28 +0000 Subject: [PATCH 13/21] build missing packages --- .github/workflows/deploy_examples.yml | 2 ++ examples/todo-app/sst.config.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 9cad79b6a2..5f3ddfc214 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -52,6 +52,7 @@ jobs: - name: Deploy Write Patterns example working-directory: ./examples/write-patterns run: | + pnpm --filter @electric-sql/client --filter @electric-sql/experimental run build pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} --print-logs if [ -f ".sst/outputs.json" ]; then writes=$(jq -r '.website' .sst/outputs.json) @@ -112,6 +113,7 @@ jobs: - name: Deploy Yjs example working-directory: ./examples/yjs run: | + pnpm sst remove --stage ${{ env.DEPLOY_ENV }} pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then yjs=$(jq -r '.website' .sst/outputs.json) diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 93af103161..30d1bf0acc 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -146,8 +146,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": `application/json`, - "CF-Access-Client-Id": adminApiTokenId, - "CF-Access-Client-Secret": adminApiTokenSecret, + "CF-Access-Client-Id": adminApiTokenId ?? "", + "CF-Access-Client-Secret": adminApiTokenSecret ?? "", }, body: JSON.stringify({ database_url: uri, From 69d2d9e7c649b0a442a613cad6c56c5efd304ad2 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:28:20 +0000 Subject: [PATCH 14/21] seems to work --- .github/workflows/deploy_examples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 5f3ddfc214..f1712f2d76 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -52,8 +52,8 @@ jobs: - name: Deploy Write Patterns example working-directory: ./examples/write-patterns run: | - pnpm --filter @electric-sql/client --filter @electric-sql/experimental run build - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} --print-logs + pnpm --filter @electric-sql/client --filter @electric-sql/experimental --filter @electric-sql/react run build + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then writes=$(jq -r '.website' .sst/outputs.json) echo "writes=$writes" >> $GITHUB_ENV From 63f27fc57c0c69df1f03a657e7a82f155ecefa85 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:37:23 +0000 Subject: [PATCH 15/21] fix next app --- .github/workflows/deploy_examples.yml | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index f1712f2d76..7a14ad0ff9 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -49,26 +49,39 @@ jobs: restore-keys: | sst-cache-main-${{ runner.os }} - - name: Deploy Write Patterns example - working-directory: ./examples/write-patterns + - name: Deploy Linearlite Read Only + working-directory: ./examples/linearlite-read-only run: | - pnpm --filter @electric-sql/client --filter @electric-sql/experimental --filter @electric-sql/react run build pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then - writes=$(jq -r '.website' .sst/outputs.json) - echo "writes=$writes" >> $GITHUB_ENV + linearlite_read_only=$(jq -r '.website' .sst/outputs.json) + echo "linearlite_read_only=$linearlite_read_only" >> $GITHUB_ENV else echo "sst outputs file not found. Exiting." exit 123 fi - - name: Deploy Linearlite Read Only - working-directory: ./examples/linearlite-read-only + - name: Deploy Yjs example + working-directory: ./examples/yjs run: | + pnpm sst remove --stage ${{ env.DEPLOY_ENV }} pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then - linearlite_read_only=$(jq -r '.website' .sst/outputs.json) - echo "linearlite_read_only=$linearlite_read_only" >> $GITHUB_ENV + yjs=$(jq -r '.website' .sst/outputs.json) + echo "yjs=$yjs" >> $GITHUB_ENV + else + echo "sst outputs file not found. Exiting." + exit 123 + fi + + - name: Deploy Write Patterns example + working-directory: ./examples/write-patterns + run: | + pnpm --filter @electric-sql/client --filter @electric-sql/experimental --filter @electric-sql/react run build + pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} + if [ -f ".sst/outputs.json" ]; then + writes=$(jq -r '.website' .sst/outputs.json) + echo "writes=$writes" >> $GITHUB_ENV else echo "sst outputs file not found. Exiting." exit 123 @@ -110,19 +123,6 @@ jobs: exit 123 fi - - name: Deploy Yjs example - working-directory: ./examples/yjs - run: | - pnpm sst remove --stage ${{ env.DEPLOY_ENV }} - pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} - if [ -f ".sst/outputs.json" ]; then - yjs=$(jq -r '.website' .sst/outputs.json) - echo "yjs=$yjs" >> $GITHUB_ENV - else - echo "sst outputs file not found. Exiting." - exit 123 - fi - - name: Add comment to PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 From fa9adcc1640758d4555cfd2baed82fe633e012a5 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:45:12 +0000 Subject: [PATCH 16/21] fixed bad paths --- .github/workflows/deploy_examples.yml | 17 ++++++++--------- examples/yjs/Dockerfile | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index 7a14ad0ff9..b5a8479d00 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -49,26 +49,25 @@ jobs: restore-keys: | sst-cache-main-${{ runner.os }} - - name: Deploy Linearlite Read Only - working-directory: ./examples/linearlite-read-only + - name: Deploy Yjs example + working-directory: ./examples/yjs run: | pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then - linearlite_read_only=$(jq -r '.website' .sst/outputs.json) - echo "linearlite_read_only=$linearlite_read_only" >> $GITHUB_ENV + yjs=$(jq -r '.website' .sst/outputs.json) + echo "yjs=$yjs" >> $GITHUB_ENV else echo "sst outputs file not found. Exiting." exit 123 fi - - name: Deploy Yjs example - working-directory: ./examples/yjs + - name: Deploy Linearlite Read Only + working-directory: ./examples/linearlite-read-only run: | - pnpm sst remove --stage ${{ env.DEPLOY_ENV }} pnpm sst deploy --stage ${{ env.DEPLOY_ENV }} if [ -f ".sst/outputs.json" ]; then - yjs=$(jq -r '.website' .sst/outputs.json) - echo "yjs=$yjs" >> $GITHUB_ENV + linearlite_read_only=$(jq -r '.website' .sst/outputs.json) + echo "linearlite_read_only=$linearlite_read_only" >> $GITHUB_ENV else echo "sst outputs file not found. Exiting." exit 123 diff --git a/examples/yjs/Dockerfile b/examples/yjs/Dockerfile index 32365f78c5..4434b292fb 100644 --- a/examples/yjs/Dockerfile +++ b/examples/yjs/Dockerfile @@ -12,7 +12,7 @@ COPY tsconfig.base.json ./ COPY tsconfig.build.json ./ COPY packages/typescript-client packages/typescript-client/ COPY packages/react-hooks packages/react-hooks/ -COPY examples/yjs-provider/ examples/yjs-provider/ +COPY examples/yjs/ examples/yjs/ # Install dependencies RUN pnpm install --frozen-lockfile @@ -20,13 +20,13 @@ RUN pnpm run -r build # Need to make production image more clean -FROM node:lts-alpine AS prod +FROM base AS prod WORKDIR /app ENV NODE_ENV=production COPY --from=deps /app/ ./ -WORKDIR /app/examples/yjs-provider/ +WORKDIR /app/examples/yjs/ EXPOSE 3000 CMD ["npm", "run", "start"] \ No newline at end of file From df189cb9a72efaa5f93170916d3c6c041a02c84e Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 13:54:57 +0000 Subject: [PATCH 17/21] upgrade sst --- examples/linearlite-read-only/sst.config.ts | 2 +- examples/linearlite/sst.config.ts | 2 +- examples/nextjs/sst.config.ts | 2 +- examples/proxy-auth/sst.config.ts | 2 +- examples/write-patterns/sst.config.ts | 2 +- examples/yjs/Dockerfile | 2 +- examples/yjs/package.json | 2 +- examples/yjs/sst.config.ts | 4 +- pnpm-lock.yaml | 115 +++++++++----------- 9 files changed, 63 insertions(+), 70 deletions(-) diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index 780d0b1678..cb93975b08 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -15,7 +15,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, profile: process.env.CI ? undefined : `marketing`, }, neon: `0.6.3`, diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index c6013eced1..c088cb3df2 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -18,7 +18,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, // profile: process.env.CI ? undefined : `marketing`, }, }, diff --git a/examples/nextjs/sst.config.ts b/examples/nextjs/sst.config.ts index ccbd8e5a7a..5f8b504060 100644 --- a/examples/nextjs/sst.config.ts +++ b/examples/nextjs/sst.config.ts @@ -12,7 +12,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, profile: process.env.CI ? undefined : `marketing`, }, neon: `0.6.3`, diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index 3e27f4d997..1e342b850d 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -17,7 +17,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, region: `eu-west-1`, profile: process.env.CI ? undefined : `marketing`, }, diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index 3f29b05ae2..041472585d 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -18,7 +18,7 @@ export default $config({ providers: { cloudflare: '5.42.0', aws: { - version: '6.57.0', + version: `6.66.2`, profile: process.env.CI ? undefined : `marketing`, }, neon: '0.6.3', diff --git a/examples/yjs/Dockerfile b/examples/yjs/Dockerfile index 4434b292fb..aedd34edea 100644 --- a/examples/yjs/Dockerfile +++ b/examples/yjs/Dockerfile @@ -12,7 +12,7 @@ COPY tsconfig.base.json ./ COPY tsconfig.build.json ./ COPY packages/typescript-client packages/typescript-client/ COPY packages/react-hooks packages/react-hooks/ -COPY examples/yjs/ examples/yjs/ +COPY examples/yjs examples/yjs/ # Install dependencies RUN pnpm install --frozen-lockfile diff --git a/examples/yjs/package.json b/examples/yjs/package.json index 3475e8b5d2..e16967c1da 100644 --- a/examples/yjs/package.json +++ b/examples/yjs/package.json @@ -29,7 +29,7 @@ "pg": "^8.13.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "sst": "^3.3.35", + "sst": "3.6.25", "y-codemirror.next": "0.3.5", "y-indexeddb": "^9.0.12", "y-protocols": "1.0.6", diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index c3dca8c6c1..b981965abf 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -18,7 +18,7 @@ export default $config({ providers: { cloudflare: `5.42.0`, aws: { - version: `6.57.0`, + version: `6.66.2`, profile: process.env.CI ? undefined : `marketing`, }, neon: `0.6.3`, @@ -40,7 +40,7 @@ export default $config({ id: process.env.NEON_PROJECT_ID!, }) - const dbName = isProduction() ? `yjs` : `yjs-${$app.stage}` + const dbName = isProduction() ? `yjs` : `yjs-db-${$app.stage}` const { ownerName, dbName: resultingDbName } = createNeonDb({ projectId: project.id, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e50c4d6ca..e06da36816 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -542,7 +542,7 @@ importers: version: link:../../packages/react-hooks next: specifier: ^14.2.5 - version: 14.2.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.17(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) pg: specifier: ^8.12.0 version: 8.13.1 @@ -603,7 +603,7 @@ importers: version: link:../../packages/react-hooks next: specifier: ^14.2.5 - version: 14.2.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.17(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) pg: specifier: ^8.12.0 version: 8.13.1 @@ -745,7 +745,7 @@ importers: version: 0.3.4 tsup: specifier: ^8.0.1 - version: 8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.9.1)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) tsx: specifier: ^4.19.1 version: 4.19.2 @@ -1091,7 +1091,7 @@ importers: version: 0.2.99 next: specifier: ^14.2.9 - version: 14.2.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.17(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) pg: specifier: ^8.13.1 version: 8.13.1 @@ -1102,8 +1102,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) sst: - specifier: ^3.3.35 - version: 3.3.59(hono@4.6.13) + specifier: 3.6.25 + version: 3.6.25 y-codemirror.next: specifier: 0.3.5 version: 0.3.5(@codemirror/state@6.5.0)(@codemirror/view@6.35.2)(yjs@13.6.20) @@ -1198,7 +1198,7 @@ importers: version: 0.3.4 tsup: specifier: ^8.0.1 - version: 8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.9.1)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: specifier: ^5.5.2 version: 5.6.3 @@ -1274,7 +1274,7 @@ importers: version: 0.3.4 tsup: specifier: ^8.0.1 - version: 8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.9.1)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: specifier: ^5.5.2 version: 5.6.3 @@ -1334,7 +1334,7 @@ importers: version: 0.3.4 tsup: specifier: ^8.0.1 - version: 8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.9.1)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: specifier: ^5.5.2 version: 5.6.3 @@ -8836,11 +8836,6 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - sst-darwin-arm64@3.3.59: - resolution: {integrity: sha512-v8E3pg3JK7LDFOD0ot5N+HMNOA6MDHczx1M1SsJnMcNZPLTFH/Dn1B3roUaTP55+8jLKtqSJhnp9kLtTPHR1GQ==} - cpu: [arm64] - os: [darwin] - sst-darwin-arm64@3.3.64: resolution: {integrity: sha512-sGlGX66vjWuN/501zjjEdqIalteyuawuoUvbIQsYFZ3yYg+THSPsXR5e3ADo2LgrOelaMhOOAZ8jabGGEsptnw==} cpu: [arm64] @@ -8851,9 +8846,9 @@ packages: cpu: [arm64] os: [darwin] - sst-darwin-x64@3.3.59: - resolution: {integrity: sha512-SOOvHPxdxXwcMEwfdDXFiaMqZTdy1UcTL74omKGAn3i0pdoDN+FK2KPa865gNd1dzyYg0P6QXcUu9hI92g9Cyg==} - cpu: [x64] + sst-darwin-arm64@3.6.25: + resolution: {integrity: sha512-vUf0OXeSIrPN7QPHSxYJcXqycBvcoZJ9scsV1VrTRQbYpySfWCJMD8LSAuRB+//QjcDYndSx/r/ad0Ofx+a2vw==} + cpu: [arm64] os: [darwin] sst-darwin-x64@3.3.64: @@ -8866,10 +8861,10 @@ packages: cpu: [x64] os: [darwin] - sst-linux-arm64@3.3.59: - resolution: {integrity: sha512-C7RjmuO0RR6xhmz0EZDcL6FhPCInwj5odehJZkbrvW0SObdoBLZLeDF0Or/7DKKh9VuSes/dpN1UvuUtMVE5Cg==} - cpu: [arm64] - os: [linux] + sst-darwin-x64@3.6.25: + resolution: {integrity: sha512-lFW1M/1gId2PVnNxQQJYeXgGNtRVPlL1HMQ+MUCbgNjQCDAcIFJ9C1mw3RXYorfKbgiS0yQdBfLRFIgLLIIcfw==} + cpu: [x64] + os: [darwin] sst-linux-arm64@3.3.64: resolution: {integrity: sha512-MUd0hHMap0SXAdU+UniAAlAzEzuJNIPbnQ80SHFGKatJNgFlQmmp7jq4qR1GXjaB3/NttLKIroQ8RBXuydtUzA==} @@ -8881,9 +8876,9 @@ packages: cpu: [arm64] os: [linux] - sst-linux-x64@3.3.59: - resolution: {integrity: sha512-7XZaYHl7Uun9q6koMEIICvw/+BX18hqiVmBjaC2p6J6x5tw+z7kfpK3x+yD26HLHoFNhpIBLb+6Nqj7XDyCa/Q==} - cpu: [x64] + sst-linux-arm64@3.6.25: + resolution: {integrity: sha512-5Xjj08Uo5J1abiCHv09lxA0SqswbP2Vz5y6DAgocTPSLMuUlgCv9m0r+w+ng3OLDoCDVb56EUY0G8zwWX1Q3gA==} + cpu: [arm64] os: [linux] sst-linux-x64@3.3.64: @@ -8896,9 +8891,9 @@ packages: cpu: [x64] os: [linux] - sst-linux-x86@3.3.59: - resolution: {integrity: sha512-GA8dZw6ty12ZwvpdVXkKBtdNwNuGF8vIcOKSzAQ6eC2UmywHlvQNgz2fiWMPVz94QLnNHCHAZlL6XAR7fz7n4Q==} - cpu: [x86] + sst-linux-x64@3.6.25: + resolution: {integrity: sha512-805J9vxCVjQJcrSHTxnHy89a496ugneE6/hS9kLwm0okp0JUL2B1Tc3PTLq37+jksq542eTSKdJ4wRED8XFJoQ==} + cpu: [x64] os: [linux] sst-linux-x86@3.3.64: @@ -8911,17 +8906,10 @@ packages: cpu: [x86] os: [linux] - sst@3.3.59: - resolution: {integrity: sha512-WzKYWMf41n/TMEVp54tEITvmZQ0iZHf2whevpqqS85dAGP6w74NbEkwPNAB5oU2RlA2sj8GgMF76NdctsYQ0JA==} - hasBin: true - peerDependencies: - hono: 4.x - valibot: 0.30.x - peerDependenciesMeta: - hono: - optional: true - valibot: - optional: true + sst-linux-x86@3.6.25: + resolution: {integrity: sha512-7n3x2JcnN6Fbn3y/S9xI2DzhkL6vdV7D2vi0FxxkmW+Q7kZE/L8KrV6K5+IHFVrLmW37H4hyzLAU1r4Oy0Mx7A==} + cpu: [x86] + os: [linux] sst@3.3.64: resolution: {integrity: sha512-Mvgbz/ylG2UOzDir9t0Qk8M0wbzQMzwm0/lk5+lywqpK8emAea43+yOIgPvaJEeGiv9i9T97XRnYLbddUGZAFA==} @@ -8947,6 +8935,10 @@ packages: valibot: optional: true + sst@3.6.25: + resolution: {integrity: sha512-lEvXCunAEhBQ7jUTj/tF8/5vfbXS1T7nNvfzAo0ZpHE1AH/Pj3vGqI1y4Zxs+SQBfEhUbPKjOH3aDWsOWHCmfA==} + hasBin: true + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -17172,7 +17164,7 @@ snapshots: neo-async@2.6.2: {} - next@14.2.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.17(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.17 '@swc/helpers': 0.5.5 @@ -17182,7 +17174,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.17 '@next/swc-darwin-x64': 14.2.17 @@ -18608,16 +18600,13 @@ snapshots: dependencies: minipass: 7.1.2 - sst-darwin-arm64@3.3.59: - optional: true - sst-darwin-arm64@3.3.64: optional: true sst-darwin-arm64@3.3.7: optional: true - sst-darwin-x64@3.3.59: + sst-darwin-arm64@3.6.25: optional: true sst-darwin-x64@3.3.64: @@ -18626,7 +18615,7 @@ snapshots: sst-darwin-x64@3.3.7: optional: true - sst-linux-arm64@3.3.59: + sst-darwin-x64@3.6.25: optional: true sst-linux-arm64@3.3.64: @@ -18635,7 +18624,7 @@ snapshots: sst-linux-arm64@3.3.7: optional: true - sst-linux-x64@3.3.59: + sst-linux-arm64@3.6.25: optional: true sst-linux-x64@3.3.64: @@ -18644,7 +18633,7 @@ snapshots: sst-linux-x64@3.3.7: optional: true - sst-linux-x86@3.3.59: + sst-linux-x64@3.6.25: optional: true sst-linux-x86@3.3.64: @@ -18653,18 +18642,8 @@ snapshots: sst-linux-x86@3.3.7: optional: true - sst@3.3.59(hono@4.6.13): - dependencies: - aws4fetch: 1.0.20 - jose: 5.2.3 - openid-client: 5.6.4 - optionalDependencies: - hono: 4.6.13 - sst-darwin-arm64: 3.3.59 - sst-darwin-x64: 3.3.59 - sst-linux-arm64: 3.3.59 - sst-linux-x64: 3.3.59 - sst-linux-x86: 3.3.59 + sst-linux-x86@3.6.25: + optional: true sst@3.3.64(hono@4.6.13): dependencies: @@ -18692,6 +18671,18 @@ snapshots: sst-linux-x64: 3.3.7 sst-linux-x86: 3.3.7 + sst@3.6.25: + dependencies: + aws4fetch: 1.0.20 + jose: 5.2.3 + openid-client: 5.6.4 + optionalDependencies: + sst-darwin-arm64: 3.6.25 + sst-darwin-x64: 3.6.25 + sst-linux-arm64: 3.6.25 + sst-linux-x64: 3.6.25 + sst-linux-x86: 3.6.25 + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -18819,10 +18810,12 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.0 stylis@4.3.2: {} @@ -19085,7 +19078,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.9.1(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): + tsup@8.3.5(@swc/core@1.9.1)(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) cac: 6.7.14 From eb38ad780835b987cfbadb86f873c45c6945d6df Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 14:22:19 +0000 Subject: [PATCH 18/21] lint and action changes --- .github/workflows/deploy_all_examples.yml | 10 +++++++--- .github/workflows/deploy_examples.yml | 2 ++ examples/linearlite-read-only/sst.config.ts | 4 ++-- examples/linearlite/sst.config.ts | 6 +++--- examples/proxy-auth/sst.config.ts | 4 ++-- examples/todo-app/sst.config.ts | 4 ++-- examples/write-patterns/sst.config.ts | 4 ++-- examples/yjs/sst.config.ts | 4 ++-- 8 files changed, 22 insertions(+), 16 deletions(-) diff --git a/.github/workflows/deploy_all_examples.yml b/.github/workflows/deploy_all_examples.yml index ac3a65d616..62c41e4126 100644 --- a/.github/workflows/deploy_all_examples.yml +++ b/.github/workflows/deploy_all_examples.yml @@ -61,10 +61,14 @@ jobs: working-directory: ./examples/linearlite-read-only run: pnpm sst deploy --stage production - - name: Deploy Linearlite - working-directory: ./examples/linearlite - run: pnpm sst deploy --stage production + # - name: Deploy Linearlite + # working-directory: ./examples/linearlite + # run: pnpm sst deploy --stage production - name: Deploy NextJs example working-directory: ./examples/nextjs run: pnpm sst deploy --stage production + + - name: Deploy Yjs example + working-directory: ./examples/yjs + run: pnpm sst deploy --stage production diff --git a/.github/workflows/deploy_examples.yml b/.github/workflows/deploy_examples.yml index b5a8479d00..e5b9c2c2c1 100644 --- a/.github/workflows/deploy_examples.yml +++ b/.github/workflows/deploy_examples.yml @@ -141,6 +141,8 @@ jobs: - nextjs: ${nextjs} - todoapp: ${todoapp} - yjs: ${yjs} + - writes: ${writes} + - auth: ${auth} `; const { data: comments } = await github.rest.issues.listComments({ diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index cb93975b08..ad895ea6d6 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -122,8 +122,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { 'Content-Type': 'application/json', - 'CF-Access-Client-Id': adminApiTokenId ?? '', - 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', + 'CF-Access-Client-Id': adminApiTokenId ?? ``, + 'CF-Access-Client-Secret': adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index c088cb3df2..e6f1e3652c 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -19,7 +19,7 @@ export default $config({ cloudflare: `5.42.0`, aws: { version: `6.66.2`, - // profile: process.env.CI ? undefined : `marketing`, + profile: process.env.CI ? undefined : `marketing`, }, }, } @@ -96,8 +96,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { 'Content-Type': 'application/json', - 'CF-Access-Client-Id': adminApiTokenId ?? '', - 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', + 'CF-Access-Client-Id': adminApiTokenId ?? ``, + 'CF-Access-Client-Secret': adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index 1e342b850d..a5fadf1052 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -107,8 +107,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": `application/json`, - "CF-Access-Client-Id": adminApiTokenId ?? "", - "CF-Access-Client-Secret": adminApiTokenSecret ?? "", + "CF-Access-Client-Id": adminApiTokenId ?? ``, + "CF-Access-Client-Secret": adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 30d1bf0acc..8dda81d6e9 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -146,8 +146,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": `application/json`, - "CF-Access-Client-Id": adminApiTokenId ?? "", - "CF-Access-Client-Secret": adminApiTokenSecret ?? "", + "CF-Access-Client-Id": adminApiTokenId ?? ``, + "CF-Access-Client-Secret": adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index 041472585d..c5e735421e 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -154,8 +154,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { 'Content-Type': `application/json`, - 'CF-Access-Client-Id': adminApiTokenId ?? '', - 'CF-Access-Client-Secret': adminApiTokenSecret ?? '', + 'CF-Access-Client-Id': adminApiTokenId ?? ``, + 'CF-Access-Client-Secret': adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index b981965abf..0620c66530 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -151,8 +151,8 @@ async function addDatabaseToElectric( method: `PUT`, headers: { "Content-Type": "application/json", - "CF-Access-Client-Id": adminApiTokenId ?? "", - "CF-Access-Client-Secret": adminApiTokenSecret ?? "", + "CF-Access-Client-Id": adminApiTokenId ?? ``, + "CF-Access-Client-Secret": adminApiTokenSecret ?? ``, }, body: JSON.stringify({ database_url: uri, From c3e6631233caac2aac43d4c0d6d356cf691fc8a5 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 15:14:25 +0000 Subject: [PATCH 19/21] the missing source_secret renaming --- .../linearlite-read-only/src/electric.tsx | 4 ++-- .../src/pages/Issue/Comments.tsx | 6 ++--- examples/linearlite-read-only/src/shapes.ts | 6 ++--- .../linearlite-read-only/src/sst-env.d.ts | 4 ++-- examples/linearlite-read-only/sst.config.ts | 8 +++---- examples/linearlite/src/sync.ts | 16 +++++++------- examples/linearlite/sst.config.ts | 8 +++---- examples/nextjs/app/shape-proxy/route.ts | 11 ++++++---- examples/nextjs/sst.config.ts | 8 +++---- examples/proxy-auth/app/shape-proxy/route.ts | 11 ++++++---- examples/proxy-auth/sst.config.ts | 8 +++---- examples/todo-app/src/routes/index.tsx | 4 ++-- examples/todo-app/src/sst-env.d.ts | 4 ++-- examples/todo-app/src/vite-env.d.ts | 4 ++-- examples/todo-app/sst.config.ts | 8 +++---- examples/write-patterns/shared/app/config.ts | 10 ++++----- examples/write-patterns/sst.config.ts | 8 +++---- .../yjs/app/shape-proxy/[...table]/route.ts | 11 ++++++---- examples/yjs/sst.config.ts | 22 ++----------------- 19 files changed, 76 insertions(+), 85 deletions(-) diff --git a/examples/linearlite-read-only/src/electric.tsx b/examples/linearlite-read-only/src/electric.tsx index 97eda20e7e..6e377d5ae7 100644 --- a/examples/linearlite-read-only/src/electric.tsx +++ b/examples/linearlite-read-only/src/electric.tsx @@ -1,5 +1,5 @@ export const baseUrl = import.meta.env.VITE_ELECTRIC_URL ? new URL(import.meta.env.VITE_ELECTRIC_URL).origin : `http://localhost:3000` -export const token = import.meta.env.VITE_ELECTRIC_TOKEN ?? `` -export const databaseId = import.meta.env.VITE_DATABASE_ID ?? `` +export const source_secret = import.meta.env.VITE_ELECTRIC_SOURCE_SECRET ?? `` +export const source_id = import.meta.env.VITE_ELECTRIC_SOURCE_ID ?? `` diff --git a/examples/linearlite-read-only/src/pages/Issue/Comments.tsx b/examples/linearlite-read-only/src/pages/Issue/Comments.tsx index 36b6b9dfd5..863beb969f 100644 --- a/examples/linearlite-read-only/src/pages/Issue/Comments.tsx +++ b/examples/linearlite-read-only/src/pages/Issue/Comments.tsx @@ -8,7 +8,7 @@ import { formatDate } from '../../utils/date' import { showWarning } from '../../utils/notification' import { Comment, Issue } from '../../types/types' import { useShape } from '@electric-sql/react' -import { baseUrl, databaseId, token } from '../../electric' +import { baseUrl, source_id, source_secret } from '../../electric' export interface CommentsProps { issue: Issue @@ -19,8 +19,8 @@ function Comments(commentProps: CommentsProps) { const allComments = useShape({ url: `${baseUrl}/v1/shape`, params: { - token, - source_id: databaseId, + source_secret, + source_id, table: `comment`, }, })! as Comment[] diff --git a/examples/linearlite-read-only/src/shapes.ts b/examples/linearlite-read-only/src/shapes.ts index e99cd105a8..09cba2dec2 100644 --- a/examples/linearlite-read-only/src/shapes.ts +++ b/examples/linearlite-read-only/src/shapes.ts @@ -1,11 +1,11 @@ import { ShapeStreamOptions } from '@electric-sql/client' -import { baseUrl, databaseId, token } from './electric' +import { baseUrl, source_id, source_secret } from './electric' export const issueShape: ShapeStreamOptions = { url: `${baseUrl}/v1/shape/`, params: { table: `issue`, - token, - source_id: databaseId, + source_secret, + source_id, }, } diff --git a/examples/linearlite-read-only/src/sst-env.d.ts b/examples/linearlite-read-only/src/sst-env.d.ts index c9fa9af86a..09b728abe9 100644 --- a/examples/linearlite-read-only/src/sst-env.d.ts +++ b/examples/linearlite-read-only/src/sst-env.d.ts @@ -4,8 +4,8 @@ /// interface ImportMetaEnv { readonly VITE_ELECTRIC_URL: string - readonly VITE_ELECTRIC_TOKEN: string - readonly VITE_DATABASE_ID: string + readonly VITE_ELECTRIC_SOURCE_SECRET: string + readonly VITE_ELECTRIC_SOURCE_ID: string } interface ImportMeta { readonly env: ImportMetaEnv diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index ad895ea6d6..6365a9fab4 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -64,8 +64,8 @@ export default $config({ const website = deployLinearLite(electricInfo) return { databaseUri, - database_id: electricInfo.id, - electric_token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, website: website.url, } } catch (e) { @@ -98,8 +98,8 @@ function deployLinearLite( return new sst.aws.StaticSite(`linearlite-read-only`, { environment: { VITE_ELECTRIC_URL: process.env.ELECTRIC_API!, - VITE_ELECTRIC_TOKEN: electricInfo.token, - VITE_DATABASE_ID: electricInfo.id, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, build: { command: `pnpm run --filter @electric-sql/client --filter @electric-sql/react --filter @electric-examples/linearlite-read-only build`, diff --git a/examples/linearlite/src/sync.ts b/examples/linearlite/src/sync.ts index a51e5eb93e..3650dbace3 100644 --- a/examples/linearlite/src/sync.ts +++ b/examples/linearlite/src/sync.ts @@ -11,8 +11,8 @@ const WRITE_SERVER_URL = import.meta.env.VITE_WRITE_SERVER_URL const ELECTRIC_URL = import.meta.env.VITE_ELECTRIC_URL ? new URL(import.meta.env.VITE_ELECTRIC_URL).origin : `http://localhost:3000` -const ELECTRIC_DATABASE_ID = import.meta.env.VITE_ELECTRIC_DATABASE_ID -const ELECTRIC_TOKEN = import.meta.env.VITE_ELECTRIC_TOKEN +const ELECTRIC_SOURCE_ID = import.meta.env.VITE_ELECTRIC_SOURCE_ID +const ELECTRIC_SOURCE_SECRET = import.meta.env.VITE_ELECTRIC_SOURCE_SECRET const APPLY_CHANGES_URL = `${WRITE_SERVER_URL}/apply-changes` type SyncStatus = 'initial-sync' | 'done' @@ -57,8 +57,8 @@ async function startSyncToDatabase(pg: PGliteWithExtensions) { } const issueUrl = new URL(`${ELECTRIC_URL}/v1/shape`) - if (ELECTRIC_TOKEN) { - issueUrl.searchParams.set('token', ELECTRIC_TOKEN) + if (ELECTRIC_SOURCE_SECRET) { + issueUrl.searchParams.set('source_secret', ELECTRIC_SOURCE_SECRET) } // Issues Sync @@ -67,7 +67,7 @@ async function startSyncToDatabase(pg: PGliteWithExtensions) { url: issueUrl.toString(), params: { table: 'issue', - source_id: ELECTRIC_DATABASE_ID, + source_id: ELECTRIC_SOURCE_ID, }, }, table: 'issue', @@ -93,8 +93,8 @@ async function startSyncToDatabase(pg: PGliteWithExtensions) { ) const commentUrl = new URL(`${ELECTRIC_URL}/v1/shape`) - if (ELECTRIC_TOKEN) { - commentUrl.searchParams.set('token', ELECTRIC_TOKEN) + if (ELECTRIC_SOURCE_SECRET) { + commentUrl.searchParams.set('source_secret', ELECTRIC_SOURCE_SECRET) } // Comments Sync @@ -103,7 +103,7 @@ async function startSyncToDatabase(pg: PGliteWithExtensions) { url: commentUrl.toString(), params: { table: 'comment', - source_id: ELECTRIC_DATABASE_ID, + source_id: ELECTRIC_SOURCE_ID, }, }, table: 'comment', diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index e6f1e3652c..6b10f5f5e7 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -53,8 +53,8 @@ export default $config({ }, environment: { VITE_ELECTRIC_URL: process.env.ELECTRIC_API, - VITE_ELECTRIC_TOKEN: electricInfo.token, - VITE_ELECTRIC_DATABASE_ID: electricInfo.id, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { name: `linearlite${isProduction($app.stage) ? `` : `-stage-${$app.stage}`}.examples.electric-sql.com`, @@ -67,8 +67,8 @@ export default $config({ return { databaseUri, - database_id: electricInfo.id, - electric_token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, website: website.url, } } catch (e) { diff --git a/examples/nextjs/app/shape-proxy/route.ts b/examples/nextjs/app/shape-proxy/route.ts index 2973eb598a..485fc9d74c 100644 --- a/examples/nextjs/app/shape-proxy/route.ts +++ b/examples/nextjs/app/shape-proxy/route.ts @@ -10,13 +10,16 @@ export async function GET(request: Request) { originUrl.searchParams.set(key, value) }) - if (process.env.DATABASE_ID) { - originUrl.searchParams.set(`source_id`, process.env.DATABASE_ID) + if (process.env.ELECTRIC_SOURCE_ID) { + originUrl.searchParams.set(`source_id`, process.env.ELECTRIC_SOURCE_ID) } const headers = new Headers() - if (process.env.ELECTRIC_TOKEN) { - originUrl.searchParams.set(`token`, process.env.ELECTRIC_TOKEN) + if (process.env.ELECTRIC_SOURCE_SECRET) { + originUrl.searchParams.set( + `source_secret`, + process.env.ELECTRIC_SOURCE_SECRET + ) } const newRequest = new Request(originUrl.toString(), { diff --git a/examples/nextjs/sst.config.ts b/examples/nextjs/sst.config.ts index 5f8b504060..b0502d8b0c 100644 --- a/examples/nextjs/sst.config.ts +++ b/examples/nextjs/sst.config.ts @@ -53,8 +53,8 @@ export default $config({ const website = deployNextJsExample(electricInfo, pooledDatabaseUri) return { pooledDatabaseUri, - database_id: electricInfo.id, - electric_token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, website: website.url, } } catch (e) { @@ -79,8 +79,8 @@ function deployNextJsExample( return new sst.aws.Nextjs(`nextjs`, { environment: { ELECTRIC_URL: process.env.ELECTRIC_API!, - ELECTRIC_TOKEN: electricInfo.token, - DATABASE_ID: electricInfo.id, + ELECTRIC_SOURCE_SECRET: electricInfo.token, + ELECTRIC_SOURCE_ID: electricInfo.id, DATABASE_URL: uri, }, domain: { diff --git a/examples/proxy-auth/app/shape-proxy/route.ts b/examples/proxy-auth/app/shape-proxy/route.ts index bad1c8ad14..4fd7cebb59 100644 --- a/examples/proxy-auth/app/shape-proxy/route.ts +++ b/examples/proxy-auth/app/shape-proxy/route.ts @@ -8,12 +8,15 @@ export async function GET(request: Request) { originUrl.searchParams.set(key, value) }) - if (process.env.DATABASE_ID) { - originUrl.searchParams.set(`source_id`, process.env.DATABASE_ID) + if (process.env.ELECTRIC_SOURCE_ID) { + originUrl.searchParams.set(`source_id`, process.env.ELECTRIC_SOURCE_ID) } - if (process.env.ELECTRIC_TOKEN) { - originUrl.searchParams.set(`token`, process.env.ELECTRIC_TOKEN) + if (process.env.ELECTRIC_SOURCE_SECRET) { + originUrl.searchParams.set( + `source_secret`, + process.env.ELECTRIC_SOURCE_SECRET + ) } // authentication and authorization diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index a5fadf1052..b718f63960 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -69,8 +69,8 @@ export default $config({ const staticSite = new sst.aws.Nextjs(`proxy-auth`, { environment: { ELECTRIC_URL: process.env.ELECTRIC_API!, - ELECTRIC_TOKEN: electricInfo.token, - DATABASE_ID: electricInfo.id, + ELECTRIC_SOURCE_SECRET: electricInfo.token, + ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { name: `proxy-auth${isProduction($app.stage) ? `` : `-stage-${$app.stage}`}.examples.electric-sql.com`, @@ -82,8 +82,8 @@ export default $config({ return { databaseUri, - databaseId: electricInfo.id, - token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, url: staticSite.url, } }, diff --git a/examples/todo-app/src/routes/index.tsx b/examples/todo-app/src/routes/index.tsx index d0c2969d72..ea1a43a7f7 100644 --- a/examples/todo-app/src/routes/index.tsx +++ b/examples/todo-app/src/routes/index.tsx @@ -26,8 +26,8 @@ export default function Index() { url: new URL(`${import.meta.env.VITE_ELECTRIC_URL}/v1/shape/`).href, params: { table: `todos`, - source_id: import.meta.env.VITE_ELECTRIC_DATABASE_ID, - token: import.meta.env.VITE_ELECTRIC_TOKEN, + source_id: import.meta.env.VITE_ELECTRIC_SOURCE_ID, + source_secret: import.meta.env.VITE_ELECTRIC_SOURCE_SECRET, }, }) todos.sort((a, b) => a.created_at - b.created_at) diff --git a/examples/todo-app/src/sst-env.d.ts b/examples/todo-app/src/sst-env.d.ts index 969044b889..54ae54e8c3 100644 --- a/examples/todo-app/src/sst-env.d.ts +++ b/examples/todo-app/src/sst-env.d.ts @@ -5,8 +5,8 @@ interface ImportMetaEnv { readonly VITE_SERVER_URL: string readonly VITE_ELECTRIC_URL: string - readonly VITE_ELECTRIC_TOKEN: string - readonly VITE_ELECTRIC_DATABASE_ID: string + readonly VITE_ELECTRIC_SOURCE_SECRET: string + readonly VITE_ELECTRIC_SOURCE_ID: string } interface ImportMeta { readonly env: ImportMetaEnv diff --git a/examples/todo-app/src/vite-env.d.ts b/examples/todo-app/src/vite-env.d.ts index a941f2c3f0..d48e2ca241 100644 --- a/examples/todo-app/src/vite-env.d.ts +++ b/examples/todo-app/src/vite-env.d.ts @@ -3,8 +3,8 @@ interface ImportMetaEnv { readonly VITE_SERVER_URL: string readonly VITE_ELECTRIC_URL: string - readonly VITE_ELECTRIC_DATABASE_ID: string - readonly VITE_ELECTRIC_TOKEN: string + readonly VITE_ELECTRIC_SOURCE_SECRET: string + readonly VITE_ELECTRIC_SOURCE_ID: string } interface ImportMeta { diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index 8dda81d6e9..b019e41278 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -102,8 +102,8 @@ export default $config({ url.slice(0, url.length - 1) ), VITE_ELECTRIC_URL: process.env.ELECTRIC_API, - VITE_ELECTRIC_TOKEN: electricInfo.token, - VITE_ELECTRIC_DATABASE_ID: electricInfo.id, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { name: `todo-app${isProduction($app.stage) ? `` : `-stage-${$app.stage}`}.examples.electric-sql.com`, @@ -116,8 +116,8 @@ export default $config({ return { databaseUri, - database_id: electricInfo.id, - electric_token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, server: service.url, website: website.url, } diff --git a/examples/write-patterns/shared/app/config.ts b/examples/write-patterns/shared/app/config.ts index fec011bd24..e4a02dac43 100644 --- a/examples/write-patterns/shared/app/config.ts +++ b/examples/write-patterns/shared/app/config.ts @@ -1,11 +1,11 @@ export const ELECTRIC_URL = import.meta.env.VITE_ELECTRIC_URL || 'http://localhost:3000' -export const envParams: { source_id?: string; token?: string } = - import.meta.env.VITE_ELECTRIC_TOKEN && - import.meta.env.VITE_ELECTRIC_DATABASE_ID +export const envParams: { source_id?: string; source_secret?: string } = + import.meta.env.VITE_ELECTRIC_SOURCE_SECRET && + import.meta.env.VITE_ELECTRIC_SOURCE_ID ? { - source_id: import.meta.env.VITE_ELECTRIC_DATABASE_ID, - token: import.meta.env.VITE_ELECTRIC_TOKEN, + source_id: import.meta.env.VITE_ELECTRIC_SOURCE_ID, + source_secret: import.meta.env.VITE_ELECTRIC_SOURCE_SECRET, } : {} diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index c5e735421e..b74c922621 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -108,8 +108,8 @@ export default $config({ url.slice(0, url.length - 1) ), VITE_ELECTRIC_URL: process.env.ELECTRIC_API, - VITE_ELECTRIC_DATABASE_ID: electricInfo.id, - VITE_ELECTRIC_TOKEN: electricInfo.token, + VITE_ELECTRIC_SOURCE_ID: electricInfo.id, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, }, domain: { name: `write-patterns${ @@ -124,8 +124,8 @@ export default $config({ return { databaseUri, - database_id: electricInfo.id, - electric_token: electricInfo.token, + // source_id: electricInfo.id, + // source_secret: electricInfo.token, server: service.url, website: website.url, } diff --git a/examples/yjs/app/shape-proxy/[...table]/route.ts b/examples/yjs/app/shape-proxy/[...table]/route.ts index da73a8e55b..f35e1a335a 100644 --- a/examples/yjs/app/shape-proxy/[...table]/route.ts +++ b/examples/yjs/app/shape-proxy/[...table]/route.ts @@ -10,13 +10,16 @@ export async function GET(request: Request) { originUrl.searchParams.set(key, value) }) - if (process.env.DATABASE_ID) { - originUrl.searchParams.set(`source_id`, process.env.DATABASE_ID) + if (process.env.ELECTRIC_SOURCE_ID) { + originUrl.searchParams.set(`source_id`, process.env.ELECTRIC_SOURCE_ID) } const headers = new Headers() - if (process.env.ELECTRIC_TOKEN) { - originUrl.searchParams.set(`token`, process.env.ELECTRIC_TOKEN) + if (process.env.ELECTRIC_SOURCE_SECRET) { + originUrl.searchParams.set( + `source_secret`, + process.env.ELECTRIC_SOURCE_SECRET + ) } const newRequest = new Request(originUrl.toString(), { diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index 0620c66530..0cd3563d62 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -108,8 +108,8 @@ function deployAppServer( environment: { ELECTRIC_URL: process.env.ELECTRIC_API!, DATABASE_URL: uri, - DATABASE_ID: id, - ELECTRIC_TOKEN: token, + ELECTRIC_SOURCE_ID: id, + ELECTRIC_SOURCE_SECRET: token, }, image: { context: `../..`, @@ -123,24 +123,6 @@ function deployAppServer( return service } -// function deployServerlessApp( -// electricInfo: $util.Output<{ id: string; token: string }>, -// uri: $util.Output -// ) { -// return new sst.aws.Nextjs(`yjs`, { -// environment: { -// ELECTRIC_URL: process.env.ELECTRIC_API!, -// ELECTRIC_TOKEN: electricInfo.token, -// DATABASE_ID: electricInfo.id, -// NEON_DATABASE_URL: uri, -// }, -// domain: { -// name: `yjs${isProduction() ? `` : `-stage-${$app.stage}`}.examples.electric-sql.com`, -// dns: sst.cloudflare.dns(), -// }, -// }) -// } - async function addDatabaseToElectric( uri: string ): Promise<{ id: string; token: string }> { From e761686a995587939c943cc3a6c383a91f32880d Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 15:36:06 +0000 Subject: [PATCH 20/21] we also changed the api --- examples/linearlite-read-only/sst.config.ts | 8 ++++---- examples/linearlite/sst.config.ts | 6 +++--- examples/nextjs/sst.config.ts | 8 ++++---- examples/proxy-auth/sst.config.ts | 6 +++--- examples/todo-app/sst.config.ts | 6 +++--- examples/write-patterns/sst.config.ts | 6 +++--- examples/yjs/sst.config.ts | 6 +++--- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index 6365a9fab4..f02e58c066 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -65,7 +65,7 @@ export default $config({ return { databaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, website: website.url, } } catch (e) { @@ -93,12 +93,12 @@ function loadData(uri: string) { } function deployLinearLite( - electricInfo: $util.Output<{ id: string; token: string }> + electricInfo: $util.Output<{ id: string; source_secret: string }> ) { return new sst.aws.StaticSite(`linearlite-read-only`, { environment: { VITE_ELECTRIC_URL: process.env.ELECTRIC_API!, - VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, build: { @@ -114,7 +114,7 @@ function deployLinearLite( async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/linearlite/sst.config.ts b/examples/linearlite/sst.config.ts index 6b10f5f5e7..b4fd109748 100644 --- a/examples/linearlite/sst.config.ts +++ b/examples/linearlite/sst.config.ts @@ -53,7 +53,7 @@ export default $config({ }, environment: { VITE_ELECTRIC_URL: process.env.ELECTRIC_API, - VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { @@ -68,7 +68,7 @@ export default $config({ return { databaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, website: website.url, } } catch (e) { @@ -88,7 +88,7 @@ function applyMigrations(uri: string) { async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/nextjs/sst.config.ts b/examples/nextjs/sst.config.ts index b0502d8b0c..efe5f45222 100644 --- a/examples/nextjs/sst.config.ts +++ b/examples/nextjs/sst.config.ts @@ -54,7 +54,7 @@ export default $config({ return { pooledDatabaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, website: website.url, } } catch (e) { @@ -73,13 +73,13 @@ function applyMigrations(uri: string) { } function deployNextJsExample( - electricInfo: $util.Output<{ id: string; token: string }>, + electricInfo: $util.Output<{ id: string; source_secret: string }>, uri: $util.Output ) { return new sst.aws.Nextjs(`nextjs`, { environment: { ELECTRIC_URL: process.env.ELECTRIC_API!, - ELECTRIC_SOURCE_SECRET: electricInfo.token, + ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, ELECTRIC_SOURCE_ID: electricInfo.id, DATABASE_URL: uri, }, @@ -92,7 +92,7 @@ function deployNextJsExample( async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index b718f63960..252bbb1a66 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -69,7 +69,7 @@ export default $config({ const staticSite = new sst.aws.Nextjs(`proxy-auth`, { environment: { ELECTRIC_URL: process.env.ELECTRIC_API!, - ELECTRIC_SOURCE_SECRET: electricInfo.token, + ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { @@ -83,7 +83,7 @@ export default $config({ return { databaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, url: staticSite.url, } }, @@ -99,7 +99,7 @@ function applyMigrations(uri: string) { } async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/todo-app/sst.config.ts b/examples/todo-app/sst.config.ts index b019e41278..586d4762e5 100644 --- a/examples/todo-app/sst.config.ts +++ b/examples/todo-app/sst.config.ts @@ -102,7 +102,7 @@ export default $config({ url.slice(0, url.length - 1) ), VITE_ELECTRIC_URL: process.env.ELECTRIC_API, - VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, VITE_ELECTRIC_SOURCE_ID: electricInfo.id, }, domain: { @@ -117,7 +117,7 @@ export default $config({ return { databaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, server: service.url, website: website.url, } @@ -138,7 +138,7 @@ function applyMigrations(uri: string) { async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/write-patterns/sst.config.ts b/examples/write-patterns/sst.config.ts index b74c922621..1ddbbb7642 100644 --- a/examples/write-patterns/sst.config.ts +++ b/examples/write-patterns/sst.config.ts @@ -109,7 +109,7 @@ export default $config({ ), VITE_ELECTRIC_URL: process.env.ELECTRIC_API, VITE_ELECTRIC_SOURCE_ID: electricInfo.id, - VITE_ELECTRIC_SOURCE_SECRET: electricInfo.token, + VITE_ELECTRIC_SOURCE_SECRET: electricInfo.source_secret, }, domain: { name: `write-patterns${ @@ -125,7 +125,7 @@ export default $config({ return { databaseUri, // source_id: electricInfo.id, - // source_secret: electricInfo.token, + // source_secret: electricInfo.source_secret, server: service.url, website: website.url, } @@ -146,7 +146,7 @@ function applyMigrations(uri: string) { async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index 0cd3563d62..7135fd0582 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -92,7 +92,7 @@ function applyMigrations(uri: string) { } function deployAppServer( - { id, token }: $util.Output<{ id: string; token: string }>, + { id, source_secret }: $util.Output<{ id: string; source_secret: string }>, uri: $util.Output ) { const vpc = new sst.aws.Vpc(`yjs-vpc-${$app.stage}`, { bastion: true }) @@ -109,7 +109,7 @@ function deployAppServer( ELECTRIC_URL: process.env.ELECTRIC_API!, DATABASE_URL: uri, ELECTRIC_SOURCE_ID: id, - ELECTRIC_SOURCE_SECRET: token, + ELECTRIC_SOURCE_SECRET: source_secret, }, image: { context: `../..`, @@ -125,7 +125,7 @@ function deployAppServer( async function addDatabaseToElectric( uri: string -): Promise<{ id: string; token: string }> { +): Promise<{ id: string; source_secret: string }> { const adminApi = process.env.ELECTRIC_ADMIN_API const teamId = process.env.ELECTRIC_TEAM_ID From b9af1d1eaf946d9e375ca0dcccb880f861d723f9 Mon Sep 17 00:00:00 2001 From: Valter Balegas Date: Wed, 29 Jan 2025 22:17:46 +0000 Subject: [PATCH 21/21] checkstyle; wrong attribute for adding url to comment --- examples/linearlite-read-only/sst.config.ts | 2 +- examples/proxy-auth/sst.config.ts | 2 +- examples/yjs/sst.config.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/linearlite-read-only/sst.config.ts b/examples/linearlite-read-only/sst.config.ts index f02e58c066..94f5b92937 100644 --- a/examples/linearlite-read-only/sst.config.ts +++ b/examples/linearlite-read-only/sst.config.ts @@ -121,7 +121,7 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, headers: { - 'Content-Type': 'application/json', + 'Content-Type': `application/json`, 'CF-Access-Client-Id': adminApiTokenId ?? ``, 'CF-Access-Client-Secret': adminApiTokenSecret ?? ``, }, diff --git a/examples/proxy-auth/sst.config.ts b/examples/proxy-auth/sst.config.ts index 252bbb1a66..5e8eeb27ab 100644 --- a/examples/proxy-auth/sst.config.ts +++ b/examples/proxy-auth/sst.config.ts @@ -84,7 +84,7 @@ export default $config({ databaseUri, // source_id: electricInfo.id, // source_secret: electricInfo.source_secret, - url: staticSite.url, + website: staticSite.url, } }, }) diff --git a/examples/yjs/sst.config.ts b/examples/yjs/sst.config.ts index 7135fd0582..a85cdf87ef 100644 --- a/examples/yjs/sst.config.ts +++ b/examples/yjs/sst.config.ts @@ -34,7 +34,7 @@ export default $config({ if (!$dev && !process.env.ELECTRIC_ADMIN_API_TOKEN_SECRET) { throw new Error(`ELECTRIC_ADMIN_API_TOKEN_ID is not set`) } - + try { const project = neon.getProjectOutput({ id: process.env.NEON_PROJECT_ID!, @@ -72,7 +72,7 @@ export default $config({ return { // serverless_url: serverless.url, - server_url: website.url, + website: website.url, databaseUri, databasePooledUri: pooledUri, } @@ -132,7 +132,7 @@ async function addDatabaseToElectric( const result = await fetch(`${adminApi}/v1/sources`, { method: `PUT`, headers: { - "Content-Type": "application/json", + "Content-Type": `application/json`, "CF-Access-Client-Id": adminApiTokenId ?? ``, "CF-Access-Client-Secret": adminApiTokenSecret ?? ``, },