From 099263d3144f27e13ceee914401e04ba5b3bf786 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 4 Jul 2024 20:55:41 -0400 Subject: [PATCH] ssr-site: do not deploy CDN in dev mode --- pkg/platform/src/components/aws/astro.ts | 80 ++++------- pkg/platform/src/components/aws/function.ts | 25 +--- pkg/platform/src/components/aws/nextjs.ts | 128 ++++-------------- pkg/platform/src/components/aws/nuxt.ts | 56 +++----- pkg/platform/src/components/aws/remix.ts | 60 ++++---- .../src/components/aws/solid-start.ts | 56 +++----- pkg/platform/src/components/aws/ssr-site.ts | 34 +++-- pkg/platform/src/components/aws/svelte-kit.ts | 64 ++++----- .../src/components/cloudflare/ssr-site.ts | 3 +- .../src/components/cloudflare/worker.ts | 4 - 10 files changed, 168 insertions(+), 342 deletions(-) diff --git a/pkg/platform/src/components/aws/astro.ts b/pkg/platform/src/components/aws/astro.ts index 29cfa7c73..f81846efc 100644 --- a/pkg/platform/src/components/aws/astro.ts +++ b/pkg/platform/src/components/aws/astro.ts @@ -7,6 +7,7 @@ import { Plan, SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -319,9 +320,9 @@ const BUILD_META_FILE_NAME: BuildMetaFileName = "sst.buildMeta.json"; * ``` */ export class Astro extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -331,10 +332,22 @@ export class Astro extends Component implements Link.Linkable { super(__pulumiType, name, args, opts); const parent = this; - const { sitePath, partition, region } = prepare(args, opts); + const { sitePath, partition } = prepare(args, opts); + + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath); - const { buildMeta } = loadBuildOutput(); + const buildMeta = loadBuildMetadata(); const plan = buildPlan(); const { distribution, ssrFunctions, edgeFunctions } = createServersAndDistribution( @@ -352,13 +365,11 @@ export class Astro extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), edge: plan.edge, @@ -366,23 +377,6 @@ export class Astro extends Component implements Link.Linkable { }, }); - function loadBuildOutput() { - const cache = new Cache( - `${name}BuildOutput`, - { - data: $dev ? loadBuildMetadataPlaceholder() : loadBuildMetadata(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - buildMeta: cache.data as ReturnType, - }; - } - function loadBuildMetadata() { return outputPath.apply((outputPath) => { const filePath = path.join(outputPath, "dist", BUILD_META_FILE_NAME); @@ -397,34 +391,6 @@ export class Astro extends Component implements Link.Linkable { }); } - function loadBuildMetadataPlaceholder() { - return { - deploymentStrategy: "regional", - responseMode: "buffer", - outputMode: "server", - pageResolution: "directory", - trailingSlash: "ignore", - serverBuildOutputFile: "dist/server/entry.mjs", - clientBuildOutputDir: "dist/client", - clientBuildVersionedSubDir: "_astro", - routes: [ - { - route: "/_image", - type: "endpoint", - pattern: "/^\\/_image$/", - prerender: false, - }, - { - route: "/", - type: "page", - pattern: "/^\\/$/", - prerender: false, - }, - ], - serverRoutes: [], - }; - } - function buildPlan() { return all([outputPath, buildMeta]).apply(([outputPath, buildMeta]) => { const isStatic = buildMeta.outputMode === "static"; @@ -603,7 +569,7 @@ export class Astro extends Component implements Link.Linkable { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/aws/function.ts b/pkg/platform/src/components/aws/function.ts index 61c61f08b..b6649c25c 100644 --- a/pkg/platform/src/components/aws/function.ts +++ b/pkg/platform/src/components/aws/function.ts @@ -781,10 +781,6 @@ export interface FunctionArgs { */ logGroup?: Transform; }; - /** - * @internal - */ - _ignoreCodeChanges?: boolean; /** * @internal */ @@ -1116,17 +1112,6 @@ export class Function extends Component implements Link.Linkable, AWSLinkable { function buildHandler() { return dev.apply((dev) => { - if (args._ignoreCodeChanges) { - return { - bundle: path.join( - $cli.paths.platform, - "functions", - "empty-function", - ), - handler: "index.handler", - }; - } - if (dev) { return { handler: "bootstrap", @@ -1398,9 +1383,6 @@ export class Function extends Component implements Link.Linkable, AWSLinkable { }, { parent, - ignoreChanges: args._ignoreCodeChanges - ? ["key", "source"] - : undefined, retainOnDelete: true, }, ); @@ -1456,12 +1438,7 @@ export class Function extends Component implements Link.Linkable, AWSLinkable { transformed.architectures = all([transformed.architectures, dev]).apply( ([architectures, dev]) => (dev ? ["x86_64"] : architectures!), ); - return new lambda.Function(`${name}Function`, transformed, { - parent, - ignoreChanges: args._ignoreCodeChanges - ? ["code", "handler"] - : undefined, - }); + return new lambda.Function(`${name}Function`, transformed, { parent }); } function createUrl() { diff --git a/pkg/platform/src/components/aws/nextjs.ts b/pkg/platform/src/components/aws/nextjs.ts index 46d65236b..becb435af 100644 --- a/pkg/platform/src/components/aws/nextjs.ts +++ b/pkg/platform/src/components/aws/nextjs.ts @@ -9,6 +9,7 @@ import { Plan, SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -446,9 +447,9 @@ export interface NextjsArgs extends SsrSiteArgs { * ``` */ export class Nextjs extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -469,6 +470,17 @@ export class Nextjs extends Component implements Link.Linkable { const parent = this; const buildCommand = normalizeBuildCommand(); const { sitePath, partition, region } = prepare(args, opts); + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath, buildCommand); const { @@ -502,13 +514,11 @@ export class Nextjs extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), edge: plan.edge, @@ -530,29 +540,6 @@ export class Nextjs extends Component implements Link.Linkable { } function loadBuildOutput() { - const cache = new Cache( - `${name}OpenNextOutput`, - { - data: $dev ? loadOpenNextOutputPlaceholder() : loadOpenNextOutput(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - openNextOutput: cache.data as ReturnType, - buildId: loadBuildId(), - routesManifest: loadRoutesManifest(), - appPathRoutesManifest: loadAppPathRoutesManifest(), - appPathsManifest: loadAppPathsManifest(), - pagesManifest: loadPagesManifest(), - prerenderManifest: loadPrerenderManifest(), - }; - } - - function loadOpenNextOutput() { return outputPath.apply((outputPath) => { const openNextOutputPath = path.join( outputPath, @@ -574,63 +561,20 @@ export class Nextjs extends Component implements Link.Linkable { bundle: ".open-next/dynamodb-provider", }; } - return json; + return { + openNextOutput: json, + buildId: loadBuildId(), + routesManifest: loadRoutesManifest(), + appPathRoutesManifest: loadAppPathRoutesManifest(), + appPathsManifest: loadAppPathsManifest(), + pagesManifest: loadPagesManifest(), + prerenderManifest: loadPrerenderManifest(), + }; }); } - function loadOpenNextOutputPlaceholder() { - // Configure origins and behaviors based on the Next.js app from quick start - return outputPath.apply((outputPath) => ({ - edgeFunctions: {}, - origins: { - s3: { - type: "s3", - originPath: "_assets", - // do not upload anything - copy: [], - }, - imageOptimizer: { - type: "function", - handler: "index.handler", - bundle: path.join( - outputPath, - ".open-next/image-optimization-function", - ), - streaming: false, - }, - default: { - type: "function", - handler: "index.handler", - bundle: path.join( - outputPath, - ".open-next/server-functions/default", - ), - streaming: false, - }, - }, - behaviors: [ - { pattern: "_next/image*", origin: "imageOptimizer" }, - { pattern: "_next/data/*", origin: "default" }, - { pattern: "*", origin: "default" }, - { pattern: "BUILD_ID", origin: "s3" }, - { pattern: "_next/*", origin: "s3" }, - { pattern: "favicon.ico", origin: "s3" }, - { pattern: "next.svg", origin: "s3" }, - { pattern: "vercel.svg", origin: "s3" }, - ], - additionalProps: { - // skip creating revalidation queue - disableIncrementalCache: true, - // skip creating revalidation table - disableTagCache: true, - }, - })); - } - function loadBuildId() { return outputPath.apply((outputPath) => { - if ($dev) return "mock-build-id"; - try { return fs .readFileSync(path.join(outputPath, ".next/BUILD_ID")) @@ -646,8 +590,6 @@ export class Nextjs extends Component implements Link.Linkable { function loadRoutesManifest() { return outputPath.apply((outputPath) => { - if ($dev) return { dynamicRoutes: [], staticRoutes: [] }; - try { const content = fs .readFileSync(path.join(outputPath, ".next/routes-manifest.json")) @@ -678,8 +620,6 @@ export class Nextjs extends Component implements Link.Linkable { // } return outputPath.apply((outputPath) => { - if ($dev) return {}; - try { const content = fs .readFileSync( @@ -695,8 +635,6 @@ export class Nextjs extends Component implements Link.Linkable { function loadAppPathsManifest() { return outputPath.apply((outputPath) => { - if ($dev) return {}; - try { const content = fs .readFileSync( @@ -712,8 +650,6 @@ export class Nextjs extends Component implements Link.Linkable { function loadPagesManifest() { return outputPath.apply((outputPath) => { - if ($dev) return {}; - try { const content = fs .readFileSync( @@ -729,8 +665,6 @@ export class Nextjs extends Component implements Link.Linkable { function loadPrerenderManifest() { return outputPath.apply((outputPath) => { - if ($dev) return { version: 0, routes: {} }; - try { const content = fs .readFileSync( @@ -968,7 +902,6 @@ export class Nextjs extends Component implements Link.Linkable { }, ], live: false, - _ignoreCodeChanges: $dev, _skipMetadata: true, }, { @@ -1069,7 +1002,6 @@ export class Nextjs extends Component implements Link.Linkable { CACHE_DYNAMO_TABLE: revalidationTable!.name, }, live: false, - _ignoreCodeChanges: $dev, _skipMetadata: true, }, { parent }, @@ -1085,7 +1017,7 @@ export class Nextjs extends Component implements Link.Linkable { RequestType: "Create", }), }, - { parent, ignoreChanges: $dev ? ["*"] : undefined }, + { parent }, ); }, ); @@ -1356,7 +1288,7 @@ if(request.headers["cloudfront-viewer-longitude"]) { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/aws/nuxt.ts b/pkg/platform/src/components/aws/nuxt.ts index 705b66b69..fde21de32 100644 --- a/pkg/platform/src/components/aws/nuxt.ts +++ b/pkg/platform/src/components/aws/nuxt.ts @@ -5,6 +5,7 @@ import { Function } from "./function.js"; import { SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -310,9 +311,9 @@ export interface NuxtArgs extends SsrSiteArgs { * ``` */ export class Nuxt extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -323,9 +324,20 @@ export class Nuxt extends Component implements Link.Linkable { const parent = this; const { sitePath, partition } = prepare(args, opts); + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath); - const { buildMeta } = loadBuildOutput(); + const buildMeta = loadBuildMetadata(); const plan = buildPlan(); const { distribution, ssrFunctions, edgeFunctions } = createServersAndDistribution( @@ -343,36 +355,17 @@ export class Nuxt extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), server: serverFunction.arn, }, }); - function loadBuildOutput() { - const cache = new Cache( - `${name}BuildOutput`, - { - data: $dev ? loadBuildMetadataPlaceholder() : loadBuildMetadata(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - buildMeta: cache.data as ReturnType, - }; - } - function loadBuildMetadata() { return outputPath.apply((outputPath) => { const assetsPath = path.join(".output", "public"); @@ -391,13 +384,6 @@ export class Nuxt extends Component implements Link.Linkable { }); } - function loadBuildMetadataPlaceholder() { - return { - assetsPath: "placeholder", - staticRoutes: ["_build/*", "_server/*", "assets/*", "favicon.ico"], - }; - } - function buildPlan() { return all([outputPath, buildMeta]).apply(([outputPath, buildMeta]) => { const serverConfig = { @@ -464,7 +450,7 @@ export class Nuxt extends Component implements Link.Linkable { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/aws/remix.ts b/pkg/platform/src/components/aws/remix.ts index 70cfe72d1..7d3f865ca 100644 --- a/pkg/platform/src/components/aws/remix.ts +++ b/pkg/platform/src/components/aws/remix.ts @@ -5,6 +5,7 @@ import { Function } from "./function.js"; import { SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -318,9 +319,9 @@ export interface RemixArgs extends SsrSiteArgs { * ``` */ export class Remix extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -331,11 +332,23 @@ export class Remix extends Component implements Link.Linkable { const parent = this; const edge = normalizeEdge(); - const { sitePath, partition, region } = prepare(args, opts); + const { sitePath, partition } = prepare(args, opts); + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + edge, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const isUsingVite = checkIsUsingVite(); const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath); - const { buildMeta } = loadBuildOutput(); + const buildMeta = loadBuildMetadata(); const plan = buildPlan(); const { distribution, ssrFunctions, edgeFunctions } = createServersAndDistribution( @@ -353,13 +366,11 @@ export class Remix extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), edge, @@ -379,23 +390,6 @@ export class Remix extends Component implements Link.Linkable { ); } - function loadBuildOutput() { - const cache = new Cache( - `${name}BuildOutput`, - { - data: $dev ? loadBuildMetadataPlaceholder() : loadBuildMetadata(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - buildMeta: cache.data as ReturnType, - }; - } - function loadBuildMetadata() { return all([outputPath, isUsingVite]).apply( ([outputPath, isUsingVite]) => { @@ -425,14 +419,6 @@ export class Remix extends Component implements Link.Linkable { ); } - function loadBuildMetadataPlaceholder() { - return { - assetsPath: "placeholder", - assetsVersionedSubDir: undefined, - staticRoutes: ["assets/*", "favicon.ico"], - }; - } - function buildPlan() { return all([isUsingVite, outputPath, edge, buildMeta]).apply( ([isUsingVite, outputPath, edge, buildMeta]) => { @@ -599,7 +585,7 @@ export class Remix extends Component implements Link.Linkable { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/aws/solid-start.ts b/pkg/platform/src/components/aws/solid-start.ts index 80c494a9d..6eadba390 100644 --- a/pkg/platform/src/components/aws/solid-start.ts +++ b/pkg/platform/src/components/aws/solid-start.ts @@ -5,6 +5,7 @@ import { Function } from "./function.js"; import { SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -311,9 +312,9 @@ export interface SolidStartArgs extends SsrSiteArgs { * ``` */ export class SolidStart extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -324,6 +325,17 @@ export class SolidStart extends Component implements Link.Linkable { const parent = this; const { sitePath, partition } = prepare(args, opts); + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath).apply((output) => { const nitro = JSON.parse( @@ -336,7 +348,7 @@ export class SolidStart extends Component implements Link.Linkable { } return output; }); - const { buildMeta } = loadBuildOutput(); + const buildMeta = loadBuildMetadata(); const plan = buildPlan(); const { distribution, ssrFunctions, edgeFunctions } = createServersAndDistribution( @@ -354,36 +366,17 @@ export class SolidStart extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), server: serverFunction.arn, }, }); - function loadBuildOutput() { - const cache = new Cache( - `${name}BuildOutput`, - { - data: $dev ? loadBuildMetadataPlaceholder() : loadBuildMetadata(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - buildMeta: cache.data as ReturnType, - }; - } - function loadBuildMetadata() { return outputPath.apply((outputPath) => { const assetsPath = path.join(".output", "public"); @@ -402,13 +395,6 @@ export class SolidStart extends Component implements Link.Linkable { }); } - function loadBuildMetadataPlaceholder() { - return { - assetsPath: "placeholder", - staticRoutes: ["_build/*", "_server/*", "assets/*", "favicon.ico"], - }; - } - function buildPlan() { return all([outputPath, buildMeta]).apply(([outputPath, buildMeta]) => { const serverConfig = { @@ -476,7 +462,7 @@ export class SolidStart extends Component implements Link.Linkable { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/aws/ssr-site.ts b/pkg/platform/src/components/aws/ssr-site.ts index e0fc76b93..49f8b7d41 100644 --- a/pkg/platform/src/components/aws/ssr-site.ts +++ b/pkg/platform/src/components/aws/ssr-site.ts @@ -236,6 +236,29 @@ export function createBucket( } } +export function createDevServer( + parent: ComponentResource, + name: string, + args: SsrSiteArgs, +) { + return new Function( + `${name}DevServer`, + transform(args.transform?.server, { + description: `${name} dev server`, + runtime: "nodejs20.x", + timeout: "20 seconds", + memory: "128 MB", + bundle: path.join($cli.paths.platform, "functions", "empty-function"), + handler: "index.handler", + environment: args.environment, + permissions: args.permissions, + link: args.link, + live: false, + }), + { parent }, + ); +} + export function createServersAndDistribution( parent: ComponentResource, name: string, @@ -345,7 +368,7 @@ export function createServersAndDistribution( bucketName: bucket.name, files: bucketFiles, }, - { parent, ignoreChanges: $dev ? ["*"] : undefined }, + { parent }, ); }); } @@ -455,7 +478,6 @@ function handler(event) { }, }, live: false, - _ignoreCodeChanges: $dev, }, { provider: useProvider("us-east-1"), parent }, ); @@ -552,7 +574,6 @@ function handler(event) { ]), url: true, live: false, - _ignoreCodeChanges: $dev, }), { parent }, ); @@ -591,7 +612,6 @@ function handler(event) { ...props.function, url: true, live: false, - _ignoreCodeChanges: $dev, _skipMetadata: true, }, { parent }, @@ -749,7 +769,6 @@ function handler(event) { })), customErrorResponses: plan.errorResponses, domain: args.domain, - wait: !$dev, }), // create distribution after assets are uploaded { dependsOn: bucketFile, parent }, @@ -946,10 +965,7 @@ function handler(event) { version: invalidationBuildId, wait: invalidation.wait, }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, + { parent }, ); }, ); diff --git a/pkg/platform/src/components/aws/svelte-kit.ts b/pkg/platform/src/components/aws/svelte-kit.ts index a053b6b43..230dee057 100644 --- a/pkg/platform/src/components/aws/svelte-kit.ts +++ b/pkg/platform/src/components/aws/svelte-kit.ts @@ -5,6 +5,7 @@ import { Function } from "./function.js"; import { SsrSiteArgs, createBucket, + createDevServer, createServersAndDistribution, prepare, useCloudFrontFunctionHostHeaderInjection, @@ -15,7 +16,6 @@ import { Bucket } from "./bucket.js"; import { Component } from "../component.js"; import { Link } from "../link.js"; import type { Input } from "../input.js"; -import { Cache } from "./providers/cache.js"; import { buildApp } from "../base/base-ssr-site.js"; export interface SvelteKitArgs extends SsrSiteArgs { @@ -318,9 +318,9 @@ export interface SvelteKitArgs extends SsrSiteArgs { * ``` */ export class SvelteKit extends Component implements Link.Linkable { - private cdn: Output; - private assets: Bucket; - private server: Output; + private cdn?: Output; + private assets?: Bucket; + private server?: Output; constructor( name: string, @@ -332,9 +332,22 @@ export class SvelteKit extends Component implements Link.Linkable { const parent = this; const edge = normalizeEdge(); const { sitePath, partition } = prepare(args, opts); + + if ($dev) { + this.registerOutputs({ + _metadata: { + mode: "placeholder", + path: sitePath, + edge, + server: createDevServer(parent, name, args).arn, + }, + }); + return; + } + const { access, bucket } = createBucket(parent, name, partition, args); const outputPath = buildApp(name, args, sitePath); - const { buildMeta } = loadBuildOutput(); + const buildMeta = loadBuildMetadata(); const plan = buildPlan(); const { distribution, ssrFunctions, edgeFunctions } = createServersAndDistribution( @@ -352,13 +365,11 @@ export class SvelteKit extends Component implements Link.Linkable { this.cdn = distribution; this.server = serverFunction; this.registerOutputs({ - _hint: $dev - ? undefined - : all([this.cdn.domainUrl, this.cdn.url]).apply( - ([domainUrl, url]) => domainUrl ?? url, - ), + _hint: all([this.cdn.domainUrl, this.cdn.url]).apply( + ([domainUrl, url]) => domainUrl ?? url, + ), _metadata: { - mode: $dev ? "placeholder" : "deployed", + mode: "deployed", path: sitePath, url: distribution.apply((d) => d.domainUrl ?? d.url), edge, @@ -370,23 +381,6 @@ export class SvelteKit extends Component implements Link.Linkable { return output(args?.edge).apply((edge) => edge ?? false); } - function loadBuildOutput() { - const cache = new Cache( - `${name}BuildOutput`, - { - data: $dev ? loadBuildMetadataPlaceholder() : loadBuildMetadata(), - }, - { - parent, - ignoreChanges: $dev ? ["*"] : undefined, - }, - ); - - return { - buildMeta: cache.data as ReturnType, - }; - } - function loadBuildMetadata() { const serverPath = ".svelte-kit/svelte-kit-sst/server"; const assetsPath = ".svelte-kit/svelte-kit-sst/client"; @@ -423,18 +417,6 @@ export class SvelteKit extends Component implements Link.Linkable { }); } - function loadBuildMetadataPlaceholder() { - return { - basePath: "", - serverPath: ".svelte-kit/svelte-kit-sst/server", - serverFiles: undefined, - prerenderedPath: "placeholder", - assetsPath: "placeholder", - assetsVersionedSubDir: undefined, - staticRoutes: ["_app/*", "favicon.png"], - }; - } - function buildPlan() { return all([outputPath, edge, buildMeta]).apply( ([outputPath, edge, buildMeta]) => { @@ -542,7 +524,7 @@ export class SvelteKit extends Component implements Link.Linkable { * Otherwise, it's the autogenerated CloudFront URL. */ public get url() { - return all([this.cdn.domainUrl, this.cdn.url]).apply( + return all([this.cdn?.domainUrl, this.cdn?.url]).apply( ([domainUrl, url]) => domainUrl ?? url, ); } diff --git a/pkg/platform/src/components/cloudflare/ssr-site.ts b/pkg/platform/src/components/cloudflare/ssr-site.ts index 22869af6b..6c82e0c2c 100644 --- a/pkg/platform/src/components/cloudflare/ssr-site.ts +++ b/pkg/platform/src/components/cloudflare/ssr-site.ts @@ -161,7 +161,7 @@ export function createRouter( })), ), }, - { parent, ignoreChanges: $dev ? ["*"] : undefined }, + { parent }, ); } @@ -223,7 +223,6 @@ export function createRouter( ...(link ?? []), ]), live: false, - _ignoreCodeChanges: $dev, }, { parent }, ); diff --git a/pkg/platform/src/components/cloudflare/worker.ts b/pkg/platform/src/components/cloudflare/worker.ts index d2d7c6d6d..9d67a0f69 100644 --- a/pkg/platform/src/components/cloudflare/worker.ts +++ b/pkg/platform/src/components/cloudflare/worker.ts @@ -159,10 +159,6 @@ export interface WorkerArgs { */ worker?: Transform; }; - /** - * @internal - */ - _ignoreCodeChanges?: boolean; /** * @internal * Placehodler for future feature.