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/config.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { PRISMA_PROVIDERS } from './emitters/prisma.js';
|
|
4
|
+
import { describeThrown, err, ok } from './result.js';
|
|
5
|
+
/** File names searched for in each directory, in priority order. */
|
|
6
|
+
export const CONFIG_FILE_NAMES = [
|
|
7
|
+
'ormbridge.config.json',
|
|
8
|
+
'.ormbridgerc.json',
|
|
9
|
+
];
|
|
10
|
+
const CONVERSION_KEYS = [
|
|
11
|
+
'name',
|
|
12
|
+
'input',
|
|
13
|
+
'output',
|
|
14
|
+
'from',
|
|
15
|
+
'to',
|
|
16
|
+
'naming',
|
|
17
|
+
'provider',
|
|
18
|
+
'header',
|
|
19
|
+
'appLabel',
|
|
20
|
+
'autoField',
|
|
21
|
+
'namespace',
|
|
22
|
+
'goPackage',
|
|
23
|
+
'prismaVersion',
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Looks for a config file in `startDirectory` and each parent directory. The
|
|
27
|
+
* search stops after the first directory that contains a package.json (the
|
|
28
|
+
* project root) and at the filesystem root. Returns undefined when none exists.
|
|
29
|
+
*/
|
|
30
|
+
export async function findConfigFile(startDirectory) {
|
|
31
|
+
let directory = resolve(startDirectory);
|
|
32
|
+
for (;;) {
|
|
33
|
+
for (const name of CONFIG_FILE_NAMES) {
|
|
34
|
+
const candidate = join(directory, name);
|
|
35
|
+
if (await isFile(candidate)) {
|
|
36
|
+
return candidate;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (await isFile(join(directory, 'package.json'))) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const parent = dirname(directory);
|
|
43
|
+
if (parent === directory) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
directory = parent;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function isFile(path) {
|
|
50
|
+
try {
|
|
51
|
+
return (await stat(path)).isFile();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Reads and validates a JSON config file. Relative paths inside it resolve against its directory. */
|
|
58
|
+
export async function loadConfigFile(path) {
|
|
59
|
+
const absolutePath = resolve(path);
|
|
60
|
+
let text;
|
|
61
|
+
try {
|
|
62
|
+
text = await readFile(absolutePath, 'utf8');
|
|
63
|
+
}
|
|
64
|
+
catch (thrown) {
|
|
65
|
+
return err('INVALID_CONFIG', `Could not read the config file "${absolutePath}": ${describeThrown(thrown)}`);
|
|
66
|
+
}
|
|
67
|
+
let raw;
|
|
68
|
+
try {
|
|
69
|
+
raw = JSON.parse(text);
|
|
70
|
+
}
|
|
71
|
+
catch (thrown) {
|
|
72
|
+
return err('INVALID_CONFIG', `The config file "${absolutePath}" is not valid JSON: ${describeThrown(thrown)}`);
|
|
73
|
+
}
|
|
74
|
+
return parseConfig(raw, absolutePath);
|
|
75
|
+
}
|
|
76
|
+
/** Validates already-parsed JSON. Every message names the config file and the offending key. */
|
|
77
|
+
export function parseConfig(raw, path) {
|
|
78
|
+
const fail = (message) => err('INVALID_CONFIG', `${path}: ${message}`);
|
|
79
|
+
if (!isRecord(raw)) {
|
|
80
|
+
return fail('the config must be a JSON object.');
|
|
81
|
+
}
|
|
82
|
+
const baseDirectory = dirname(path);
|
|
83
|
+
const topLevel = {};
|
|
84
|
+
let rawConversions;
|
|
85
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
86
|
+
if (key === '$schema') {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (key === 'conversions') {
|
|
90
|
+
rawConversions = value;
|
|
91
|
+
}
|
|
92
|
+
else if (key === 'name') {
|
|
93
|
+
return fail('"name" is only valid inside an entry of "conversions", not at the top level.');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
topLevel[key] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const defaults = parseConversion(topLevel, '', baseDirectory);
|
|
100
|
+
if (!defaults.ok) {
|
|
101
|
+
return fail(defaults.error.message);
|
|
102
|
+
}
|
|
103
|
+
const conversions = [];
|
|
104
|
+
if (rawConversions !== undefined) {
|
|
105
|
+
if (!Array.isArray(rawConversions) || rawConversions.length === 0) {
|
|
106
|
+
return fail('"conversions" must be a non-empty array of objects.');
|
|
107
|
+
}
|
|
108
|
+
const names = new Set();
|
|
109
|
+
for (const [index, entry] of rawConversions.entries()) {
|
|
110
|
+
if (!isRecord(entry)) {
|
|
111
|
+
return fail(`"conversions[${index}]" must be an object.`);
|
|
112
|
+
}
|
|
113
|
+
const parsed = parseConversion(entry, `conversions[${index}].`, baseDirectory);
|
|
114
|
+
if (!parsed.ok) {
|
|
115
|
+
return fail(parsed.error.message);
|
|
116
|
+
}
|
|
117
|
+
const name = parsed.value.name;
|
|
118
|
+
if (name !== undefined) {
|
|
119
|
+
if (names.has(name)) {
|
|
120
|
+
return fail(`"conversions[${index}].name" duplicates the name "${name}" used by another conversion.`);
|
|
121
|
+
}
|
|
122
|
+
names.add(name);
|
|
123
|
+
}
|
|
124
|
+
conversions.push(parsed.value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return ok({ path, defaults: defaults.value, conversions });
|
|
128
|
+
}
|
|
129
|
+
function isRecord(value) {
|
|
130
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
131
|
+
}
|
|
132
|
+
function describeValue(value) {
|
|
133
|
+
return JSON.stringify(value) ?? String(value);
|
|
134
|
+
}
|
|
135
|
+
/** Validates one conversion object. Error messages name the key (with its prefix) and the problem. */
|
|
136
|
+
function parseConversion(raw, prefix, baseDirectory) {
|
|
137
|
+
const fail = (key, problem) => err('INVALID_CONFIG', `"${prefix}${key}" ${problem}`);
|
|
138
|
+
const config = {};
|
|
139
|
+
for (const key of Object.keys(raw)) {
|
|
140
|
+
if (!CONVERSION_KEYS.includes(key)) {
|
|
141
|
+
const valid = CONVERSION_KEYS.filter((candidate) => prefix !== '' || candidate !== 'name');
|
|
142
|
+
if (prefix === '') {
|
|
143
|
+
valid.push('conversions');
|
|
144
|
+
}
|
|
145
|
+
return err('INVALID_CONFIG', `unknown key "${prefix}${key}". Valid keys: ${valid.join(', ')}.`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const key of [
|
|
149
|
+
'name',
|
|
150
|
+
'from',
|
|
151
|
+
'to',
|
|
152
|
+
'appLabel',
|
|
153
|
+
'namespace',
|
|
154
|
+
'goPackage',
|
|
155
|
+
]) {
|
|
156
|
+
const value = raw[key];
|
|
157
|
+
if (value === undefined) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
161
|
+
return fail(key, `must be a non-empty string (got ${describeValue(value)}).`);
|
|
162
|
+
}
|
|
163
|
+
config[key] = value;
|
|
164
|
+
}
|
|
165
|
+
const output = raw['output'];
|
|
166
|
+
if (output !== undefined) {
|
|
167
|
+
if (typeof output !== 'string' || output.trim() === '') {
|
|
168
|
+
return fail('output', `must be a non-empty path string (got ${describeValue(output)}).`);
|
|
169
|
+
}
|
|
170
|
+
config.output = resolve(baseDirectory, output);
|
|
171
|
+
}
|
|
172
|
+
const input = raw['input'];
|
|
173
|
+
if (input !== undefined) {
|
|
174
|
+
const entries = Array.isArray(input) ? input : [input];
|
|
175
|
+
if (entries.length === 0 ||
|
|
176
|
+
entries.some((entry) => typeof entry !== 'string' || entry === '')) {
|
|
177
|
+
return fail('input', `must be a path string or a non-empty array of path strings (got ${describeValue(input)}).`);
|
|
178
|
+
}
|
|
179
|
+
config.input = entries.map((entry) => resolve(baseDirectory, entry));
|
|
180
|
+
}
|
|
181
|
+
const naming = raw['naming'];
|
|
182
|
+
if (naming !== undefined) {
|
|
183
|
+
if (naming !== 'preserve' && naming !== 'normalize') {
|
|
184
|
+
return fail('naming', `must be "preserve" or "normalize" (got ${describeValue(naming)}).`);
|
|
185
|
+
}
|
|
186
|
+
config.naming = naming;
|
|
187
|
+
}
|
|
188
|
+
const provider = raw['provider'];
|
|
189
|
+
if (provider !== undefined) {
|
|
190
|
+
if (typeof provider !== 'string' ||
|
|
191
|
+
!PRISMA_PROVIDERS.includes(provider)) {
|
|
192
|
+
return fail('provider', `must be one of ${PRISMA_PROVIDERS.join(', ')} (got ${describeValue(provider)}).`);
|
|
193
|
+
}
|
|
194
|
+
config.provider = provider;
|
|
195
|
+
}
|
|
196
|
+
const prismaVersion = raw['prismaVersion'];
|
|
197
|
+
if (prismaVersion !== undefined) {
|
|
198
|
+
if (prismaVersion !== 6 && prismaVersion !== 7) {
|
|
199
|
+
return fail('prismaVersion', `must be the number 6 or 7 (got ${describeValue(prismaVersion)}).`);
|
|
200
|
+
}
|
|
201
|
+
config.prismaVersion = prismaVersion;
|
|
202
|
+
}
|
|
203
|
+
const header = raw['header'];
|
|
204
|
+
if (header !== undefined) {
|
|
205
|
+
if (typeof header !== 'boolean') {
|
|
206
|
+
return fail('header', `must be true or false (got ${describeValue(header)}).`);
|
|
207
|
+
}
|
|
208
|
+
config.header = header;
|
|
209
|
+
}
|
|
210
|
+
const autoField = raw['autoField'];
|
|
211
|
+
if (autoField !== undefined) {
|
|
212
|
+
const lowered = typeof autoField === 'string' ? autoField.toLowerCase() : undefined;
|
|
213
|
+
if (lowered !== 'int' && lowered !== 'bigint') {
|
|
214
|
+
return fail('autoField', `must be "int" or "bigint" (got ${describeValue(autoField)}).`);
|
|
215
|
+
}
|
|
216
|
+
config.autoField = lowered;
|
|
217
|
+
}
|
|
218
|
+
return ok(config);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DEFAULT_APP_LABEL, type FormatName, type FormatOptions, type SourceText } from './formats.js';
|
|
2
|
+
import { type Result } from './result.js';
|
|
3
|
+
export { DEFAULT_APP_LABEL };
|
|
4
|
+
export type { FormatName, SourceText };
|
|
5
|
+
/** Names of the built-in formats. Use listFormatNames() for the live registry contents. */
|
|
6
|
+
export declare const FORMAT_NAMES: readonly FormatName[];
|
|
7
|
+
export interface ConvertOptions extends FormatOptions {
|
|
8
|
+
from: FormatName;
|
|
9
|
+
to: FormatName;
|
|
10
|
+
}
|
|
11
|
+
export interface ConvertResult {
|
|
12
|
+
/** The converted text. Empty when the emitter produced several files; see `files`. */
|
|
13
|
+
output: string;
|
|
14
|
+
/** Relative path to file text, present only when the emitter produced several files. */
|
|
15
|
+
files?: Record<string, string>;
|
|
16
|
+
warnings: string[];
|
|
17
|
+
modelCount: number;
|
|
18
|
+
}
|
|
19
|
+
/** Converts in-memory source text from one ORM format to another. */
|
|
20
|
+
export declare function convertText(sources: SourceText[], options: ConvertOptions): Promise<Result<ConvertResult>>;
|
package/dist/convert.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { BUILT_IN_FORMAT_NAMES, DEFAULT_APP_LABEL, getFormat, } from './formats.js';
|
|
2
|
+
import { err, ok } from './result.js';
|
|
3
|
+
export { DEFAULT_APP_LABEL };
|
|
4
|
+
/** Names of the built-in formats. Use listFormatNames() for the live registry contents. */
|
|
5
|
+
export const FORMAT_NAMES = BUILT_IN_FORMAT_NAMES;
|
|
6
|
+
/** Converts in-memory source text from one ORM format to another. */
|
|
7
|
+
export async function convertText(sources, options) {
|
|
8
|
+
if (options.from === options.to) {
|
|
9
|
+
return err('UNSUPPORTED_CONVERSION', `The source and target formats are both "${options.from}". Choose different values for --from and --to.`);
|
|
10
|
+
}
|
|
11
|
+
if (sources.length === 0) {
|
|
12
|
+
return err('NO_INPUT_FILES', 'No input sources were provided to convert.');
|
|
13
|
+
}
|
|
14
|
+
// Resolve both adapters first so a bad format fails before any parsing work.
|
|
15
|
+
const parser = resolveParser(options.from);
|
|
16
|
+
if (!parser.ok) {
|
|
17
|
+
return parser;
|
|
18
|
+
}
|
|
19
|
+
const emitter = resolveEmitter(options.to);
|
|
20
|
+
if (!emitter.ok) {
|
|
21
|
+
return emitter;
|
|
22
|
+
}
|
|
23
|
+
const parsed = await parser.value(sources, options);
|
|
24
|
+
if (!parsed.ok) {
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
const emitted = emitter.value(parsed.value, options);
|
|
28
|
+
if (!emitted.ok) {
|
|
29
|
+
return emitted;
|
|
30
|
+
}
|
|
31
|
+
const warnings = [
|
|
32
|
+
...parsed.value.warnings,
|
|
33
|
+
...emitted.value.warnings,
|
|
34
|
+
];
|
|
35
|
+
const modelCount = parsed.value.models.length;
|
|
36
|
+
if (emitted.value.text === undefined) {
|
|
37
|
+
return ok({ output: '', files: emitted.value.files, warnings, modelCount });
|
|
38
|
+
}
|
|
39
|
+
return ok({ output: emitted.value.text, warnings, modelCount });
|
|
40
|
+
}
|
|
41
|
+
function resolveParser(name) {
|
|
42
|
+
const adapter = getFormat(name);
|
|
43
|
+
if (!adapter.ok) {
|
|
44
|
+
return adapter;
|
|
45
|
+
}
|
|
46
|
+
if (adapter.value.parse === undefined) {
|
|
47
|
+
return err('UNSUPPORTED_CONVERSION', `The format "${name}" can only be used as an output; it cannot be read as input.`);
|
|
48
|
+
}
|
|
49
|
+
return ok(adapter.value.parse);
|
|
50
|
+
}
|
|
51
|
+
function resolveEmitter(name) {
|
|
52
|
+
const adapter = getFormat(name);
|
|
53
|
+
if (!adapter.ok) {
|
|
54
|
+
return adapter;
|
|
55
|
+
}
|
|
56
|
+
if (adapter.value.emit === undefined) {
|
|
57
|
+
return err('UNSUPPORTED_CONVERSION', `The format "${name}" can only be used as an input; it cannot be written as output.`);
|
|
58
|
+
}
|
|
59
|
+
return ok(adapter.value.emit);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
|