@lunora/cli
Version:
The Lunora CLI: init, dev, deploy, codegen, run, reset, and migrate commands
101 lines (98 loc) • 3.87 kB
JavaScript
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 };