Skip to content
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions apps/web/client/public/onlook-preload-script.js

Large diffs are not rendered by default.

50 changes: 39 additions & 11 deletions apps/web/client/src/server/api/routers/domain/adapters/freestyle.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { FreestyleDeployWebSuccessResponseV2 } from 'freestyle-sandboxes';
import type { DeploymentSource, FreestyleDeployWebSuccessResponseV2 } from 'freestyle-sandboxes';
import { initializeFreestyleSdk } from '../freestyle';
import type {
HostingProviderAdapter,
Expand All @@ -9,34 +9,62 @@ import type {
export class FreestyleAdapter implements HostingProviderAdapter {
async deploy(request: DeploymentRequest): Promise<DeploymentResponse> {
const sdk = initializeFreestyleSdk();

if (request.sourceUrl) {
// Many SDKs accept a generic URL-based source. Use a loose cast to avoid type mismatch.

const res = await sdk.deployWeb(
{ kind: 'tar', url: request.sourceUrl } as unknown as DeploymentSource,
request.config,
);

const freestyleResponse = res as {
message?: string;
error?: { message: string };
data?: FreestyleDeployWebSuccessResponseV2;
};

if (freestyleResponse.error) {
throw new Error(
freestyleResponse.error.message ??
freestyleResponse.message ??
'Unknown error',
);
}

return {
deploymentId: freestyleResponse.data?.deploymentId ?? '',
success: true,
message: freestyleResponse.message,
};
}

const res = await sdk.deployWeb(
{
files: request.files,
files: request.files ?? {},
kind: 'files',
},
request.config
request.config,
);

const freestyleResponse = res as {
message?: string;
error?: {
message: string;
};
data?: FreestyleDeployWebSuccessResponseV2;
};

if (freestyleResponse.error) {
throw new Error(
freestyleResponse.error.message ||
freestyleResponse.message ||
'Unknown error'
freestyleResponse.error.message ??
freestyleResponse.message ??
'Unknown error',
);
}

return {
deploymentId: freestyleResponse.data?.deploymentId ?? '',
success: true
success: true,
};
}
}
40 changes: 22 additions & 18 deletions apps/web/client/src/server/api/routers/publish/helpers/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,39 @@ import {
import { HostingProviderFactory } from '../../domain/hosting-factory.ts';

export const deployFreestyle = async (
{
files,
urls,
envVars,
}: {
files: Record<string, FreestyleFile>,
urls: string[],
envVars?: Record<string, string>,
args: (
{ files: Record<string, FreestyleFile>; sourceUrl?: undefined } |
{ files?: undefined; sourceUrl: string }
) & {
urls: string[];
envVars?: Record<string, string>;
}
): Promise<{
success: boolean;
message?: string;
}> => {
const entrypoint = 'server.js';
const adapter = HostingProviderFactory.create(HostingProvider.FREESTYLE);
const deploymentFiles: Record<string, { content: string; encoding?: 'utf-8' | 'base64' }> = {};
for (const [path, file] of Object.entries(files)) {
deploymentFiles[path] = {
content: file.content,
encoding: (file.encoding === 'base64' ? 'base64' : 'utf-8')
};
}

const result = await adapter.deploy({
files: deploymentFiles,
...(('sourceUrl' in args && typeof args.sourceUrl === 'string')
? { sourceUrl: args.sourceUrl }
: {
files: Object.fromEntries(
Object.entries(args.files ?? {}).map(([path, file]) => [
path,
{
content: file.content,
encoding: (file.encoding === 'base64' ? 'base64' : 'utf-8'),
} as const,
]),
),
}
),
config: {
domains: urls,
domains: args.urls,
entrypoint,
envVars,
envVars: args.envVars,
},
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export async function publish({ db, deployment }: { db: DrizzleDb; deployment: D
requestedBy: userId,
} = deployment;
try {
const deploymentUrls = await getProjectUrls(db, projectId, type);
const deploymentUrls = await getProjectUrls(db, projectId, type);
const sandboxId = await getSandboxId(db, projectId);

const updateDeploymentResult1 = await updateDeployment(db, deploymentId, {
Expand All @@ -35,11 +35,7 @@ export async function publish({ db, deployment }: { db: DrizzleDb; deployment: D
});
}

const { provider, sandboxId: forkedSandboxId } = await forkBuildSandbox(
sandboxId,
userId,
deploymentId,
);
const { provider, sandboxId: forkedSandboxId } = await forkBuildSandbox(sandboxId, userId, deploymentId);

try {
const updateDeploymentResult2 = await updateDeployment(db, deploymentId, {
Expand All @@ -55,11 +51,13 @@ export async function publish({ db, deployment }: { db: DrizzleDb; deployment: D
});
}


const publishManager = new PublishManager(provider);
const files = await publishManager.publish({
const artifactUrl = await publishManager.buildAndUploadArtifact({
skipBadge: type === DeploymentType.CUSTOM,
buildScript: buildScript ?? DefaultSettings.COMMANDS.build,
buildFlags: buildFlags ?? DefaultSettings.EDITOR_SETTINGS.buildFlags,
deploymentId,
updateDeployment: (deployment) => updateDeployment(db, deploymentId, deployment),
});

Expand All @@ -80,7 +78,7 @@ export async function publish({ db, deployment }: { db: DrizzleDb; deployment: D
const mergedEnvVars = { ...sandboxEnvVars, ...(envVars ?? {}) };

await deployFreestyle({
files,
sourceUrl: artifactUrl,
urls: deploymentUrls,
envVars: mergedEnvVars,
});
Expand Down
Loading