@ganju/utils 0.0.16 → 0.0.17
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/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -1
- package/dist/customCodeToken.d.ts +11 -0
- package/dist/customCodeToken.d.ts.map +1 -1
- package/dist/customCodeToken.js +41 -1
- package/dist/data.d.ts +4 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +26 -1
- package/dist/dataApi.d.ts +68 -1
- package/dist/dataApi.d.ts.map +1 -1
- package/dist/dataApi.js +45 -1
- package/dist/dataCompiler.d.ts.map +1 -1
- package/dist/dataCompiler.js +5 -1
- package/dist/dataCsv.d.ts +20 -0
- package/dist/dataCsv.d.ts.map +1 -0
- package/dist/dataCsv.js +102 -0
- package/dist/dataEngine.d.ts.map +1 -1
- package/dist/dataEngine.js +24 -4
- package/dist/dataImport.d.ts +2 -0
- package/dist/dataImport.d.ts.map +1 -1
- package/dist/dataImport.js +4 -1
- package/dist/dataQueries.d.ts +73 -0
- package/dist/dataQueries.d.ts.map +1 -0
- package/dist/dataQueries.js +513 -0
- package/dist/dataRpc.d.ts +19 -0
- package/dist/dataRpc.d.ts.map +1 -1
- package/dist/dataTools.d.ts +40 -0
- package/dist/dataTools.d.ts.map +1 -0
- package/dist/dataTools.js +280 -0
- package/dist/dataTypes.d.ts +2 -0
- package/dist/dataTypes.d.ts.map +1 -1
- package/dist/index.d.ts +86 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/schema.d.ts +91 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +65 -1
- package/dist/sdkConstants.d.ts +1 -0
- package/dist/sdkConstants.d.ts.map +1 -1
- package/dist/sdkConstants.js +2 -1
- package/package.json +1 -1
- package/src/constants.ts +13 -1
- package/src/customCodeToken.ts +74 -0
- package/src/data.ts +34 -0
- package/src/dataApi.ts +53 -2
- package/src/dataCompiler.ts +5 -1
- package/src/dataCsv.ts +99 -0
- package/src/dataEngine.ts +24 -4
- package/src/dataImport.ts +3 -0
- package/src/dataQueries.ts +730 -0
- package/src/dataRpc.ts +11 -0
- package/src/dataTools.ts +338 -0
- package/src/dataTypes.ts +6 -0
- package/src/index.ts +9 -1
- package/src/schema.ts +69 -1
- package/src/sdkConstants.ts +1 -0
package/dist/constants.d.ts
CHANGED
|
@@ -650,6 +650,7 @@ export declare const constants: {
|
|
|
650
650
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE: string;
|
|
651
651
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE: string;
|
|
652
652
|
CUSTOM_CODE_BROKER_PATH_SEND_FILE: string;
|
|
653
|
+
CUSTOM_CODE_BROKER_PATH_DATA: string;
|
|
653
654
|
CUSTOM_CODE_OUTBOUND_PARAM_ARTIFACT_ID: "artifactId";
|
|
654
655
|
CUSTOM_CODE_OUTBOUND_PARAM_ALLOWED_HOSTS: "allowedHosts";
|
|
655
656
|
CUSTOM_CODE_PLATFORM_HOSTS: string[];
|
|
@@ -692,6 +693,8 @@ export declare const constants: {
|
|
|
692
693
|
MCP_CHANNEL_PLATFORM_HEADER: string;
|
|
693
694
|
MCP_CHANNEL_CONVERSATION_HEADER: string;
|
|
694
695
|
MCP_CHANNEL_CLIENT_USER_AGENT: string;
|
|
696
|
+
MCP_CHANNEL_PARTICIPANT_HEADER: string;
|
|
697
|
+
MCP_CHANNEL_TIME_ZONE_HEADER: string;
|
|
695
698
|
MCP_SESSION_HEADER: string;
|
|
696
699
|
MCP_REQUEST_METHOD_INITIALIZE: "initialize";
|
|
697
700
|
MCP_REQUEST_METHOD_PING: "ping";
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.js
CHANGED
|
@@ -1344,7 +1344,10 @@ const RESERVED_TOOL_NAME_PREFIXES = [
|
|
|
1344
1344
|
'slack-',
|
|
1345
1345
|
CALENDAR_TOOL_KEY_PREFIX,
|
|
1346
1346
|
CALCOM_TOOL_KEY_PREFIX,
|
|
1347
|
-
WEB_TOOL_KEY_PREFIX
|
|
1347
|
+
WEB_TOOL_KEY_PREFIX,
|
|
1348
|
+
// data-describe, data-query, data-write and data-admin, registered for a
|
|
1349
|
+
// project with a database.
|
|
1350
|
+
'data-'
|
|
1348
1351
|
];
|
|
1349
1352
|
// The keys that don't belong to a prefixed group: the RAG core the channel
|
|
1350
1353
|
// runner intercepts by name, the smoke-test tool, the three proxied definition
|
|
@@ -1597,6 +1600,11 @@ const MCP_CHANNEL_PLATFORM_HEADER = 'x-ganju-channel-platform';
|
|
|
1597
1600
|
// the chat it ran in.
|
|
1598
1601
|
const MCP_CHANNEL_CONVERSATION_HEADER = 'x-ganju-channel-conversation-id';
|
|
1599
1602
|
const MCP_CHANNEL_CLIENT_USER_AGENT = 'ganju-channel/0.0.1';
|
|
1603
|
+
// The participant a channel turn is for: customer-scoped tables fill and
|
|
1604
|
+
// filter their rows with it. Trusted only on the channel's own auth paths.
|
|
1605
|
+
const MCP_CHANNEL_PARTICIPANT_HEADER = 'x-ganju-channel-participant-id';
|
|
1606
|
+
// The zone the channel resolves dates in; the data tools answer in it.
|
|
1607
|
+
const MCP_CHANNEL_TIME_ZONE_HEADER = 'x-ganju-channel-time-zone';
|
|
1600
1608
|
const JWKS_KV_KEY = 'jwks:v1';
|
|
1601
1609
|
const JWKS_TTL_SECONDS = 600;
|
|
1602
1610
|
// Standard OIDC scopes the better-auth oauthProvider honors for user OAuth
|
|
@@ -2697,6 +2705,7 @@ exports.constants = {
|
|
|
2697
2705
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE: sdkConstants_1.CUSTOM_CODE_BROKER_PATH_RESOURCES_CREATE,
|
|
2698
2706
|
CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE: sdkConstants_1.CUSTOM_CODE_BROKER_PATH_RESOURCES_DELETE,
|
|
2699
2707
|
CUSTOM_CODE_BROKER_PATH_SEND_FILE: sdkConstants_1.CUSTOM_CODE_BROKER_PATH_SEND_FILE,
|
|
2708
|
+
CUSTOM_CODE_BROKER_PATH_DATA: sdkConstants_1.CUSTOM_CODE_BROKER_PATH_DATA,
|
|
2700
2709
|
CUSTOM_CODE_OUTBOUND_PARAM_ARTIFACT_ID,
|
|
2701
2710
|
CUSTOM_CODE_OUTBOUND_PARAM_ALLOWED_HOSTS,
|
|
2702
2711
|
CUSTOM_CODE_PLATFORM_HOSTS,
|
|
@@ -2739,6 +2748,8 @@ exports.constants = {
|
|
|
2739
2748
|
MCP_CHANNEL_PLATFORM_HEADER,
|
|
2740
2749
|
MCP_CHANNEL_CONVERSATION_HEADER,
|
|
2741
2750
|
MCP_CHANNEL_CLIENT_USER_AGENT,
|
|
2751
|
+
MCP_CHANNEL_PARTICIPANT_HEADER,
|
|
2752
|
+
MCP_CHANNEL_TIME_ZONE_HEADER,
|
|
2742
2753
|
MCP_SESSION_HEADER,
|
|
2743
2754
|
MCP_REQUEST_METHOD_INITIALIZE,
|
|
2744
2755
|
MCP_REQUEST_METHOD_PING,
|
|
@@ -23,6 +23,17 @@ export declare const mintCustomCodeToken: (payload: Omit<CustomCodeTokenPayload,
|
|
|
23
23
|
* failed.
|
|
24
24
|
*/
|
|
25
25
|
export declare const verifyCustomCodeToken: (token: string, secret: string, now?: number) => Promise<CustomCodeTokenPayload | null>;
|
|
26
|
+
export interface CustomCodeCallPayload {
|
|
27
|
+
v: string;
|
|
28
|
+
artifactId: string;
|
|
29
|
+
versionId: string;
|
|
30
|
+
tool: string;
|
|
31
|
+
exp: number;
|
|
32
|
+
}
|
|
33
|
+
export declare const mintCustomCodeCallToken: (payload: Omit<CustomCodeCallPayload, "v" | "exp"> & {
|
|
34
|
+
ttlMs: number;
|
|
35
|
+
}, secret: string, issuedAt?: number) => Promise<string>;
|
|
36
|
+
export declare const verifyCustomCodeCallToken: (token: string, secret: string, now?: number) => Promise<CustomCodeCallPayload | null>;
|
|
26
37
|
/**
|
|
27
38
|
* The legacy dispatch-namespace script name for an artifact: `artifact_<id>`.
|
|
28
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customCodeToken.d.ts","sourceRoot":"","sources":["../src/customCodeToken.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,sBAAsB;IAGrC,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;IAIlB,GAAG,EAAE,MAAM,CAAC;IAOZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA0BD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,IAAI,CAAC,sBAAsB,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,QAAQ,MAAM,EACd,WAAU,MAAmB,KAC5B,OAAO,CAAC,MAAM,CAmBhB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,MAAM,MAAM,KACX,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA+DvC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,KAAG,MACE,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GAAI,YAAY,MAAM,KAAG,MACoB,CAAC;AAEtF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,KAAG,MACR,CAAC;AAEnD;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,GAAI,YAAY,MAAM,KAAG,MACR,CAAC"}
|
|
1
|
+
{"version":3,"file":"customCodeToken.d.ts","sourceRoot":"","sources":["../src/customCodeToken.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,sBAAsB;IAGrC,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;IAIlB,GAAG,EAAE,MAAM,CAAC;IAOZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA0BD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,IAAI,CAAC,sBAAsB,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,QAAQ,MAAM,EACd,WAAU,MAAmB,KAC5B,OAAO,CAAC,MAAM,CAmBhB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,MAAM,MAAM,KACX,OAAO,CAAC,sBAAsB,GAAG,IAAI,CA+DvC,CAAC;AAWF,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAID,eAAO,MAAM,uBAAuB,GAClC,SAAS,IAAI,CAAC,qBAAqB,EAAE,GAAG,GAAG,KAAK,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACrE,QAAQ,MAAM,EACd,WAAU,MAAmB,KAC5B,OAAO,CAAC,MAAM,CAahB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,MAAK,MAAmB,KACvB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CA8BtC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,KAAG,MACE,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GAAI,YAAY,MAAM,KAAG,MACoB,CAAC;AAEtF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,KAAG,MACR,CAAC;AAEnD;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,GAAI,YAAY,MAAM,KAAG,MACR,CAAC"}
|
package/dist/customCodeToken.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.customCodePreviewUploadName = exports.customCodeUploadName = exports.customCodePreviewScriptName = exports.customCodeScriptName = exports.verifyCustomCodeToken = exports.mintCustomCodeToken = void 0;
|
|
3
|
+
exports.customCodePreviewUploadName = exports.customCodeUploadName = exports.customCodePreviewScriptName = exports.customCodeScriptName = exports.verifyCustomCodeCallToken = exports.mintCustomCodeCallToken = exports.verifyCustomCodeToken = exports.mintCustomCodeToken = void 0;
|
|
4
4
|
const base64_1 = require("./base64");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
6
|
const encoder = new TextEncoder();
|
|
@@ -96,6 +96,46 @@ const verifyCustomCodeToken = async (token, secret, now) => {
|
|
|
96
96
|
};
|
|
97
97
|
};
|
|
98
98
|
exports.verifyCustomCodeToken = verifyCustomCodeToken;
|
|
99
|
+
const callSecret = (secret) => `${secret}:call`;
|
|
100
|
+
const mintCustomCodeCallToken = async (payload, secret, issuedAt = Date.now()) => {
|
|
101
|
+
const body = {
|
|
102
|
+
v: constants_1.constants.CUSTOM_CODE_TOKEN_VERSION,
|
|
103
|
+
artifactId: payload.artifactId,
|
|
104
|
+
versionId: payload.versionId,
|
|
105
|
+
tool: payload.tool,
|
|
106
|
+
exp: Math.ceil((issuedAt + payload.ttlMs) / 1000)
|
|
107
|
+
};
|
|
108
|
+
const encodedPayload = (0, base64_1.toBase64Url)((0, base64_1.bytesToBase64)(encoder.encode(JSON.stringify(body))));
|
|
109
|
+
const signature = await signPayload(encodedPayload, callSecret(secret));
|
|
110
|
+
return `${encodedPayload}.${signature}`;
|
|
111
|
+
};
|
|
112
|
+
exports.mintCustomCodeCallToken = mintCustomCodeCallToken;
|
|
113
|
+
const verifyCustomCodeCallToken = async (token, secret, now = Date.now()) => {
|
|
114
|
+
const separator = token.lastIndexOf('.');
|
|
115
|
+
if (separator <= 0)
|
|
116
|
+
return null;
|
|
117
|
+
const encodedPayload = token.slice(0, separator);
|
|
118
|
+
try {
|
|
119
|
+
const key = await importKey(callSecret(secret));
|
|
120
|
+
const valid = await crypto.subtle.verify('HMAC', key, new Uint8Array((0, base64_1.base64ToBytes)((0, base64_1.fromBase64Url)(token.slice(separator + 1)))), encoder.encode(encodedPayload));
|
|
121
|
+
if (!valid)
|
|
122
|
+
return null;
|
|
123
|
+
const candidate = JSON.parse(new TextDecoder().decode((0, base64_1.base64ToBytes)((0, base64_1.fromBase64Url)(encodedPayload))));
|
|
124
|
+
if (candidate.v !== constants_1.constants.CUSTOM_CODE_TOKEN_VERSION ||
|
|
125
|
+
typeof candidate.artifactId !== 'string' ||
|
|
126
|
+
typeof candidate.versionId !== 'string' ||
|
|
127
|
+
typeof candidate.tool !== 'string' ||
|
|
128
|
+
typeof candidate.exp !== 'number' ||
|
|
129
|
+
candidate.exp * 1000 <= now) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
return candidate;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
exports.verifyCustomCodeCallToken = verifyCustomCodeCallToken;
|
|
99
139
|
/**
|
|
100
140
|
* The legacy dispatch-namespace script name for an artifact: `artifact_<id>`.
|
|
101
141
|
*
|
package/dist/data.d.ts
CHANGED
|
@@ -5,5 +5,9 @@ export { chunkRows, rowsPerInsert, ftsMatch, keysetCondition, encodeCursor, deco
|
|
|
5
5
|
export type { SqlValue, KeysetCursor, SortKey } from './dataCompiler';
|
|
6
6
|
export { INTERNAL_MIGRATIONS, INTERNAL_SCHEMA_VERSION, hasInternalTables, getMeta, setMeta, migrateInternal, loadSchema, toTableInput, normaliseColumn, translateSqliteError, describe, query, write, rowHistory, pruneHistory, deleteImpact, createTable, updateTable, dropTable, addColumn, updateColumn, dropColumn, columnChangeNeedsRebuild, dropColumnNeedsRebuild, readTableCopy, clearFailedTableCopy, copyTableStep, writeReachesCopy, assertActor, assertWritable, exportRows } from './dataEngine';
|
|
7
7
|
export type { SqlRow, SqlRunner } from './dataEngine';
|
|
8
|
+
export { DATA_QUERY_PARAM_TYPES, DATA_MAX_QUERIES, DATA_MAX_QUERY_SQL, DATA_MAX_QUERY_PARAMS, DATA_DEFAULT_QUERY_ROWS, compileQuerySql, checkQueryPlan, listQueries, queriesFor, saveQuery, dropQuery, runQuery } from './dataQueries';
|
|
9
|
+
export type { DataQuery, DataQueryInput, DataQueryParam, DataQueryParamType } from './dataQueries';
|
|
8
10
|
export type { ProjectDatabaseRpc, DatabaseInfo, ExportFile, ExportFormat, ExportState, RestoreResult } from './dataRpc';
|
|
11
|
+
export { DATA_TOOL_DESCRIBE, DATA_TOOL_QUERY, DATA_TOOL_WRITE, DATA_TOOL_ADMIN, DATA_TOOL_NAMES, DATA_TOOL_TITLES, DATA_TOOL_MAX_LIMIT, DATA_ADMIN_ACTIONS, hasDataToolTables, dataToolDefinitions, dataAdminToolDefinition } from './dataTools';
|
|
12
|
+
export type { DataToolDefinition, DataAdminAction } from './dataTools';
|
|
9
13
|
//# sourceMappingURL=data.d.ts.map
|
package/dist/data.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACX,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,KAAK,EACN,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,KAAK,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACX,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,SAAS,EACT,aAAa,EACb,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,KAAK,EACN,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,KAAK,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,WAAW,EACX,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACT,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,kBAAkB,EACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/data.js
CHANGED
|
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.writeReachesCopy = exports.copyTableStep = exports.clearFailedTableCopy = exports.readTableCopy = exports.dropColumnNeedsRebuild = exports.columnChangeNeedsRebuild = exports.dropColumn = exports.updateColumn = exports.addColumn = exports.dropTable = exports.updateTable = exports.createTable = exports.deleteImpact = exports.pruneHistory = exports.rowHistory = exports.write = exports.query = exports.describe = exports.translateSqliteError = exports.normaliseColumn = exports.toTableInput = exports.loadSchema = exports.migrateInternal = exports.setMeta = exports.getMeta = exports.hasInternalTables = exports.INTERNAL_SCHEMA_VERSION = exports.INTERNAL_MIGRATIONS = exports.zoned = exports.tidyArgs = exports.isSensitiveWrite = exports.decodeCursor = exports.encodeCursor = exports.keysetCondition = exports.ftsMatch = exports.rowsPerInsert = exports.chunkRows = exports.sqlLiteral = exports.searchableColumns = exports.ftsTableName = exports.ftsCreateSql = exports.desiredTriggers = exports.desiredIndexes = exports.columnDefinitionSql = exports.createTableSql = exports.isValidIdentifier = exports.identifierIssue = exports.DATA_HIDDEN_COLUMNS = exports.DATA_SYSTEM_COLUMNS = exports.DATA_IDENTIFIER_PATTERN = void 0;
|
|
18
|
-
exports.exportRows = exports.assertWritable = exports.assertActor = void 0;
|
|
18
|
+
exports.dataAdminToolDefinition = exports.dataToolDefinitions = exports.hasDataToolTables = exports.DATA_ADMIN_ACTIONS = exports.DATA_TOOL_MAX_LIMIT = exports.DATA_TOOL_TITLES = exports.DATA_TOOL_NAMES = exports.DATA_TOOL_ADMIN = exports.DATA_TOOL_WRITE = exports.DATA_TOOL_QUERY = exports.DATA_TOOL_DESCRIBE = exports.runQuery = exports.dropQuery = exports.saveQuery = exports.queriesFor = exports.listQueries = exports.checkQueryPlan = exports.compileQuerySql = exports.DATA_DEFAULT_QUERY_ROWS = exports.DATA_MAX_QUERY_PARAMS = exports.DATA_MAX_QUERY_SQL = exports.DATA_MAX_QUERIES = exports.DATA_QUERY_PARAM_TYPES = exports.exportRows = exports.assertWritable = exports.assertActor = void 0;
|
|
19
19
|
// Entry point for `@ganju/utils/data`: everything a project's database and
|
|
20
20
|
// its callers share, without pulling in the rest of the package.
|
|
21
21
|
__exportStar(require("./dataTypes"), exports);
|
|
@@ -76,3 +76,28 @@ Object.defineProperty(exports, "writeReachesCopy", { enumerable: true, get: func
|
|
|
76
76
|
Object.defineProperty(exports, "assertActor", { enumerable: true, get: function () { return dataEngine_1.assertActor; } });
|
|
77
77
|
Object.defineProperty(exports, "assertWritable", { enumerable: true, get: function () { return dataEngine_1.assertWritable; } });
|
|
78
78
|
Object.defineProperty(exports, "exportRows", { enumerable: true, get: function () { return dataEngine_1.exportRows; } });
|
|
79
|
+
var dataQueries_1 = require("./dataQueries");
|
|
80
|
+
Object.defineProperty(exports, "DATA_QUERY_PARAM_TYPES", { enumerable: true, get: function () { return dataQueries_1.DATA_QUERY_PARAM_TYPES; } });
|
|
81
|
+
Object.defineProperty(exports, "DATA_MAX_QUERIES", { enumerable: true, get: function () { return dataQueries_1.DATA_MAX_QUERIES; } });
|
|
82
|
+
Object.defineProperty(exports, "DATA_MAX_QUERY_SQL", { enumerable: true, get: function () { return dataQueries_1.DATA_MAX_QUERY_SQL; } });
|
|
83
|
+
Object.defineProperty(exports, "DATA_MAX_QUERY_PARAMS", { enumerable: true, get: function () { return dataQueries_1.DATA_MAX_QUERY_PARAMS; } });
|
|
84
|
+
Object.defineProperty(exports, "DATA_DEFAULT_QUERY_ROWS", { enumerable: true, get: function () { return dataQueries_1.DATA_DEFAULT_QUERY_ROWS; } });
|
|
85
|
+
Object.defineProperty(exports, "compileQuerySql", { enumerable: true, get: function () { return dataQueries_1.compileQuerySql; } });
|
|
86
|
+
Object.defineProperty(exports, "checkQueryPlan", { enumerable: true, get: function () { return dataQueries_1.checkQueryPlan; } });
|
|
87
|
+
Object.defineProperty(exports, "listQueries", { enumerable: true, get: function () { return dataQueries_1.listQueries; } });
|
|
88
|
+
Object.defineProperty(exports, "queriesFor", { enumerable: true, get: function () { return dataQueries_1.queriesFor; } });
|
|
89
|
+
Object.defineProperty(exports, "saveQuery", { enumerable: true, get: function () { return dataQueries_1.saveQuery; } });
|
|
90
|
+
Object.defineProperty(exports, "dropQuery", { enumerable: true, get: function () { return dataQueries_1.dropQuery; } });
|
|
91
|
+
Object.defineProperty(exports, "runQuery", { enumerable: true, get: function () { return dataQueries_1.runQuery; } });
|
|
92
|
+
var dataTools_1 = require("./dataTools");
|
|
93
|
+
Object.defineProperty(exports, "DATA_TOOL_DESCRIBE", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_DESCRIBE; } });
|
|
94
|
+
Object.defineProperty(exports, "DATA_TOOL_QUERY", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_QUERY; } });
|
|
95
|
+
Object.defineProperty(exports, "DATA_TOOL_WRITE", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_WRITE; } });
|
|
96
|
+
Object.defineProperty(exports, "DATA_TOOL_ADMIN", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_ADMIN; } });
|
|
97
|
+
Object.defineProperty(exports, "DATA_TOOL_NAMES", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_NAMES; } });
|
|
98
|
+
Object.defineProperty(exports, "DATA_TOOL_TITLES", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_TITLES; } });
|
|
99
|
+
Object.defineProperty(exports, "DATA_TOOL_MAX_LIMIT", { enumerable: true, get: function () { return dataTools_1.DATA_TOOL_MAX_LIMIT; } });
|
|
100
|
+
Object.defineProperty(exports, "DATA_ADMIN_ACTIONS", { enumerable: true, get: function () { return dataTools_1.DATA_ADMIN_ACTIONS; } });
|
|
101
|
+
Object.defineProperty(exports, "hasDataToolTables", { enumerable: true, get: function () { return dataTools_1.hasDataToolTables; } });
|
|
102
|
+
Object.defineProperty(exports, "dataToolDefinitions", { enumerable: true, get: function () { return dataTools_1.dataToolDefinitions; } });
|
|
103
|
+
Object.defineProperty(exports, "dataAdminToolDefinition", { enumerable: true, get: function () { return dataTools_1.dataAdminToolDefinition; } });
|
package/dist/dataApi.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface DataApiRoute {
|
|
|
6
6
|
path: string;
|
|
7
7
|
summary: string;
|
|
8
8
|
description?: string;
|
|
9
|
-
tag: 'Database' | 'Tables' | 'Rows' | 'History and export';
|
|
9
|
+
tag: 'Database' | 'Tables' | 'Rows' | 'Queries' | 'History and export';
|
|
10
10
|
body?: z.ZodType;
|
|
11
11
|
query?: z.ZodObject;
|
|
12
12
|
returns: string;
|
|
@@ -35,6 +35,17 @@ export declare const DATA_API_ROUTES: {
|
|
|
35
35
|
readonly returns: "{ database }";
|
|
36
36
|
readonly status: 201;
|
|
37
37
|
};
|
|
38
|
+
readonly updateDatabase: {
|
|
39
|
+
readonly method: "patch";
|
|
40
|
+
readonly path: "";
|
|
41
|
+
readonly tag: "Database";
|
|
42
|
+
readonly summary: "Change the database's settings";
|
|
43
|
+
readonly description: "`timeZone`, an IANA zone such as `America/Bogota`, or null for UTC. Datetimes come back in it for callers that send no `timeZone` of their own: the assistant, functions and scripts. Datetimes without an offset are read in it too.";
|
|
44
|
+
readonly body: z.ZodObject<{
|
|
45
|
+
timeZone: z.ZodNullable<z.ZodString>;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
readonly returns: "{ database }";
|
|
48
|
+
};
|
|
38
49
|
readonly remove: {
|
|
39
50
|
readonly method: "delete";
|
|
40
51
|
readonly path: "";
|
|
@@ -396,6 +407,62 @@ export declare const DATA_API_ROUTES: {
|
|
|
396
407
|
}, z.core.$strict>;
|
|
397
408
|
readonly returns: "{ results }";
|
|
398
409
|
};
|
|
410
|
+
readonly listQueries: {
|
|
411
|
+
readonly method: "get";
|
|
412
|
+
readonly path: "/query";
|
|
413
|
+
readonly tag: "Queries";
|
|
414
|
+
readonly summary: "Named queries";
|
|
415
|
+
readonly description: "Each with its SQL, parameters, the tables it reads and its plan (`SCAN orders` means it reads the whole table).";
|
|
416
|
+
readonly returns: "{ queries }";
|
|
417
|
+
};
|
|
418
|
+
readonly saveQuery: {
|
|
419
|
+
readonly method: "post";
|
|
420
|
+
readonly path: "/query";
|
|
421
|
+
readonly tag: "Queries";
|
|
422
|
+
readonly summary: "Save a named query";
|
|
423
|
+
readonly description: "One `SELECT` (or `WITH … SELECT`) with named parameters such as `:from`, each declared in `params` with its type. It is compiled, never run, and refused unless it only reads this database's tables. Saving under an existing name replaces it. `assistant: true` lets channel bots run it from data-query.";
|
|
424
|
+
readonly body: z.ZodObject<{
|
|
425
|
+
name: z.ZodString;
|
|
426
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
427
|
+
sql: z.ZodString;
|
|
428
|
+
params: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
429
|
+
name: z.ZodString;
|
|
430
|
+
type: z.ZodEnum<{
|
|
431
|
+
boolean: "boolean";
|
|
432
|
+
text: "text";
|
|
433
|
+
integer: "integer";
|
|
434
|
+
decimal: "decimal";
|
|
435
|
+
date: "date";
|
|
436
|
+
datetime: "datetime";
|
|
437
|
+
}>;
|
|
438
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
439
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
440
|
+
}, z.core.$strict>>>;
|
|
441
|
+
assistant: z.ZodOptional<z.ZodBoolean>;
|
|
442
|
+
}, z.core.$strict>;
|
|
443
|
+
readonly returns: "{ query }";
|
|
444
|
+
readonly status: 201;
|
|
445
|
+
};
|
|
446
|
+
readonly dropQuery: {
|
|
447
|
+
readonly method: "delete";
|
|
448
|
+
readonly path: "/query/:name";
|
|
449
|
+
readonly tag: "Queries";
|
|
450
|
+
readonly summary: "Delete a named query";
|
|
451
|
+
readonly returns: "{ dropped }";
|
|
452
|
+
};
|
|
453
|
+
readonly runQuery: {
|
|
454
|
+
readonly method: "post";
|
|
455
|
+
readonly path: "/query/:name/run";
|
|
456
|
+
readonly tag: "Queries";
|
|
457
|
+
readonly summary: "Run a named query";
|
|
458
|
+
readonly description: "With its `params`, up to `limit` rows (100 by default, 500 at most) and 1 MB; `truncated` says it stopped early. A query that would scan a table over 200,000 rows is refused.";
|
|
459
|
+
readonly body: z.ZodObject<{
|
|
460
|
+
params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
461
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
462
|
+
timeZone: z.ZodOptional<z.ZodString>;
|
|
463
|
+
}, z.core.$strict>;
|
|
464
|
+
readonly returns: "{ query, rows, truncated? }";
|
|
465
|
+
};
|
|
399
466
|
readonly startExport: {
|
|
400
467
|
readonly method: "post";
|
|
401
468
|
readonly path: "/export";
|
package/dist/dataApi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataApi.d.ts","sourceRoot":"","sources":["../src/dataApi.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa,mEACwC,CAAC;AAEnE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IAEtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"dataApi.d.ts","sourceRoot":"","sources":["../src/dataApi.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa,mEACwC,CAAC;AAEnE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IAEtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAAC;IACvE,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;IAEpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA4BD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkSqB,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAmB1D;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6G5C,CAAC"}
|
package/dist/dataApi.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.dataOpenApi = exports.DATA_API_ROUTES = exports.DATA_API_BASE = void 0;
|
|
|
7
7
|
const zod_1 = require("zod");
|
|
8
8
|
const schema_1 = require("./schema");
|
|
9
9
|
exports.DATA_API_BASE = '/organization/:organizationId/project/:projectId/artifact/data';
|
|
10
|
-
const { DATA_DATABASE_CREATE, DATA_DATABASE_DELETE, DATA_TABLE_INPUT, DATA_TABLE_PATCH, DATA_COLUMN_INPUT, DATA_COLUMN_PATCH, DATA_TABLE_DROP_BODY, DATA_ROW_LIST_QUERY, DATA_ROW_GET_QUERY, DATA_ROW_CREATE_BODY, DATA_ROW_UPDATE_BODY, DATA_ROW_DELETE_BODY, DATA_DELETE_PREVIEW_BODY, DATA_WRITE_BODY, DATA_ROW_HISTORY_QUERY, DATA_RESTORE_POINT_BODY, DATA_EXPORT_BODY, DATA_EXPORT_QUERY, DATA_EXPORT_FILE_QUERY, DATA_CHANGE_LIST_QUERY } = schema_1.Schema;
|
|
10
|
+
const { DATA_DATABASE_CREATE, DATA_DATABASE_DELETE, DATA_DATABASE_PATCH, DATA_TABLE_INPUT, DATA_TABLE_PATCH, DATA_COLUMN_INPUT, DATA_COLUMN_PATCH, DATA_TABLE_DROP_BODY, DATA_ROW_LIST_QUERY, DATA_ROW_GET_QUERY, DATA_ROW_CREATE_BODY, DATA_ROW_UPDATE_BODY, DATA_ROW_DELETE_BODY, DATA_DELETE_PREVIEW_BODY, DATA_WRITE_BODY, DATA_ROW_HISTORY_QUERY, DATA_RESTORE_POINT_BODY, DATA_EXPORT_BODY, DATA_EXPORT_QUERY, DATA_EXPORT_FILE_QUERY, DATA_CHANGE_LIST_QUERY, DATA_QUERY_INPUT, DATA_QUERY_RUN_BODY } = schema_1.Schema;
|
|
11
11
|
exports.DATA_API_ROUTES = {
|
|
12
12
|
getDatabase: {
|
|
13
13
|
method: 'get',
|
|
@@ -27,6 +27,15 @@ exports.DATA_API_ROUTES = {
|
|
|
27
27
|
returns: '{ database }',
|
|
28
28
|
status: 201
|
|
29
29
|
},
|
|
30
|
+
updateDatabase: {
|
|
31
|
+
method: 'patch',
|
|
32
|
+
path: '',
|
|
33
|
+
tag: 'Database',
|
|
34
|
+
summary: "Change the database's settings",
|
|
35
|
+
description: '`timeZone`, an IANA zone such as `America/Bogota`, or null for UTC. Datetimes come back in it for callers that send no `timeZone` of their own: the assistant, functions and scripts. Datetimes without an offset are read in it too.',
|
|
36
|
+
body: DATA_DATABASE_PATCH,
|
|
37
|
+
returns: '{ database }'
|
|
38
|
+
},
|
|
30
39
|
remove: {
|
|
31
40
|
method: 'delete',
|
|
32
41
|
path: '',
|
|
@@ -199,6 +208,40 @@ exports.DATA_API_ROUTES = {
|
|
|
199
208
|
body: DATA_WRITE_BODY,
|
|
200
209
|
returns: '{ results }'
|
|
201
210
|
},
|
|
211
|
+
listQueries: {
|
|
212
|
+
method: 'get',
|
|
213
|
+
path: '/query',
|
|
214
|
+
tag: 'Queries',
|
|
215
|
+
summary: 'Named queries',
|
|
216
|
+
description: 'Each with its SQL, parameters, the tables it reads and its plan (`SCAN orders` means it reads the whole table).',
|
|
217
|
+
returns: '{ queries }'
|
|
218
|
+
},
|
|
219
|
+
saveQuery: {
|
|
220
|
+
method: 'post',
|
|
221
|
+
path: '/query',
|
|
222
|
+
tag: 'Queries',
|
|
223
|
+
summary: 'Save a named query',
|
|
224
|
+
description: "One `SELECT` (or `WITH … SELECT`) with named parameters such as `:from`, each declared in `params` with its type. It is compiled, never run, and refused unless it only reads this database's tables. Saving under an existing name replaces it. `assistant: true` lets channel bots run it from data-query.",
|
|
225
|
+
body: DATA_QUERY_INPUT,
|
|
226
|
+
returns: '{ query }',
|
|
227
|
+
status: 201
|
|
228
|
+
},
|
|
229
|
+
dropQuery: {
|
|
230
|
+
method: 'delete',
|
|
231
|
+
path: '/query/:name',
|
|
232
|
+
tag: 'Queries',
|
|
233
|
+
summary: 'Delete a named query',
|
|
234
|
+
returns: '{ dropped }'
|
|
235
|
+
},
|
|
236
|
+
runQuery: {
|
|
237
|
+
method: 'post',
|
|
238
|
+
path: '/query/:name/run',
|
|
239
|
+
tag: 'Queries',
|
|
240
|
+
summary: 'Run a named query',
|
|
241
|
+
description: 'With its `params`, up to `limit` rows (100 by default, 500 at most) and 1 MB; `truncated` says it stopped early. A query that would scan a table over 200,000 rows is refused.',
|
|
242
|
+
body: DATA_QUERY_RUN_BODY,
|
|
243
|
+
returns: '{ query, rows, truncated? }'
|
|
244
|
+
},
|
|
202
245
|
startExport: {
|
|
203
246
|
method: 'post',
|
|
204
247
|
path: '/export',
|
|
@@ -323,6 +366,7 @@ const dataOpenApi = (serverUrl) => {
|
|
|
323
366
|
{ name: 'Database' },
|
|
324
367
|
{ name: 'Tables' },
|
|
325
368
|
{ name: 'Rows' },
|
|
369
|
+
{ name: 'Queries' },
|
|
326
370
|
{ name: 'History and export' }
|
|
327
371
|
],
|
|
328
372
|
paths,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataCompiler.d.ts","sourceRoot":"","sources":["../src/dataCompiler.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE9C,eAAO,MAAM,gBAAgB,oGAYnB,CAAC;AAIX,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAQN,eAAO,MAAM,cAAc,GACzB,QAAQ,gBAAgB,KACvB,MAAM,IAAI,OAAO,CAAC,gBAAgB,EAAE;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,CACT,CAAC;AAE/C,eAAO,MAAM,SAAS,GACpB,OAAO,SAAS,EAChB,MAAM,MAAM,KACX,gBAAgB,GAAG,SAKrB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,EAAE,MAAM,MAAM,cASzD,CAAC;AAIJ,eAAO,MAAM,QAAQ,GAAI,QAAQ,UAAU,EAAE,OAAO,SAAS,KAAG,
|
|
1
|
+
{"version":3,"file":"dataCompiler.d.ts","sourceRoot":"","sources":["../src/dataCompiler.ts"],"names":[],"mappings":"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"}
|
package/dist/dataCompiler.js
CHANGED
|
@@ -43,7 +43,11 @@ const unknownColumn = (table, name) => new dataTypes_1.DataError(`Unknown column
|
|
|
43
43
|
].join(', ')}.`, 'invalid');
|
|
44
44
|
exports.unknownColumn = unknownColumn;
|
|
45
45
|
// Access
|
|
46
|
-
const accessOf = (caller, table) => caller.
|
|
46
|
+
const accessOf = (caller, table) => caller.tables && !caller.tables.includes(table.name)
|
|
47
|
+
? 'none'
|
|
48
|
+
: caller.restricted
|
|
49
|
+
? table.access
|
|
50
|
+
: 'full';
|
|
47
51
|
exports.accessOf = accessOf;
|
|
48
52
|
const visibleTables = (schema, caller) => schema.tables.filter(table => dataTypes_1.DATA_ACCESS_RANK[(0, exports.accessOf)(caller, table)] >= 1);
|
|
49
53
|
exports.visibleTables = visibleTables;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a CSV file into rows of text, with no parser package behind it:
|
|
3
|
+
* the CLI's import and the owner's data-admin tool read files the same way.
|
|
4
|
+
*
|
|
5
|
+
* RFC 4180 plus the two things spreadsheets actually write: a byte-order mark
|
|
6
|
+
* in front, and `;` between fields where the decimal mark is a comma (Excel in
|
|
7
|
+
* Spanish). The separator is read from the header line, so the same file
|
|
8
|
+
* exported from either locale imports the same way.
|
|
9
|
+
*
|
|
10
|
+
* Every cell comes back as text. Deciding what "28.000" means is the shared
|
|
11
|
+
* import code's job, so the CLI and the dashboard decide it the same way.
|
|
12
|
+
*/
|
|
13
|
+
export interface ParsedCsv {
|
|
14
|
+
headers: string[];
|
|
15
|
+
rows: string[][];
|
|
16
|
+
lines: number[];
|
|
17
|
+
}
|
|
18
|
+
export declare const detectSeparator: (text: string) => string;
|
|
19
|
+
export declare const parseCsv: (input: string, separator?: string) => ParsedCsv;
|
|
20
|
+
//# sourceMappingURL=dataCsv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataCsv.d.ts","sourceRoot":"","sources":["../src/dataCsv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IAGjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAKD,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAc9C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,YAAY,MAAM,KAAG,SA0D5D,CAAC"}
|
package/dist/dataCsv.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading a CSV file into rows of text, with no parser package behind it:
|
|
4
|
+
* the CLI's import and the owner's data-admin tool read files the same way.
|
|
5
|
+
*
|
|
6
|
+
* RFC 4180 plus the two things spreadsheets actually write: a byte-order mark
|
|
7
|
+
* in front, and `;` between fields where the decimal mark is a comma (Excel in
|
|
8
|
+
* Spanish). The separator is read from the header line, so the same file
|
|
9
|
+
* exported from either locale imports the same way.
|
|
10
|
+
*
|
|
11
|
+
* Every cell comes back as text. Deciding what "28.000" means is the shared
|
|
12
|
+
* import code's job, so the CLI and the dashboard decide it the same way.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.parseCsv = exports.detectSeparator = void 0;
|
|
16
|
+
const SEPARATORS = [',', ';', '\t'];
|
|
17
|
+
// The separator that appears most in the first line, outside quotes.
|
|
18
|
+
const detectSeparator = (text) => {
|
|
19
|
+
const counts = new Map(SEPARATORS.map(s => [s, 0]));
|
|
20
|
+
let quoted = false;
|
|
21
|
+
for (const char of text) {
|
|
22
|
+
if (char === '"')
|
|
23
|
+
quoted = !quoted;
|
|
24
|
+
else if (!quoted && (char === '\n' || char === '\r'))
|
|
25
|
+
break;
|
|
26
|
+
else if (!quoted && counts.has(char))
|
|
27
|
+
counts.set(char, counts.get(char) + 1);
|
|
28
|
+
}
|
|
29
|
+
let best = ',';
|
|
30
|
+
for (const [separator, count] of counts) {
|
|
31
|
+
if (count > counts.get(best))
|
|
32
|
+
best = separator;
|
|
33
|
+
}
|
|
34
|
+
return best;
|
|
35
|
+
};
|
|
36
|
+
exports.detectSeparator = detectSeparator;
|
|
37
|
+
const parseCsv = (input, separator) => {
|
|
38
|
+
const text = input.charCodeAt(0) === 0xfeff ? input.slice(1) : input;
|
|
39
|
+
const sep = separator ?? (0, exports.detectSeparator)(text);
|
|
40
|
+
const records = [];
|
|
41
|
+
let cells = [];
|
|
42
|
+
let cell = '';
|
|
43
|
+
let quoted = false;
|
|
44
|
+
let line = 1;
|
|
45
|
+
let startLine = 1;
|
|
46
|
+
const endCell = () => {
|
|
47
|
+
cells.push(cell);
|
|
48
|
+
cell = '';
|
|
49
|
+
};
|
|
50
|
+
const endRecord = () => {
|
|
51
|
+
endCell();
|
|
52
|
+
// A blank line, or one of nothing but separators, is not a row.
|
|
53
|
+
if (cells.some(c => c.trim() !== '')) {
|
|
54
|
+
records.push({ cells, line: startLine });
|
|
55
|
+
}
|
|
56
|
+
cells = [];
|
|
57
|
+
};
|
|
58
|
+
for (let i = 0; i < text.length; i++) {
|
|
59
|
+
const char = text[i];
|
|
60
|
+
if (quoted) {
|
|
61
|
+
if (char === '"') {
|
|
62
|
+
if (text[i + 1] === '"') {
|
|
63
|
+
cell += '"';
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
quoted = false;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
if (char === '\n')
|
|
71
|
+
line++;
|
|
72
|
+
cell += char;
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (char === '"' && cell === '') {
|
|
77
|
+
quoted = true;
|
|
78
|
+
}
|
|
79
|
+
else if (char === sep) {
|
|
80
|
+
endCell();
|
|
81
|
+
}
|
|
82
|
+
else if (char === '\n' || char === '\r') {
|
|
83
|
+
if (char === '\r' && text[i + 1] === '\n')
|
|
84
|
+
i++;
|
|
85
|
+
endRecord();
|
|
86
|
+
line++;
|
|
87
|
+
startLine = line;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
cell += char;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (cell !== '' || cells.length)
|
|
94
|
+
endRecord();
|
|
95
|
+
const [header, ...body] = records;
|
|
96
|
+
return {
|
|
97
|
+
headers: (header?.cells ?? []).map(h => h.trim()),
|
|
98
|
+
rows: body.map(r => r.cells),
|
|
99
|
+
lines: body.map(r => r.line)
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
exports.parseCsv = parseCsv;
|
package/dist/dataEngine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataEngine.d.ts","sourceRoot":"","sources":["../src/dataEngine.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAoC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EACL,YAAY,EA0BZ,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EAGV,gBAAgB,EAChB,gBAAgB,EAEhB,UAAU,EACV,SAAS,EACT,aAAa,EAEd,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAGzD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,YAAY,IAAI,MAAM,CAAC;CACxB;AAaD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"dataEngine.d.ts","sourceRoot":"","sources":["../src/dataEngine.ts"],"names":[],"mappings":"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"}
|
package/dist/dataEngine.js
CHANGED
|
@@ -75,6 +75,22 @@ exports.INTERNAL_MIGRATIONS = [
|
|
|
75
75
|
WHERE c.table_id = _ganju_tables.id AND c.type = 'text'
|
|
76
76
|
ORDER BY c.position, c.id LIMIT 1
|
|
77
77
|
) WHERE display_column_id IS NULL AND created_at < '2026-10-24T00:00:00Z'`
|
|
78
|
+
],
|
|
79
|
+
// Named queries: the owner's SELECTs, run by name. `tables` and `plan` are
|
|
80
|
+
// what the check found when each was saved.
|
|
81
|
+
[
|
|
82
|
+
`CREATE TABLE IF NOT EXISTS _ganju_queries (
|
|
83
|
+
name TEXT PRIMARY KEY,
|
|
84
|
+
description TEXT,
|
|
85
|
+
sql TEXT NOT NULL,
|
|
86
|
+
params TEXT NOT NULL DEFAULT '[]',
|
|
87
|
+
assistant INTEGER NOT NULL DEFAULT 0,
|
|
88
|
+
tables TEXT NOT NULL DEFAULT '[]',
|
|
89
|
+
plan TEXT NOT NULL DEFAULT '[]',
|
|
90
|
+
created_at TEXT NOT NULL DEFAULT (${dataDdl_1.DATA_NOW_SQL}),
|
|
91
|
+
updated_at TEXT NOT NULL DEFAULT (${dataDdl_1.DATA_NOW_SQL}),
|
|
92
|
+
updated_by TEXT
|
|
93
|
+
) WITHOUT ROWID`
|
|
78
94
|
]
|
|
79
95
|
];
|
|
80
96
|
exports.INTERNAL_SCHEMA_VERSION = exports.INTERNAL_MIGRATIONS.length;
|
|
@@ -158,7 +174,8 @@ const loadSchema = (runner) => {
|
|
|
158
174
|
position: Number(c.position)
|
|
159
175
|
};
|
|
160
176
|
})
|
|
161
|
-
}))
|
|
177
|
+
})),
|
|
178
|
+
timeZone: (0, exports.getMeta)(runner, 'time_zone')
|
|
162
179
|
};
|
|
163
180
|
};
|
|
164
181
|
exports.loadSchema = loadSchema;
|
|
@@ -977,9 +994,10 @@ const insertValues = (table, values, results, index, timeZone) => {
|
|
|
977
994
|
// A bot may only point a relation at a row it could read: none in a table
|
|
978
995
|
// hidden from it, and only its own customer's in a scoped one. Otherwise it
|
|
979
996
|
// could link an order to another customer and read their name back as the
|
|
980
|
-
// label.
|
|
997
|
+
// label. A caller held to some tables (a function's `data.tables`) may not
|
|
998
|
+
// point outside them either.
|
|
981
999
|
const assertRelationsVisible = (runner, schema, caller, table, values) => {
|
|
982
|
-
if (!caller.restricted)
|
|
1000
|
+
if (!caller.restricted && !caller.tables)
|
|
983
1001
|
return;
|
|
984
1002
|
for (const [name, value] of values) {
|
|
985
1003
|
if (value === null)
|
|
@@ -991,7 +1009,9 @@ const assertRelationsVisible = (runner, schema, caller, table, values) => {
|
|
|
991
1009
|
if (!target)
|
|
992
1010
|
continue;
|
|
993
1011
|
if (!(0, dataCompiler_1.canRead)(caller, target)) {
|
|
994
|
-
throw new dataTypes_1.DataError(
|
|
1012
|
+
throw new dataTypes_1.DataError(caller.restricted
|
|
1013
|
+
? `${table.name}.${name} points at a table the assistant can't use.`
|
|
1014
|
+
: `${table.name}.${name} points at ${target.name}, which isn't one of this caller's tables.`, 'forbidden');
|
|
995
1015
|
}
|
|
996
1016
|
if (!(0, dataCompiler_1.isScoped)(caller, target))
|
|
997
1017
|
continue;
|