@squadbase/vite-server 0.1.12-dev.a9ac647 → 0.1.17-dev.24af54e
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/dist/cli/index.js +12374 -883
- package/dist/connectors/airtable-oauth.js +257 -46
- package/dist/connectors/airtable.js +294 -51
- package/dist/connectors/amplitude.js +297 -47
- package/dist/connectors/anthropic.js +135 -47
- package/dist/connectors/asana.js +302 -49
- package/dist/connectors/attio.js +277 -49
- package/dist/connectors/aws-billing.js +262 -46
- package/dist/connectors/azure-sql.js +396 -102
- package/dist/connectors/backlog-api-key.js +292 -47
- package/dist/connectors/clickup.js +313 -49
- package/dist/connectors/cosmosdb.js +280 -50
- package/dist/connectors/customerio.js +294 -47
- package/dist/connectors/dbt.js +315 -47
- package/dist/connectors/freshdesk.js +317 -53
- package/dist/connectors/freshsales.js +308 -52
- package/dist/connectors/freshservice.js +336 -53
- package/dist/connectors/gamma.js +302 -52
- package/dist/connectors/gemini.js +134 -47
- package/dist/connectors/github.js +361 -49
- package/dist/connectors/gmail-oauth.js +179 -7
- package/dist/connectors/gmail.js +325 -47
- package/dist/connectors/google-ads.js +263 -46
- package/dist/connectors/google-analytics-oauth.js +285 -46
- package/dist/connectors/google-analytics.js +387 -49
- package/dist/connectors/google-audit-log.js +413 -47
- package/dist/connectors/google-calendar-oauth.js +234 -46
- package/dist/connectors/google-calendar.js +334 -47
- package/dist/connectors/google-docs.js +195 -6
- package/dist/connectors/google-drive.js +237 -5
- package/dist/connectors/google-search-console-oauth.js +231 -46
- package/dist/connectors/google-sheets.js +247 -47
- package/dist/connectors/google-slides.js +180 -6
- package/dist/connectors/grafana.js +307 -49
- package/dist/connectors/hubspot-oauth.js +183 -5
- package/dist/connectors/hubspot.js +281 -49
- package/dist/connectors/influxdb.js +391 -51
- package/dist/connectors/intercom-oauth.js +185 -5
- package/dist/connectors/intercom.js +277 -49
- package/dist/connectors/jdbc.js +737 -110
- package/dist/connectors/jira-api-key.js +301 -47
- package/dist/connectors/kintone-api-token.js +256 -47
- package/dist/connectors/kintone.js +303 -47
- package/dist/connectors/linear.js +305 -49
- package/dist/connectors/linkedin-ads.js +243 -50
- package/dist/connectors/mailchimp-oauth.js +243 -46
- package/dist/connectors/mailchimp.js +295 -49
- package/dist/connectors/meta-ads-oauth.js +248 -48
- package/dist/connectors/meta-ads.js +260 -50
- package/dist/connectors/mixpanel.js +313 -47
- package/dist/connectors/monday.js +335 -49
- package/dist/connectors/mongodb.js +294 -57
- package/dist/connectors/notion-oauth.js +206 -5
- package/dist/connectors/notion.js +298 -51
- package/dist/connectors/openai.js +134 -47
- package/dist/connectors/oracle.js +414 -103
- package/dist/connectors/outlook-oauth.js +179 -5
- package/dist/connectors/powerbi-oauth.js +226 -5
- package/dist/connectors/salesforce.js +359 -49
- package/dist/connectors/semrush.js +289 -49
- package/dist/connectors/sentry.js +264 -50
- package/dist/connectors/shopify-oauth.js +162 -5
- package/dist/connectors/shopify.js +332 -47
- package/dist/connectors/sqlserver.js +390 -102
- package/dist/connectors/stripe-api-key.js +244 -46
- package/dist/connectors/stripe-oauth.js +177 -5
- package/dist/connectors/supabase.js +278 -48
- package/dist/connectors/tableau.js +389 -184
- package/dist/connectors/tiktok-ads.js +254 -48
- package/dist/connectors/wix-store.js +295 -49
- package/dist/connectors/zendesk-oauth.js +214 -5
- package/dist/connectors/zendesk.js +333 -47
- package/dist/index.d.ts +149 -1
- package/dist/index.js +13677 -1969
- package/dist/main.js +13627 -1927
- package/dist/vite-plugin.js +12391 -890
- package/package.json +1 -1
|
@@ -1,101 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description;
|
|
6
|
-
envVarBaseKey;
|
|
7
|
-
type;
|
|
8
|
-
secret;
|
|
9
|
-
required;
|
|
10
|
-
constructor(config) {
|
|
11
|
-
this.slug = config.slug;
|
|
12
|
-
this.name = config.name;
|
|
13
|
-
this.description = config.description;
|
|
14
|
-
this.envVarBaseKey = config.envVarBaseKey;
|
|
15
|
-
this.type = config.type;
|
|
16
|
-
this.secret = config.secret;
|
|
17
|
-
this.required = config.required;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Get the parameter value from a ConnectorConnectionObject.
|
|
21
|
-
*/
|
|
22
|
-
getValue(connection2) {
|
|
23
|
-
const param = connection2.parameters.find(
|
|
24
|
-
(p) => p.parameterSlug === this.slug
|
|
25
|
-
);
|
|
26
|
-
if (!param || param.value == null) {
|
|
27
|
-
throw new Error(
|
|
28
|
-
`Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
return param.value;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Try to get the parameter value. Returns undefined if not found (for optional params).
|
|
35
|
-
*/
|
|
36
|
-
tryGetValue(connection2) {
|
|
37
|
-
const param = connection2.parameters.find(
|
|
38
|
-
(p) => p.parameterSlug === this.slug
|
|
39
|
-
);
|
|
40
|
-
if (!param || param.value == null) return void 0;
|
|
41
|
-
return param.value;
|
|
42
|
-
}
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __esm = (fn, res) => function __init() {
|
|
4
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
43
5
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
sshHost: new ParameterDefinition({
|
|
48
|
-
slug: "ssh-host",
|
|
49
|
-
name: "SSH Tunnel Host",
|
|
50
|
-
description: "Optional. Hostname of the SSH bastion to tunnel through. Leave empty to connect directly.",
|
|
51
|
-
envVarBaseKey: "SSH_TUNNEL_HOST",
|
|
52
|
-
type: "text",
|
|
53
|
-
secret: false,
|
|
54
|
-
required: false
|
|
55
|
-
}),
|
|
56
|
-
sshPort: new ParameterDefinition({
|
|
57
|
-
slug: "ssh-port",
|
|
58
|
-
name: "SSH Tunnel Port",
|
|
59
|
-
description: "Optional. SSH port of the bastion host (default: 22).",
|
|
60
|
-
envVarBaseKey: "SSH_TUNNEL_PORT",
|
|
61
|
-
type: "text",
|
|
62
|
-
secret: false,
|
|
63
|
-
required: false
|
|
64
|
-
}),
|
|
65
|
-
sshUsername: new ParameterDefinition({
|
|
66
|
-
slug: "ssh-username",
|
|
67
|
-
name: "SSH Tunnel Username",
|
|
68
|
-
description: "Optional. Username for SSH authentication. Required when SSH Tunnel Host is set.",
|
|
69
|
-
envVarBaseKey: "SSH_TUNNEL_USERNAME",
|
|
70
|
-
type: "text",
|
|
71
|
-
secret: false,
|
|
72
|
-
required: false
|
|
73
|
-
}),
|
|
74
|
-
sshPrivateKeyBase64: new ParameterDefinition({
|
|
75
|
-
slug: "ssh-private-key-base64",
|
|
76
|
-
name: "SSH Private Key",
|
|
77
|
-
description: "Optional. Private key (PEM, base64-encoded) used for SSH authentication. Required when SSH Tunnel Host is set.",
|
|
78
|
-
envVarBaseKey: "SSH_TUNNEL_PRIVATE_KEY_BASE64",
|
|
79
|
-
type: "base64EncodedText",
|
|
80
|
-
secret: true,
|
|
81
|
-
required: false
|
|
82
|
-
}),
|
|
83
|
-
sshPassphrase: new ParameterDefinition({
|
|
84
|
-
slug: "ssh-passphrase",
|
|
85
|
-
name: "SSH Private Key Passphrase",
|
|
86
|
-
description: "Optional. Passphrase for the SSH private key, if it is encrypted.",
|
|
87
|
-
envVarBaseKey: "SSH_TUNNEL_PASSPHRASE",
|
|
88
|
-
type: "text",
|
|
89
|
-
secret: true,
|
|
90
|
-
required: false
|
|
91
|
-
})
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
92
9
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
10
|
+
|
|
11
|
+
// ../connectors/src/parameter-definition.ts
|
|
12
|
+
var ParameterDefinition;
|
|
13
|
+
var init_parameter_definition = __esm({
|
|
14
|
+
"../connectors/src/parameter-definition.ts"() {
|
|
15
|
+
"use strict";
|
|
16
|
+
ParameterDefinition = class {
|
|
17
|
+
slug;
|
|
18
|
+
name;
|
|
19
|
+
description;
|
|
20
|
+
envVarBaseKey;
|
|
21
|
+
type;
|
|
22
|
+
secret;
|
|
23
|
+
required;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.slug = config.slug;
|
|
26
|
+
this.name = config.name;
|
|
27
|
+
this.description = config.description;
|
|
28
|
+
this.envVarBaseKey = config.envVarBaseKey;
|
|
29
|
+
this.type = config.type;
|
|
30
|
+
this.secret = config.secret;
|
|
31
|
+
this.required = config.required;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the parameter value from a ConnectorConnectionObject.
|
|
35
|
+
*/
|
|
36
|
+
getValue(connection2) {
|
|
37
|
+
const param = connection2.parameters.find(
|
|
38
|
+
(p) => p.parameterSlug === this.slug
|
|
39
|
+
);
|
|
40
|
+
if (!param || param.value == null) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return param.value;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Try to get the parameter value. Returns undefined if not found (for optional params).
|
|
49
|
+
*/
|
|
50
|
+
tryGetValue(connection2) {
|
|
51
|
+
const param = connection2.parameters.find(
|
|
52
|
+
(p) => p.parameterSlug === this.slug
|
|
53
|
+
);
|
|
54
|
+
if (!param || param.value == null) return void 0;
|
|
55
|
+
return param.value;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
97
58
|
}
|
|
98
59
|
});
|
|
60
|
+
|
|
61
|
+
// ../connectors/src/lib/ssh-tunnel.ts
|
|
99
62
|
function connectionParamsToRecord(connection2) {
|
|
100
63
|
const out = {};
|
|
101
64
|
for (const p of connection2.parameters) {
|
|
@@ -166,11 +129,68 @@ async function maybeOpenSshTunnelHostPort(params, dbHost, dbPort) {
|
|
|
166
129
|
}
|
|
167
130
|
};
|
|
168
131
|
}
|
|
132
|
+
var sshTunnelParameters, NOOP_TUNNEL_HOSTPORT;
|
|
133
|
+
var init_ssh_tunnel = __esm({
|
|
134
|
+
"../connectors/src/lib/ssh-tunnel.ts"() {
|
|
135
|
+
"use strict";
|
|
136
|
+
init_parameter_definition();
|
|
137
|
+
sshTunnelParameters = {
|
|
138
|
+
sshHost: new ParameterDefinition({
|
|
139
|
+
slug: "ssh-host",
|
|
140
|
+
name: "SSH Tunnel Host",
|
|
141
|
+
description: "Optional. Hostname of the SSH bastion to tunnel through. Leave empty to connect directly.",
|
|
142
|
+
envVarBaseKey: "SSH_TUNNEL_HOST",
|
|
143
|
+
type: "text",
|
|
144
|
+
secret: false,
|
|
145
|
+
required: false
|
|
146
|
+
}),
|
|
147
|
+
sshPort: new ParameterDefinition({
|
|
148
|
+
slug: "ssh-port",
|
|
149
|
+
name: "SSH Tunnel Port",
|
|
150
|
+
description: "Optional. SSH port of the bastion host (default: 22).",
|
|
151
|
+
envVarBaseKey: "SSH_TUNNEL_PORT",
|
|
152
|
+
type: "text",
|
|
153
|
+
secret: false,
|
|
154
|
+
required: false
|
|
155
|
+
}),
|
|
156
|
+
sshUsername: new ParameterDefinition({
|
|
157
|
+
slug: "ssh-username",
|
|
158
|
+
name: "SSH Tunnel Username",
|
|
159
|
+
description: "Optional. Username for SSH authentication. Required when SSH Tunnel Host is set.",
|
|
160
|
+
envVarBaseKey: "SSH_TUNNEL_USERNAME",
|
|
161
|
+
type: "text",
|
|
162
|
+
secret: false,
|
|
163
|
+
required: false
|
|
164
|
+
}),
|
|
165
|
+
sshPrivateKeyBase64: new ParameterDefinition({
|
|
166
|
+
slug: "ssh-private-key-base64",
|
|
167
|
+
name: "SSH Private Key",
|
|
168
|
+
description: "Optional. Private key (PEM, base64-encoded) used for SSH authentication. Required when SSH Tunnel Host is set.",
|
|
169
|
+
envVarBaseKey: "SSH_TUNNEL_PRIVATE_KEY_BASE64",
|
|
170
|
+
type: "base64EncodedText",
|
|
171
|
+
secret: true,
|
|
172
|
+
required: false
|
|
173
|
+
}),
|
|
174
|
+
sshPassphrase: new ParameterDefinition({
|
|
175
|
+
slug: "ssh-passphrase",
|
|
176
|
+
name: "SSH Private Key Passphrase",
|
|
177
|
+
description: "Optional. Passphrase for the SSH private key, if it is encrypted.",
|
|
178
|
+
envVarBaseKey: "SSH_TUNNEL_PASSPHRASE",
|
|
179
|
+
type: "text",
|
|
180
|
+
secret: true,
|
|
181
|
+
required: false
|
|
182
|
+
})
|
|
183
|
+
};
|
|
184
|
+
NOOP_TUNNEL_HOSTPORT = (host, port) => ({
|
|
185
|
+
host,
|
|
186
|
+
port,
|
|
187
|
+
close: async () => {
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
});
|
|
169
192
|
|
|
170
193
|
// ../connectors/src/connectors/oracle/utils.ts
|
|
171
|
-
var JDBC_THIN_PREFIX_RE = /^jdbc:oracle:thin:/i;
|
|
172
|
-
var JDBC_OCI_PREFIX_RE = /^jdbc:oracle:oci/i;
|
|
173
|
-
var URL_PREFIX_RE = /^oracle:\/\//i;
|
|
174
194
|
function parseOracleJdbcUrl(jdbcUrl, options = {}) {
|
|
175
195
|
const trimmed = jdbcUrl.trim();
|
|
176
196
|
if (JDBC_OCI_PREFIX_RE.test(trimmed)) {
|
|
@@ -242,9 +262,34 @@ function rewriteOracleConnectStringHostPort(connectString, host, port) {
|
|
|
242
262
|
if (!parts) return connectString;
|
|
243
263
|
return `${host}:${port}${parts.trailing}`;
|
|
244
264
|
}
|
|
265
|
+
async function runOracleSetupQuery(params, sql) {
|
|
266
|
+
const { runOracleQuery: runOracleQuery2 } = await Promise.resolve().then(() => (init_oracle_runner(), oracle_runner_exports));
|
|
267
|
+
const parsed = parseOracleJdbcUrl(params["jdbc-url"] ?? "", {
|
|
268
|
+
username: params["username"],
|
|
269
|
+
password: params["password"]
|
|
270
|
+
});
|
|
271
|
+
const cleanSql = sql.replace(/;\s*$/, "");
|
|
272
|
+
const result = await runOracleQuery2(parsed, cleanSql, {
|
|
273
|
+
tunnelParams: params
|
|
274
|
+
});
|
|
275
|
+
return result.rows;
|
|
276
|
+
}
|
|
277
|
+
var JDBC_THIN_PREFIX_RE, JDBC_OCI_PREFIX_RE, URL_PREFIX_RE;
|
|
278
|
+
var init_utils = __esm({
|
|
279
|
+
"../connectors/src/connectors/oracle/utils.ts"() {
|
|
280
|
+
"use strict";
|
|
281
|
+
JDBC_THIN_PREFIX_RE = /^jdbc:oracle:thin:/i;
|
|
282
|
+
JDBC_OCI_PREFIX_RE = /^jdbc:oracle:oci/i;
|
|
283
|
+
URL_PREFIX_RE = /^oracle:\/\//i;
|
|
284
|
+
}
|
|
285
|
+
});
|
|
245
286
|
|
|
246
287
|
// ../connectors/src/lib/oracle-runner.ts
|
|
247
|
-
var
|
|
288
|
+
var oracle_runner_exports = {};
|
|
289
|
+
__export(oracle_runner_exports, {
|
|
290
|
+
checkOracleConnection: () => checkOracleConnection,
|
|
291
|
+
runOracleQuery: () => runOracleQuery
|
|
292
|
+
});
|
|
248
293
|
async function importOracleDb() {
|
|
249
294
|
let mod;
|
|
250
295
|
try {
|
|
@@ -320,8 +365,22 @@ async function checkOracleConnection(url, credentials, options = {}) {
|
|
|
320
365
|
return { success: false, error: msg };
|
|
321
366
|
}
|
|
322
367
|
}
|
|
368
|
+
var GLOBAL_ORACLEDB_PATH;
|
|
369
|
+
var init_oracle_runner = __esm({
|
|
370
|
+
"../connectors/src/lib/oracle-runner.ts"() {
|
|
371
|
+
"use strict";
|
|
372
|
+
init_ssh_tunnel();
|
|
373
|
+
init_utils();
|
|
374
|
+
GLOBAL_ORACLEDB_PATH = "/usr/lib/node_modules/oracledb/index.js";
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// ../connectors/src/connectors/oracle/sdk/index.ts
|
|
379
|
+
init_oracle_runner();
|
|
323
380
|
|
|
324
381
|
// ../connectors/src/connectors/oracle/parameters.ts
|
|
382
|
+
init_parameter_definition();
|
|
383
|
+
init_ssh_tunnel();
|
|
325
384
|
var parameters = {
|
|
326
385
|
jdbcUrl: new ParameterDefinition({
|
|
327
386
|
slug: "jdbc-url",
|
|
@@ -354,6 +413,7 @@ var parameters = {
|
|
|
354
413
|
};
|
|
355
414
|
|
|
356
415
|
// ../connectors/src/connectors/oracle/sdk/index.ts
|
|
416
|
+
init_utils();
|
|
357
417
|
function createClient(params) {
|
|
358
418
|
const jdbcUrl = params[parameters.jdbcUrl.slug];
|
|
359
419
|
if (!jdbcUrl) {
|
|
@@ -438,6 +498,28 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
438
498
|
tools;
|
|
439
499
|
query;
|
|
440
500
|
checkConnection;
|
|
501
|
+
/**
|
|
502
|
+
* SQPD-1212: Logic-based, rule-driven connection setup. Connectors that
|
|
503
|
+
* implement this expose a step-by-step exploration flow (database/schema/
|
|
504
|
+
* table/etc. discovery) that the dashboard backend drives via the
|
|
505
|
+
* `/connections/:connectionId/setup` endpoint. Implement by delegating to
|
|
506
|
+
* `runSetupFlow` from `setup-flow.ts`.
|
|
507
|
+
*/
|
|
508
|
+
setup;
|
|
509
|
+
/**
|
|
510
|
+
* Opt-out of the default "verify before save" behavior on connection
|
|
511
|
+
* creation. The backend invokes `checkConnection` synchronously while
|
|
512
|
+
* creating the connection and aborts (no row inserted) if it fails — this
|
|
513
|
+
* flag disables that for connectors where the check cannot succeed pre-save:
|
|
514
|
+
*
|
|
515
|
+
* - `squadbase-db` populates `connection-url` only after Neon provisioning
|
|
516
|
+
* - OAuth connectors require an OAuth-aware proxyFetch keyed by the
|
|
517
|
+
* connectionId, which doesn't exist until the row is saved
|
|
518
|
+
*
|
|
519
|
+
* Exceptions are the explicit position; new credential-input connectors get
|
|
520
|
+
* the default verify-on-create behavior without opt-in.
|
|
521
|
+
*/
|
|
522
|
+
skipConnectionCheckOnCreate;
|
|
441
523
|
constructor(config) {
|
|
442
524
|
this.slug = config.slug;
|
|
443
525
|
this.authType = config.authType;
|
|
@@ -454,6 +536,8 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
454
536
|
this.tools = config.tools;
|
|
455
537
|
this.query = config.query;
|
|
456
538
|
this.checkConnection = config.checkConnection;
|
|
539
|
+
this.setup = config.setup;
|
|
540
|
+
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
457
541
|
}
|
|
458
542
|
get connectorKey() {
|
|
459
543
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -518,6 +602,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
518
602
|
}
|
|
519
603
|
};
|
|
520
604
|
|
|
605
|
+
// ../connectors/src/setup-flow.ts
|
|
606
|
+
async function runSetupFlow(flow, params, ctx, config) {
|
|
607
|
+
const runtime = {
|
|
608
|
+
params,
|
|
609
|
+
language: ctx.language,
|
|
610
|
+
config
|
|
611
|
+
};
|
|
612
|
+
let state = flow.initialState();
|
|
613
|
+
let answerIdx = 0;
|
|
614
|
+
for (const step of flow.steps) {
|
|
615
|
+
const ans = ctx.answers[answerIdx];
|
|
616
|
+
if (ans && ans.questionSlug === step.slug) {
|
|
617
|
+
state = step.applyAnswer(state, ans.answer);
|
|
618
|
+
answerIdx += 1;
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
if (step.type === "text") {
|
|
622
|
+
return {
|
|
623
|
+
type: "nextQuestion",
|
|
624
|
+
questionSlug: step.slug,
|
|
625
|
+
question: step.question[ctx.language],
|
|
626
|
+
questionType: "text"
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
630
|
+
if (options.length === 0) {
|
|
631
|
+
continue;
|
|
632
|
+
}
|
|
633
|
+
return {
|
|
634
|
+
type: "nextQuestion",
|
|
635
|
+
questionSlug: step.slug,
|
|
636
|
+
question: step.question[ctx.language],
|
|
637
|
+
questionType: step.type,
|
|
638
|
+
options
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
642
|
+
return { type: "fulfilled", dataInvestigationResult };
|
|
643
|
+
}
|
|
644
|
+
async function resolveSetupSelection(params) {
|
|
645
|
+
const { selected, allSentinel, fetchAll, limit } = params;
|
|
646
|
+
const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
|
|
647
|
+
return resolved.slice(0, limit);
|
|
648
|
+
}
|
|
649
|
+
|
|
521
650
|
// ../connectors/src/auth-types.ts
|
|
522
651
|
var AUTH_TYPES = {
|
|
523
652
|
OAUTH: "oauth",
|
|
@@ -544,6 +673,9 @@ function unwrapSampleLimit(sql) {
|
|
|
544
673
|
return { inner, limit };
|
|
545
674
|
}
|
|
546
675
|
|
|
676
|
+
// ../connectors/src/connectors/oracle/index.ts
|
|
677
|
+
init_oracle_runner();
|
|
678
|
+
|
|
547
679
|
// ../connectors/src/connectors/oracle/setup.ts
|
|
548
680
|
var oracleOnboarding = new ConnectorOnboarding({
|
|
549
681
|
dataOverviewInstructions: {
|
|
@@ -560,8 +692,165 @@ var oracleOnboarding = new ConnectorOnboarding({
|
|
|
560
692
|
}
|
|
561
693
|
});
|
|
562
694
|
|
|
695
|
+
// ../connectors/src/connectors/oracle/setup-flow.ts
|
|
696
|
+
init_utils();
|
|
697
|
+
var ALL_TABLES = "__ALL_TABLES__";
|
|
698
|
+
var ORACLE_SETUP_MAX_TABLES = 20;
|
|
699
|
+
var INTERNAL_OWNERS = /* @__PURE__ */ new Set([
|
|
700
|
+
"SYS",
|
|
701
|
+
"SYSTEM",
|
|
702
|
+
"XDB",
|
|
703
|
+
"OUTLN",
|
|
704
|
+
"ANONYMOUS",
|
|
705
|
+
"APEX_PUBLIC_USER",
|
|
706
|
+
"APPQOSSYS",
|
|
707
|
+
"AUDSYS",
|
|
708
|
+
"CTXSYS",
|
|
709
|
+
"DBSFWUSER",
|
|
710
|
+
"DBSNMP",
|
|
711
|
+
"DIP",
|
|
712
|
+
"DVF",
|
|
713
|
+
"DVSYS",
|
|
714
|
+
"EXFSYS",
|
|
715
|
+
"FLOWS_FILES",
|
|
716
|
+
"GGSYS",
|
|
717
|
+
"GSMADMIN_INTERNAL",
|
|
718
|
+
"GSMCATUSER",
|
|
719
|
+
"GSMUSER",
|
|
720
|
+
"LBACSYS",
|
|
721
|
+
"MDDATA",
|
|
722
|
+
"MDSYS",
|
|
723
|
+
"OJVMSYS",
|
|
724
|
+
"OLAPSYS",
|
|
725
|
+
"ORACLE_OCM",
|
|
726
|
+
"ORDDATA",
|
|
727
|
+
"ORDPLUGINS",
|
|
728
|
+
"ORDSYS",
|
|
729
|
+
"PDBADMIN",
|
|
730
|
+
"REMOTE_SCHEDULER_AGENT",
|
|
731
|
+
"SI_INFORMTN_SCHEMA",
|
|
732
|
+
"SPATIAL_CSW_ADMIN_USR",
|
|
733
|
+
"SPATIAL_WFS_ADMIN_USR",
|
|
734
|
+
"SQLTXADMIN",
|
|
735
|
+
"SQLTXPLAIN",
|
|
736
|
+
"SYSBACKUP",
|
|
737
|
+
"SYSDG",
|
|
738
|
+
"SYSKM",
|
|
739
|
+
"SYSRAC",
|
|
740
|
+
"SYS$UMF",
|
|
741
|
+
"TSMSYS",
|
|
742
|
+
"WMSYS",
|
|
743
|
+
"XS$NULL"
|
|
744
|
+
]);
|
|
745
|
+
function isInternalOwner(name) {
|
|
746
|
+
const upper = name.toUpperCase();
|
|
747
|
+
if (INTERNAL_OWNERS.has(upper)) return true;
|
|
748
|
+
if (upper.startsWith("APEX_")) return true;
|
|
749
|
+
return false;
|
|
750
|
+
}
|
|
751
|
+
function quoteLiteral(value) {
|
|
752
|
+
return "'" + value.replace(/'/g, "''") + "'";
|
|
753
|
+
}
|
|
754
|
+
async function fetchTableNames(params, owner) {
|
|
755
|
+
const rows = await runOracleSetupQuery(
|
|
756
|
+
params,
|
|
757
|
+
`SELECT TABLE_NAME FROM ALL_TABLES
|
|
758
|
+
WHERE OWNER = ${quoteLiteral(owner)}
|
|
759
|
+
ORDER BY TABLE_NAME`
|
|
760
|
+
);
|
|
761
|
+
return rows.map((r) => String(r["TABLE_NAME"] ?? "")).filter((name) => name);
|
|
762
|
+
}
|
|
763
|
+
var oracleSetupFlow = {
|
|
764
|
+
initialState: () => ({}),
|
|
765
|
+
steps: [
|
|
766
|
+
{
|
|
767
|
+
slug: "owner",
|
|
768
|
+
type: "select",
|
|
769
|
+
question: {
|
|
770
|
+
ja: "\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u306B\u4F7F\u3046\u30B9\u30AD\u30FC\u30DE\uFF08\u30AA\u30FC\u30CA\u30FC\uFF09\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044",
|
|
771
|
+
en: "Select the schema (owner) to use for setup"
|
|
772
|
+
},
|
|
773
|
+
async fetchOptions(_state, rt) {
|
|
774
|
+
const rows = await runOracleSetupQuery(
|
|
775
|
+
rt.params,
|
|
776
|
+
`SELECT USERNAME FROM ALL_USERS ORDER BY USERNAME`
|
|
777
|
+
);
|
|
778
|
+
return rows.map((r) => String(r["USERNAME"] ?? "")).filter((name) => name && !isInternalOwner(name)).map((value) => ({ value }));
|
|
779
|
+
},
|
|
780
|
+
applyAnswer: (state, answer) => ({ ...state, owner: answer[0] })
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
slug: "tables",
|
|
784
|
+
type: "multiSelect",
|
|
785
|
+
question: {
|
|
786
|
+
ja: "\u5BFE\u8C61\u30C6\u30FC\u30D6\u30EB\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
|
|
787
|
+
en: "Select target tables (multi-select allowed)"
|
|
788
|
+
},
|
|
789
|
+
async fetchOptions(state, rt) {
|
|
790
|
+
if (!state.owner) return [];
|
|
791
|
+
const names = await fetchTableNames(rt.params, state.owner);
|
|
792
|
+
const tableOptions = names.map((value) => ({ value }));
|
|
793
|
+
return [
|
|
794
|
+
{
|
|
795
|
+
value: ALL_TABLES,
|
|
796
|
+
label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30C6\u30FC\u30D6\u30EB" : "All tables"
|
|
797
|
+
},
|
|
798
|
+
...tableOptions
|
|
799
|
+
];
|
|
800
|
+
},
|
|
801
|
+
applyAnswer: (state, answer) => ({ ...state, tables: answer })
|
|
802
|
+
}
|
|
803
|
+
],
|
|
804
|
+
async finalize(state, rt) {
|
|
805
|
+
if (!state.owner || !state.tables) {
|
|
806
|
+
throw new Error("Oracle setup: incomplete state on finalize");
|
|
807
|
+
}
|
|
808
|
+
const owner = state.owner;
|
|
809
|
+
const targetTables = await resolveSetupSelection({
|
|
810
|
+
selected: state.tables,
|
|
811
|
+
allSentinel: ALL_TABLES,
|
|
812
|
+
fetchAll: () => fetchTableNames(rt.params, owner),
|
|
813
|
+
limit: ORACLE_SETUP_MAX_TABLES
|
|
814
|
+
});
|
|
815
|
+
const sections = [
|
|
816
|
+
"## Oracle Database",
|
|
817
|
+
"",
|
|
818
|
+
`### Schema: ${owner}`,
|
|
819
|
+
""
|
|
820
|
+
];
|
|
821
|
+
for (const table of targetTables) {
|
|
822
|
+
const cols = await runOracleSetupQuery(
|
|
823
|
+
rt.params,
|
|
824
|
+
`SELECT COLUMN_NAME, DATA_TYPE, NULLABLE, DATA_DEFAULT
|
|
825
|
+
FROM ALL_TAB_COLUMNS
|
|
826
|
+
WHERE OWNER = ${quoteLiteral(owner)}
|
|
827
|
+
AND TABLE_NAME = ${quoteLiteral(table)}
|
|
828
|
+
ORDER BY COLUMN_ID`
|
|
829
|
+
);
|
|
830
|
+
sections.push(`#### Table: ${table}`, "");
|
|
831
|
+
sections.push("| Column | Type | Nullable | Default |");
|
|
832
|
+
sections.push("|--------|------|----------|---------|");
|
|
833
|
+
for (const c of cols) {
|
|
834
|
+
const name = String(c["COLUMN_NAME"] ?? "");
|
|
835
|
+
const type = String(c["DATA_TYPE"] ?? "");
|
|
836
|
+
const nullable = String(c["NULLABLE"] ?? "");
|
|
837
|
+
const defaultRaw = c["DATA_DEFAULT"];
|
|
838
|
+
const defaultValue = defaultRaw == null ? "-" : String(defaultRaw).trim() || "-";
|
|
839
|
+
sections.push(
|
|
840
|
+
`| ${name} | ${type} | ${nullable} | ${defaultValue} |`
|
|
841
|
+
);
|
|
842
|
+
}
|
|
843
|
+
sections.push("");
|
|
844
|
+
}
|
|
845
|
+
return sections.join("\n");
|
|
846
|
+
}
|
|
847
|
+
};
|
|
848
|
+
|
|
563
849
|
// ../connectors/src/connectors/oracle/tools/execute-query.ts
|
|
564
850
|
import { z } from "zod";
|
|
851
|
+
init_oracle_runner();
|
|
852
|
+
init_ssh_tunnel();
|
|
853
|
+
init_utils();
|
|
565
854
|
var MAX_ROWS = 500;
|
|
566
855
|
var inputSchema = z.object({
|
|
567
856
|
toolUseIntent: z.string().optional().describe(
|
|
@@ -637,6 +926,7 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
|
|
|
637
926
|
});
|
|
638
927
|
|
|
639
928
|
// ../connectors/src/connectors/oracle/index.ts
|
|
929
|
+
init_utils();
|
|
640
930
|
var tools = { executeQuery: executeQueryTool };
|
|
641
931
|
var oracleConnector = new ConnectorPlugin({
|
|
642
932
|
slug: "oracle",
|
|
@@ -689,6 +979,7 @@ The business logic type for this connector is "sql".
|
|
|
689
979
|
- \u884C\u6570\u5236\u9650\u306E\u4E92\u63DB\u6027: \u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E server-logic \u30B9\u30AD\u30FC\u30DE\u63A8\u8AD6\u306F\u3001\u30AF\u30A8\u30EA\u3092 \`SELECT * FROM (<inner>) AS _sq LIMIT N\` \u306E\u5F62\u3067\u30E9\u30C3\u30D7\u3057\u3066\u304F\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002Oracle \u306B\u306F \`LIMIT\` \u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u3001\u30B3\u30CD\u30AF\u30BF\u306F \`query()\` \u5185\u3067\u3053\u306E\u30E9\u30C3\u30D1\u3092\u691C\u51FA\u3057\u3001\`<inner>\` \u3092\u305D\u306E\u307E\u307E\u5B9F\u884C\u3057\u3066 JS \u5074\u3067\u5148\u982D N \u884C\u306B\u5207\u308A\u8A70\u3081\u307E\u3059\u3002\u5229\u7528\u8005\u5074\u3067\u5BFE\u51E6\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u81EA\u5206\u3067\u66F8\u304F SQL \u3067\u306F \`LIMIT\` \u3092\u4F7F\u308F\u305A \`FETCH FIRST N ROWS ONLY\` / \`OFFSET m ROWS FETCH NEXT N ROWS ONLY\` / \`ROWNUM\` \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002`
|
|
690
980
|
},
|
|
691
981
|
tools,
|
|
982
|
+
setup: (params, ctx, config) => runSetupFlow(oracleSetupFlow, params, ctx, config),
|
|
692
983
|
async checkConnection(params, _config) {
|
|
693
984
|
return checkOracleConnection(
|
|
694
985
|
params[parameters.jdbcUrl.slug],
|
|
@@ -743,6 +1034,7 @@ function resolveEnvVarOptional(entry, key) {
|
|
|
743
1034
|
import { getContext } from "hono/context-storage";
|
|
744
1035
|
import { getCookie } from "hono/cookie";
|
|
745
1036
|
var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
|
|
1037
|
+
var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
|
|
746
1038
|
function normalizeHeaders(input) {
|
|
747
1039
|
const out = {};
|
|
748
1040
|
if (!input) return out;
|
|
@@ -751,6 +1043,11 @@ function normalizeHeaders(input) {
|
|
|
751
1043
|
});
|
|
752
1044
|
return out;
|
|
753
1045
|
}
|
|
1046
|
+
function extractInputUrl(input) {
|
|
1047
|
+
if (typeof input === "string") return input;
|
|
1048
|
+
if (input instanceof URL) return input.href;
|
|
1049
|
+
return input.url;
|
|
1050
|
+
}
|
|
754
1051
|
function createSandboxProxyFetch(connectionId) {
|
|
755
1052
|
return async (input, init) => {
|
|
756
1053
|
const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
|
|
@@ -760,10 +1057,17 @@ function createSandboxProxyFetch(connectionId) {
|
|
|
760
1057
|
"Connection proxy is not configured. Please check your deployment settings."
|
|
761
1058
|
);
|
|
762
1059
|
}
|
|
763
|
-
const originalUrl =
|
|
1060
|
+
const originalUrl = extractInputUrl(input);
|
|
1061
|
+
const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
|
|
1062
|
+
if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
|
|
1063
|
+
const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
|
|
1064
|
+
return fetch(sessionUrl, {
|
|
1065
|
+
method: "POST",
|
|
1066
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
1067
|
+
});
|
|
1068
|
+
}
|
|
764
1069
|
const originalMethod = init?.method ?? "GET";
|
|
765
1070
|
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
766
|
-
const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
|
|
767
1071
|
const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
768
1072
|
return fetch(proxyUrl, {
|
|
769
1073
|
method: "POST",
|
|
@@ -789,10 +1093,9 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
789
1093
|
}
|
|
790
1094
|
const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
|
|
791
1095
|
const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
1096
|
+
const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
|
|
792
1097
|
return async (input, init) => {
|
|
793
|
-
const originalUrl =
|
|
794
|
-
const originalMethod = init?.method ?? "GET";
|
|
795
|
-
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
1098
|
+
const originalUrl = extractInputUrl(input);
|
|
796
1099
|
const c = getContext();
|
|
797
1100
|
const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
|
|
798
1101
|
if (!appSession) {
|
|
@@ -800,6 +1103,14 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
800
1103
|
"No authentication method available for connection proxy."
|
|
801
1104
|
);
|
|
802
1105
|
}
|
|
1106
|
+
if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
|
|
1107
|
+
return fetch(sessionUrl, {
|
|
1108
|
+
method: "POST",
|
|
1109
|
+
headers: { Authorization: `Bearer ${appSession}` }
|
|
1110
|
+
});
|
|
1111
|
+
}
|
|
1112
|
+
const originalMethod = init?.method ?? "GET";
|
|
1113
|
+
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
803
1114
|
return fetch(proxyUrl, {
|
|
804
1115
|
method: "POST",
|
|
805
1116
|
headers: {
|