ormbridge 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +459 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliRunner.d.ts +20 -0
- package/dist/cliRunner.js +363 -0
- package/dist/cliRunner.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.js +220 -0
- package/dist/config.js.map +1 -0
- package/dist/convert.d.ts +20 -0
- package/dist/convert.js +61 -0
- package/dist/convert.js.map +1 -0
- package/dist/emitters/django.d.ts +4 -0
- package/dist/emitters/django.js +501 -0
- package/dist/emitters/django.js.map +1 -0
- package/dist/emitters/doctrine.d.ts +20 -0
- package/dist/emitters/doctrine.js +1134 -0
- package/dist/emitters/doctrine.js.map +1 -0
- package/dist/emitters/gorm.d.ts +38 -0
- package/dist/emitters/gorm.js +1507 -0
- package/dist/emitters/gorm.js.map +1 -0
- package/dist/emitters/graphene.d.ts +4 -0
- package/dist/emitters/graphene.js +431 -0
- package/dist/emitters/graphene.js.map +1 -0
- package/dist/emitters/laravel.d.ts +33 -0
- package/dist/emitters/laravel.js +1695 -0
- package/dist/emitters/laravel.js.map +1 -0
- package/dist/emitters/prisma.d.ts +21 -0
- package/dist/emitters/prisma.js +1058 -0
- package/dist/emitters/prisma.js.map +1 -0
- package/dist/emitters/typeorm.d.ts +9 -0
- package/dist/emitters/typeorm.js +838 -0
- package/dist/emitters/typeorm.js.map +1 -0
- package/dist/emitters/typescriptInterfaces.d.ts +15 -0
- package/dist/emitters/typescriptInterfaces.js +350 -0
- package/dist/emitters/typescriptInterfaces.js.map +1 -0
- package/dist/formats.d.ts +82 -0
- package/dist/formats.js +238 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/io.d.ts +48 -0
- package/dist/io.js +343 -0
- package/dist/io.js.map +1 -0
- package/dist/ir.d.ts +197 -0
- package/dist/ir.js +10 -0
- package/dist/ir.js.map +1 -0
- package/dist/naming.d.ts +11 -0
- package/dist/naming.js +88 -0
- package/dist/naming.js.map +1 -0
- package/dist/parsers/django.d.ts +14 -0
- package/dist/parsers/django.js +1161 -0
- package/dist/parsers/django.js.map +1 -0
- package/dist/parsers/doctrine.d.ts +12 -0
- package/dist/parsers/doctrine.js +1984 -0
- package/dist/parsers/doctrine.js.map +1 -0
- package/dist/parsers/goSyntax.d.ts +105 -0
- package/dist/parsers/goSyntax.js +435 -0
- package/dist/parsers/goSyntax.js.map +1 -0
- package/dist/parsers/gorm.d.ts +16 -0
- package/dist/parsers/gorm.js +1857 -0
- package/dist/parsers/gorm.js.map +1 -0
- package/dist/parsers/laravel.d.ts +17 -0
- package/dist/parsers/laravel.js +2824 -0
- package/dist/parsers/laravel.js.map +1 -0
- package/dist/parsers/phpSyntax.d.ts +124 -0
- package/dist/parsers/phpSyntax.js +429 -0
- package/dist/parsers/phpSyntax.js.map +1 -0
- package/dist/parsers/prisma.d.ts +12 -0
- package/dist/parsers/prisma.js +964 -0
- package/dist/parsers/prisma.js.map +1 -0
- package/dist/parsers/pythonSyntax.d.ts +38 -0
- package/dist/parsers/pythonSyntax.js +120 -0
- package/dist/parsers/pythonSyntax.js.map +1 -0
- package/dist/parsers/typeorm.d.ts +12 -0
- package/dist/parsers/typeorm.js +1614 -0
- package/dist/parsers/typeorm.js.map +1 -0
- package/dist/parsers/typescriptSyntax.d.ts +57 -0
- package/dist/parsers/typescriptSyntax.js +200 -0
- package/dist/parsers/typescriptSyntax.js.map +1 -0
- package/dist/prismaOnlyConstructs.d.ts +7 -0
- package/dist/prismaOnlyConstructs.js +76 -0
- package/dist/prismaOnlyConstructs.js.map +1 -0
- package/dist/result.d.ts +20 -0
- package/dist/result.js +18 -0
- package/dist/result.js.map +1 -0
- package/dist/transforms.d.ts +13 -0
- package/dist/transforms.js +142 -0
- package/dist/transforms.js.map +1 -0
- package/package.json +83 -4
package/dist/cli.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { EXIT_CONVERSION_ERROR, runCli } from './cliRunner.js';
|
|
3
|
+
runCli(process.argv.slice(2), {
|
|
4
|
+
cwd: process.cwd(),
|
|
5
|
+
stdout: (text) => {
|
|
6
|
+
process.stdout.write(text);
|
|
7
|
+
},
|
|
8
|
+
stderr: (text) => {
|
|
9
|
+
process.stderr.write(text);
|
|
10
|
+
},
|
|
11
|
+
})
|
|
12
|
+
.then((exitCode) => {
|
|
13
|
+
process.exitCode = exitCode;
|
|
14
|
+
})
|
|
15
|
+
.catch((thrown) => {
|
|
16
|
+
const message = thrown instanceof Error ? thrown.message : String(thrown);
|
|
17
|
+
process.stderr.write(`error: ${message}\n`);
|
|
18
|
+
process.exitCode = EXIT_CONVERSION_ERROR;
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC5B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,MAAM,EAAE,CAAC,IAAY,EAAQ,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,CAAC,IAAY,EAAQ,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;KACC,IAAI,CAAC,CAAC,QAAgB,EAAE,EAAE;IACzB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,MAAe,EAAE,EAAE;IACzB,MAAM,OAAO,GACX,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,QAAQ,GAAG,qBAAqB,CAAC;AAC3C,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Exit codes of the `ormbridge` command. */
|
|
2
|
+
export declare const EXIT_OK: number;
|
|
3
|
+
/** A conversion failed: unreadable input, parse error, unwritable output. */
|
|
4
|
+
export declare const EXIT_CONVERSION_ERROR: number;
|
|
5
|
+
/** The command line or the config file is invalid. */
|
|
6
|
+
export declare const EXIT_USAGE_ERROR: number;
|
|
7
|
+
/** `--check` found an output file that is stale or missing. */
|
|
8
|
+
export declare const EXIT_CHECK_FAILED: number;
|
|
9
|
+
/** Where the CLI reads its working directory from and writes its output to. */
|
|
10
|
+
export interface CliEnvironment {
|
|
11
|
+
cwd: string;
|
|
12
|
+
stdout: (text: string) => void;
|
|
13
|
+
stderr: (text: string) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs the CLI with the given arguments (without the node and script
|
|
17
|
+
* entries) and returns the exit code. Nothing is written to the real
|
|
18
|
+
* process streams, so tests can call this in-process.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runCli(argv: string[], env: CliEnvironment): Promise<number>;
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { extname, isAbsolute, relative, resolve } from 'node:path';
|
|
3
|
+
import { Command, CommanderError } from 'commander';
|
|
4
|
+
import { findConfigFile, loadConfigFile, } from './config.js';
|
|
5
|
+
import { PRISMA_PROVIDERS, } from './emitters/prisma.js';
|
|
6
|
+
import { describeFormats, getFormat, getFormatByExtension, listFormatNames, listFormats, } from './formats.js';
|
|
7
|
+
import { countLines, runConversion, } from './io.js';
|
|
8
|
+
/** Exit codes of the `ormbridge` command. */
|
|
9
|
+
export const EXIT_OK = 0;
|
|
10
|
+
/** A conversion failed: unreadable input, parse error, unwritable output. */
|
|
11
|
+
export const EXIT_CONVERSION_ERROR = 1;
|
|
12
|
+
/** The command line or the config file is invalid. */
|
|
13
|
+
export const EXIT_USAGE_ERROR = 2;
|
|
14
|
+
/** `--check` found an output file that is stale or missing. */
|
|
15
|
+
export const EXIT_CHECK_FAILED = 3;
|
|
16
|
+
function readPackageVersion() {
|
|
17
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
18
|
+
const packageJson = requireFromHere('../package.json');
|
|
19
|
+
return packageJson.version ?? '0.0.0';
|
|
20
|
+
}
|
|
21
|
+
function inferFormatFromPath(filePath) {
|
|
22
|
+
if (filePath === undefined) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const adapter = getFormatByExtension(extname(filePath));
|
|
26
|
+
return adapter?.name;
|
|
27
|
+
}
|
|
28
|
+
function failure(code, message) {
|
|
29
|
+
return { ok: false, error: { code, message } };
|
|
30
|
+
}
|
|
31
|
+
/** Validates merged settings and builds the options for one conversion. */
|
|
32
|
+
function buildRunOptions(settings, mode) {
|
|
33
|
+
const inputs = settings.input ?? [];
|
|
34
|
+
if (inputs.length === 0) {
|
|
35
|
+
return failure('INVALID_OPTION', 'No input was given. Pass -i/--input, or set "input" in the config file.');
|
|
36
|
+
}
|
|
37
|
+
if (mode === 'check' && settings.output === undefined) {
|
|
38
|
+
return failure('INVALID_OPTION', '--check compares the conversion with an existing output, so an output path is required. Pass -o/--output, or set "output" in the config file.');
|
|
39
|
+
}
|
|
40
|
+
const fromValue = settings.from ?? inferFormatFromPath(inputs[0]) ?? 'django';
|
|
41
|
+
if (!getFormat(fromValue).ok) {
|
|
42
|
+
return failure('INVALID_OPTION', `Invalid --from value "${fromValue}". Expected one of: ${listFormatNames().join(', ')}.`);
|
|
43
|
+
}
|
|
44
|
+
const toValue = settings.to ??
|
|
45
|
+
inferFormatFromPath(settings.output) ??
|
|
46
|
+
(fromValue === 'django' ? 'prisma' : 'django');
|
|
47
|
+
if (!getFormat(toValue).ok) {
|
|
48
|
+
return failure('INVALID_OPTION', `Invalid --to value "${toValue}". Expected one of: ${listFormatNames().join(', ')}.`);
|
|
49
|
+
}
|
|
50
|
+
const namingValue = settings.naming ?? 'preserve';
|
|
51
|
+
if (namingValue !== 'preserve' && namingValue !== 'normalize') {
|
|
52
|
+
return failure('INVALID_OPTION', `Invalid --naming value "${namingValue}". Expected "preserve" or "normalize".`);
|
|
53
|
+
}
|
|
54
|
+
const naming = namingValue;
|
|
55
|
+
const providerValue = settings.provider ?? 'postgresql';
|
|
56
|
+
if (!PRISMA_PROVIDERS.includes(providerValue)) {
|
|
57
|
+
return failure('INVALID_OPTION', `Invalid --provider value "${providerValue}". Expected one of: ${PRISMA_PROVIDERS.join(', ')}.`);
|
|
58
|
+
}
|
|
59
|
+
const provider = providerValue;
|
|
60
|
+
const autoFieldValue = (settings.autoField ?? 'int').toLowerCase();
|
|
61
|
+
if (autoFieldValue !== 'int' && autoFieldValue !== 'bigint') {
|
|
62
|
+
return failure('INVALID_OPTION', `Invalid --auto-field value "${settings.autoField ?? ''}". Expected "int" or "bigint".`);
|
|
63
|
+
}
|
|
64
|
+
let prismaVersion;
|
|
65
|
+
if (settings.prismaVersion !== undefined) {
|
|
66
|
+
const versionText = String(settings.prismaVersion).trim();
|
|
67
|
+
if (versionText !== '6' && versionText !== '7') {
|
|
68
|
+
return failure('INVALID_OPTION', `Invalid --prisma-version value "${String(settings.prismaVersion)}". Expected 6 or 7.`);
|
|
69
|
+
}
|
|
70
|
+
prismaVersion = versionText === '7' ? 7 : 6;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
ok: true,
|
|
74
|
+
value: {
|
|
75
|
+
from: fromValue,
|
|
76
|
+
to: toValue,
|
|
77
|
+
naming,
|
|
78
|
+
provider,
|
|
79
|
+
header: settings.header ?? true,
|
|
80
|
+
autoField: autoFieldValue === 'bigint' ? 'bigInt' : 'int',
|
|
81
|
+
inputs,
|
|
82
|
+
dryRun: mode === 'dry-run',
|
|
83
|
+
check: mode === 'check',
|
|
84
|
+
...(settings.output === undefined ? {} : { output: settings.output }),
|
|
85
|
+
...(settings.appLabel === undefined
|
|
86
|
+
? {}
|
|
87
|
+
: { appLabel: settings.appLabel }),
|
|
88
|
+
...(settings.namespace === undefined
|
|
89
|
+
? {}
|
|
90
|
+
: { namespace: settings.namespace }),
|
|
91
|
+
...(settings.goPackage === undefined
|
|
92
|
+
? {}
|
|
93
|
+
: { goPackage: settings.goPackage }),
|
|
94
|
+
...(prismaVersion === undefined ? {} : { prismaVersion }),
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Finds and loads the config file according to --config / --no-config. */
|
|
99
|
+
async function resolveConfig(flags, env) {
|
|
100
|
+
if (flags.config === false) {
|
|
101
|
+
return { ok: true, value: undefined };
|
|
102
|
+
}
|
|
103
|
+
if (typeof flags.config === 'string') {
|
|
104
|
+
return loadConfigFile(resolve(env.cwd, flags.config));
|
|
105
|
+
}
|
|
106
|
+
const found = await findConfigFile(env.cwd);
|
|
107
|
+
if (found === undefined) {
|
|
108
|
+
return { ok: true, value: undefined };
|
|
109
|
+
}
|
|
110
|
+
return loadConfigFile(found);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Merges the config file and the flags into the conversions to run. Flags
|
|
114
|
+
* override config values. With no -i and a config that lists `conversions`,
|
|
115
|
+
* every listed conversion runs.
|
|
116
|
+
*/
|
|
117
|
+
function planRuns(flags, headerFromFlag, config, env, mode) {
|
|
118
|
+
const useConversionList = config !== undefined &&
|
|
119
|
+
config.conversions.length > 0 &&
|
|
120
|
+
flags.input === undefined;
|
|
121
|
+
const entries = config === undefined
|
|
122
|
+
? [{}]
|
|
123
|
+
: useConversionList
|
|
124
|
+
? config.conversions.map((conversion) => ({
|
|
125
|
+
...config.defaults,
|
|
126
|
+
...conversion,
|
|
127
|
+
}))
|
|
128
|
+
: [config.defaults];
|
|
129
|
+
if (entries.length > 1 && flags.output !== undefined) {
|
|
130
|
+
return failure('INVALID_OPTION', `--output cannot be combined with the ${entries.length} conversions in the config file, because they would all write to the same path. Remove -o, or pass -i to run a single conversion.`);
|
|
131
|
+
}
|
|
132
|
+
const runs = [];
|
|
133
|
+
for (const [index, entry] of entries.entries()) {
|
|
134
|
+
const label = entries.length === 1 ? undefined : (entry.name ?? `#${index + 1}`);
|
|
135
|
+
const settings = { ...entry };
|
|
136
|
+
if (flags.input !== undefined) {
|
|
137
|
+
settings.input = flags.input.map((path) => resolve(env.cwd, path));
|
|
138
|
+
}
|
|
139
|
+
if (flags.output !== undefined) {
|
|
140
|
+
settings.output = resolve(env.cwd, flags.output);
|
|
141
|
+
}
|
|
142
|
+
if (flags.from !== undefined) {
|
|
143
|
+
settings.from = flags.from;
|
|
144
|
+
}
|
|
145
|
+
if (flags.to !== undefined) {
|
|
146
|
+
settings.to = flags.to;
|
|
147
|
+
}
|
|
148
|
+
if (flags.naming !== undefined) {
|
|
149
|
+
settings.naming = flags.naming;
|
|
150
|
+
}
|
|
151
|
+
if (flags.provider !== undefined) {
|
|
152
|
+
settings.provider = flags.provider;
|
|
153
|
+
}
|
|
154
|
+
if (headerFromFlag !== undefined) {
|
|
155
|
+
settings.header = headerFromFlag;
|
|
156
|
+
}
|
|
157
|
+
if (flags.appLabel !== undefined) {
|
|
158
|
+
settings.appLabel = flags.appLabel;
|
|
159
|
+
}
|
|
160
|
+
if (flags.autoField !== undefined) {
|
|
161
|
+
settings.autoField = flags.autoField;
|
|
162
|
+
}
|
|
163
|
+
if (flags.namespace !== undefined) {
|
|
164
|
+
settings.namespace = flags.namespace;
|
|
165
|
+
}
|
|
166
|
+
if (flags.goPackage !== undefined) {
|
|
167
|
+
settings.goPackage = flags.goPackage;
|
|
168
|
+
}
|
|
169
|
+
if (flags.prismaVersion !== undefined) {
|
|
170
|
+
settings.prismaVersion = flags.prismaVersion;
|
|
171
|
+
}
|
|
172
|
+
const options = buildRunOptions(settings, mode);
|
|
173
|
+
if (!options.ok) {
|
|
174
|
+
const where = label === undefined ? '' : `conversion ${label}: `;
|
|
175
|
+
return failure('INVALID_OPTION', `${where}${options.error.message}`);
|
|
176
|
+
}
|
|
177
|
+
runs.push({ label, options: options.value });
|
|
178
|
+
}
|
|
179
|
+
return { ok: true, value: runs };
|
|
180
|
+
}
|
|
181
|
+
function formatBytes(bytes) {
|
|
182
|
+
return bytes < 1024 ? `${bytes} B` : `${(bytes / 1024).toFixed(1)} KB`;
|
|
183
|
+
}
|
|
184
|
+
function describeFile(file) {
|
|
185
|
+
return `${file.lines} line(s), ${formatBytes(file.bytes)}`;
|
|
186
|
+
}
|
|
187
|
+
/** Shows a path relative to the working directory when it is inside it. */
|
|
188
|
+
function displayPath(path, cwd) {
|
|
189
|
+
const relativePath = relative(cwd, path);
|
|
190
|
+
return relativePath !== '' &&
|
|
191
|
+
!relativePath.startsWith('..') &&
|
|
192
|
+
!isAbsolute(relativePath)
|
|
193
|
+
? relativePath
|
|
194
|
+
: path;
|
|
195
|
+
}
|
|
196
|
+
/** Prints the result of one conversion. Returns true when --check found it stale. */
|
|
197
|
+
function report(run, summary, mode, env) {
|
|
198
|
+
const prefix = run.label === undefined ? '' : `[${run.label}] `;
|
|
199
|
+
const options = run.options;
|
|
200
|
+
for (const warning of summary.warnings) {
|
|
201
|
+
env.stderr(`${prefix}warning: ${warning}\n`);
|
|
202
|
+
}
|
|
203
|
+
const description = `${summary.modelCount} model(s) from ${summary.inputFiles.length} file(s) ` +
|
|
204
|
+
`(${options.from} -> ${options.to})`;
|
|
205
|
+
if (summary.outputPath === undefined) {
|
|
206
|
+
if (mode === 'dry-run') {
|
|
207
|
+
env.stderr(`${prefix}Dry run: converted ${description}; the result would be printed to stdout (${countLines(summary.output)} line(s)).\n`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
env.stdout(summary.output);
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
let stale = false;
|
|
215
|
+
if (mode === 'check') {
|
|
216
|
+
for (const file of summary.plannedFiles) {
|
|
217
|
+
const path = displayPath(file.path, env.cwd);
|
|
218
|
+
if (file.state === 'unchanged') {
|
|
219
|
+
env.stderr(`${prefix}up to date: ${path}\n`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
stale = true;
|
|
223
|
+
env.stderr(file.state === 'created'
|
|
224
|
+
? `${prefix}error: ${path} is missing; the conversion would create it (${describeFile(file)}).\n`
|
|
225
|
+
: `${prefix}error: ${path} is out of date: ${file.diff ?? 'contents differ'}.\n`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return stale;
|
|
229
|
+
}
|
|
230
|
+
const heading = mode === 'dry-run'
|
|
231
|
+
? `Dry run, nothing written: ${description}`
|
|
232
|
+
: `Converted ${description}`;
|
|
233
|
+
env.stderr(`${prefix}${heading}\n`);
|
|
234
|
+
for (const file of summary.plannedFiles) {
|
|
235
|
+
const path = displayPath(file.path, env.cwd);
|
|
236
|
+
const verb = file.state === 'unchanged'
|
|
237
|
+
? 'unchanged'
|
|
238
|
+
: mode === 'dry-run'
|
|
239
|
+
? file.state === 'created'
|
|
240
|
+
? 'would create'
|
|
241
|
+
: 'would update'
|
|
242
|
+
: file.state === 'created'
|
|
243
|
+
? 'created'
|
|
244
|
+
: 'updated';
|
|
245
|
+
const detail = file.diff === undefined
|
|
246
|
+
? describeFile(file)
|
|
247
|
+
: `${describeFile(file)}; ${file.diff}`;
|
|
248
|
+
env.stderr(`${prefix} ${verb} ${path} (${detail})\n`);
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
async function handleConvert(flags, headerFromFlag, env) {
|
|
253
|
+
const usageError = (message) => {
|
|
254
|
+
env.stderr(`error [USAGE]: ${message}\n`);
|
|
255
|
+
return EXIT_USAGE_ERROR;
|
|
256
|
+
};
|
|
257
|
+
if (flags.check === true && flags.dryRun === true) {
|
|
258
|
+
return usageError('--check and --dry-run cannot be combined: --check already writes nothing.');
|
|
259
|
+
}
|
|
260
|
+
const mode = flags.check === true
|
|
261
|
+
? 'check'
|
|
262
|
+
: flags.dryRun === true
|
|
263
|
+
? 'dry-run'
|
|
264
|
+
: 'write';
|
|
265
|
+
const config = await resolveConfig(flags, env);
|
|
266
|
+
if (!config.ok) {
|
|
267
|
+
return usageError(config.error.message);
|
|
268
|
+
}
|
|
269
|
+
const runs = planRuns(flags, headerFromFlag, config.value, env, mode);
|
|
270
|
+
if (!runs.ok) {
|
|
271
|
+
return usageError(runs.error.message);
|
|
272
|
+
}
|
|
273
|
+
if (config.value !== undefined && runs.value.length > 1) {
|
|
274
|
+
env.stderr(`Using ${displayPath(config.value.path, env.cwd)}: ${runs.value.length} conversions\n`);
|
|
275
|
+
}
|
|
276
|
+
let failedConversions = 0;
|
|
277
|
+
let staleOutputs = 0;
|
|
278
|
+
for (const run of runs.value) {
|
|
279
|
+
const prefix = run.label === undefined ? '' : `[${run.label}] `;
|
|
280
|
+
const summary = await runConversion(run.options);
|
|
281
|
+
if (!summary.ok) {
|
|
282
|
+
env.stderr(`${prefix}error [${summary.error.code}]: ${summary.error.message}\n`);
|
|
283
|
+
failedConversions += 1;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (report(run, summary.value, mode, env)) {
|
|
287
|
+
staleOutputs += 1;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (failedConversions > 0) {
|
|
291
|
+
return EXIT_CONVERSION_ERROR;
|
|
292
|
+
}
|
|
293
|
+
if (staleOutputs > 0) {
|
|
294
|
+
env.stderr('Generated output is stale. Run "ormbridge convert" without --check to regenerate it.\n');
|
|
295
|
+
return EXIT_CHECK_FAILED;
|
|
296
|
+
}
|
|
297
|
+
return EXIT_OK;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Runs the CLI with the given arguments (without the node and script
|
|
301
|
+
* entries) and returns the exit code. Nothing is written to the real
|
|
302
|
+
* process streams, so tests can call this in-process.
|
|
303
|
+
*/
|
|
304
|
+
export async function runCli(argv, env) {
|
|
305
|
+
const program = new Command();
|
|
306
|
+
program
|
|
307
|
+
.name('ormbridge')
|
|
308
|
+
.description('Convert ORM schemas between Django, Prisma, TypeORM and more.')
|
|
309
|
+
.version(readPackageVersion())
|
|
310
|
+
.exitOverride()
|
|
311
|
+
.configureOutput({ writeOut: env.stdout, writeErr: env.stderr });
|
|
312
|
+
let exitCode = EXIT_OK;
|
|
313
|
+
program
|
|
314
|
+
.command('convert')
|
|
315
|
+
.description('Convert models from one ORM format to another')
|
|
316
|
+
.option('-i, --input <paths...>', 'file(s) or directories to read (models.py, models/ package, or .prisma); optional when a config file supplies them')
|
|
317
|
+
.option('-o, --output <path>', 'file to write (a directory for formats that produce several files); prints to stdout when omitted')
|
|
318
|
+
.option('-f, --from <format>', `source format (${listFormatNames().join(' | ')}); inferred from the input when omitted`)
|
|
319
|
+
.option('-t, --to <format>', `target format (${listFormatNames().join(' | ')}); inferred from the output when omitted`)
|
|
320
|
+
.option('--naming <mode>', 'preserve existing database names, or normalize to singular snake_case + UUID ids (default: preserve)')
|
|
321
|
+
.option('--provider <name>', `Prisma datasource provider (${PRISMA_PROVIDERS.join(' | ')}) (default: postgresql)`)
|
|
322
|
+
.option('--no-header', 'omit the Prisma generator and datasource blocks')
|
|
323
|
+
.option('--app-label <name>', 'Django app label used for default table names (default: derived from the directory)')
|
|
324
|
+
.option('--auto-field <type>', 'primary key type for Django models without one (int | bigint) (default: int)')
|
|
325
|
+
.option('--namespace <name>', 'PHP namespace of the Doctrine entities (default: App\\Entity) or Laravel models (default: App\\Models)')
|
|
326
|
+
.option('--go-package <name>', 'Go package name of the GORM models (default: models)')
|
|
327
|
+
.option('--prisma-version <version>', 'Prisma major version of the generator and datasource blocks (6 | 7) (default: 6; 7 writes the prisma-client generator and no datasource url)')
|
|
328
|
+
.option('--dry-run', 'run the conversion and report what would be written, without touching any file')
|
|
329
|
+
.option('--check', 'exit with code 3 if an output file is missing or differs from the conversion; writes nothing')
|
|
330
|
+
.option('--config <path>', 'read settings from this JSON config file instead of searching for ormbridge.config.json')
|
|
331
|
+
.option('--no-config', 'ignore any config file')
|
|
332
|
+
.action(async (flags, command) => {
|
|
333
|
+
const conflict = argv.includes('--no-config') &&
|
|
334
|
+
argv.some((arg) => arg === '--config' || arg.startsWith('--config='));
|
|
335
|
+
if (conflict) {
|
|
336
|
+
env.stderr('error [USAGE]: --config and --no-config cannot be combined.\n');
|
|
337
|
+
exitCode = EXIT_USAGE_ERROR;
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const headerFromFlag = command.getOptionValueSource('header') === 'cli'
|
|
341
|
+
? flags.header
|
|
342
|
+
: undefined;
|
|
343
|
+
exitCode = await handleConvert(flags, headerFromFlag, env);
|
|
344
|
+
});
|
|
345
|
+
program
|
|
346
|
+
.command('formats')
|
|
347
|
+
.description('List the supported formats, their file extensions, and whether each can be read and/or written')
|
|
348
|
+
.action(() => {
|
|
349
|
+
env.stdout(describeFormats(listFormats()));
|
|
350
|
+
});
|
|
351
|
+
try {
|
|
352
|
+
await program.parseAsync(argv, { from: 'user' });
|
|
353
|
+
}
|
|
354
|
+
catch (thrown) {
|
|
355
|
+
if (thrown instanceof CommanderError) {
|
|
356
|
+
// Commander already printed the message; help and version are not failures.
|
|
357
|
+
return thrown.exitCode === 0 ? EXIT_OK : EXIT_USAGE_ERROR;
|
|
358
|
+
}
|
|
359
|
+
throw thrown;
|
|
360
|
+
}
|
|
361
|
+
return exitCode;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=cliRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliRunner.js","sourceRoot":"","sources":["../src/cliRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type Result } from './result.js';
|
|
2
|
+
/** File names searched for in each directory, in priority order. */
|
|
3
|
+
export declare const CONFIG_FILE_NAMES: readonly string[];
|
|
4
|
+
/** The settings of one conversion. Every key is optional; missing keys fall back to defaults. */
|
|
5
|
+
export interface ConversionConfig {
|
|
6
|
+
/** Label used in messages. Only meaningful inside `conversions`. */
|
|
7
|
+
name?: string;
|
|
8
|
+
/** Input files or directories (absolute: relative paths resolve against the config file). */
|
|
9
|
+
input?: string[];
|
|
10
|
+
/** Output file or directory (absolute). */
|
|
11
|
+
output?: string;
|
|
12
|
+
from?: string;
|
|
13
|
+
to?: string;
|
|
14
|
+
naming?: 'preserve' | 'normalize';
|
|
15
|
+
provider?: string;
|
|
16
|
+
header?: boolean;
|
|
17
|
+
appLabel?: string;
|
|
18
|
+
autoField?: 'int' | 'bigint';
|
|
19
|
+
/** PHP namespace of the Doctrine entities or Laravel models. */
|
|
20
|
+
namespace?: string;
|
|
21
|
+
/** Go package name of the GORM models. */
|
|
22
|
+
goPackage?: string;
|
|
23
|
+
/** Prisma major version of the generated header (6 or 7). */
|
|
24
|
+
prismaVersion?: 6 | 7;
|
|
25
|
+
}
|
|
26
|
+
/** A parsed config file. Top-level settings are defaults shared by every entry in `conversions`. */
|
|
27
|
+
export interface ConfigFile {
|
|
28
|
+
/** Absolute path of the file the config was read from. */
|
|
29
|
+
path: string;
|
|
30
|
+
/** Top-level settings, used as defaults for each conversion. */
|
|
31
|
+
defaults: ConversionConfig;
|
|
32
|
+
/** Named conversions. Empty when the file describes a single conversion at the top level. */
|
|
33
|
+
conversions: ConversionConfig[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Looks for a config file in `startDirectory` and each parent directory. The
|
|
37
|
+
* search stops after the first directory that contains a package.json (the
|
|
38
|
+
* project root) and at the filesystem root. Returns undefined when none exists.
|
|
39
|
+
*/
|
|
40
|
+
export declare function findConfigFile(startDirectory: string): Promise<string | undefined>;
|
|
41
|
+
/** Reads and validates a JSON config file. Relative paths inside it resolve against its directory. */
|
|
42
|
+
export declare function loadConfigFile(path: string): Promise<Result<ConfigFile>>;
|
|
43
|
+
/** Validates already-parsed JSON. Every message names the config file and the offending key. */
|
|
44
|
+
export declare function parseConfig(raw: unknown, path: string): Result<ConfigFile>;
|