Skip to content

Commit af3043d

Browse files
committed
feat: make all format options configurable
1 parent fb1dd26 commit af3043d

File tree

4 files changed

+43
-26
lines changed

4 files changed

+43
-26
lines changed

packages/cli/src/actions/db.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ type PushOptions = {
1717

1818
export type PullOptions = {
1919
schema?: string;
20-
out?: string;
21-
naming?: 'pascal' | 'camel' | 'snake' | 'kebab' | 'none';
22-
alwaysMap?: boolean;
2320
excludeSchemas?: string[];
21+
out?: string;
22+
modelCasing: 'pascal' | 'camel' | 'snake' | 'kebab' | 'none';
23+
fieldCasing: 'pascal' | 'camel' | 'snake' | 'kebab' | 'none';
24+
alwaysMap: boolean;
25+
quote: 'single' | 'double';
26+
indent: number;
2427
};
2528

2629
/**
@@ -281,9 +284,8 @@ async function runPull(options: PullOptions) {
281284
}
282285

283286
const generator = new ZModelCodeGenerator({
284-
//TODO: make configurable
285-
quote: 'double',
286-
indent: 2,
287+
quote: options.quote,
288+
indent: options.indent,
287289
});
288290

289291
if (options.out) {

packages/cli/src/actions/pull/index.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { ZModelServices } from '@zenstackhq/language';
22
import { Attribute, isEnum, type DataField, type DataModel, type Enum, type Model } from '@zenstackhq/language/ast';
33
import {
4-
DataFieldAttributeFactory,
5-
DataFieldFactory,
6-
DataModelFactory,
7-
EnumFactory
4+
DataFieldAttributeFactory,
5+
DataFieldFactory,
6+
DataModelFactory,
7+
EnumFactory,
88
} from '@zenstackhq/language/factory';
99
import type { PullOptions } from '../db';
1010
import type { Cascade, IntrospectedEnum, IntrospectedTable, IntrospectionProvider } from './provider';
@@ -22,21 +22,21 @@ export function syncEnums({
2222
options: PullOptions;
2323
}) {
2424
for (const dbEnum of dbEnums) {
25-
const { modified, name } = resolveNameCasing(options, dbEnum.enum_type);
25+
const { modified, name } = resolveNameCasing(options.modelCasing, dbEnum.enum_type);
2626
if (modified) console.log(`Mapping enum ${dbEnum.enum_type} to ${name}`);
2727
const factory = new EnumFactory().setName(name);
28-
if (modified)
28+
if (modified || options.alwaysMap)
2929
factory.addAttribute((builder) =>
3030
builder
3131
.setDecl(getAttributeRef('@@map', services))
3232
.addArg((argBuilder) => argBuilder.StringLiteral.setValue(dbEnum.enum_type)),
3333
);
3434

3535
dbEnum.values.forEach((v) => {
36-
const { name, modified } = resolveNameCasing(options, v);
36+
const { name, modified } = resolveNameCasing(options.fieldCasing, v);
3737
factory.addField((builder) => {
3838
builder.setName(name);
39-
if (modified)
39+
if (modified || options.alwaysMap)
4040
builder.addAttribute((builder) =>
4141
builder
4242
.setDecl(getAttributeRef('@map', services))
@@ -64,10 +64,11 @@ export function syncEnums({
6464
}
6565
}
6666

67-
function resolveNameCasing(options: PullOptions, originalName: string) {
67+
function resolveNameCasing(casing: 'pascal' | 'camel' | 'snake' | 'kebab' | 'none', originalName: string) {
6868
let name = originalName;
69+
const fieldPrefix = /[0-9]/g.test(name.charAt(0)) ? '_' : '';
6970

70-
switch (options.naming) {
71+
switch (casing) {
7172
case 'pascal':
7273
name = toPascalCase(originalName);
7374
break;
@@ -83,8 +84,8 @@ function resolveNameCasing(options: PullOptions, originalName: string) {
8384
}
8485

8586
return {
86-
modified: options.alwaysMap ? true : name !== originalName,
87-
name,
87+
modified: name !== originalName || fieldPrefix !== '',
88+
name: `${fieldPrefix}${name}`,
8889
};
8990
}
9091

@@ -163,13 +164,13 @@ export function syncTable({
163164
}
164165

165166
const relations: Relation[] = [];
166-
const { name, modified } = resolveNameCasing({ ...options, naming: 'pascal' }, table.name);
167+
const { name, modified } = resolveNameCasing(options.modelCasing, table.name);
167168
const multiPk = table.columns.filter((c) => c.pk).length > 1;
168169

169170
const modelFactory = new DataModelFactory().setName(name).setIsView(table.type === 'view');
170171
modelFactory.setContainer(model);
171172

172-
if (modified) {
173+
if (modified || options.alwaysMap) {
173174
modelFactory.addAttribute((builder) =>
174175
builder.setDecl(tableMapAttribute).addArg((argBuilder) => argBuilder.StringLiteral.setValue(table.name)),
175176
);
@@ -195,10 +196,7 @@ export function syncTable({
195196
});
196197
}
197198

198-
const fieldPrefix = /[0-9]/g.test(column.name.charAt(0)) ? '_' : '';
199-
const { name: _name, modified: _modified } = resolveNameCasing(options, column.name);
200-
const name = `${fieldPrefix}${_name}`;
201-
const modified = fieldPrefix !== '' || _modified;
199+
const { name, modified } = resolveNameCasing(options.fieldCasing, column.name);
202200

203201
const builtinType = provider.getBuiltinType(column.datatype);
204202

@@ -252,7 +250,7 @@ export function syncTable({
252250
return b;
253251
});
254252
}
255-
if (modified) {
253+
if (modified || options.alwaysMap) {
256254
builder.addAttribute((ab) =>
257255
ab.setDecl(fieldMapAttribute).addArg((ab) => ab.StringLiteral.setValue(column.name)),
258256
);

packages/cli/src/actions/pull/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
isInvocationExpr,
1010
type Attribute,
1111
type Model,
12-
StringLiteral,
12+
type StringLiteral,
1313
} from '@zenstackhq/language/ast';
1414
import { getStringLiteral } from '@zenstackhq/language/utils';
1515
import type { DataSourceProviderType } from '@zenstackhq/sdk/schema';

packages/cli/src/index.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,23 @@ function createProgram() {
144144
.addOption(noVersionCheckOption)
145145
.addOption(new Option('-e, --exclude-schemas <schemas...>', 'exclude specific schemas from introspection'))
146146
.addOption(new Option('-o, --out <path>', 'add custom output path for the introspected schema'))
147+
.addOption(
148+
new Option('--model-casing <pascal|camel|snake|kebab>', 'set the casing of generated models').default(
149+
'none',
150+
),
151+
)
152+
.addOption(
153+
new Option('--field-casing <pascal|camel|snake|kebab>', 'set the casing of generated fields').default(
154+
'none',
155+
),
156+
)
157+
.addOption(
158+
new Option('--always-map', 'always add @map and @@map attributes to models and fields').default(false),
159+
)
160+
.addOption(
161+
new Option('--quote <double|single>', 'set the quote style of generated schema files').default('double'),
162+
)
163+
.addOption(new Option('--indent <number>', 'set the indentation of the generated schema files').default(2))
147164
.action((options) => dbAction('pull', options));
148165

149166
dbCommand

0 commit comments

Comments
 (0)