UNPKG

@envkit/nextjs

Version:

Environment variable management for Next.js applications

143 lines 6.71 kB
"use strict"; /** * EnvKit API handler for Next.js * Provides a unified API handler that can be easily imported in Next.js route handlers */ 'use server'; Object.defineProperty(exports, "__esModule", { value: true }); exports.createEnvApiHandler = void 0; const server_1 = require("next/server"); const server_2 = require("../server"); /** * Creates an API handler factory for Next.js * This allows easy setup of the API routes for EnvKit in Next.js applications */ const createEnvApiHandler = (options = {}) => { const createResponse = (data, statusCode) => { const response = server_1.NextResponse.json(data, { status: statusCode }); // Add CORS headers response.headers.set('Access-Control-Allow-Origin', '*'); response.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); response.headers.set('Access-Control-Allow-Headers', 'Content-Type'); return response; }; const factory = { createStatusHandler: (handlerOptions = {}) => { return async (request) => { // Check production access if (process.env.NODE_ENV === 'production' && !options.allowInProduction) { return createResponse({ error: 'Not available in production' }, 404); } let requiredVars = []; let currentEnv = process.env.NODE_ENV || 'development'; // Check cookies for required vars const cookieHeader = request.headers.get('cookie'); if (cookieHeader) { const cookieItems = cookieHeader.split(';').map(item => item.trim()); const envkitCookie = cookieItems.find(item => item.startsWith('__ENVKIT_REQUIRED_VARS__=')); if (envkitCookie) { try { requiredVars = JSON.parse(decodeURIComponent(envkitCookie.split('=')[1])); } catch (e) { console.warn('Failed to parse required vars from cookie:', e); } } } // If requiredVars is still empty, check environment-specific config if (requiredVars.length === 0 && options.environments && options.environments[currentEnv]) { requiredVars = options.environments[currentEnv].requiredVars || []; } // If still empty, fall back to legacy requiredVars if (requiredVars.length === 0 && options.requiredVars) { requiredVars = options.requiredVars; } // Load env vars const env = await (0, server_2.loadEnvVars)({ ...options, ...handlerOptions }); // Check for missing variables const missingVars = requiredVars.filter(key => !env[key]); // Return status return createResponse({ success: missingVars.length === 0, missingVars, environment: currentEnv }, 200); }; }, createUpdateHandler: (handlerOptions = {}) => { return async (request) => { // Check production access if (process.env.NODE_ENV === 'production' && !options.allowInProduction) { return createResponse({ error: 'Not available in production' }, 404); } // Parse request body let body; let targetEnv; try { const requestData = await request.json(); // Check if the request includes a target environment if (requestData._targetEnv) { targetEnv = requestData._targetEnv; // Remove the _targetEnv property from the body const { _targetEnv, ...envVars } = requestData; body = envVars; } else { body = requestData; } } catch (error) { return createResponse({ error: 'Invalid request body. Expected JSON object.' }, 400); } // Write env vars try { const currentEnv = targetEnv || process.env.NODE_ENV || 'development'; let targetEnvFile = '.env.local'; // Check if we have environment-specific configuration if (options.environments && options.environments[currentEnv] && options.environments[currentEnv].targetEnvFile) { targetEnvFile = options.environments[currentEnv].targetEnvFile; } // Get the raw result from writeEnvVars const rawResult = await (0, server_2.writeEnvVars)(body, { ...options, ...handlerOptions, targetEnvFile }); // Convert to the expected format const result = { success: true, // If we got here without an error, consider it successful path: rawResult.path, // Map any potential error error: undefined }; // Call onUpdate if provided if (options.onUpdate) { await options.onUpdate(body); } // Return response with properties that match WriteEnvResult return createResponse({ success: result.success, path: result.path, environment: currentEnv, error: result.error }, 200); } catch (error) { return createResponse({ error: error instanceof Error ? error.message : 'Failed to update environment variables' }, 500); } }; } }; // Return the handlers with the correct names for Next.js App Router return { statusHandler: factory.createStatusHandler(options), updateHandler: factory.createUpdateHandler(options) }; }; exports.createEnvApiHandler = createEnvApiHandler; exports.default = exports.createEnvApiHandler; //# sourceMappingURL=createEnvApiHandler.js.map