diff --git a/package.json b/package.json
index 6136ef39df..ea8e9f0e63 100644
--- a/package.json
+++ b/package.json
@@ -48,8 +48,8 @@
"lodash": "4.17.21"
},
"dependencies": {
- "execa": "8.0.1",
"cssnano": "6.0.3",
+ "execa": "8.0.1",
"js-yaml": "4.1.0",
"postcss": "8.4.33",
"terser": "5.27.0",
@@ -61,8 +61,10 @@
"cross-env": "7.0.3",
"cypress": "13.6.3",
"eslint": "8.56.0",
+ "fast-glob": "3.3.2",
+ "ncp": "2.0.0",
"start-server-and-test": "2.0.3",
- "ncp": "2.0.0"
+ "tar": "6.2.0"
},
"optionalDependencies": {
"@tensorflow/tfjs-core": "4.4.0"
diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts
index 8e1a89d55f..a5094e6a86 100644
--- a/packages/backend/src/server/web/ClientServerService.ts
+++ b/packages/backend/src/server/web/ClientServerService.ts
@@ -51,6 +51,7 @@ const clientAssets = `${_dirname}/../../../../frontend/assets/`;
const assets = `${_dirname}/../../../../../built/_frontend_dist_/`;
const swAssets = `${_dirname}/../../../../../built/_sw_dist_/`;
const viteOut = `${_dirname}/../../../../../built/_vite_/`;
+const tarball = `${_dirname}/../../../../../built/tarball/`;
@Injectable()
export class ClientServerService {
@@ -291,6 +292,13 @@ export class ClientServerService {
decorateReply: false,
});
+ fastify.register(fastifyStatic, {
+ root: tarball,
+ prefix: '/tarball/',
+ immutable: true,
+ decorateReply: false,
+ });
+
fastify.get('/favicon.ico', async (request, reply) => {
return reply.sendFile('/favicon.ico', staticAssets);
});
diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue
index 69cb6ef647..8e5fcda283 100644
--- a/packages/frontend/src/pages/about.vue
+++ b/packages/frontend/src/pages/about.vue
@@ -86,6 +86,7 @@ SPDX-License-Identifier: AGPL-3.0-only
nodeinfo
robots.txt
manifest.json
+ source code
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 640713067f..d3e0b2b913 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -50,12 +50,18 @@ importers:
eslint:
specifier: 8.56.0
version: 8.56.0
+ fast-glob:
+ specifier: 3.3.2
+ version: 3.3.2
ncp:
specifier: 2.0.0
version: 2.0.0
start-server-and-test:
specifier: 2.0.3
version: 2.0.3
+ tar:
+ specifier: 6.2.0
+ version: 6.2.0
packages/backend:
dependencies:
@@ -15456,7 +15462,6 @@ packages:
/minipass@5.0.0:
resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
engines: {node: '>=8'}
- dev: false
/minipass@7.0.4:
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
@@ -19095,6 +19100,18 @@ packages:
mkdirp: 1.0.4
yallist: 4.0.0
+ /tar@6.2.0:
+ resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+ dev: true
+
/taskkill@5.0.0:
resolution: {integrity: sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==}
engines: {node: '>=14.16'}
diff --git a/scripts/tarball.mjs b/scripts/tarball.mjs
new file mode 100644
index 0000000000..2652a182f5
--- /dev/null
+++ b/scripts/tarball.mjs
@@ -0,0 +1,42 @@
+import { createWriteStream } from 'node:fs';
+import { mkdir } from 'node:fs/promises';
+import { resolve } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import glob from 'fast-glob';
+import Pack from 'tar/lib/pack.js';
+import meta from '../package.json' assert { type: "json" };
+
+const cwd = fileURLToPath(new URL('..', import.meta.url));
+const mkdirPromise = mkdir(resolve(cwd, 'built', 'tarball'), { recursive: true });
+const patterns = [
+ '{assets,fluent-emojis,locales,misskey-assets}/**/*',
+ 'packages/.config/example.yml',
+ 'packages/{backend,frontend,misskey-bubble-game,misskey-js,misskey-js/generator,misskey-reversi,sw}/{src/**/*,.swcrc,*}',
+ 'packages/backend/{assets,migration,nsfw-model}/**/*',
+ 'packages/frontend/{.storybook,@types,assets,lib,public}/**/*',
+ '!packages/frontend/.storybook/{locale.ts,themes.ts,*.js}',
+ '!packages/misskey-js/CONTRIBUTING.md',
+ 'packages/meta.json',
+ 'scripts/{changelog-checker/{src/**/*,*},*}',
+ '.node-version',
+ '.npmrc',
+ 'CHANGELOD.md',
+ 'COPYING',
+ 'LICENSE',
+ 'README.md',
+ 'SECURITY.md',
+ 'package.json',
+ 'pnpm-lock.yaml',
+ 'pnpm-workspace.yaml',
+];
+const pack = new Pack({ cwd, gzip: true });
+
+for await (const entry of glob.stream(patterns)) {
+ pack.add(entry);
+}
+
+pack.end();
+
+await mkdirPromise;
+
+pack.pipe(createWriteStream(resolve(cwd, 'built', 'tarball', `misskey-${meta.version}.tar.gz`)));