Skip to content

Commit 05b294b

Browse files
feat: add svelte preset (#292)
Co-authored-by: Hendrik Soares <hendrik.soares@gmail.com>
1 parent 8b8c614 commit 05b294b

File tree

6 files changed

+143
-0
lines changed

6 files changed

+143
-0
lines changed

lib/constants/framework-initializer.constants.js

+9
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ const TemplatesOptions = {
8383
{ value: 'react-static', message: 'static supported', mode: 'deliver' },
8484
],
8585
},
86+
Svelte: {
87+
options: [
88+
{ value: 'svelte-static', message: 'static supported', mode: 'deliver' },
89+
],
90+
},
8691
Vue: {
8792
options: [
8893
{ value: 'vue-static', message: 'static supported', mode: 'deliver' },
@@ -146,6 +151,10 @@ const TemplatesInitializer = {
146151
const cloneCommands = generateCloneCommand(projectName, subdirectory);
147152
await exec(cloneCommands, 'React', false, false);
148153
},
154+
Svelte: async (projectName, subdirectory) => {
155+
const cloneCommands = generateCloneCommand(projectName, subdirectory);
156+
await exec(cloneCommands, 'Svelte', false, false);
157+
},
149158
Vue: async (projectName, subdirectory) => {
150159
const cloneCommands = generateCloneCommand(projectName, subdirectory);
151160
await exec(cloneCommands, 'Vue', false, false);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Config to be used in build context.
3+
*/
4+
const config = {
5+
builder: 'webpack',
6+
useNodePolyfills: false,
7+
custom: {},
8+
};
9+
10+
export default config;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { ErrorHTML, mountSSG } from '#edge';
2+
/**
3+
* Handles the 'fetch' event.
4+
* @param {any} event - The fetch event.
5+
* @returns {Promise<Response>} The response for the request.
6+
*/
7+
async function handler(event) {
8+
try {
9+
const myApp = await mountSSG(event.request.url);
10+
return myApp;
11+
} catch (error) {
12+
return ErrorHTML('404');
13+
}
14+
}
15+
16+
export default handler;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { rm } from 'fs/promises';
2+
import {
3+
exec,
4+
getPackageManager,
5+
copyDirectory,
6+
generateManifest,
7+
} from '#utils';
8+
9+
const packageManager = await getPackageManager();
10+
11+
const manifest = {
12+
origin: [
13+
{
14+
name: 'origin_storage_default',
15+
type: 'object_storage',
16+
},
17+
],
18+
rules: {
19+
request: [
20+
{
21+
name: 'Main_Rule',
22+
match: '^\\/',
23+
setOrigin: {
24+
name: 'origin_storage_default',
25+
type: 'object_storage',
26+
},
27+
},
28+
],
29+
},
30+
};
31+
32+
/**
33+
* Runs custom prebuild actions
34+
*/
35+
async function prebuild() {
36+
const newOutDir = '.edge/storage';
37+
const outDir = 'build';
38+
39+
await exec(`${packageManager} run build`, 'Svelte', true);
40+
41+
// move files to vulcan default path
42+
copyDirectory(outDir, newOutDir);
43+
44+
await generateManifest(manifest);
45+
46+
rm(outDir, { recursive: true, force: true });
47+
}
48+
49+
export default prebuild;

lib/utils/presets/presets.utils.test.js

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('getPresetsList utils', () => {
2222
'next',
2323
'react',
2424
'rustwasm',
25+
'svelte',
2526
'vue',
2627
];
2728

@@ -91,6 +92,7 @@ describe('getPresetsList utils', () => {
9192
'Next (Deliver)',
9293
'React (Deliver)',
9394
'Rustwasm (Compute)',
95+
'Svelte (Deliver)',
9496
'Vue (Deliver)',
9597
];
9698
const beautifiedResults = presets.getBeautify();
@@ -110,6 +112,7 @@ describe('getPresetsList utils', () => {
110112
'hugo',
111113
'next',
112114
'react',
115+
'svelte',
113116
'rustwasm',
114117
'vue',
115118
];
@@ -125,6 +128,7 @@ describe('getPresetsList utils', () => {
125128
['Deliver'],
126129
['Compute', 'Deliver'],
127130
['Deliver'],
131+
['Deliver'],
128132
['Compute'],
129133
['Deliver'],
130134
];

tests/e2e/svelte-static.test.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* eslint-disable jest/expect-expect */
2+
import supertest from 'supertest';
3+
import puppeteer from 'puppeteer';
4+
import projectInitializer from '../utils/project-initializer.js';
5+
import projectStop from '../utils/project-stop.js';
6+
import { getContainerPort } from '../utils/docker-env-actions.js';
7+
8+
// timeout in minutes
9+
const TIMEOUT = 10 * 60 * 1000;
10+
11+
let serverPort;
12+
let localhostBaseUrl;
13+
const EXAMPLE_PATH = '/examples/svelte-static';
14+
15+
describe('E2E - svelte-static project', () => {
16+
let request;
17+
let browser;
18+
let page;
19+
20+
beforeAll(async () => {
21+
serverPort = getContainerPort();
22+
localhostBaseUrl = `http://0.0.0.0:${serverPort}`;
23+
24+
request = supertest(localhostBaseUrl);
25+
26+
await projectInitializer(EXAMPLE_PATH, 'svelte', 'deliver', serverPort);
27+
28+
browser = await puppeteer.launch({ headless: 'new' });
29+
page = await browser.newPage();
30+
}, TIMEOUT);
31+
32+
afterAll(async () => {
33+
await projectStop(serverPort, EXAMPLE_PATH.replace('/examples/', ''));
34+
35+
await browser.close();
36+
}, TIMEOUT);
37+
38+
test('Should render home page in "/" route', async () => {
39+
await page.goto(`${localhostBaseUrl}/`, {
40+
waitUntil: 'domcontentloaded',
41+
});
42+
await page.waitForSelector('h1');
43+
const pageContent = await page.content();
44+
45+
expect(pageContent).toContain('Welcome to SvelteKit');
46+
expect(pageContent).toContain('kit.svelte.dev');
47+
});
48+
49+
test('Should return correct asset', async () => {
50+
await request
51+
.get('/favicon.png')
52+
.expect(200)
53+
.expect('Content-Type', /image\/png/);
54+
});
55+
});

0 commit comments

Comments
 (0)