UNPKG

@lunora/cli

Version:

The Lunora CLI: init, dev, deploy, codegen, run, reset, and migrate commands

101 lines (98 loc) 3.87 kB
import { runCodegen } from '@lunora/codegen'; import { validateWranglerProject, inferLunoraBindings, reconcileWranglerBindings, reconcileWranglerCompatibilityDate, reconcileWranglerCrons } from '@lunora/config'; import { p as parseApiSpec } from '../packem_shared/api-spec-Bx0iKbxA.mjs'; import { r as renderCodegenFailure } from '../packem_shared/codegen-error-DJG-ghs_.mjs'; import { d as defineHandler } from '../packem_shared/command-lYnl4QyF.mjs'; import { r as runSchemaDriftGate } from '../packem_shared/schema-drift-gate-BtBt0as0.mjs'; const provisionBindings = async (cwd, logger, cronTriggers = []) => { try { const inferred = await inferLunoraBindings({ projectRoot: cwd }); const reconciled = reconcileWranglerBindings(cwd, inferred); if (reconciled.changed) { logger.success(`provisioned bindings: ${reconciled.added.join(", ")}${reconciled.wranglerPath ?? "wrangler.jsonc"}`); } for (const warning of reconciled.warnings) { logger.warn(warning); } } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.warn(`binding inference skipped: ${message}`); } try { const reconciled = reconcileWranglerCompatibilityDate(cwd); if (reconciled.changed) { logger.success( `bumped compatibility_date to ${reconciled.date ?? "unknown"} (Workers Cache enabled) → ${reconciled.wranglerPath ?? "wrangler.jsonc"}` ); } } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.warn(`compatibility date sync skipped: ${message}`); } try { const reconciled = reconcileWranglerCrons(cwd, cronTriggers); if (reconciled.changed) { logger.success(`synced ${String(cronTriggers.length)} cron trigger(s) → ${reconciled.wranglerPath ?? "wrangler.jsonc"}`); } } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.warn(`cron trigger sync skipped: ${message}`); } }; const runPrepareCommand = async (options) => { const cwd = options.cwd ?? process.cwd(); options.logger.info("running codegen"); let codegen; try { codegen = runCodegen({ apiSpec: options.apiSpec, projectRoot: cwd }); options.logger.success("codegen complete"); } catch (error) { const message = error instanceof Error ? error.message : String(error); options.logger.error(renderCodegenFailure(error)); return { code: 1, error: `codegen failed: ${message}`, validation: { problems: [], wranglerPath: void 0 } }; } const gate = runSchemaDriftGate({ allowDrift: options.allowSchemaDrift === true, codegen, logger: options.logger, updateBaseline: options.updateSchemaBaseline === true }); if (gate.blocked) { return { code: 1, error: "schema drift gate blocked prepare", schemaDrift: { blocked: true, reason: gate.reason }, validation: { problems: [], wranglerPath: void 0 } }; } await provisionBindings(cwd, options.logger, codegen.cronTriggers); const validation = validateWranglerProject({ projectRoot: cwd }); if (validation.problems.length > 0) { options.logger.error("wrangler.jsonc validation failed:"); for (const problem of validation.problems) { options.logger.error(` - ${problem}`); } return { code: 1, error: "wrangler validation failed", validation }; } gate.rebless?.(); options.logger.success("project is ready to deploy"); return { code: 0, validation }; }; const execute = defineHandler( ({ cwd, logger, options }) => runPrepareCommand({ allowSchemaDrift: options.allowSchemaDrift === true, apiSpec: parseApiSpec(options.apiSpec), cwd, logger, updateSchemaBaseline: options.updateSchemaBaseline === true }) ); export { execute, runPrepareCommand };