feat: tsup, small fixes

This commit is contained in:
diced 2023-01-06 14:45:48 -08:00
parent b8b1a5bba6
commit eef6fdaeb3
No known key found for this signature in database
GPG key ID: 370BD1BA142842D1
28 changed files with 967 additions and 597 deletions

File diff suppressed because one or more lines are too long

View file

@ -6,4 +6,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools" spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-3.2.4.cjs yarnPath: .yarn/releases/yarn-3.3.1.cjs

View file

@ -62,4 +62,4 @@ COPY --from=builder /build/tsconfig.json ./tsconfig.json
COPY --from=builder /build/package.json ./package.json COPY --from=builder /build/package.json ./package.json
COPY --from=builder /build/mimes.json ./mimes.json COPY --from=builder /build/mimes.json ./mimes.json
CMD ["node", "--enable-source-maps", "dist/server"] CMD ["node", "--enable-source-maps", "dist"]

View file

@ -1,23 +0,0 @@
const esbuild = require('esbuild');
const { existsSync } = require('fs');
const { rm } = require('fs/promises');
const { recursiveReadDir } = require('next/dist/lib/recursive-readdir');
(async () => {
if (existsSync('./dist')) {
await rm('./dist', { recursive: true });
}
const entryPoints = await recursiveReadDir('./src', /.*\.(ts)$/, /(themes|queries|pages)/);
await esbuild.build({
tsconfig: 'tsconfig.json',
outdir: 'dist',
platform: 'node',
entryPoints,
format: 'cjs',
resolveExtensions: ['.ts', '.js'],
write: true,
sourcemap: true,
});
})();

View file

