diff --git a/.changeset/cyan-radios-attend.md b/.changeset/cyan-radios-attend.md new file mode 100644 index 000000000000..e8f7502018d7 --- /dev/null +++ b/.changeset/cyan-radios-attend.md @@ -0,0 +1,7 @@ +--- +'@sveltejs/adapter-node': patch +'@sveltejs/adapter-static': patch +'@sveltejs/kit': patch +--- + +Move `compress` logic to `Builder` API diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js index 4dbd7d1bd9ad..ef6e8adab00b 100644 --- a/packages/adapter-node/index.js +++ b/packages/adapter-node/index.js @@ -1,11 +1,5 @@ -import { createReadStream, createWriteStream, existsSync, statSync, writeFileSync } from 'fs'; -import { pipeline } from 'stream'; -import glob from 'tiny-glob'; +import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; -import { promisify } from 'util'; -import zlib from 'zlib'; - -const pipe = promisify(pipeline); const files = fileURLToPath(new URL('./files', import.meta.url).href); @@ -49,51 +43,9 @@ export default function (opts = {}) { if (precompress) { builder.log.minor('Compressing assets'); - await compress(`${out}/client`); - await compress(`${out}/prerendered`); + await builder.compress(`${out}/client`); + await builder.compress(`${out}/prerendered`); } } }; } - -/** - * @param {string} directory - */ -async function compress(directory) { - if (!existsSync(directory)) { - return; - } - - const files = await glob('**/*.{html,js,json,css,svg,xml,wasm}', { - cwd: directory, - dot: true, - absolute: true, - filesOnly: true - }); - - await Promise.all( - files.map((file) => Promise.all([compress_file(file, 'gz'), compress_file(file, 'br')])) - ); -} - -/** - * @param {string} file - * @param {'gz' | 'br'} format - */ -async function compress_file(file, format = 'gz') { - const compress = - format == 'br' - ? zlib.createBrotliCompress({ - params: { - [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, - [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY, - [zlib.constants.BROTLI_PARAM_SIZE_HINT]: statSync(file).size - } - }) - : zlib.createGzip({ level: zlib.constants.Z_BEST_COMPRESSION }); - - const source = createReadStream(file); - const destination = createWriteStream(`${file}.${format}`); - - await pipe(source, compress, destination); -} diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 19eb4585cc5d..e69733a62541 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -31,9 +31,6 @@ "format": "npm run lint -- --write", "prepublishOnly": "npm run build" }, - "dependencies": { - "tiny-glob": "^0.2.9" - }, "devDependencies": { "@rollup/plugin-json": "^4.1.0", "@sveltejs/kit": "workspace:*", diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index 6120ff5f712c..9068a0730dac 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -1,12 +1,5 @@ -import { createReadStream, createWriteStream, statSync } from 'fs'; -import { pipeline } from 'stream'; -import glob from 'tiny-glob'; -import { promisify } from 'util'; -import zlib from 'zlib'; import { platforms } from './platforms.js'; -const pipe = promisify(pipeline); - /** @type {import('.').default} */ export default function (options) { return { @@ -49,13 +42,13 @@ export default function (options) { if (precompress) { if (pages === assets) { builder.log.minor('Compressing assets and pages'); - await compress(assets); + await builder.compress(assets); } else { builder.log.minor('Compressing assets'); - await compress(assets); + await builder.compress(assets); builder.log.minor('Compressing pages'); - await compress(pages); + await builder.compress(pages); } } @@ -69,41 +62,3 @@ export default function (options) { } }; } - -/** - * @param {string} directory - */ -async function compress(directory) { - const files = await glob('**/*.{html,js,json,css,svg,xml,wasm}', { - cwd: directory, - dot: true, - absolute: true, - filesOnly: true - }); - - await Promise.all( - files.map((file) => Promise.all([compress_file(file, 'gz'), compress_file(file, 'br')])) - ); -} - -/** - * @param {string} file - * @param {'gz' | 'br'} format - */ -async function compress_file(file, format = 'gz') { - const compress = - format == 'br' - ? zlib.createBrotliCompress({ - params: { - [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, - [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY, - [zlib.constants.BROTLI_PARAM_SIZE_HINT]: statSync(file).size - } - }) - : zlib.createGzip({ level: zlib.constants.Z_BEST_COMPRESSION }); - - const source = createReadStream(file); - const destination = createWriteStream(`${file}.${format}`); - - await pipe(source, compress, destination); -} diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index c8b196c7f108..bdde0da9d350 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -24,9 +24,6 @@ "format": "npm run lint -- --write", "test": "uvu test test.js" }, - "dependencies": { - "tiny-glob": "^0.2.9" - }, "devDependencies": { "@sveltejs/kit": "workspace:*", "@types/node": "^16.11.36", diff --git a/packages/kit/package.json b/packages/kit/package.json index 8a13e25b9473..811e3f1cad80 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -12,7 +12,8 @@ "dependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.1", "chokidar": "^3.5.3", - "sade": "^1.8.1" + "sade": "^1.8.1", + "tiny-glob": "^0.2.9" }, "devDependencies": { "@playwright/test": "^1.23.4", diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index d54628378bf6..c3755870bbe1 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -1,3 +1,8 @@ +import glob from 'tiny-glob'; +import zlib from 'zlib'; +import { existsSync, statSync, createReadStream, createWriteStream } from 'fs'; +import { pipeline } from 'stream'; +import { promisify } from 'util'; import { copy, rimraf, mkdirp } from '../../utils/filesystem.js'; import { generate_manifest } from '../generate_manifest/index.js'; @@ -25,6 +30,30 @@ export function create_builder({ config, build_data, prerendered, log }) { return true; } + const pipe = promisify(pipeline); + + /** + * @param {string} file + * @param {'gz' | 'br'} format + */ + async function compress_file(file, format = 'gz') { + const compress = + format == 'br' + ? zlib.createBrotliCompress({ + params: { + [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, + [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY, + [zlib.constants.BROTLI_PARAM_SIZE_HINT]: statSync(file).size + } + }) + : zlib.createGzip({ level: zlib.constants.Z_BEST_COMPRESSION }); + + const source = createReadStream(file); + const destination = createWriteStream(`${file}.${format}`); + + await pipe(source, compress, destination); + } + return { log, rimraf, @@ -151,6 +180,23 @@ export function create_builder({ config, build_data, prerendered, log }) { ); }, + async compress(directory) { + if (!existsSync(directory)) { + return; + } + + const files = await glob('**/*.{html,js,json,css,svg,xml,wasm}', { + cwd: directory, + dot: true, + absolute: true, + filesOnly: true + }); + + await Promise.all( + files.map((file) => Promise.all([compress_file(file, 'gz'), compress_file(file, 'br')])) + ); + }, + async prerender() { throw new Error( 'builder.prerender() has been removed. Prerendering now takes place in the build phase — see builder.prerender and builder.writePrerendered' diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 02f2d277799c..591d6104f0d4 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -80,6 +80,11 @@ export interface Builder { replace?: Record; } ): string[]; + + /** + * @param {string} directory Path to the directory containing the files to be compressed + */ + compress(directory: string): void; } export interface Config { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 355ec5a63052..c4375fde09bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,11 +125,8 @@ importers: rimraf: ^3.0.2 rollup: ^2.75.7 sirv: ^2.0.2 - tiny-glob: ^0.2.9 typescript: ^4.7.4 uvu: ^0.5.3 - dependencies: - tiny-glob: 0.2.9 devDependencies: '@rollup/plugin-json': 4.1.0_rollup@2.75.7 '@sveltejs/kit': link:../kit @@ -150,12 +147,9 @@ importers: playwright-chromium: ^1.23.4 sirv: ^2.0.2 svelte: ^3.48.0 - tiny-glob: ^0.2.9 typescript: ^4.7.4 uvu: ^0.5.3 vite: ^3.0.0 - dependencies: - tiny-glob: 0.2.9 devDependencies: '@sveltejs/kit': link:../kit '@types/node': 16.11.42 @@ -305,6 +299,7 @@ importers: '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.48.0+vite@3.0.0 chokidar: 3.5.3 sade: 1.8.1 + tiny-glob: 0.2.9 devDependencies: '@playwright/test': 1.23.4 '@rollup/plugin-replace': 4.0.0_rollup@2.75.7 @@ -331,7 +326,6 @@ importers: svelte-check: 2.8.0_svelte@3.48.0 svelte-preprocess: 4.10.7_lvfi2wesz6u4l5rfbnetbucfmm svelte2tsx: 0.5.11_lvfi2wesz6u4l5rfbnetbucfmm - tiny-glob: 0.2.9 typescript: 4.7.4 undici: 5.8.1 uvu: 0.5.4