feat: add one-command local development stack

This commit is contained in:
2026-09-08 20:03:40 -04:00
parent 5916ce1ff5
commit 41efdfe041
7 changed files with 293 additions and 9 deletions
+10 -1
View File
@@ -1,4 +1,7 @@
import 'dotenv/config';
import dotenv from 'dotenv';
import { fileURLToPath } from 'node:url';
dotenv.config({ path: fileURLToPath(new URL('../../../../.env', import.meta.url)) });
import { buildApp } from './build-app.js';
import { createDatabase } from '../infrastructure/database/client.js';
@@ -55,6 +58,12 @@ async function startServer() {
const passwordResetRepository = createPasswordResetRepository(database.db);
const mfaMethodRepository = createMfaMethodRepository(database.db);
const securityAuditRepository = createSecurityAuditRepository(database.db);
const secretProtector = createSecretProtector();
const mfaService = createMfaService({
mfaMethodRepository,
secretProtector,
securityAuditRepository,
});
const passwordResetNotifier = createPasswordResetNotifier();
const authenticationService = createAuthenticationService({
mfaService,
+1 -1
View File
@@ -1,4 +1,4 @@
const apiBaseUrl = import.meta.env?.VITE_API_BASE_URL ?? 'http://localhost:3000/api/v1';
const apiBaseUrl = import.meta.env?.VITE_API_BASE_URL ?? '/api/v1';
export async function searchCatalog({ query = '', page = 1, limit = 20 } = {}) {
const params = new URLSearchParams({ query, page: String(page), limit: String(limit) });
+3 -3
View File
@@ -6,7 +6,7 @@ import { getPublicListing } from '../src/services/catalog-service.js';
test('fetches a public listing detail through the API service', async () => {
const originalFetch = globalThis.fetch;
globalThis.fetch = async (url) => {
assert.equal(url, 'http://localhost:3000/api/v1/public/listings/listing-1');
assert.equal(url, '/api/v1/public/listings/listing-1');
return { ok: true, async json() { return { data: { id: 'listing-1' } }; } };
};
@@ -20,7 +20,7 @@ test('fetches a public listing detail through the API service', async () => {
test('encodes catalog search pagination in the API request', async () => {
const originalFetch = globalThis.fetch;
globalThis.fetch = async (url) => {
assert.equal(url, 'http://localhost:3000/api/v1/public/search?query=card+set&page=3&limit=20');
assert.equal(url, '/api/v1/public/search?query=card+set&page=3&limit=20');
return { ok: true, async json() { return { data: { items: [], pagination: {} } }; } };
};
@@ -35,7 +35,7 @@ test('encodes catalog search pagination in the API request', async () => {
test('fetches a public product using its stable slug URL', async () => {
const originalFetch = globalThis.fetch;
globalThis.fetch = async (url) => {
assert.equal(url, 'http://localhost:3000/api/v1/public/products/pikachu-plush');
assert.equal(url, '/api/v1/public/products/pikachu-plush');
return { ok: true, async json() { return { data: { slug: 'pikachu-plush' } }; } };
};
+3
View File
@@ -12,5 +12,8 @@ export default defineConfig({
},
server: {
port: 5173,
proxy: {
'/api': 'http://localhost:3000',
},
},
});