stepzen 0.29.0 → 0.30.0-beta.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/README.md +417 -54
- package/lib/commands/import/curl.d.ts +48 -0
- package/lib/commands/import/curl.d.ts.map +1 -0
- package/lib/commands/import/curl.js +246 -0
- package/lib/commands/import/curl.js.map +1 -0
- package/lib/commands/import/graphql.d.ts +34 -0
- package/lib/commands/import/graphql.d.ts.map +1 -0
- package/lib/commands/import/graphql.js +118 -0
- package/lib/commands/import/graphql.js.map +1 -0
- package/lib/commands/import/index.d.ts +22 -0
- package/lib/commands/import/index.d.ts.map +1 -0
- package/lib/commands/import/index.js +165 -0
- package/lib/commands/import/index.js.map +1 -0
- package/lib/commands/import/mysql.d.ts +48 -0
- package/lib/commands/import/mysql.d.ts.map +1 -0
- package/lib/commands/import/mysql.js +145 -0
- package/lib/commands/import/mysql.js.map +1 -0
- package/lib/commands/import/postgresql.d.ts +51 -0
- package/lib/commands/import/postgresql.d.ts.map +1 -0
- package/lib/commands/import/postgresql.js +150 -0
- package/lib/commands/import/postgresql.js.map +1 -0
- package/lib/commands/import/presto.d.ts +49 -0
- package/lib/commands/import/presto.d.ts.map +1 -0
- package/lib/commands/import/presto.js +152 -0
- package/lib/commands/import/presto.js.map +1 -0
- package/lib/commands/import/snowflake.d.ts +53 -0
- package/lib/commands/import/snowflake.d.ts.map +1 -0
- package/lib/commands/import/snowflake.js +181 -0
- package/lib/commands/import/snowflake.js.map +1 -0
- package/lib/commands/list.d.ts.map +1 -1
- package/lib/commands/list.js +0 -2
- package/lib/commands/list.js.map +1 -1
- package/lib/commands/request.js +6 -6
- package/lib/commands/request.js.map +1 -1
- package/lib/commands/service.d.ts +1 -1
- package/lib/commands/service.d.ts.map +1 -1
- package/lib/commands/service.js +12 -12
- package/lib/commands/service.js.map +1 -1
- package/lib/generate/curl2sdl.d.ts +13 -25
- package/lib/generate/curl2sdl.d.ts.map +1 -1
- package/lib/generate/curl2sdl.js +52 -114
- package/lib/generate/curl2sdl.js.map +1 -1
- package/lib/generate/flags.d.ts +19 -0
- package/lib/generate/flags.d.ts.map +1 -0
- package/lib/generate/flags.js +74 -0
- package/lib/generate/flags.js.map +1 -0
- package/lib/generate/graphql2sdl.d.ts +5 -16
- package/lib/generate/graphql2sdl.d.ts.map +1 -1
- package/lib/generate/graphql2sdl.js +4 -49
- package/lib/generate/graphql2sdl.js.map +1 -1
- package/lib/generate/helpers.d.ts +5 -9
- package/lib/generate/helpers.d.ts.map +1 -1
- package/lib/generate/helpers.js +30 -37
- package/lib/generate/helpers.js.map +1 -1
- package/lib/generate/import-command.d.ts +25 -0
- package/lib/generate/import-command.d.ts.map +1 -0
- package/lib/generate/import-command.js +176 -0
- package/lib/generate/import-command.js.map +1 -0
- package/lib/generate/questions.d.ts +30 -0
- package/lib/generate/questions.d.ts.map +1 -0
- package/lib/generate/questions.js +50 -0
- package/lib/generate/questions.js.map +1 -0
- package/lib/generate/sql2sdl.d.ts +14 -18
- package/lib/generate/sql2sdl.d.ts.map +1 -1
- package/lib/generate/sql2sdl.js +29 -92
- package/lib/generate/sql2sdl.js.map +1 -1
- package/lib/hooks/prerun/check-upgrade.js +4 -4
- package/lib/hooks/prerun/check-upgrade.js.map +1 -1
- package/lib/shared/constants.d.ts +1 -0
- package/lib/shared/constants.d.ts.map +1 -1
- package/lib/shared/constants.js +2 -1
- package/lib/shared/constants.js.map +1 -1
- package/lib/shared/curl-parser.d.ts +3 -3
- package/lib/shared/curl-parser.d.ts.map +1 -1
- package/lib/shared/curl-parser.js +52 -39
- package/lib/shared/curl-parser.js.map +1 -1
- package/lib/shared/docker.d.ts +8 -36
- package/lib/shared/docker.d.ts.map +1 -1
- package/lib/shared/docker.js +44 -42
- package/lib/shared/docker.js.map +1 -1
- package/lib/shared/dsn-parser.d.ts +3 -0
- package/lib/shared/dsn-parser.d.ts.map +1 -0
- package/lib/shared/dsn-parser.js +28 -0
- package/lib/shared/dsn-parser.js.map +1 -0
- package/lib/shared/header-params-parser.d.ts +7 -5
- package/lib/shared/header-params-parser.d.ts.map +1 -1
- package/lib/shared/header-params-parser.js +55 -43
- package/lib/shared/header-params-parser.js.map +1 -1
- package/lib/shared/header.d.ts +2 -2
- package/lib/shared/header.d.ts.map +1 -1
- package/lib/shared/header.js +13 -7
- package/lib/shared/header.js.map +1 -1
- package/lib/shared/inquirer.d.ts +2 -0
- package/lib/shared/inquirer.d.ts.map +1 -1
- package/lib/shared/inquirer.js +12 -4
- package/lib/shared/inquirer.js.map +1 -1
- package/lib/shared/path-params-parser.d.ts +2 -2
- package/lib/shared/path-params-parser.d.ts.map +1 -1
- package/lib/shared/path-params-parser.js +11 -7
- package/lib/shared/path-params-parser.js.map +1 -1
- package/lib/shared/request-variables-parser.d.ts +2 -9
- package/lib/shared/request-variables-parser.d.ts.map +1 -1
- package/lib/shared/request-variables-parser.js +8 -8
- package/lib/shared/request-variables-parser.js.map +1 -1
- package/lib/shared/types.d.ts +33 -6
- package/lib/shared/types.d.ts.map +1 -1
- package/lib/shared/utils.d.ts +5 -13
- package/lib/shared/utils.d.ts.map +1 -1
- package/lib/shared/utils.js.map +1 -1
- package/oclif.manifest.json +684 -197
- package/package.json +6 -6
- package/lib/commands/import.d.ts +0 -85
- package/lib/commands/import.d.ts.map +0 -1
- package/lib/commands/import.js +0 -645
- package/lib/commands/import.js.map +0 -1
- package/lib/generate/index.d.ts +0 -6
- package/lib/generate/index.d.ts.map +0 -1
- package/lib/generate/index.js +0 -4
- package/lib/generate/index.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ImportCommandBase } from '../../generate/import-command';
|
|
2
|
+
import type { CommonImportOptions } from '../../generate/import-command';
|
|
3
|
+
import type { DBIntrospectionOptions, MysqlImportOptions } from '../../generate/sql2sdl';
|
|
4
|
+
import type { FlagsT } from '../../shared/types';
|
|
5
|
+
export declare type MySQLAnswers = Pick<MysqlImportOptions, 'host' | 'user' | 'password' | 'database' | 'linkTypes'>;
|
|
6
|
+
export default class ImportMySQL extends ImportCommandBase {
|
|
7
|
+
static description: string;
|
|
8
|
+
get source(): "mysql";
|
|
9
|
+
static aliases: string[];
|
|
10
|
+
static flags: {
|
|
11
|
+
'db-host': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
'db-user': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
13
|
+
'db-password': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
14
|
+
'db-database': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
15
|
+
'db-link-types': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
'db-include': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
17
|
+
'db-use-deprecated-2022-naming': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
dir: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
19
|
+
silent: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
21
|
+
overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
22
|
+
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
23
|
+
'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
24
|
+
};
|
|
25
|
+
static args: {
|
|
26
|
+
dsn: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
27
|
+
};
|
|
28
|
+
protected import(commonOptions: CommonImportOptions): Promise<import("../../shared/types").ErrorOr<import("../../generate/helpers").IntrospectionServiceResponse, {
|
|
29
|
+
message: string;
|
|
30
|
+
}>>;
|
|
31
|
+
getImportOptionsFromFlags(flags: FlagsT<typeof ImportMySQL>): {
|
|
32
|
+
host: string | undefined;
|
|
33
|
+
user: string | undefined;
|
|
34
|
+
password: string | undefined;
|
|
35
|
+
database: string | undefined;
|
|
36
|
+
linkTypes: boolean;
|
|
37
|
+
include: "tables-only" | "views-only" | "tables-and-views" | undefined;
|
|
38
|
+
introspectionOptions: DBIntrospectionOptions;
|
|
39
|
+
};
|
|
40
|
+
getImportOptionsFromDsn(possibleDsn: string): {
|
|
41
|
+
host: string;
|
|
42
|
+
user: string | undefined;
|
|
43
|
+
password: string | undefined;
|
|
44
|
+
database: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
getImportOptionsInteractively(defaults?: Partial<MySQLAnswers>): Promise<MySQLAnswers>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../src/commands/import/mysql.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,iBAAiB,EAAC,MAAM,+BAA+B,CAAA;AAQ/D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAU,MAAM,EAAC,MAAM,oBAAoB,CAAA;AAEvD,oBAAY,YAAY,GAAG,IAAI,CAC7B,kBAAkB,EAClB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CACxD,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,iBAAiB;IACxD,MAAM,CAAC,WAAW,SAMgC;IAElD,IAAI,MAAM,YAET;IAED,MAAM,CAAC,OAAO,WAAyB;IAEvC,MAAM,CAAC,KAAK;;;;;;;;;;;;;;MAUX;IAED,MAAM,CAAC,IAAI;;MASV;cAEe,MAAM,CAAC,aAAa,EAAE,mBAAmB;;;IAmFzD,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,WAAW,CAAC;;;;;;;;;IAmB3D,uBAAuB,CAAC,WAAW,EAAE,MAAM;;;;;;IAkBrC,6BAA6B,CACjC,QAAQ,GAAE,OAAO,CAAC,YAAY,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;CAczB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2020,2021,2022,2023, StepZen, Inc.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const errors_1 = require("@oclif/core/lib/errors");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const flags_1 = require("../../generate/flags");
|
|
9
|
+
const import_command_1 = require("../../generate/import-command");
|
|
10
|
+
const questions_1 = require("../../generate/questions");
|
|
11
|
+
const sql2sdl_1 = require("../../generate/sql2sdl");
|
|
12
|
+
const configuration_1 = require("../../shared/configuration");
|
|
13
|
+
const dsn_parser_1 = require("../../shared/dsn-parser");
|
|
14
|
+
const inquirer = require("../../shared/inquirer");
|
|
15
|
+
const utils_1 = require("../../shared/utils");
|
|
16
|
+
class ImportMySQL extends import_command_1.ImportCommandBase {
|
|
17
|
+
get source() {
|
|
18
|
+
return 'mysql';
|
|
19
|
+
}
|
|
20
|
+
async import(commonOptions) {
|
|
21
|
+
const { args, flags } = await this.parse(ImportMySQL);
|
|
22
|
+
const nonInteractiveOptions = {
|
|
23
|
+
...(args.dsn ? this.getImportOptionsFromDsn(args.dsn) : {}),
|
|
24
|
+
...this.getImportOptionsFromFlags(flags),
|
|
25
|
+
};
|
|
26
|
+
const requiredOptions = [
|
|
27
|
+
'host',
|
|
28
|
+
'user',
|
|
29
|
+
'password',
|
|
30
|
+
'database',
|
|
31
|
+
];
|
|
32
|
+
const hasRequiredOptions = requiredOptions.every(option => nonInteractiveOptions[option] !== undefined);
|
|
33
|
+
let sql2sdlOptions;
|
|
34
|
+
if (hasRequiredOptions) {
|
|
35
|
+
// an ugly hint for the TS compiler because it is not smart enough to figure this :(
|
|
36
|
+
const typedNonInteractiveOptions = nonInteractiveOptions;
|
|
37
|
+
// run non-interactively
|
|
38
|
+
sql2sdlOptions = {
|
|
39
|
+
dbType: this.source,
|
|
40
|
+
...commonOptions,
|
|
41
|
+
...typedNonInteractiveOptions,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (flags['non-interactive']) {
|
|
46
|
+
throw new errors_1.CLIError('Please provide a Data Source Name (DSN) string for a MySQL database.' +
|
|
47
|
+
chalk `\nSee more help with {bold stepzen import mysql --help}`);
|
|
48
|
+
}
|
|
49
|
+
// no parameters given: start an interactive prompt
|
|
50
|
+
if (!flags.silent) {
|
|
51
|
+
this.log();
|
|
52
|
+
this.log(chalk `{bold stepzen import mysql} - ` +
|
|
53
|
+
chalk.dim('introspect a MySQL database and extend your GraphQL schema' +
|
|
54
|
+
' with the types, queries and mutations for accessing it through' +
|
|
55
|
+
' a StepZen API.'));
|
|
56
|
+
this.log();
|
|
57
|
+
}
|
|
58
|
+
// one or more required parameters are missing: start an interactive prompt
|
|
59
|
+
const interactiveOptions = await this.getImportOptionsInteractively(nonInteractiveOptions);
|
|
60
|
+
sql2sdlOptions = {
|
|
61
|
+
dbType: this.source,
|
|
62
|
+
...commonOptions,
|
|
63
|
+
// Some options that may have been provided via the command line are
|
|
64
|
+
// excluded from the interactive prompts (e.g. `--db-include`). That's
|
|
65
|
+
// why the non-interactive options are also included here.
|
|
66
|
+
...nonInteractiveOptions,
|
|
67
|
+
...interactiveOptions,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const configuration = await (0, configuration_1.readConfiguration)();
|
|
71
|
+
sql2sdlOptions.host = (0, utils_1.rewriteLocalhostToHostGateway)(configuration, sql2sdlOptions.host);
|
|
72
|
+
return this.wrapInProgressAndTimeout((0, sql2sdl_1.sql2sdl)(sql2sdlOptions, configuration));
|
|
73
|
+
}
|
|
74
|
+
getImportOptionsFromFlags(flags) {
|
|
75
|
+
const options = {
|
|
76
|
+
host: flags['db-host'],
|
|
77
|
+
user: flags['db-user'],
|
|
78
|
+
password: flags['db-password'],
|
|
79
|
+
database: flags['db-database'],
|
|
80
|
+
linkTypes: flags['db-link-types'],
|
|
81
|
+
include: flags['db-include'],
|
|
82
|
+
introspectionOptions: {
|
|
83
|
+
// Use the 2023 naming convention by default, and the 2022 naming
|
|
84
|
+
// convention only if explicitly requested by the user.
|
|
85
|
+
naming: flags['db-use-deprecated-2022-naming'] ? '2022' : '2023',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
// Remove `undefined`-valued properties
|
|
89
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
90
|
+
}
|
|
91
|
+
getImportOptionsFromDsn(possibleDsn) {
|
|
92
|
+
const parsed = (0, dsn_parser_1.parseDsn)(possibleDsn);
|
|
93
|
+
if (parsed.success) {
|
|
94
|
+
const value = parsed.value;
|
|
95
|
+
const options = {
|
|
96
|
+
host: value.host + (value.port ? `:${value.port}` : ''),
|
|
97
|
+
user: value.user,
|
|
98
|
+
password: value.pass,
|
|
99
|
+
database: value.db,
|
|
100
|
+
};
|
|
101
|
+
// Remove `undefined`-valued properties
|
|
102
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
103
|
+
}
|
|
104
|
+
throw new errors_1.CLIError(parsed.message);
|
|
105
|
+
}
|
|
106
|
+
async getImportOptionsInteractively(defaults = {}) {
|
|
107
|
+
const questions = inquirer.overrideDefaults([
|
|
108
|
+
questions_1.ImportQuestions.dbHost(),
|
|
109
|
+
questions_1.ImportQuestions.dbUser(),
|
|
110
|
+
questions_1.ImportQuestions.dbPassword(),
|
|
111
|
+
questions_1.ImportQuestions.dbDatabase(),
|
|
112
|
+
questions_1.ImportQuestions.dbLinkTypes(),
|
|
113
|
+
], defaults);
|
|
114
|
+
return inquirer.prompt(`import-${this.source}`, questions);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.default = ImportMySQL;
|
|
118
|
+
ImportMySQL.description = `Import a schema for a MySQL data source into your GraphQL API.` +
|
|
119
|
+
`\n` +
|
|
120
|
+
chalk `\n{bold stepzen import mysql} automatically introspects a MySQL` +
|
|
121
|
+
` database, generates a GraphQL schema for accessing this database` +
|
|
122
|
+
` through a StepZen API, and merges the generated types, queries and` +
|
|
123
|
+
` mutations into your into your GraphQL schema.`;
|
|
124
|
+
ImportMySQL.aliases = ['import:singlestore'];
|
|
125
|
+
ImportMySQL.flags = {
|
|
126
|
+
...import_command_1.ImportCommandBase.flags,
|
|
127
|
+
'db-host': flags_1.ImportFlags.dbHost(),
|
|
128
|
+
'db-user': flags_1.ImportFlags.dbUser(),
|
|
129
|
+
'db-password': flags_1.ImportFlags.dbPassword(),
|
|
130
|
+
'db-database': flags_1.ImportFlags.dbDatabase(),
|
|
131
|
+
// 'db-schema': ImportFlags.dbSchema(), -- intentionally omitted (MySQL does not have schemas)
|
|
132
|
+
'db-link-types': flags_1.ImportFlags.dbLinkTypes(),
|
|
133
|
+
'db-include': flags_1.ImportFlags.dbInclude(),
|
|
134
|
+
'db-use-deprecated-2022-naming': flags_1.ImportFlags.dbUseDeprecatedNaming(),
|
|
135
|
+
};
|
|
136
|
+
ImportMySQL.args = {
|
|
137
|
+
dsn: core_1.Args.string({
|
|
138
|
+
description: chalk `{italic (optional)} Data Source Name (DSN) of a MySQL database.` +
|
|
139
|
+
chalk `\nExample: {bold mysql://user:password@host:port/database}` +
|
|
140
|
+
chalk `\n` +
|
|
141
|
+
chalk `\nFlags, such as {bold --db-host}, override the corresponding` +
|
|
142
|
+
chalk ` parts of the DSN (if both are provided).`,
|
|
143
|
+
}),
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../src/commands/import/mysql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ImportCommandBase } from '../../generate/import-command';
|
|
2
|
+
import type { CommonImportOptions } from '../../generate/import-command';
|
|
3
|
+
import type { DBIntrospectionOptions, PostgresqlImportOptions } from '../../generate/sql2sdl';
|
|
4
|
+
import type { FlagsT } from '../../shared/types';
|
|
5
|
+
export declare type PostgreSQLAnswers = Pick<PostgresqlImportOptions, 'host' | 'user' | 'password' | 'database' | 'schema' | 'linkTypes'>;
|
|
6
|
+
export default class ImportPostgreSQL extends ImportCommandBase {
|
|
7
|
+
static description: string;
|
|
8
|
+
get source(): "postgresql";
|
|
9
|
+
static aliases: string[];
|
|
10
|
+
static flags: {
|
|
11
|
+
'db-host': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
'db-user': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
13
|
+
'db-password': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
14
|
+
'db-database': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
15
|
+
'db-schema': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
16
|
+
'db-link-types': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
'db-include': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
18
|
+
'db-use-deprecated-2022-naming': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
dir: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
20
|
+
silent: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
21
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
22
|
+
overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
24
|
+
'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
};
|
|
26
|
+
static args: {
|
|
27
|
+
dsn: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
28
|
+
};
|
|
29
|
+
protected import(commonOptions: CommonImportOptions): Promise<import("../../shared/types").ErrorOr<import("../../generate/helpers").IntrospectionServiceResponse, {
|
|
30
|
+
message: string;
|
|
31
|
+
}>>;
|
|
32
|
+
getImportOptionsFromFlags(flags: FlagsT<typeof ImportPostgreSQL>): {
|
|
33
|
+
host: string | undefined;
|
|
34
|
+
user: string | undefined;
|
|
35
|
+
password: string | undefined;
|
|
36
|
+
database: string | undefined;
|
|
37
|
+
schema: string | undefined;
|
|
38
|
+
linkTypes: boolean;
|
|
39
|
+
include: "tables-only" | "views-only" | "tables-and-views" | undefined;
|
|
40
|
+
introspectionOptions: DBIntrospectionOptions;
|
|
41
|
+
};
|
|
42
|
+
getImportOptionsFromDsn(possibleDsn: string): {
|
|
43
|
+
host: string;
|
|
44
|
+
user: string | undefined;
|
|
45
|
+
password: string | undefined;
|
|
46
|
+
database: string | undefined;
|
|
47
|
+
schema: string | undefined;
|
|
48
|
+
};
|
|
49
|
+
getImportOptionsInteractively(defaults?: Partial<PostgreSQLAnswers>): Promise<PostgreSQLAnswers>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=postgresql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../src/commands/import/postgresql.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,iBAAiB,EAAC,MAAM,+BAA+B,CAAA;AAQ/D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAU,MAAM,EAAC,MAAM,oBAAoB,CAAA;AAEvD,oBAAY,iBAAiB,GAAG,IAAI,CAClC,uBAAuB,EACvB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CACnE,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,iBAAiB;IAC7D,MAAM,CAAC,WAAW,SAMkC;IAEpD,IAAI,MAAM,iBAET;IAED,MAAM,CAAC,OAAO,WAAsB;IAEpC,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;MAUX;IAED,MAAM,CAAC,IAAI;;MASV;cAEe,MAAM,CAAC,aAAa,EAAE,mBAAmB;;;IAmFzD,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,gBAAgB,CAAC;;;;;;;;;;IAoBhE,uBAAuB,CAAC,WAAW,EAAE,MAAM;;;;;;;IAsBrC,6BAA6B,CACjC,QAAQ,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACxC,OAAO,CAAC,iBAAiB,CAAC;CAe9B"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2020,2021,2022,2023, StepZen, Inc.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const errors_1 = require("@oclif/core/lib/errors");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const flags_1 = require("../../generate/flags");
|
|
9
|
+
const import_command_1 = require("../../generate/import-command");
|
|
10
|
+
const questions_1 = require("../../generate/questions");
|
|
11
|
+
const sql2sdl_1 = require("../../generate/sql2sdl");
|
|
12
|
+
const configuration_1 = require("../../shared/configuration");
|
|
13
|
+
const dsn_parser_1 = require("../../shared/dsn-parser");
|
|
14
|
+
const inquirer = require("../../shared/inquirer");
|
|
15
|
+
const utils_1 = require("../../shared/utils");
|
|
16
|
+
class ImportPostgreSQL extends import_command_1.ImportCommandBase {
|
|
17
|
+
get source() {
|
|
18
|
+
return 'postgresql';
|
|
19
|
+
}
|
|
20
|
+
async import(commonOptions) {
|
|
21
|
+
const { args, flags } = await this.parse(ImportPostgreSQL);
|
|
22
|
+
const nonInteractiveOptions = {
|
|
23
|
+
...(args.dsn ? this.getImportOptionsFromDsn(args.dsn) : {}),
|
|
24
|
+
...this.getImportOptionsFromFlags(flags),
|
|
25
|
+
};
|
|
26
|
+
const requiredOptions = [
|
|
27
|
+
'host',
|
|
28
|
+
'user',
|
|
29
|
+
'password',
|
|
30
|
+
'database',
|
|
31
|
+
];
|
|
32
|
+
const hasRequiredOptions = requiredOptions.every(option => nonInteractiveOptions[option] !== undefined);
|
|
33
|
+
let sql2sdlOptions;
|
|
34
|
+
if (hasRequiredOptions) {
|
|
35
|
+
// an ugly hint for the TS compiler because it is not smart enough to figure this :(
|
|
36
|
+
const typedNonInteractiveOptions = nonInteractiveOptions;
|
|
37
|
+
// run non-interactively
|
|
38
|
+
sql2sdlOptions = {
|
|
39
|
+
dbType: this.source,
|
|
40
|
+
...commonOptions,
|
|
41
|
+
...typedNonInteractiveOptions,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (flags['non-interactive']) {
|
|
46
|
+
throw new errors_1.CLIError('Please provide a Data Source Name (DSN) string for a PostgreSQL database.' +
|
|
47
|
+
chalk `\nSee more help with {bold stepzen import postgresql --help}`);
|
|
48
|
+
}
|
|
49
|
+
// no parameters given: start an interactive prompt
|
|
50
|
+
if (!flags.silent) {
|
|
51
|
+
this.log();
|
|
52
|
+
this.log(chalk `{bold stepzen import postgresql} - ` +
|
|
53
|
+
chalk.dim('introspect a PostgreSQL database and extend your GraphQL schema' +
|
|
54
|
+
' with the types, queries and mutations for accessing it through' +
|
|
55
|
+
' a StepZen API.'));
|
|
56
|
+
this.log();
|
|
57
|
+
}
|
|
58
|
+
// one or more required parameters are missing: start an interactive prompt
|
|
59
|
+
const interactiveOptions = await this.getImportOptionsInteractively(nonInteractiveOptions);
|
|
60
|
+
sql2sdlOptions = {
|
|
61
|
+
dbType: this.source,
|
|
62
|
+
...commonOptions,
|
|
63
|
+
// Some options that may have been provided via the command line are
|
|
64
|
+
// excluded from the interactive prompts (e.g. `--db-include`). That's
|
|
65
|
+
// why the non-interactive options are also included here.
|
|
66
|
+
...nonInteractiveOptions,
|
|
67
|
+
...interactiveOptions,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const configuration = await (0, configuration_1.readConfiguration)();
|
|
71
|
+
sql2sdlOptions.host = (0, utils_1.rewriteLocalhostToHostGateway)(configuration, sql2sdlOptions.host);
|
|
72
|
+
return this.wrapInProgressAndTimeout((0, sql2sdl_1.sql2sdl)(sql2sdlOptions, configuration));
|
|
73
|
+
}
|
|
74
|
+
getImportOptionsFromFlags(flags) {
|
|
75
|
+
const options = {
|
|
76
|
+
host: flags['db-host'],
|
|
77
|
+
user: flags['db-user'],
|
|
78
|
+
password: flags['db-password'],
|
|
79
|
+
database: flags['db-database'],
|
|
80
|
+
schema: flags['db-schema'],
|
|
81
|
+
linkTypes: flags['db-link-types'],
|
|
82
|
+
include: flags['db-include'],
|
|
83
|
+
introspectionOptions: {
|
|
84
|
+
// Use the 2023 naming convention by default, and the 2022 naming
|
|
85
|
+
// convention only if explicitly requested by the user.
|
|
86
|
+
naming: flags['db-use-deprecated-2022-naming'] ? '2022' : '2023',
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
// Remove `undefined`-valued properties
|
|
90
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
91
|
+
}
|
|
92
|
+
getImportOptionsFromDsn(possibleDsn) {
|
|
93
|
+
const parsed = (0, dsn_parser_1.parseDsn)(possibleDsn);
|
|
94
|
+
if (parsed.success) {
|
|
95
|
+
const value = parsed.value;
|
|
96
|
+
const options = {
|
|
97
|
+
host: value.host + (value.port ? `:${value.port}` : ''),
|
|
98
|
+
user: value.user,
|
|
99
|
+
password: value.pass,
|
|
100
|
+
database: value.db,
|
|
101
|
+
schema: value.params?.schema === undefined
|
|
102
|
+
? undefined
|
|
103
|
+
: `${value.params?.schema}`,
|
|
104
|
+
};
|
|
105
|
+
// Remove `undefined`-valued properties
|
|
106
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
107
|
+
}
|
|
108
|
+
throw new errors_1.CLIError(parsed.message);
|
|
109
|
+
}
|
|
110
|
+
async getImportOptionsInteractively(defaults = {}) {
|
|
111
|
+
const questions = inquirer.overrideDefaults([
|
|
112
|
+
questions_1.ImportQuestions.dbHost(),
|
|
113
|
+
questions_1.ImportQuestions.dbUser(),
|
|
114
|
+
questions_1.ImportQuestions.dbPassword(),
|
|
115
|
+
questions_1.ImportQuestions.dbDatabase(),
|
|
116
|
+
questions_1.ImportQuestions.dbSchema(),
|
|
117
|
+
questions_1.ImportQuestions.dbLinkTypes(),
|
|
118
|
+
], defaults);
|
|
119
|
+
return inquirer.prompt(`import-${this.source}`, questions);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.default = ImportPostgreSQL;
|
|
123
|
+
ImportPostgreSQL.description = `Import a schema for a PostgreSQL data source into your GraphQL API.` +
|
|
124
|
+
`\n` +
|
|
125
|
+
chalk `\n{bold stepzen import postgresql} automatically introspects a` +
|
|
126
|
+
` PostgreSQL database, generates a GraphQL schema for accessing this` +
|
|
127
|
+
` database through a StepZen API, and merges the generated types,` +
|
|
128
|
+
` queries and mutations into your GraphQL schema.`;
|
|
129
|
+
ImportPostgreSQL.aliases = ['import:postgres'];
|
|
130
|
+
ImportPostgreSQL.flags = {
|
|
131
|
+
...import_command_1.ImportCommandBase.flags,
|
|
132
|
+
'db-host': flags_1.ImportFlags.dbHost(),
|
|
133
|
+
'db-user': flags_1.ImportFlags.dbUser(),
|
|
134
|
+
'db-password': flags_1.ImportFlags.dbPassword(),
|
|
135
|
+
'db-database': flags_1.ImportFlags.dbDatabase(),
|
|
136
|
+
'db-schema': flags_1.ImportFlags.dbSchema(),
|
|
137
|
+
'db-link-types': flags_1.ImportFlags.dbLinkTypes(),
|
|
138
|
+
'db-include': flags_1.ImportFlags.dbInclude(),
|
|
139
|
+
'db-use-deprecated-2022-naming': flags_1.ImportFlags.dbUseDeprecatedNaming(),
|
|
140
|
+
};
|
|
141
|
+
ImportPostgreSQL.args = {
|
|
142
|
+
dsn: core_1.Args.string({
|
|
143
|
+
description: chalk `{italic (optional)} Data Source Name (DSN) of a PostgreSQL database.` +
|
|
144
|
+
chalk `\nExample: {bold postgresql://user:password@host:port/database?schema=schema}` +
|
|
145
|
+
chalk `\n` +
|
|
146
|
+
chalk `\nFlags, such as {bold --db-host}, override the corresponding` +
|
|
147
|
+
chalk ` parts of the DSN (if both are provided).`,
|
|
148
|
+
}),
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=postgresql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../../src/commands/import/postgresql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ImportCommandBase } from '../../generate/import-command';
|
|
2
|
+
import type { CommonImportOptions } from '../../generate/import-command';
|
|
3
|
+
import type { PrestoImportOptions } from '../../generate/sql2sdl';
|
|
4
|
+
import type { FlagsT } from '../../shared/types';
|
|
5
|
+
export declare type PrestoAnswers = Pick<PrestoImportOptions, 'host' | 'user' | 'password' | 'catalog' | 'schema' | 'linkTypes'>;
|
|
6
|
+
export default class ImportPresto extends ImportCommandBase {
|
|
7
|
+
static description: string;
|
|
8
|
+
get source(): "presto";
|
|
9
|
+
static hidden: boolean;
|
|
10
|
+
static flags: {
|
|
11
|
+
'db-host': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
'db-user': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
13
|
+
'db-password': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
14
|
+
'db-catalog': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
15
|
+
'db-schema': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
16
|
+
'db-link-types': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
'db-include': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
18
|
+
dir: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
19
|
+
silent: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
21
|
+
overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
22
|
+
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
23
|
+
'non-interactive': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
24
|
+
};
|
|
25
|
+
static args: {
|
|
26
|
+
dsn: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
27
|
+
};
|
|
28
|
+
protected import(commonOptions: CommonImportOptions): Promise<import("../../shared/types").ErrorOr<import("../../generate/helpers").IntrospectionServiceResponse, {
|
|
29
|
+
message: string;
|
|
30
|
+
}>>;
|
|
31
|
+
getImportOptionsFromFlags(flags: FlagsT<typeof ImportPresto>): {
|
|
32
|
+
host: string | undefined;
|
|
33
|
+
user: string | undefined;
|
|
34
|
+
password: string | undefined;
|
|
35
|
+
catalog: string | undefined;
|
|
36
|
+
schema: string | undefined;
|
|
37
|
+
linkTypes: boolean;
|
|
38
|
+
include: "tables-only" | "views-only" | "tables-and-views" | undefined;
|
|
39
|
+
};
|
|
40
|
+
getImportOptionsFromDsn(possibleDsn: string): {
|
|
41
|
+
host: string;
|
|
42
|
+
user: string | undefined;
|
|
43
|
+
password: string | undefined;
|
|
44
|
+
catalog: string | undefined;
|
|
45
|
+
schema: string | number | boolean | undefined;
|
|
46
|
+
};
|
|
47
|
+
getImportOptionsInteractively(defaults?: Partial<PrestoAnswers>): Promise<PrestoAnswers>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=presto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presto.d.ts","sourceRoot":"","sources":["../../../src/commands/import/presto.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,iBAAiB,EAAC,MAAM,+BAA+B,CAAA;AAU/D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAU,MAAM,EAAC,MAAM,oBAAoB,CAAA;AAEvD,oBAAY,aAAa,GAAG,IAAI,CAC9B,mBAAmB,EACnB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAClE,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,iBAAiB;IACzD,MAAM,CAAC,WAAW,SAMgC;IAElD,IAAI,MAAM,aAET;IAGD,MAAM,CAAC,MAAM,UAAwC;IAErD,MAAM,CAAC,KAAK;;;;;;;;;;;;;;MAYX;IAED,MAAM,CAAC,IAAI;;MASV;cAEe,MAAM,CAAC,aAAa,EAAE,mBAAmB;;;IAoFzD,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAY,CAAC;;;;;;;;;IAe5D,uBAAuB,CAAC,WAAW,EAAE,MAAM;;;;;;;IAmBrC,6BAA6B,CACjC,QAAQ,GAAE,OAAO,CAAC,aAAa,CAAM,GACpC,OAAO,CAAC,aAAa,CAAC;CAoB1B"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2020,2021,2022,2023, StepZen, Inc.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const errors_1 = require("@oclif/core/lib/errors");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const flags_1 = require("../../generate/flags");
|
|
9
|
+
const import_command_1 = require("../../generate/import-command");
|
|
10
|
+
const questions_1 = require("../../generate/questions");
|
|
11
|
+
const sql2sdl_1 = require("../../generate/sql2sdl");
|
|
12
|
+
const configuration_1 = require("../../shared/configuration");
|
|
13
|
+
const constants_1 = require("../../shared/constants");
|
|
14
|
+
const dsn_parser_1 = require("../../shared/dsn-parser");
|
|
15
|
+
const inquirer = require("../../shared/inquirer");
|
|
16
|
+
const utils_1 = require("../../shared/utils");
|
|
17
|
+
class ImportPresto extends import_command_1.ImportCommandBase {
|
|
18
|
+
get source() {
|
|
19
|
+
return 'presto';
|
|
20
|
+
}
|
|
21
|
+
async import(commonOptions) {
|
|
22
|
+
const { args, flags } = await this.parse(ImportPresto);
|
|
23
|
+
const nonInteractiveOptions = {
|
|
24
|
+
...(args.dsn ? this.getImportOptionsFromDsn(args.dsn) : {}),
|
|
25
|
+
...this.getImportOptionsFromFlags(flags),
|
|
26
|
+
};
|
|
27
|
+
const requiredOptions = [
|
|
28
|
+
'host',
|
|
29
|
+
'user',
|
|
30
|
+
'password',
|
|
31
|
+
'catalog',
|
|
32
|
+
'schema',
|
|
33
|
+
];
|
|
34
|
+
const hasRequiredOptions = requiredOptions.every(option => nonInteractiveOptions[option] !== undefined);
|
|
35
|
+
let sql2sdlOptions;
|
|
36
|
+
if (hasRequiredOptions) {
|
|
37
|
+
// an ugly hint for the TS compiler because it is not smart enough to figure this :(
|
|
38
|
+
const typedNonInteractiveOptions = nonInteractiveOptions;
|
|
39
|
+
// run non-interactively
|
|
40
|
+
sql2sdlOptions = {
|
|
41
|
+
dbType: this.source,
|
|
42
|
+
...commonOptions,
|
|
43
|
+
...typedNonInteractiveOptions,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
if (flags['non-interactive']) {
|
|
48
|
+
throw new errors_1.CLIError('Please provide a complete Data Source Name (DSN) string for a Presto database.' +
|
|
49
|
+
chalk `\nSee more help with {bold stepzen import presto --help}`);
|
|
50
|
+
}
|
|
51
|
+
// no parameters given: start an interactive prompt
|
|
52
|
+
if (!flags.silent) {
|
|
53
|
+
this.log();
|
|
54
|
+
this.log(chalk `{bold stepzen import presto} - ` +
|
|
55
|
+
chalk.dim('introspect a Presto database and extend your GraphQL schema' +
|
|
56
|
+
' with the types, queries and mutations for accessing it through' +
|
|
57
|
+
' a StepZen API.'));
|
|
58
|
+
this.log();
|
|
59
|
+
}
|
|
60
|
+
// one or more required parameters are missing: start an interactive prompt
|
|
61
|
+
const interactiveOptions = await this.getImportOptionsInteractively(nonInteractiveOptions);
|
|
62
|
+
sql2sdlOptions = {
|
|
63
|
+
dbType: this.source,
|
|
64
|
+
...commonOptions,
|
|
65
|
+
// Some options that may have been provided via the command line are
|
|
66
|
+
// excluded from the interactive prompts (e.g. `--db-include`). That's
|
|
67
|
+
// why the non-interactive options are also included here.
|
|
68
|
+
...nonInteractiveOptions,
|
|
69
|
+
...interactiveOptions,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const configuration = await (0, configuration_1.readConfiguration)();
|
|
73
|
+
sql2sdlOptions.host = (0, utils_1.rewriteLocalhostToHostGateway)(configuration, sql2sdlOptions.host);
|
|
74
|
+
return this.wrapInProgressAndTimeout((0, sql2sdl_1.sql2sdl)(sql2sdlOptions, configuration));
|
|
75
|
+
}
|
|
76
|
+
getImportOptionsFromFlags(flags) {
|
|
77
|
+
const options = {
|
|
78
|
+
host: flags['db-host'],
|
|
79
|
+
user: flags['db-user'],
|
|
80
|
+
password: flags['db-password'],
|
|
81
|
+
catalog: flags['db-catalog'],
|
|
82
|
+
schema: flags['db-schema'],
|
|
83
|
+
linkTypes: flags['db-link-types'],
|
|
84
|
+
include: flags['db-include'],
|
|
85
|
+
};
|
|
86
|
+
// Remove `undefined`-valued properties
|
|
87
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
88
|
+
}
|
|
89
|
+
getImportOptionsFromDsn(possibleDsn) {
|
|
90
|
+
const parsed = (0, dsn_parser_1.parseDsn)(possibleDsn);
|
|
91
|
+
if (parsed.success) {
|
|
92
|
+
const value = parsed.value;
|
|
93
|
+
const options = {
|
|
94
|
+
host: value.host + (value.port ? `:${value.port}` : ''),
|
|
95
|
+
user: value.user,
|
|
96
|
+
password: value.pass,
|
|
97
|
+
catalog: value.db,
|
|
98
|
+
schema: value.params?.schema,
|
|
99
|
+
};
|
|
100
|
+
// Remove `undefined`-valued properties
|
|
101
|
+
return (0, lodash_1.pickBy)(options, value => value !== undefined);
|
|
102
|
+
}
|
|
103
|
+
throw new errors_1.CLIError(parsed.message);
|
|
104
|
+
}
|
|
105
|
+
async getImportOptionsInteractively(defaults = {}) {
|
|
106
|
+
const questions = inquirer.overrideDefaults([
|
|
107
|
+
questions_1.ImportQuestions.dbHost(),
|
|
108
|
+
questions_1.ImportQuestions.dbUser(),
|
|
109
|
+
questions_1.ImportQuestions.dbPassword(),
|
|
110
|
+
{
|
|
111
|
+
name: 'catalog',
|
|
112
|
+
message: 'What is your Presto catalog name?',
|
|
113
|
+
validate: input => input.trim() !== '' || 'Catalog name must not be empty',
|
|
114
|
+
},
|
|
115
|
+
questions_1.ImportQuestions.dbSchema({ required: true }),
|
|
116
|
+
questions_1.ImportQuestions.dbLinkTypes(),
|
|
117
|
+
], defaults);
|
|
118
|
+
return inquirer.prompt(`import-${this.source}`, questions);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.default = ImportPresto;
|
|
122
|
+
ImportPresto.description = `Import a schema for a Presto data source into your GraphQL API.` +
|
|
123
|
+
`\n` +
|
|
124
|
+
chalk `\n{bold stepzen import presto} automatically introspects a Presto` +
|
|
125
|
+
` database, generates a GraphQL schema for accessing this database` +
|
|
126
|
+
` through a StepZen API, and merges the generated types, queries and` +
|
|
127
|
+
` mutations into your into your GraphQL schema.`;
|
|
128
|
+
// the GA version of the introspection service does not support Presto yet
|
|
129
|
+
ImportPresto.hidden = !(0, utils_1.getFeatureFlag)(constants_1.ENABLE_PRESTO_IMPORT);
|
|
130
|
+
ImportPresto.flags = {
|
|
131
|
+
...import_command_1.ImportCommandBase.flags,
|
|
132
|
+
'db-host': flags_1.ImportFlags.dbHost(),
|
|
133
|
+
'db-user': flags_1.ImportFlags.dbUser(),
|
|
134
|
+
'db-password': flags_1.ImportFlags.dbPassword(),
|
|
135
|
+
// 'db-database': ImportFlags.dbDatabase(), -- intentionally omitted (Presto does not have databases)
|
|
136
|
+
'db-catalog': core_1.Flags.string({
|
|
137
|
+
description: 'Name of the catalog to import',
|
|
138
|
+
}),
|
|
139
|
+
'db-schema': flags_1.ImportFlags.dbSchema(),
|
|
140
|
+
'db-link-types': flags_1.ImportFlags.dbLinkTypes(),
|
|
141
|
+
'db-include': flags_1.ImportFlags.dbInclude(),
|
|
142
|
+
};
|
|
143
|
+
ImportPresto.args = {
|
|
144
|
+
dsn: core_1.Args.string({
|
|
145
|
+
description: chalk `{italic (optional)} Data Source Name (DSN) of a Presto data source.` +
|
|
146
|
+
chalk `\nExample: {bold presto://user:password@host:port/catalog}` +
|
|
147
|
+
chalk `\n` +
|
|
148
|
+
chalk `\nFlags, such as {bold --db-host}, override the corresponding` +
|
|
149
|
+
chalk ` parts of the DSN (if both are provided).`,
|
|
150
|
+
}),
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=presto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presto.js","sourceRoot":"","sources":["../../../src/commands/import/presto.ts"],"names":[],"mappings":"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"}
|