@squadbase/vite-server 0.1.12-dev.93b8799 → 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 +12128 -934
- package/dist/connectors/airtable-oauth.js +248 -46
- package/dist/connectors/airtable.js +285 -51
- package/dist/connectors/amplitude.js +288 -47
- package/dist/connectors/anthropic.js +126 -47
- package/dist/connectors/asana.js +293 -49
- package/dist/connectors/attio.js +268 -49
- package/dist/connectors/aws-billing.js +253 -46
- package/dist/connectors/azure-sql.js +387 -102
- package/dist/connectors/backlog-api-key.js +283 -47
- package/dist/connectors/clickup.js +304 -49
- package/dist/connectors/cosmosdb.js +271 -50
- package/dist/connectors/customerio.js +285 -47
- package/dist/connectors/dbt.js +306 -47
- package/dist/connectors/freshdesk.js +308 -53
- package/dist/connectors/freshsales.js +299 -52
- package/dist/connectors/freshservice.js +327 -53
- package/dist/connectors/gamma.js +293 -52
- package/dist/connectors/gemini.js +125 -47
- package/dist/connectors/github.js +352 -49
- package/dist/connectors/gmail-oauth.js +170 -7
- package/dist/connectors/gmail.js +316 -47
- package/dist/connectors/google-ads.js +254 -46
- package/dist/connectors/google-analytics-oauth.js +276 -46
- package/dist/connectors/google-analytics.js +378 -49
- package/dist/connectors/google-audit-log.js +404 -47
- package/dist/connectors/google-calendar-oauth.js +225 -46
- package/dist/connectors/google-calendar.js +325 -47
- package/dist/connectors/google-docs.js +186 -6
- package/dist/connectors/google-drive.js +228 -5
- package/dist/connectors/google-search-console-oauth.js +222 -46
- package/dist/connectors/google-sheets.js +238 -47
- package/dist/connectors/google-slides.js +171 -6
- package/dist/connectors/grafana.js +298 -49
- package/dist/connectors/hubspot-oauth.js +174 -5
- package/dist/connectors/hubspot.js +272 -49
- package/dist/connectors/influxdb.js +382 -51
- package/dist/connectors/intercom-oauth.js +176 -5
- package/dist/connectors/intercom.js +268 -49
- package/dist/connectors/jdbc.js +728 -110
- package/dist/connectors/jira-api-key.js +292 -47
- package/dist/connectors/kintone-api-token.js +247 -47
- package/dist/connectors/kintone.js +294 -47
- package/dist/connectors/linear.js +296 -49
- package/dist/connectors/linkedin-ads.js +234 -50
- package/dist/connectors/mailchimp-oauth.js +234 -46
- package/dist/connectors/mailchimp.js +286 -49
- package/dist/connectors/meta-ads-oauth.js +239 -48
- package/dist/connectors/meta-ads.js +251 -50
- package/dist/connectors/mixpanel.js +304 -47
- package/dist/connectors/monday.js +326 -49
- package/dist/connectors/mongodb.js +285 -57
- package/dist/connectors/notion-oauth.js +197 -5
- package/dist/connectors/notion.js +289 -51
- package/dist/connectors/openai.js +125 -47
- package/dist/connectors/oracle.js +405 -103
- package/dist/connectors/outlook-oauth.js +170 -5
- package/dist/connectors/powerbi-oauth.js +217 -5
- package/dist/connectors/salesforce.js +350 -49
- package/dist/connectors/semrush.js +280 -49
- package/dist/connectors/sentry.js +255 -50
- package/dist/connectors/shopify-oauth.js +153 -5
- package/dist/connectors/shopify.js +323 -47
- package/dist/connectors/sqlserver.js +381 -102
- package/dist/connectors/stripe-api-key.js +235 -46
- package/dist/connectors/stripe-oauth.js +168 -5
- package/dist/connectors/supabase.js +269 -48
- package/dist/connectors/tableau.js +337 -206
- package/dist/connectors/tiktok-ads.js +245 -48
- package/dist/connectors/wix-store.js +286 -49
- package/dist/connectors/zendesk-oauth.js +205 -5
- package/dist/connectors/zendesk.js +324 -47
- package/dist/index.d.ts +149 -1
- package/dist/index.js +18297 -6886
- package/dist/main.js +12785 -1382
- package/dist/vite-plugin.js +12140 -936
- 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) {
|
|
@@ -446,6 +506,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
446
506
|
* `runSetupFlow` from `setup-flow.ts`.
|
|
447
507
|
*/
|
|
448
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;
|
|
449
523
|
constructor(config) {
|
|
450
524
|
this.slug = config.slug;
|
|
451
525
|
this.authType = config.authType;
|
|
@@ -463,6 +537,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
463
537
|
this.query = config.query;
|
|
464
538
|
this.checkConnection = config.checkConnection;
|
|
465
539
|
this.setup = config.setup;
|
|
540
|
+
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
466
541
|
}
|
|
467
542
|
get connectorKey() {
|
|
468
543
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -527,6 +602,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
527
602
|
}
|
|
528
603
|
};
|
|
529
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
|
+
|
|
530
650
|
// ../connectors/src/auth-types.ts
|
|
531
651
|
var AUTH_TYPES = {
|
|
532
652
|
OAUTH: "oauth",
|
|
@@ -553,6 +673,9 @@ function unwrapSampleLimit(sql) {
|
|
|
553
673
|
return { inner, limit };
|
|
554
674
|
}
|
|
555
675
|
|
|
676
|
+
// ../connectors/src/connectors/oracle/index.ts
|
|
677
|
+
init_oracle_runner();
|
|
678
|
+
|
|
556
679
|
// ../connectors/src/connectors/oracle/setup.ts
|
|
557
680
|
var oracleOnboarding = new ConnectorOnboarding({
|
|
558
681
|
dataOverviewInstructions: {
|
|
@@ -569,8 +692,165 @@ var oracleOnboarding = new ConnectorOnboarding({
|
|
|
569
692
|
}
|
|
570
693
|
});
|
|
571
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
|
+
|
|
572
849
|
// ../connectors/src/connectors/oracle/tools/execute-query.ts
|
|
573
850
|
import { z } from "zod";
|
|
851
|
+
init_oracle_runner();
|
|
852
|
+
init_ssh_tunnel();
|
|
853
|
+
init_utils();
|
|
574
854
|
var MAX_ROWS = 500;
|
|
575
855
|
var inputSchema = z.object({
|
|
576
856
|
toolUseIntent: z.string().optional().describe(
|
|
@@ -646,6 +926,7 @@ Do NOT terminate statements with a semicolon; the driver rejects trailing termin
|
|
|
646
926
|
});
|
|
647
927
|
|
|
648
928
|
// ../connectors/src/connectors/oracle/index.ts
|
|
929
|
+
init_utils();
|
|
649
930
|
var tools = { executeQuery: executeQueryTool };
|
|
650
931
|
var oracleConnector = new ConnectorPlugin({
|
|
651
932
|
slug: "oracle",
|
|
@@ -698,6 +979,7 @@ The business logic type for this connector is "sql".
|
|
|
698
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`
|
|
699
980
|
},
|
|
700
981
|
tools,
|
|
982
|
+
setup: (params, ctx, config) => runSetupFlow(oracleSetupFlow, params, ctx, config),
|
|
701
983
|
async checkConnection(params, _config) {
|
|
702
984
|
return checkOracleConnection(
|
|
703
985
|
params[parameters.jdbcUrl.slug],
|
|
@@ -752,6 +1034,7 @@ function resolveEnvVarOptional(entry, key) {
|
|
|
752
1034
|
import { getContext } from "hono/context-storage";
|
|
753
1035
|
import { getCookie } from "hono/cookie";
|
|
754
1036
|
var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
|
|
1037
|
+
var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
|
|
755
1038
|
function normalizeHeaders(input) {
|
|
756
1039
|
const out = {};
|
|
757
1040
|
if (!input) return out;
|
|
@@ -760,6 +1043,11 @@ function normalizeHeaders(input) {
|
|
|
760
1043
|
});
|
|
761
1044
|
return out;
|
|
762
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
|
+
}
|
|
763
1051
|
function createSandboxProxyFetch(connectionId) {
|
|
764
1052
|
return async (input, init) => {
|
|
765
1053
|
const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
|
|
@@ -769,10 +1057,17 @@ function createSandboxProxyFetch(connectionId) {
|
|
|
769
1057
|
"Connection proxy is not configured. Please check your deployment settings."
|
|
770
1058
|
);
|
|
771
1059
|
}
|
|
772
|
-
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
|
+
}
|
|
773
1069
|
const originalMethod = init?.method ?? "GET";
|
|
774
1070
|
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
775
|
-
const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
|
|
776
1071
|
const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
777
1072
|
return fetch(proxyUrl, {
|
|
778
1073
|
method: "POST",
|
|
@@ -798,10 +1093,9 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
798
1093
|
}
|
|
799
1094
|
const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
|
|
800
1095
|
const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
1096
|
+
const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
|
|
801
1097
|
return async (input, init) => {
|
|
802
|
-
const originalUrl =
|
|
803
|
-
const originalMethod = init?.method ?? "GET";
|
|
804
|
-
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
1098
|
+
const originalUrl = extractInputUrl(input);
|
|
805
1099
|
const c = getContext();
|
|
806
1100
|
const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
|
|
807
1101
|
if (!appSession) {
|
|
@@ -809,6 +1103,14 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
809
1103
|
"No authentication method available for connection proxy."
|
|
810
1104
|
);
|
|
811
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;
|
|
812
1114
|
return fetch(proxyUrl, {
|
|
813
1115
|
method: "POST",
|
|
814
1116
|
headers: {
|