Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 23 additions & 20 deletions packages/cli/src/actions/proxy.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { ZModelCodeGenerator } from '@zenstackhq/language';
import { isDataSource } from '@zenstackhq/language/ast';
import {
ConfigExpr,
InvocationExpr,
isDataSource,
isInvocationExpr,
isLiteralExpr,
LiteralExpr,
} from '@zenstackhq/language/ast';
import { getStringLiteral } from '@zenstackhq/language/utils';
import { ZenStackClient, type ClientContract } from '@zenstackhq/orm';
import { MysqlDialect } from '@zenstackhq/orm/dialects/mysql';
Expand Down Expand Up @@ -28,6 +34,10 @@ type Options = {
};

export async function run(options: Options) {
const allowedLogLevels = ['error', 'query'] as const;
const log = options.logLevel?.filter((level): level is (typeof allowedLogLevels)[number] =>
allowedLogLevels.includes(level as any),
);
Comment thread
jiashengguo marked this conversation as resolved.
const schemaFile = getSchemaFile(options.schema);
console.log(colors.gray(`Loading ZModel schema from: ${schemaFile}`));

Expand All @@ -46,16 +56,12 @@ export async function run(options: Options) {

if (!databaseUrl) {
const schemaUrl = dataSource?.fields.find((f) => f.name === 'url')?.value;

if (!schemaUrl) {
throw new CliError(
`The schema's "datasource" does not have a "url" field, please provide it with -d option.`,
);
}
const zModelGenerator = new ZModelCodeGenerator();
const url = zModelGenerator.generate(schemaUrl);

databaseUrl = evaluateUrl(url);
databaseUrl = evaluateUrl(schemaUrl);
}

const provider = getStringLiteral(dataSource?.fields.find((f) => f.name === 'provider')?.value)!;
Expand All @@ -66,11 +72,6 @@ export async function run(options: Options) {

const schemaModule = (await jiti.import(path.join(outputPath, 'schema'))) as any;

const allowedLogLevels = ['error', 'query'] as const;
const log = options.logLevel?.filter((level): level is (typeof allowedLogLevels)[number] =>
allowedLogLevels.includes(level as any),
);

const db = new ZenStackClient(schemaModule.schema, {
dialect: dialect,
log: log && log.length > 0 ? log : undefined,
Expand All @@ -86,18 +87,20 @@ export async function run(options: Options) {
startServer(db, schemaModule.schema, options);
}

function evaluateUrl(value: string): string {
// Check if it's an env() function call
const envMatch = value.trim().match(/^env\s*\(\s*['"]([^'"]+)['"]\s*\)$/);
if (envMatch) {
const varName = envMatch[1];
const envValue = process.env[varName!];
function evaluateUrl(schemaUrl: ConfigExpr) {
if (isLiteralExpr(schemaUrl)) {
// Handle string literal
return getStringLiteral(schemaUrl);
} else if (isInvocationExpr(schemaUrl)) {
const envFunction = schemaUrl as InvocationExpr;
const envName = getStringLiteral(envFunction.args[0]?.value as LiteralExpr)!;
const envValue = process.env[envName];
if (!envValue) {
throw new CliError(`Environment variable ${varName} is not set`);
throw new CliError(`Environment variable ${envName} is not set`);
}
return envValue;
} else {
return value;
throw new CliError(`Unable to resolve the "url" field value.`);
}
}
Comment thread
jiashengguo marked this conversation as resolved.

Expand Down