@querypanel/node-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,63 @@
1
+ export interface AskRequestBody {
2
+ question: string;
3
+ }
4
+ export interface AskOptions {
5
+ tenantId?: string;
6
+ userId?: string;
7
+ scopes?: string[];
8
+ }
9
+ export interface AskResponseBody {
10
+ vegaLiteSpec: string;
11
+ notes: string | null;
12
+ }
13
+ export interface TrainingExample {
14
+ question: string;
15
+ sql: string;
16
+ }
17
+ export interface TrainRequestBody {
18
+ tenant_id: string;
19
+ ddl?: string;
20
+ examples?: TrainingExample[];
21
+ businessDoc?: string;
22
+ }
23
+ export interface TrainResponseBody {
24
+ message: string;
25
+ processed: {
26
+ ddl: number;
27
+ examples: number;
28
+ businessDoc: number;
29
+ };
30
+ }
31
+ export interface StatsResponseBody {
32
+ trainingData: Array<{
33
+ kind: string;
34
+ count: number;
35
+ last_updated: string | null;
36
+ }>;
37
+ total: number;
38
+ }
39
+ export interface StatsOptions {
40
+ tenantId?: string;
41
+ userId?: string;
42
+ scopes?: string[];
43
+ }
44
+ export declare class QueryPanelSdkAPI {
45
+ private readonly baseUrl;
46
+ private readonly token?;
47
+ private readonly privateKey?;
48
+ private readonly organizationId?;
49
+ private cachedPrivateKey?;
50
+ constructor(baseUrl: string, jwtTokenOrPrivateKey: string, organizationId?: string);
51
+ ask(body: AskRequestBody, options?: AskOptions, signal?: AbortSignal): Promise<AskResponseBody>;
52
+ train(body: TrainRequestBody, options?: {
53
+ userId?: string;
54
+ scopes?: string[];
55
+ }, signal?: AbortSignal): Promise<TrainResponseBody>;
56
+ stats(options?: StatsOptions, signal?: AbortSignal): Promise<StatsResponseBody>;
57
+ private get;
58
+ private post;
59
+ private generateJWT;
60
+ private headers;
61
+ private parseResponse;
62
+ }
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAM;gBAEnB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAa5E,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjI,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAIvE,GAAG;YASH,IAAI;YAUJ,WAAW;YA+BX,OAAO;YAkBP,aAAa;CAc9B"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryPanelSdkAPI = void 0;
4
+ const jose_1 = require("jose");
5
+ class QueryPanelSdkAPI {
6
+ constructor(baseUrl, jwtTokenOrPrivateKey, organizationId) {
7
+ this.baseUrl = baseUrl.replace(/\/$/, "");
8
+ if (organizationId) {
9
+ // New mode: generate JWTs
10
+ this.privateKey = jwtTokenOrPrivateKey;
11
+ this.organizationId = organizationId;
12
+ }
13
+ else {
14
+ // Legacy mode: use provided JWT
15
+ this.token = jwtTokenOrPrivateKey;
16
+ }
17
+ }
18
+ async ask(body, options, signal) {
19
+ return await this.post("/ask", body, options?.tenantId, options?.userId, options?.scopes, signal);
20
+ }
21
+ async train(body, options, signal) {
22
+ return await this.post("/train", body, body.tenant_id, options?.userId, options?.scopes, signal);
23
+ }
24
+ async stats(options, signal) {
25
+ return await this.get("/stats", options?.tenantId, options?.userId, options?.scopes, signal);
26
+ }
27
+ async get(path, tenantId, userId, scopes, signal) {
28
+ const res = await fetch(this.baseUrl + path, {
29
+ method: "GET",
30
+ headers: await this.headers(tenantId, userId, scopes),
31
+ signal,
32
+ });
33
+ return await this.parseResponse(res);
34
+ }
35
+ async post(path, body, tenantId, userId, scopes, signal) {
36
+ const res = await fetch(this.baseUrl + path, {
37
+ method: "POST",
38
+ headers: await this.headers(tenantId, userId, scopes),
39
+ body: JSON.stringify(body ?? {}),
40
+ signal,
41
+ });
42
+ return await this.parseResponse(res);
43
+ }
44
+ async generateJWT(tenantId, userId, scopes) {
45
+ if (!this.privateKey || !this.organizationId) {
46
+ throw new Error("Private key and organization ID are required for JWT generation");
47
+ }
48
+ // Cache the imported private key to avoid re-importing on every request
49
+ if (!this.cachedPrivateKey) {
50
+ this.cachedPrivateKey = await (0, jose_1.importPKCS8)(this.privateKey, 'RS256');
51
+ }
52
+ const payload = {
53
+ organizationId: this.organizationId,
54
+ };
55
+ if (tenantId) {
56
+ payload.tenantId = tenantId;
57
+ }
58
+ if (userId) {
59
+ payload.userId = userId;
60
+ }
61
+ if (scopes && scopes.length > 0) {
62
+ payload.scopes = scopes;
63
+ }
64
+ return await new jose_1.SignJWT(payload)
65
+ .setProtectedHeader({ alg: 'RS256' })
66
+ .setIssuedAt()
67
+ .setExpirationTime('1h')
68
+ .sign(this.cachedPrivateKey);
69
+ }
70
+ async headers(tenantId, userId, scopes) {
71
+ let authToken;
72
+ if (this.token) {
73
+ // Legacy mode: use provided JWT
74
+ authToken = this.token;
75
+ }
76
+ else {
77
+ // New mode: generate JWT
78
+ authToken = await this.generateJWT(tenantId, userId, scopes);
79
+ }
80
+ return {
81
+ "Authorization": `Bearer ${authToken}`,
82
+ "Content-Type": "application/json",
83
+ "Accept": "application/json",
84
+ };
85
+ }
86
+ async parseResponse(res) {
87
+ const text = await res.text();
88
+ let json = undefined;
89
+ try {
90
+ json = text ? JSON.parse(text) : undefined;
91
+ }
92
+ catch { }
93
+ if (!res.ok) {
94
+ const message = json?.error || res.statusText || "Request failed";
95
+ const err = new Error(message);
96
+ err.status = res.status;
97
+ if (json?.details)
98
+ err.details = json.details;
99
+ throw err;
100
+ }
101
+ return json;
102
+ }
103
+ }
104
+ exports.QueryPanelSdkAPI = QueryPanelSdkAPI;
105
+ // Optional: polyfill fetch for Node < 18 if global fetch is not available
106
+ // Consumers on older Node can pass a fetch implementation by assigning globalThis.fetch
107
+ // Example: globalThis.fetch = (await import('node-fetch')).default as any;
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,63 @@
1
+ export interface AskRequestBody {
2
+ question: string;
3
+ }
4
+ export interface AskOptions {
5
+ tenantId?: string;
6
+ userId?: string;
7
+ scopes?: string[];
8
+ }
9
+ export interface AskResponseBody {
10
+ vegaLiteSpec: string;
11
+ notes: string | null;
12
+ }
13
+ export interface TrainingExample {
14
+ question: string;
15
+ sql: string;
16
+ }
17
+ export interface TrainRequestBody {
18
+ tenant_id: string;
19
+ ddl?: string;
20
+ examples?: TrainingExample[];
21
+ businessDoc?: string;
22
+ }
23
+ export interface TrainResponseBody {
24
+ message: string;
25
+ processed: {
26
+ ddl: number;
27
+ examples: number;
28
+ businessDoc: number;
29
+ };
30
+ }
31
+ export interface StatsResponseBody {
32
+ trainingData: Array<{
33
+ kind: string;
34
+ count: number;
35
+ last_updated: string | null;
36
+ }>;
37
+ total: number;
38
+ }
39
+ export interface StatsOptions {
40
+ tenantId?: string;
41
+ userId?: string;
42
+ scopes?: string[];
43
+ }
44
+ export declare class QueryPanelSdkAPI {
45
+ private readonly baseUrl;
46
+ private readonly token?;
47
+ private readonly privateKey?;
48
+ private readonly organizationId?;
49
+ private cachedPrivateKey?;
50
+ constructor(baseUrl: string, jwtTokenOrPrivateKey: string, organizationId?: string);
51
+ ask(body: AskRequestBody, options?: AskOptions, signal?: AbortSignal): Promise<AskResponseBody>;
52
+ train(body: TrainRequestBody, options?: {
53
+ userId?: string;
54
+ scopes?: string[];
55
+ }, signal?: AbortSignal): Promise<TrainResponseBody>;
56
+ stats(options?: StatsOptions, signal?: AbortSignal): Promise<StatsResponseBody>;
57
+ private get;
58
+ private post;
59
+ private generateJWT;
60
+ private headers;
61
+ private parseResponse;
62
+ }
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAM;gBAEnB,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAa5E,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjI,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAIvE,GAAG;YASH,IAAI;YAUJ,WAAW;YA+BX,OAAO;YAkBP,aAAa;CAc9B"}
@@ -0,0 +1,104 @@
1
+ import { SignJWT, importPKCS8 } from 'jose';
2
+ export class QueryPanelSdkAPI {
3
+ constructor(baseUrl, jwtTokenOrPrivateKey, organizationId) {
4
+ this.baseUrl = baseUrl.replace(/\/$/, "");
5
+ if (organizationId) {
6
+ // New mode: generate JWTs
7
+ this.privateKey = jwtTokenOrPrivateKey;
8
+ this.organizationId = organizationId;
9
+ }
10
+ else {
11
+ // Legacy mode: use provided JWT
12
+ this.token = jwtTokenOrPrivateKey;
13
+ }
14
+ }
15
+ async ask(body, options, signal) {
16
+ return await this.post("/ask", body, options?.tenantId, options?.userId, options?.scopes, signal);
17
+ }
18
+ async train(body, options, signal) {
19
+ return await this.post("/train", body, body.tenant_id, options?.userId, options?.scopes, signal);
20
+ }
21
+ async stats(options, signal) {
22
+ return await this.get("/stats", options?.tenantId, options?.userId, options?.scopes, signal);
23
+ }
24
+ async get(path, tenantId, userId, scopes, signal) {
25
+ const res = await fetch(this.baseUrl + path, {
26
+ method: "GET",
27
+ headers: await this.headers(tenantId, userId, scopes),
28
+ signal,
29
+ });
30
+ return await this.parseResponse(res);
31
+ }
32
+ async post(path, body, tenantId, userId, scopes, signal) {
33
+ const res = await fetch(this.baseUrl + path, {
34
+ method: "POST",
35
+ headers: await this.headers(tenantId, userId, scopes),
36
+ body: JSON.stringify(body ?? {}),
37
+ signal,
38
+ });
39
+ return await this.parseResponse(res);
40
+ }
41
+ async generateJWT(tenantId, userId, scopes) {
42
+ if (!this.privateKey || !this.organizationId) {
43
+ throw new Error("Private key and organization ID are required for JWT generation");
44
+ }
45
+ // Cache the imported private key to avoid re-importing on every request
46
+ if (!this.cachedPrivateKey) {
47
+ this.cachedPrivateKey = await importPKCS8(this.privateKey, 'RS256');
48
+ }
49
+ const payload = {
50
+ organizationId: this.organizationId,
51
+ };
52
+ if (tenantId) {
53
+ payload.tenantId = tenantId;
54
+ }
55
+ if (userId) {
56
+ payload.userId = userId;
57
+ }
58
+ if (scopes && scopes.length > 0) {
59
+ payload.scopes = scopes;
60
+ }
61
+ return await new SignJWT(payload)
62
+ .setProtectedHeader({ alg: 'RS256' })
63
+ .setIssuedAt()
64
+ .setExpirationTime('1h')
65
+ .sign(this.cachedPrivateKey);
66
+ }
67
+ async headers(tenantId, userId, scopes) {
68
+ let authToken;
69
+ if (this.token) {
70
+ // Legacy mode: use provided JWT
71
+ authToken = this.token;
72
+ }
73
+ else {
74
+ // New mode: generate JWT
75
+ authToken = await this.generateJWT(tenantId, userId, scopes);
76
+ }
77
+ return {
78
+ "Authorization": `Bearer ${authToken}`,
79
+ "Content-Type": "application/json",
80
+ "Accept": "application/json",
81
+ };
82
+ }
83
+ async parseResponse(res) {
84
+ const text = await res.text();
85
+ let json = undefined;
86
+ try {
87
+ json = text ? JSON.parse(text) : undefined;
88
+ }
89
+ catch { }
90
+ if (!res.ok) {
91
+ const message = json?.error || res.statusText || "Request failed";
92
+ const err = new Error(message);
93
+ err.status = res.status;
94
+ if (json?.details)
95
+ err.details = json.details;
96
+ throw err;
97
+ }
98
+ return json;
99
+ }
100
+ }
101
+ // Optional: polyfill fetch for Node < 18 if global fetch is not available
102
+ // Consumers on older Node can pass a fetch implementation by assigning globalThis.fetch
103
+ // Example: globalThis.fetch = (await import('node-fetch')).default as any;
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AA6C5C,MAAM,OAAO,gBAAgB;IAOzB,YAAY,OAAe,EAAE,oBAA4B,EAAE,cAAuB;QAC9E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,cAAc,EAAE,CAAC;YACjB,0BAA0B;YAC1B,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC;YACvC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,gCAAgC;YAChC,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC;QACtC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAoB,EAAE,OAAoB,EAAE,MAAoB;QACtE,OAAO,MAAM,IAAI,CAAC,IAAI,CAAkB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAsB,EAAE,OAAgD,EAAE,MAAoB;QACtG,OAAO,MAAM,IAAI,CAAC,IAAI,CAAoB,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAsB,EAAE,MAAoB;QACpD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAoB,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,QAAiB,EAAE,MAAe,EAAE,MAAiB,EAAE,MAAY;QAClG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;YACzC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACrD,MAAM;SACT,CAAC,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAI,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAa,EAAE,QAAiB,EAAE,MAAe,EAAE,MAAiB,EAAE,MAAY;QAClH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACrD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM;SACT,CAAC,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAI,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAiB,EAAE,MAAe,EAAE,MAAiB;QAC3E,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACvF,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAQ;YACjB,cAAc,EAAE,IAAI,CAAC,cAAc;SACtC,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,OAAO,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;aAC5B,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;aACpC,WAAW,EAAE;aACb,iBAAiB,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,QAAiB,EAAE,MAAe,EAAE,MAAiB;QACvE,IAAI,SAAiB,CAAC;QAEtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,gCAAgC;YAChC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,yBAAyB;YACzB,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QAED,OAAO;YACH,eAAe,EAAE,UAAU,SAAS,EAAE;YACtC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;SAC/B,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,aAAa,CAAI,GAAiB;QAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAQ,SAAS,CAAC;QAC1B,IAAI,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAE5D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC;YAClE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAmD,CAAC;YACjF,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACxB,IAAI,IAAI,EAAE,OAAO;gBAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9C,MAAM,GAAG,CAAC;QACd,CAAC;QACD,OAAO,IAAS,CAAC;IACrB,CAAC;CACJ;AAWD,0EAA0E;AAC1E,wFAAwF;AACxF,2EAA2E"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@querypanel/node-sdk",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "dist/cjs/index.js",
6
+ "module": "dist/esm/index.js",
7
+ "types": "dist/esm/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/esm/index.d.ts",
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.js",
13
+ "default": "./dist/esm/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "engines": {
20
+ "node": ">=18.0.0"
21
+ },
22
+ "scripts": {
23
+ "build": "npm run build:cjs && npm run build:esm && npm run build:package-json",
24
+ "build:cjs": "tsc -p tsconfig.cjs.json",
25
+ "build:esm": "tsc -p tsconfig.esm.json",
26
+ "build:package-json": "echo '{\"type\": \"commonjs\"}' > dist/cjs/package.json",
27
+ "build:watch": "tsc -p tsconfig.esm.json -w",
28
+ "prepublishOnly": "npm run build"
29
+ },
30
+ "dependencies": {
31
+ "jose": "^5.9.6"
32
+ },
33
+ "devDependencies": {
34
+ "typescript": "^5.9.2"
35
+ }
36
+ }
37
+
38
+