@ -4,15 +4,15 @@
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"dev": "npm-run-all build:server dev:run", "dev": "npm-run-all build:server dev:run",
"dev:run": "cross-env DEBUG=true REACT_EDITOR=code NODE_ENV=development RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false node --enable-source-maps dist/server", "dev:run": "cross-env DEBUG=true REACT_EDITOR=code NODE_ENV=development RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false node --enable-source-maps dist",
"build": "npm-run-all build:server build:schema build:next", "build": "npm-run-all build:server build:schema build:next",
"build-ci": "cross-env ZIPLINE_DOCKER_BUILD=1 npm-run-all build:server build:schema build:next", "build-ci": "cross-env ZIPLINE_DOCKER_BUILD=1 npm-run-all build:server build:schema build:next",
"build:server": "node esbuild.config.js", "build:server": "tsup",
"build:next": "next build", "build:next": "next build",
"build:schema": "prisma generate --schema=prisma/schema.prisma", "build:schema": "prisma generate --schema=prisma/schema.prisma",
"format": "prettier --write ./src/**/*.{ts,tsx} ./*.{md,js,json,yml}", "format": "prettier --write ./src/**/*.{ts,tsx} ./*.{md,js,json,yml}",
"migrate:dev": "prisma migrate dev --create-only", "migrate:dev": "prisma migrate dev --create-only",
"start": "node dist/server", "start": "node dist",
"lint": "next lint", "lint": "next lint",
"docker:run": "docker-compose up -d", "docker:run": "docker-compose up -d",
"docker:down": "docker-compose down", "docker:down": "docker-compose down",
@ -82,13 +82,13 @@
"@types/react": "^18.0.26", "@types/react": "^18.0.26",
"@types/sharp": "^0.31.0", "@types/sharp": "^0.31.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"esbuild": "^0.16.4",
"eslint": "^8.29.0", "eslint": "^8.29.0",
"eslint-config-next": "^13.0.6", "eslint-config-next": "^13.0.6",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.1", "eslint-plugin-prettier": "^4.2.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prettier": "^2.8.1", "prettier": "^2.8.1",
"tsup": "^6.5.0",
"typescript": "^4.9.4" "typescript": "^4.9.4"
}, },
"repository": { "repository": {

View file

@ -1,6 +1,6 @@
import { Config } from './config/Config'; import { Config } from 'config/Config';
import readConfig from './config/readConfig'; import readConfig from 'config/readConfig';
import validateConfig from './config/validateConfig'; import validateConfig from 'config/validateConfig';
if (!global.config) global.config = validateConfig(readConfig()); if (!global.config) global.config = validateConfig(readConfig());

View file

@ -2,8 +2,8 @@ import { parse } from 'dotenv';
import { expand } from 'dotenv-expand'; import { expand } from 'dotenv-expand';
import { existsSync, readFileSync } from 'fs'; import { existsSync, readFileSync } from 'fs';
import { resolve } from 'path'; import { resolve } from 'path';
import Logger from '../logger'; import Logger from 'lib/logger';
import { humanToBytes } from '../utils/bytes'; import { humanToBytes } from 'utils/bytes';
export type ValueType = 'string' | 'number' | 'boolean' | 'array' | 'json-array' | 'human-to-byte' | 'path'; export type ValueType = 'string' | 'number' | 'boolean' | 'array' | 'json-array' | 'human-to-byte' | 'path';

View file

@ -1,8 +1,8 @@
import { s } from '@sapphire/shapeshift'; import { s } from '@sapphire/shapeshift';
import type { Config } from './Config'; import type { Config } from './Config';
import { inspect } from 'util'; import { inspect } from 'util';
import Logger from '../logger'; import Logger from 'lib/logger';
import { humanToBytes } from '../utils/bytes'; import { humanToBytes } from 'utils/bytes';
const discord_content = s const discord_content = s
.object({ .object({

View file

@ -1,7 +1,7 @@
import { Datasource } from '.'; import { Datasource } from '.';
import { ConfigSupabaseDatasource } from 'lib/config/Config'; import { ConfigSupabaseDatasource } from 'lib/config/Config';
import { guess } from '../mimes'; import { guess } from 'lib/mimes';
import Logger from '../logger'; import Logger from 'lib/logger';
import { Readable } from 'stream'; import { Readable } from 'stream';
export class Supabase extends Datasource { export class Supabase extends Datasource {

View file

@ -1,8 +1,8 @@
import { Image, Url, User } from '@prisma/client'; import { Image, Url, User } from '@prisma/client';
import config from 'lib/config'; import config from 'lib/config';
import { ConfigDiscordContent } from 'lib/config/Config'; import { ConfigDiscordContent } from 'config/Config';
import Logger from './logger'; import Logger from 'lib/logger';
import { parseString, ParseValue } from './utils/parser'; import { parseString, ParseValue } from 'utils/parser';
const logger = Logger.get('discord'); const logger = Logger.get('discord');

View file

@ -1,10 +1,10 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { readdir, readFile } from 'fs/promises'; import { readdir, readFile } from 'fs/promises';
import { join } from 'path'; import { join } from 'path';
import config from '../lib/config'; import config from 'lib/config';
import datasource from '../lib/datasource'; import datasource from 'lib/datasource';
import { guess } from '../lib/mimes'; import { guess } from 'lib/mimes';
import { migrations } from '../server/util'; import { migrations } from 'server/util';
async function main() { async function main() {
const directory = process.argv[2]; const directory = process.argv[2];

View file

@ -1,6 +1,6 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import config from '../lib/config'; import config from 'lib/config';
import { migrations } from '../server/util'; import { migrations } from 'server/util';
async function main() { async function main() {
const extras = (process.argv[2] ?? '').split(','); const extras = (process.argv[2] ?? '').split(',');

View file

@ -1,3 +1,3 @@
import config from '../lib/config'; import config from 'lib/config';
console.log(JSON.stringify(config, null, 2)); console.log(JSON.stringify(config, null, 2));

View file

@ -1,7 +1,7 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { hash } from 'argon2'; import { hash } from 'argon2';
import config from '../lib/config'; import config from 'lib/config';
import { migrations } from '../server/util'; import { migrations } from 'server/util';
const SUPPORTED_FIELDS = [ const SUPPORTED_FIELDS = [
'username', 'username',

View file

@ -1,7 +1,7 @@
import { Image } from '@prisma/client'; import { Image } from '@prisma/client';
import { FastifyInstance, FastifyReply } from 'fastify'; import { FastifyInstance, FastifyReply } from 'fastify';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';
import exts from '../../lib/exts'; import exts from 'lib/exts';
function dbFileDecorator(fastify: FastifyInstance, _, done) { function dbFileDecorator(fastify: FastifyInstance, _, done) {
fastify.decorateReply('dbFile', dbFile); fastify.decorateReply('dbFile', dbFile);

View file

@ -1,5 +1,5 @@
import { FastifyInstance, FastifyReply } from 'fastify'; import { FastifyInstance, FastifyReply } from 'fastify';
import { guess } from '../../lib/mimes'; import { guess } from 'lib/mimes';
import { extname } from 'path'; import { extname } from 'path';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';

View file

@ -1,10 +1,10 @@
import config from 'lib/config';
import datasource from 'lib/datasource';
import Logger from 'lib/logger';
import { version } from '../../package.json'; import { version } from '../../package.json';
import config from '../lib/config'; import { getStats } from 'server/util';
import datasource from '../lib/datasource';
import Logger from '../lib/logger';
import { getStats } from './util';
import fastify, { FastifyInstance, FastifyRequest, FastifyServerOptions } from 'fastify'; import fastify, { FastifyInstance, FastifyServerOptions } from 'fastify';
import { createReadStream, existsSync, readFileSync } from 'fs'; import { createReadStream, existsSync, readFileSync } from 'fs';
import dbFileDecorator from './decorators/dbFile'; import dbFileDecorator from './decorators/dbFile';
import notFound from './decorators/notFound'; import notFound from './decorators/notFound';
@ -12,6 +12,7 @@ import postFileDecorator from './decorators/postFile';
import postUrlDecorator from './decorators/postUrl'; import postUrlDecorator from './decorators/postUrl';
import preFileDecorator from './decorators/preFile'; import preFileDecorator from './decorators/preFile';
import rawFileDecorator from './decorators/rawFile'; import rawFileDecorator from './decorators/rawFile';
import allPlugin from './plugins/all';
import configPlugin from './plugins/config'; import configPlugin from './plugins/config';
import datasourcePlugin from './plugins/datasource'; import datasourcePlugin from './plugins/datasource';
import loggerPlugin from './plugins/logger'; import loggerPlugin from './plugins/logger';
@ -20,7 +21,6 @@ import prismaPlugin from './plugins/prisma';
import rawRoute from './routes/raw'; import rawRoute from './routes/raw';
import uploadsRoute, { uploadsRouteOnResponse } from './routes/uploads'; import uploadsRoute, { uploadsRouteOnResponse } from './routes/uploads';
import urlsRoute, { urlsRouteOnResponse } from './routes/urls'; import urlsRoute, { urlsRouteOnResponse } from './routes/urls';
import { IncomingMessage } from 'http';
const dev = process.env.NODE_ENV === 'development'; const dev = process.env.NODE_ENV === 'development';
const logger = Logger.get('server'); const logger = Logger.get('server');
@ -50,7 +50,8 @@ async function start() {
quiet: !dev, quiet: !dev,
hostname: config.core.host, hostname: config.core.host,
port: config.core.port, port: config.core.port,
}); })
.register(allPlugin);
// decorators // decorators
server server
@ -151,26 +152,6 @@ async function start() {
server.get('/r/:id', rawRoute.bind(server)); server.get('/r/:id', rawRoute.bind(server));
server.get('/', (_, reply) => reply.redirect('/dashboard')); server.get('/', (_, reply) => reply.redirect('/dashboard'));
// initialize next routes after all other routes have been registered so theres no overlap
server.after(() => {
// overrides fastify's default parser so that next.js can handle the request
// in the future Zipline's api will probably be entirely handled by fastify
async function parser(_: FastifyRequest, payload: IncomingMessage) {
return payload;
}
server.addContentTypeParser('text/plain', parser);
server.addContentTypeParser('application/json', parser);
server.addContentTypeParser('multipart/form-data', parser);
server.next('/*', { method: 'ALL' });
server.next('/api/*', { method: 'ALL' });
});
// server.setDefaultRoute((req, res) => {
// server.nextHandle(req, res);
// });
await server.listen({ await server.listen({
port: config.core.port, port: config.core.port,
host: config.core.host ?? '0.0.0.0', host: config.core.host ?? '0.0.0.0',

26
src/server/plugins/all.ts Normal file
View file

@ -0,0 +1,26 @@
import { FastifyInstance, FastifyRequest } from 'fastify';
import fastifyPlugin from 'fastify-plugin';
import { IncomingMessage } from 'http';
function allRoutes(fastify: FastifyInstance, _: unknown, done: () => void) {
// overrides fastify's default parser so that next.js can handle the request
// in the future Zipline's api will probably be entirely handled by fastify
async function parser(_: FastifyRequest, payload: IncomingMessage) {
return payload;
}
fastify.addContentTypeParser('text/plain', parser);
fastify.addContentTypeParser('application/json', parser);
fastify.addContentTypeParser('multipart/form-data', parser);
fastify.next('/*', { method: 'ALL' });
fastify.next('/api/*', { method: 'ALL' });
done();
}
export default fastifyPlugin(allRoutes, {
name: 'all',
fastify: '4.x',
dependencies: ['config', 'logger', 'prisma', 'next'],
});

View file

@ -1,7 +1,7 @@
import { FastifyInstance } from 'fastify'; import { FastifyInstance } from 'fastify';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';
import { mkdir } from 'fs/promises'; import { mkdir } from 'fs/promises';
import type { Config } from '../../lib/config/Config'; import type { Config } from 'lib/config/Config';
async function configPlugin(fastify: FastifyInstance, config: Config) { async function configPlugin(fastify: FastifyInstance, config: Config) {
fastify.decorate('config', config); fastify.decorate('config', config);

View file

@ -1,6 +1,6 @@
import { FastifyInstance } from 'fastify'; import { FastifyInstance } from 'fastify';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';
import type { Datasource } from '../../lib/datasources'; import type { Datasource } from 'lib/datasources';
function datasourcePlugin(fastify: FastifyInstance, datasource: Datasource, done: () => void) { function datasourcePlugin(fastify: FastifyInstance, datasource: Datasource, done: () => void) {
fastify.decorate('datasource', datasource); fastify.decorate('datasource', datasource);

View file

@ -1,6 +1,6 @@
import { FastifyInstance } from 'fastify'; import { FastifyInstance } from 'fastify';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';
import Logger from '../../lib/logger'; import Logger from 'lib/logger';
function loggerPlugin(fastify: FastifyInstance, _: unknown, done: () => void) { function loggerPlugin(fastify: FastifyInstance, _: unknown, done: () => void) {
fastify.decorate('logger', Logger.get('server')); fastify.decorate('logger', Logger.get('server'));

View file

@ -8,13 +8,13 @@ async function nextPlugin(fastify: FastifyInstance, options: NextServerOptions)
const nextServer = next(options); const nextServer = next(options);
const handle = nextServer.getRequestHandler(); const handle = nextServer.getRequestHandler();
await nextServer.prepare();
fastify fastify
.decorate('nextServer', nextServer) .decorate('nextServer', nextServer)
.decorate('nextHandle', handle) .decorate('nextHandle', handle)
.decorate('next', route.bind(fastify)); .decorate('next', route.bind(fastify));
return nextServer.prepare();
function route(path, opts: any = { method: 'GET' }) { function route(path, opts: any = { method: 'GET' }) {
if (typeof opts.method === 'string') this[opts.method.toLowerCase()](path, opts, handler); if (typeof opts.method === 'string') this[opts.method.toLowerCase()](path, opts, handler);
else if (Array.isArray(opts.method)) { else if (Array.isArray(opts.method)) {
@ -31,8 +31,6 @@ async function nextPlugin(fastify: FastifyInstance, options: NextServerOptions)
reply.hijack(); reply.hijack();
} }
} }
return;
} }
export default fastifyPlugin(nextPlugin, { export default fastifyPlugin(nextPlugin, {

View file

@ -1,7 +1,7 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { FastifyInstance } from 'fastify'; import { FastifyInstance } from 'fastify';
import fastifyPlugin from 'fastify-plugin'; import fastifyPlugin from 'fastify-plugin';
import { migrations } from '../util'; import { migrations } from 'server/util';
async function prismaPlugin(fastify: FastifyInstance, _, done) { async function prismaPlugin(fastify: FastifyInstance, _, done) {
process.env.DATABASE_URL = fastify.config.core?.database_url; process.env.DATABASE_URL = fastify.config.core?.database_url;

View file

@ -2,9 +2,9 @@ import { PrismaClient } from '@prisma/client';
import { Migrate } from '@prisma/migrate/dist/Migrate'; import { Migrate } from '@prisma/migrate/dist/Migrate';
import { ensureDatabaseExists } from '@prisma/migrate/dist/utils/ensureDatabaseExists'; import { ensureDatabaseExists } from '@prisma/migrate/dist/utils/ensureDatabaseExists';
import { ServerResponse } from 'http'; import { ServerResponse } from 'http';
import { Datasource } from '../lib/datasources'; import { Datasource } from 'lib/datasources';
import Logger from '../lib/logger'; import Logger from 'lib/logger';
import { bytesToHuman } from '../lib/utils/bytes'; import { bytesToHuman } from 'lib/utils/bytes';
export async function migrations() { export async function migrations() {
const logger = Logger.get('database::migrations'); const logger = Logger.get('database::migrations');

View file

@ -19,7 +19,9 @@
"components/*": ["components/*"], "components/*": ["components/*"],
"hooks/*": ["lib/hooks/*"], "hooks/*": ["lib/hooks/*"],
"middleware/*": ["lib/middleware/*"], "middleware/*": ["lib/middleware/*"],
"lib/*": ["lib/*"] "lib/*": ["lib/*"],
"config/*": ["lib/config/*"],
"utils/*": ["lib/utils/*"]
}, },
"incremental": true "incremental": true
}, },

37
tsup.config.ts Normal file
View file

@ -0,0 +1,37 @@
import { defineConfig, Options } from 'tsup';
const opts: Options = {
platform: 'node',
format: ['cjs'],
treeshake: true,
clean: true,
sourcemap: true,
};
export default defineConfig([
{
entryPoints: ['src/server/index.ts'],
...opts,
},
// scripts
{
entryPoints: ['src/scripts/import-dir.ts'],
outDir: 'dist/scripts',
...opts,
},
{
entryPoints: ['src/scripts/list-users.ts'],
outDir: 'dist/scripts',
...opts,
},
{
entryPoints: ['src/scripts/read-config.ts'],
outDir: 'dist/scripts',
...opts,
},
{
entryPoints: ['src/scripts/set-user.ts'],
outDir: 'dist/scripts',
...opts,
},
]);

759
yarn.lock

File diff suppressed because it is too large Load diff

4
zip-env.d.ts vendored
View file

@ -7,11 +7,11 @@ declare global {
interface Global { interface Global {
prisma: PrismaClient; prisma: PrismaClient;
config: Config; config: Config;
datasource: Datasource datasource: Datasource;
} }
interface ProcessEnv { interface ProcessEnv {
ZIPLINE_DOCKER_BUILD: string | '1'; ZIPLINE_DOCKER_BUILD: string | '1';
} }
} }
} }