@databricks/appkit 0.0.2

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.
Files changed (166) hide show
  1. package/CLAUDE.md +3 -0
  2. package/DCO +25 -0
  3. package/LICENSE +203 -0
  4. package/NOTICE.md +73 -0
  5. package/README.md +35 -0
  6. package/bin/setup-claude.js +190 -0
  7. package/dist/_virtual/rolldown_runtime.js +39 -0
  8. package/dist/analytics/analytics.d.ts +31 -0
  9. package/dist/analytics/analytics.d.ts.map +1 -0
  10. package/dist/analytics/analytics.js +149 -0
  11. package/dist/analytics/analytics.js.map +1 -0
  12. package/dist/analytics/defaults.js +17 -0
  13. package/dist/analytics/defaults.js.map +1 -0
  14. package/dist/analytics/index.js +3 -0
  15. package/dist/analytics/query.js +50 -0
  16. package/dist/analytics/query.js.map +1 -0
  17. package/dist/analytics/types.d.ts +9 -0
  18. package/dist/analytics/types.d.ts.map +1 -0
  19. package/dist/app/index.d.ts +23 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +49 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/appkit/package.js +7 -0
  24. package/dist/appkit/package.js.map +1 -0
  25. package/dist/cache/defaults.js +14 -0
  26. package/dist/cache/defaults.js.map +1 -0
  27. package/dist/cache/index.d.ts +119 -0
  28. package/dist/cache/index.d.ts.map +1 -0
  29. package/dist/cache/index.js +307 -0
  30. package/dist/cache/index.js.map +1 -0
  31. package/dist/cache/storage/defaults.js +16 -0
  32. package/dist/cache/storage/defaults.js.map +1 -0
  33. package/dist/cache/storage/index.js +4 -0
  34. package/dist/cache/storage/memory.js +87 -0
  35. package/dist/cache/storage/memory.js.map +1 -0
  36. package/dist/cache/storage/persistent.js +211 -0
  37. package/dist/cache/storage/persistent.js.map +1 -0
  38. package/dist/connectors/index.js +6 -0
  39. package/dist/connectors/lakebase/client.js +348 -0
  40. package/dist/connectors/lakebase/client.js.map +1 -0
  41. package/dist/connectors/lakebase/defaults.js +13 -0
  42. package/dist/connectors/lakebase/defaults.js.map +1 -0
  43. package/dist/connectors/lakebase/index.js +3 -0
  44. package/dist/connectors/sql-warehouse/client.js +284 -0
  45. package/dist/connectors/sql-warehouse/client.js.map +1 -0
  46. package/dist/connectors/sql-warehouse/defaults.js +12 -0
  47. package/dist/connectors/sql-warehouse/defaults.js.map +1 -0
  48. package/dist/connectors/sql-warehouse/index.js +3 -0
  49. package/dist/core/appkit.d.ts +14 -0
  50. package/dist/core/appkit.d.ts.map +1 -0
  51. package/dist/core/appkit.js +66 -0
  52. package/dist/core/appkit.js.map +1 -0
  53. package/dist/core/index.js +3 -0
  54. package/dist/index.d.ts +15 -0
  55. package/dist/index.js +21 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/plugin/dev-reader.d.ts +20 -0
  58. package/dist/plugin/dev-reader.d.ts.map +1 -0
  59. package/dist/plugin/dev-reader.js +63 -0
  60. package/dist/plugin/dev-reader.js.map +1 -0
  61. package/dist/plugin/index.js +4 -0
  62. package/dist/plugin/interceptors/cache.js +15 -0
  63. package/dist/plugin/interceptors/cache.js.map +1 -0
  64. package/dist/plugin/interceptors/retry.js +32 -0
  65. package/dist/plugin/interceptors/retry.js.map +1 -0
  66. package/dist/plugin/interceptors/telemetry.js +33 -0
  67. package/dist/plugin/interceptors/telemetry.js.map +1 -0
  68. package/dist/plugin/interceptors/timeout.js +35 -0
  69. package/dist/plugin/interceptors/timeout.js.map +1 -0
  70. package/dist/plugin/plugin.d.ts +43 -0
  71. package/dist/plugin/plugin.d.ts.map +1 -0
  72. package/dist/plugin/plugin.js +119 -0
  73. package/dist/plugin/plugin.js.map +1 -0
  74. package/dist/plugin/to-plugin.d.ts +7 -0
  75. package/dist/plugin/to-plugin.d.ts.map +1 -0
  76. package/dist/plugin/to-plugin.js +12 -0
  77. package/dist/plugin/to-plugin.js.map +1 -0
  78. package/dist/server/base-server.js +24 -0
  79. package/dist/server/base-server.js.map +1 -0
  80. package/dist/server/index.d.ts +100 -0
  81. package/dist/server/index.d.ts.map +1 -0
  82. package/dist/server/index.js +224 -0
  83. package/dist/server/index.js.map +1 -0
  84. package/dist/server/remote-tunnel/denied.html +68 -0
  85. package/dist/server/remote-tunnel/gate.js +51 -0
  86. package/dist/server/remote-tunnel/gate.js.map +1 -0
  87. package/dist/server/remote-tunnel/index.html +165 -0
  88. package/dist/server/remote-tunnel/remote-tunnel-controller.js +100 -0
  89. package/dist/server/remote-tunnel/remote-tunnel-controller.js.map +1 -0
  90. package/dist/server/remote-tunnel/remote-tunnel-manager.js +320 -0
  91. package/dist/server/remote-tunnel/remote-tunnel-manager.js.map +1 -0
  92. package/dist/server/remote-tunnel/wait.html +158 -0
  93. package/dist/server/static-server.js +47 -0
  94. package/dist/server/static-server.js.map +1 -0
  95. package/dist/server/types.d.ts +14 -0
  96. package/dist/server/types.d.ts.map +1 -0
  97. package/dist/server/utils.js +70 -0
  98. package/dist/server/utils.js.map +1 -0
  99. package/dist/server/vite-dev-server.js +103 -0
  100. package/dist/server/vite-dev-server.js.map +1 -0
  101. package/dist/shared/src/cache.d.ts +62 -0
  102. package/dist/shared/src/cache.d.ts.map +1 -0
  103. package/dist/shared/src/execute.d.ts +46 -0
  104. package/dist/shared/src/execute.d.ts.map +1 -0
  105. package/dist/shared/src/plugin.d.ts +50 -0
  106. package/dist/shared/src/plugin.d.ts.map +1 -0
  107. package/dist/shared/src/sql/helpers.d.ts +160 -0
  108. package/dist/shared/src/sql/helpers.d.ts.map +1 -0
  109. package/dist/shared/src/sql/helpers.js +103 -0
  110. package/dist/shared/src/sql/helpers.js.map +1 -0
  111. package/dist/shared/src/sql/types.d.ts +34 -0
  112. package/dist/shared/src/sql/types.d.ts.map +1 -0
  113. package/dist/shared/src/tunnel.d.ts +30 -0
  114. package/dist/shared/src/tunnel.d.ts.map +1 -0
  115. package/dist/stream/arrow-stream-processor.js +154 -0
  116. package/dist/stream/arrow-stream-processor.js.map +1 -0
  117. package/dist/stream/buffers.js +88 -0
  118. package/dist/stream/buffers.js.map +1 -0
  119. package/dist/stream/defaults.js +14 -0
  120. package/dist/stream/defaults.js.map +1 -0
  121. package/dist/stream/index.js +6 -0
  122. package/dist/stream/sse-writer.js +61 -0
  123. package/dist/stream/sse-writer.js.map +1 -0
  124. package/dist/stream/stream-manager.d.ts +27 -0
  125. package/dist/stream/stream-manager.d.ts.map +1 -0
  126. package/dist/stream/stream-manager.js +191 -0
  127. package/dist/stream/stream-manager.js.map +1 -0
  128. package/dist/stream/stream-registry.js +54 -0
  129. package/dist/stream/stream-registry.js.map +1 -0
  130. package/dist/stream/types.js +14 -0
  131. package/dist/stream/types.js.map +1 -0
  132. package/dist/stream/validator.js +25 -0
  133. package/dist/stream/validator.js.map +1 -0
  134. package/dist/telemetry/config.js +20 -0
  135. package/dist/telemetry/config.js.map +1 -0
  136. package/dist/telemetry/index.d.ts +4 -0
  137. package/dist/telemetry/index.js +8 -0
  138. package/dist/telemetry/instrumentations.js +38 -0
  139. package/dist/telemetry/instrumentations.js.map +1 -0
  140. package/dist/telemetry/noop.js +54 -0
  141. package/dist/telemetry/noop.js.map +1 -0
  142. package/dist/telemetry/telemetry-manager.js +113 -0
  143. package/dist/telemetry/telemetry-manager.js.map +1 -0
  144. package/dist/telemetry/telemetry-provider.js +82 -0
  145. package/dist/telemetry/telemetry-provider.js.map +1 -0
  146. package/dist/telemetry/types.d.ts +74 -0
  147. package/dist/telemetry/types.d.ts.map +1 -0
  148. package/dist/type-generator/vite-plugin.d.ts +22 -0
  149. package/dist/type-generator/vite-plugin.d.ts.map +1 -0
  150. package/dist/type-generator/vite-plugin.js +49 -0
  151. package/dist/type-generator/vite-plugin.js.map +1 -0
  152. package/dist/utils/databricks-client-middleware.d.ts +17 -0
  153. package/dist/utils/databricks-client-middleware.d.ts.map +1 -0
  154. package/dist/utils/databricks-client-middleware.js +117 -0
  155. package/dist/utils/databricks-client-middleware.js.map +1 -0
  156. package/dist/utils/env-validator.js +14 -0
  157. package/dist/utils/env-validator.js.map +1 -0
  158. package/dist/utils/index.js +26 -0
  159. package/dist/utils/index.js.map +1 -0
  160. package/dist/utils/merge.js +25 -0
  161. package/dist/utils/merge.js.map +1 -0
  162. package/dist/utils/vite-config-merge.js +22 -0
  163. package/dist/utils/vite-config-merge.js.map +1 -0
  164. package/llms.txt +193 -0
  165. package/package.json +70 -0
  166. package/scripts/postinstall.js +6 -0
@@ -0,0 +1,32 @@
1
+ //#region src/plugin/interceptors/retry.ts
2
+ var RetryInterceptor = class {
3
+ constructor(config) {
4
+ this.attempts = config.attempts ?? 3;
5
+ this.initialDelay = config.initialDelay ?? 1e3;
6
+ this.maxDelay = config.maxDelay ?? 3e4;
7
+ }
8
+ async intercept(fn, context) {
9
+ let lastError;
10
+ for (let attempt = 1; attempt <= this.attempts; attempt++) try {
11
+ return await fn();
12
+ } catch (error) {
13
+ lastError = error;
14
+ if (attempt === this.attempts) throw error;
15
+ if (context.signal?.aborted) throw error;
16
+ const delay = this.calculateDelay(attempt);
17
+ await this.sleep(delay);
18
+ }
19
+ throw lastError;
20
+ }
21
+ calculateDelay(attempt) {
22
+ const delay = this.initialDelay * 2 ** (attempt - 1);
23
+ return Math.min(delay, this.maxDelay);
24
+ }
25
+ sleep(ms) {
26
+ return new Promise((resolve) => setTimeout(resolve, ms));
27
+ }
28
+ };
29
+
30
+ //#endregion
31
+ export { RetryInterceptor };
32
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","names":["lastError: Error | unknown"],"sources":["../../../src/plugin/interceptors/retry.ts"],"sourcesContent":["import type { RetryConfig } from \"shared\";\nimport type { ExecutionContext, ExecutionInterceptor } from \"./types\";\n\n// interceptor to handle retry logic\nexport class RetryInterceptor implements ExecutionInterceptor {\n private attempts: number;\n private initialDelay: number;\n private maxDelay: number;\n\n constructor(config: RetryConfig) {\n this.attempts = config.attempts ?? 3;\n this.initialDelay = config.initialDelay ?? 1000;\n this.maxDelay = config.maxDelay ?? 30000;\n }\n\n async intercept<T>(\n fn: () => Promise<T>,\n context: ExecutionContext,\n ): Promise<T> {\n let lastError: Error | unknown;\n\n for (let attempt = 1; attempt <= this.attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // last attempt, rethrow the error\n if (attempt === this.attempts) {\n throw error;\n }\n\n // don't retry if was already aborted\n if (context.signal?.aborted) {\n throw error;\n }\n\n const delay = this.calculateDelay(attempt);\n await this.sleep(delay);\n }\n }\n\n // type guard\n throw lastError;\n }\n\n private calculateDelay(attempt: number): number {\n // exponential backoff\n const delay = this.initialDelay * 2 ** (attempt - 1);\n\n // max delay cap\n return Math.min(delay, this.maxDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"],"mappings":";AAIA,IAAa,mBAAb,MAA8D;CAK5D,YAAY,QAAqB;AAC/B,OAAK,WAAW,OAAO,YAAY;AACnC,OAAK,eAAe,OAAO,gBAAgB;AAC3C,OAAK,WAAW,OAAO,YAAY;;CAGrC,MAAM,UACJ,IACA,SACY;EACZ,IAAIA;AAEJ,OAAK,IAAI,UAAU,GAAG,WAAW,KAAK,UAAU,UAC9C,KAAI;AACF,UAAO,MAAM,IAAI;WACV,OAAO;AACd,eAAY;AAGZ,OAAI,YAAY,KAAK,SACnB,OAAM;AAIR,OAAI,QAAQ,QAAQ,QAClB,OAAM;GAGR,MAAM,QAAQ,KAAK,eAAe,QAAQ;AAC1C,SAAM,KAAK,MAAM,MAAM;;AAK3B,QAAM;;CAGR,AAAQ,eAAe,SAAyB;EAE9C,MAAM,QAAQ,KAAK,eAAe,MAAM,UAAU;AAGlD,SAAO,KAAK,IAAI,OAAO,KAAK,SAAS;;CAGvC,AAAQ,MAAM,IAA2B;AACvC,SAAO,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { SpanStatusCode } from "../../telemetry/index.js";
2
+
3
+ //#region src/plugin/interceptors/telemetry.ts
4
+ /**
5
+ * Interceptor to automatically instrument plugin executions with telemetry spans.
6
+ * Wraps the execution in a span and handles success/error status.
7
+ */
8
+ var TelemetryInterceptor = class {
9
+ constructor(telemetry, config) {
10
+ this.telemetry = telemetry;
11
+ this.config = config;
12
+ }
13
+ async intercept(fn, _context) {
14
+ const spanName = this.config?.spanName || "plugin.execute";
15
+ return this.telemetry.startActiveSpan(spanName, { attributes: this.config?.attributes }, async (span) => {
16
+ try {
17
+ const result = await fn();
18
+ span.setStatus({ code: SpanStatusCode.OK });
19
+ return result;
20
+ } catch (error) {
21
+ span.recordException(error);
22
+ span.setStatus({ code: SpanStatusCode.ERROR });
23
+ throw error;
24
+ } finally {
25
+ span.end();
26
+ }
27
+ });
28
+ }
29
+ };
30
+
31
+ //#endregion
32
+ export { TelemetryInterceptor };
33
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","names":["telemetry: ITelemetry","config?: TelemetryConfig"],"sources":["../../../src/plugin/interceptors/telemetry.ts"],"sourcesContent":["import type { ITelemetry, Span } from \"../../telemetry\";\nimport { SpanStatusCode } from \"../../telemetry\";\nimport type { TelemetryConfig } from \"shared\";\nimport type { ExecutionContext, ExecutionInterceptor } from \"./types\";\n\n/**\n * Interceptor to automatically instrument plugin executions with telemetry spans.\n * Wraps the execution in a span and handles success/error status.\n */\nexport class TelemetryInterceptor implements ExecutionInterceptor {\n constructor(\n private telemetry: ITelemetry,\n private config?: TelemetryConfig,\n ) {}\n\n async intercept<T>(\n fn: () => Promise<T>,\n _context: ExecutionContext,\n ): Promise<T> {\n const spanName = this.config?.spanName || \"plugin.execute\";\n return this.telemetry.startActiveSpan(\n spanName,\n { attributes: this.config?.attributes },\n async (span: Span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,uBAAb,MAAkE;CAChE,YACE,AAAQA,WACR,AAAQC,QACR;EAFQ;EACA;;CAGV,MAAM,UACJ,IACA,UACY;EACZ,MAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,SAAO,KAAK,UAAU,gBACpB,UACA,EAAE,YAAY,KAAK,QAAQ,YAAY,EACvC,OAAO,SAAe;AACpB,OAAI;IACF,MAAM,SAAS,MAAM,IAAI;AACzB,SAAK,UAAU,EAAE,MAAM,eAAe,IAAI,CAAC;AAC3C,WAAO;YACA,OAAO;AACd,SAAK,gBAAgB,MAAe;AACpC,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,CAAC;AAC9C,UAAM;aACE;AACR,SAAK,KAAK;;IAGf"}
@@ -0,0 +1,35 @@
1
+ //#region src/plugin/interceptors/timeout.ts
2
+ var TimeoutInterceptor = class {
3
+ constructor(timeoutMs) {
4
+ this.timeoutMs = timeoutMs;
5
+ }
6
+ async intercept(fn, context) {
7
+ const timeoutController = new AbortController();
8
+ const timeoutId = setTimeout(() => {
9
+ timeoutController.abort(/* @__PURE__ */ new Error(`Operation timed out after ${this.timeoutMs} ms`));
10
+ }, this.timeoutMs);
11
+ try {
12
+ context.signal = context.signal ? this._combineSignals([context.signal, timeoutController.signal]) : timeoutController.signal;
13
+ return await fn();
14
+ } finally {
15
+ clearTimeout(timeoutId);
16
+ }
17
+ }
18
+ _combineSignals(signals) {
19
+ const controller = new AbortController();
20
+ for (const signal of signals) {
21
+ if (signal.aborted) {
22
+ controller.abort(signal.reason);
23
+ break;
24
+ }
25
+ signal.addEventListener("abort", () => {
26
+ controller.abort(signal.reason);
27
+ }, { once: true });
28
+ }
29
+ return controller.signal;
30
+ }
31
+ };
32
+
33
+ //#endregion
34
+ export { TimeoutInterceptor };
35
+ //# sourceMappingURL=timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.js","names":["timeoutMs: number"],"sources":["../../../src/plugin/interceptors/timeout.ts"],"sourcesContent":["import type { ExecutionContext, ExecutionInterceptor } from \"./types\";\n\n// interceptor to handle timeout logic\nexport class TimeoutInterceptor implements ExecutionInterceptor {\n constructor(private timeoutMs: number) {}\n\n async intercept<T>(\n fn: () => Promise<T>,\n context: ExecutionContext,\n ): Promise<T> {\n // create timeout signal\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => {\n timeoutController.abort(\n new Error(`Operation timed out after ${this.timeoutMs} ms`),\n );\n }, this.timeoutMs);\n\n try {\n // combine user signal (if exists) with timeout signal\n const combinedSignal = context.signal\n ? this._combineSignals([context.signal, timeoutController.signal])\n : timeoutController.signal;\n\n // execute function with combined signal\n context.signal = combinedSignal;\n return await fn();\n } finally {\n // cleanup timeout\n clearTimeout(timeoutId);\n }\n }\n\n private _combineSignals(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n break;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true },\n );\n }\n return controller.signal;\n }\n}\n"],"mappings":";AAGA,IAAa,qBAAb,MAAgE;CAC9D,YAAY,AAAQA,WAAmB;EAAnB;;CAEpB,MAAM,UACJ,IACA,SACY;EAEZ,MAAM,oBAAoB,IAAI,iBAAiB;EAC/C,MAAM,YAAY,iBAAiB;AACjC,qBAAkB,sBAChB,IAAI,MAAM,6BAA6B,KAAK,UAAU,KAAK,CAC5D;KACA,KAAK,UAAU;AAElB,MAAI;AAOF,WAAQ,SALe,QAAQ,SAC3B,KAAK,gBAAgB,CAAC,QAAQ,QAAQ,kBAAkB,OAAO,CAAC,GAChE,kBAAkB;AAItB,UAAO,MAAM,IAAI;YACT;AAER,gBAAa,UAAU;;;CAI3B,AAAQ,gBAAgB,SAAqC;EAC3D,MAAM,aAAa,IAAI,iBAAiB;AACxC,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,OAAO,SAAS;AAClB,eAAW,MAAM,OAAO,OAAO;AAC/B;;AAEF,UAAO,iBACL,eACM;AACJ,eAAW,MAAM,OAAO,OAAO;MAEjC,EAAE,MAAM,MAAM,CACf;;AAEH,SAAO,WAAW"}
@@ -0,0 +1,43 @@
1
+ import { BasePlugin, BasePluginConfig, IAppResponse, PluginEndpointMap, PluginPhase, RouteConfig } from "../shared/src/plugin.js";
2
+ import { PluginExecutionSettings, StreamExecuteHandler, StreamExecutionSettings } from "../shared/src/execute.js";
3
+ import { AppManager } from "../app/index.js";
4
+ import { CacheManager } from "../cache/index.js";
5
+ import { StreamManager } from "../stream/stream-manager.js";
6
+ import { ITelemetry } from "../telemetry/types.js";
7
+ import { DevFileReader } from "./dev-reader.js";
8
+ import express from "express";
9
+
10
+ //#region src/plugin/plugin.d.ts
11
+ declare abstract class Plugin<TConfig extends BasePluginConfig = BasePluginConfig> implements BasePlugin {
12
+ protected config: TConfig;
13
+ protected isReady: boolean;
14
+ protected cache: CacheManager;
15
+ protected app: AppManager;
16
+ protected devFileReader: DevFileReader;
17
+ protected streamManager: StreamManager;
18
+ protected telemetry: ITelemetry;
19
+ protected abstract envVars: string[];
20
+ /** If the plugin requires the Databricks client to be set in the request context */
21
+ requiresDatabricksClient: boolean;
22
+ /** Registered endpoints for this plugin */
23
+ private registeredEndpoints;
24
+ static phase: PluginPhase;
25
+ name: string;
26
+ constructor(config: TConfig);
27
+ validateEnv(): void;
28
+ injectRoutes(_: express.Router): void;
29
+ setup(): Promise<void>;
30
+ getEndpoints(): PluginEndpointMap;
31
+ abortActiveOperations(): void;
32
+ protected executeStream<T>(res: IAppResponse, fn: StreamExecuteHandler<T>, options: StreamExecutionSettings, userKey: string): Promise<void>;
33
+ protected execute<T>(fn: (signal?: AbortSignal) => Promise<T>, options: PluginExecutionSettings, userKey: string): Promise<T | undefined>;
34
+ protected registerEndpoint(name: string, path: string): void;
35
+ protected route<_TResponse>(router: express.Router, config: RouteConfig): void;
36
+ private _buildExecutionConfig;
37
+ private _buildInterceptors;
38
+ private _executeWithInterceptors;
39
+ private _checkIfGenerator;
40
+ }
41
+ //#endregion
42
+ export { Plugin };
43
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../src/plugin/plugin.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;uBAgCsB,uBACJ,mBAAmB,6BACxB;oBAmBmB;;EArBV,UAAM,KAAA,EAKT,YALS;EAAA,UAAA,GAAA,EAMX,UANW;YACV,aAAA,EAMS,aANT;YAAmB,aAAA,EAOV,aAPU;YAoBL,SAAA,EAZT,UAYS;qBAhBb,OAAA,EAAA,MAAA,EAAA;;0BAEQ,EAAA,OAAA;;UAEJ,mBAAA;SASP,KAAA,EAAA,WAAA;MAGgB,EAAA,MAAA;aAeN,CAAA,MAAA,EAfM,OAeN;aAIb,CAAA,CAAA,EAAA,IAAA;cAEK,CAAA,CAAA,EANA,OAAA,CAAQ,MAMR,CAAA,EAAA,IAAA;OAUT,CAAA,CAAA,EAZI,OAYJ,CAAA,IAAA,CAAA;cACoB,CAAA,CAAA,EAXX,iBAWW;uBAArB,CAAA,CAAA,EAAA,IAAA;YACK,aAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAFJ,YAEI,EAAA,EAAA,EADL,oBACK,CADgB,CAChB,CAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EACM,OADN,CAAA,IAAA,CAAA;YACM,OAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,MAAA,CAAA,EAwDD,WAxDC,EAAA,GAwDe,OAxDf,CAwDuB,CAxDvB,CAAA,EAAA,OAAA,EAyDN,uBAzDM,EAAA,OAAA,EAAA,MAAA,CAAA,EA2Dd,OA3Dc,CA2DN,CA3DM,GAAA,SAAA,CAAA;YAwDD,gBAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;YAAwB,KAAA,CAAA,UAAA,CAAA,CAAA,MAAA,EA0B9B,OAAA,CAAQ,MA1BsB,EAAA,MAAA,EA2B9B,WA3B8B,CAAA,EAAA,IAAA;UAAR,qBAAA;UACrB,kBAAA;UAEA,wBAAA;UAAR,iBAAA"}
@@ -0,0 +1,119 @@
1
+ import { normalizeTelemetryOptions } from "../telemetry/config.js";
2
+ import { TelemetryManager } from "../telemetry/telemetry-manager.js";
3
+ import "../telemetry/index.js";
4
+ import { validateEnv } from "../utils/env-validator.js";
5
+ import { deepMerge } from "../utils/merge.js";
6
+ import { init_utils } from "../utils/index.js";
7
+ import { AppManager } from "../app/index.js";
8
+ import { CacheManager } from "../cache/index.js";
9
+ import { StreamManager } from "../stream/stream-manager.js";
10
+ import "../stream/index.js";
11
+ import { DevFileReader } from "./dev-reader.js";
12
+ import { CacheInterceptor } from "./interceptors/cache.js";
13
+ import { RetryInterceptor } from "./interceptors/retry.js";
14
+ import { TelemetryInterceptor } from "./interceptors/telemetry.js";
15
+ import { TimeoutInterceptor } from "./interceptors/timeout.js";
16
+
17
+ //#region src/plugin/plugin.ts
18
+ init_utils();
19
+ var Plugin = class {
20
+ static {
21
+ this.phase = "normal";
22
+ }
23
+ constructor(config) {
24
+ this.config = config;
25
+ this.isReady = false;
26
+ this.requiresDatabricksClient = false;
27
+ this.registeredEndpoints = {};
28
+ this.name = config.name ?? "plugin";
29
+ this.telemetry = TelemetryManager.getProvider(this.name, config.telemetry);
30
+ this.streamManager = new StreamManager();
31
+ this.cache = CacheManager.getInstanceSync();
32
+ this.app = new AppManager();
33
+ this.devFileReader = DevFileReader.getInstance();
34
+ this.isReady = true;
35
+ }
36
+ validateEnv() {
37
+ validateEnv(this.envVars);
38
+ }
39
+ injectRoutes(_) {}
40
+ async setup() {}
41
+ getEndpoints() {
42
+ return this.registeredEndpoints;
43
+ }
44
+ abortActiveOperations() {
45
+ this.streamManager.abortAll();
46
+ }
47
+ async executeStream(res, fn, options, userKey) {
48
+ const { stream: streamConfig, default: defaultConfig, user: userConfig } = options;
49
+ const executeConfig = this._buildExecutionConfig({
50
+ default: defaultConfig,
51
+ user: userConfig
52
+ });
53
+ const self = this;
54
+ const asyncWrapperFn = async function* (streamSignal) {
55
+ const context = {
56
+ signal: streamSignal,
57
+ metadata: /* @__PURE__ */ new Map(),
58
+ userKey
59
+ };
60
+ const interceptors = self._buildInterceptors(executeConfig);
61
+ const wrappedFn = async () => {
62
+ return await fn(context.signal);
63
+ };
64
+ const result = await self._executeWithInterceptors(wrappedFn, interceptors, context);
65
+ if (self._checkIfGenerator(result)) yield* result;
66
+ else yield result;
67
+ };
68
+ await this.streamManager.stream(res, asyncWrapperFn, streamConfig);
69
+ }
70
+ async execute(fn, options, userKey) {
71
+ const executeConfig = this._buildExecutionConfig(options);
72
+ const interceptors = this._buildInterceptors(executeConfig);
73
+ const context = {
74
+ metadata: /* @__PURE__ */ new Map(),
75
+ userKey
76
+ };
77
+ try {
78
+ return await this._executeWithInterceptors(fn, interceptors, context);
79
+ } catch (_error) {
80
+ return;
81
+ }
82
+ }
83
+ registerEndpoint(name, path) {
84
+ this.registeredEndpoints[name] = path;
85
+ }
86
+ route(router, config) {
87
+ const { name, method, path, handler } = config;
88
+ router[method](path, handler);
89
+ this.registerEndpoint(name, `/api/${this.name}${path}`);
90
+ }
91
+ _buildExecutionConfig(options) {
92
+ const { default: methodDefaults, user: userOverride } = options;
93
+ return deepMerge(deepMerge(methodDefaults, this.config), userOverride ?? {});
94
+ }
95
+ _buildInterceptors(options) {
96
+ const interceptors = [];
97
+ if (normalizeTelemetryOptions(this.config.telemetry).traces && (options.telemetryInterceptor?.enabled ?? true)) interceptors.push(new TelemetryInterceptor(this.telemetry, options.telemetryInterceptor));
98
+ if (options.timeout && options.timeout > 0) interceptors.push(new TimeoutInterceptor(options.timeout));
99
+ if (options.retry?.enabled && options.retry.attempts && options.retry.attempts > 1) interceptors.push(new RetryInterceptor(options.retry));
100
+ if (options.cache?.enabled && options.cache.cacheKey?.length) interceptors.push(new CacheInterceptor(this.cache, options.cache));
101
+ return interceptors;
102
+ }
103
+ async _executeWithInterceptors(fn, interceptors, context) {
104
+ if (interceptors.length === 0) return fn(context.signal);
105
+ let wrappedFn = () => fn(context.signal);
106
+ for (const interceptor of interceptors) {
107
+ const previousFn = wrappedFn;
108
+ wrappedFn = () => interceptor.intercept(previousFn, context);
109
+ }
110
+ return wrappedFn();
111
+ }
112
+ _checkIfGenerator(result) {
113
+ return result && typeof result === "object" && Symbol.asyncIterator in result;
114
+ }
115
+ };
116
+
117
+ //#endregion
118
+ export { Plugin };
119
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","names":["config: TConfig","context: ExecutionContext","interceptors: ExecutionInterceptor[]"],"sources":["../../src/plugin/plugin.ts"],"sourcesContent":["import type express from \"express\";\nimport type {\n BasePlugin,\n BasePluginConfig,\n IAppResponse,\n PluginEndpointMap,\n PluginExecuteConfig,\n PluginExecutionSettings,\n PluginPhase,\n RouteConfig,\n StreamExecuteHandler,\n StreamExecutionSettings,\n} from \"shared\";\nimport { AppManager } from \"../app\";\nimport { CacheManager } from \"../cache\";\nimport { StreamManager } from \"../stream\";\nimport {\n type ITelemetry,\n normalizeTelemetryOptions,\n TelemetryManager,\n} from \"../telemetry\";\nimport { deepMerge, validateEnv } from \"../utils\";\nimport { DevFileReader } from \"./dev-reader\";\nimport { CacheInterceptor } from \"./interceptors/cache\";\nimport { RetryInterceptor } from \"./interceptors/retry\";\nimport { TelemetryInterceptor } from \"./interceptors/telemetry\";\nimport { TimeoutInterceptor } from \"./interceptors/timeout\";\nimport type {\n ExecutionContext,\n ExecutionInterceptor,\n} from \"./interceptors/types\";\n\nexport abstract class Plugin<\n TConfig extends BasePluginConfig = BasePluginConfig,\n> implements BasePlugin\n{\n protected isReady = false;\n protected cache: CacheManager;\n protected app: AppManager;\n protected devFileReader: DevFileReader;\n protected streamManager: StreamManager;\n protected telemetry: ITelemetry;\n protected abstract envVars: string[];\n\n /** If the plugin requires the Databricks client to be set in the request context */\n requiresDatabricksClient = false;\n\n /** Registered endpoints for this plugin */\n private registeredEndpoints: PluginEndpointMap = {};\n\n static phase: PluginPhase = \"normal\";\n name: string;\n\n constructor(protected config: TConfig) {\n this.name = config.name ?? \"plugin\";\n this.telemetry = TelemetryManager.getProvider(this.name, config.telemetry);\n this.streamManager = new StreamManager();\n this.cache = CacheManager.getInstanceSync();\n this.app = new AppManager();\n this.devFileReader = DevFileReader.getInstance();\n\n this.isReady = true;\n }\n\n validateEnv() {\n validateEnv(this.envVars);\n }\n\n injectRoutes(_: express.Router) {\n return;\n }\n\n async setup() {}\n\n getEndpoints(): PluginEndpointMap {\n return this.registeredEndpoints;\n }\n\n abortActiveOperations(): void {\n this.streamManager.abortAll();\n }\n\n // streaming execution with interceptors\n protected async executeStream<T>(\n res: IAppResponse,\n fn: StreamExecuteHandler<T>,\n options: StreamExecutionSettings,\n userKey: string,\n ) {\n // destructure options\n const {\n stream: streamConfig,\n default: defaultConfig,\n user: userConfig,\n } = options;\n\n // build execution options\n const executeConfig = this._buildExecutionConfig({\n default: defaultConfig,\n user: userConfig,\n });\n\n const self = this;\n\n // wrapper function to ensure it returns a generator\n const asyncWrapperFn = async function* (streamSignal?: AbortSignal) {\n // build execution context\n const context: ExecutionContext = {\n signal: streamSignal,\n metadata: new Map(),\n userKey: userKey,\n };\n\n // build interceptors\n const interceptors = self._buildInterceptors(executeConfig);\n\n // wrap the function to ensure it returns a promise\n const wrappedFn = async () => {\n const result = await fn(context.signal);\n return result;\n };\n\n // execute the function with interceptors\n const result = await self._executeWithInterceptors(\n wrappedFn as (signal?: AbortSignal) => Promise<T>,\n interceptors,\n context,\n );\n\n // check if result is a generator\n if (self._checkIfGenerator(result)) {\n yield* result;\n } else {\n yield result;\n }\n };\n\n // stream the result to the client\n await this.streamManager.stream(res, asyncWrapperFn, streamConfig);\n }\n\n // single sync execution with interceptors\n protected async execute<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n options: PluginExecutionSettings,\n userKey: string,\n ): Promise<T | undefined> {\n const executeConfig = this._buildExecutionConfig(options);\n\n const interceptors = this._buildInterceptors(executeConfig);\n\n const context: ExecutionContext = {\n metadata: new Map(),\n userKey: userKey,\n };\n\n try {\n return await this._executeWithInterceptors(fn, interceptors, context);\n } catch (_error) {\n // production-safe, don't crash sdk\n return undefined;\n }\n }\n\n protected registerEndpoint(name: string, path: string): void {\n this.registeredEndpoints[name] = path;\n }\n\n protected route<_TResponse>(\n router: express.Router,\n config: RouteConfig,\n ): void {\n const { name, method, path, handler } = config;\n\n router[method](path, handler);\n\n this.registerEndpoint(name, `/api/${this.name}${path}`);\n }\n\n // build execution options by merging defaults, plugin config, and user overrides\n private _buildExecutionConfig(\n options: PluginExecutionSettings,\n ): PluginExecuteConfig {\n const { default: methodDefaults, user: userOverride } = options;\n\n // Merge: method defaults <- plugin config <- user override (highest priority)\n return deepMerge(\n deepMerge(methodDefaults, this.config),\n userOverride ?? {},\n ) as PluginExecuteConfig;\n }\n\n // build interceptors based on execute options\n private _buildInterceptors(\n options: PluginExecuteConfig,\n ): ExecutionInterceptor[] {\n const interceptors: ExecutionInterceptor[] = [];\n\n // order matters: telemetry → timeout → retry → cache (innermost to outermost)\n\n // Only add telemetry interceptor if traces are enabled\n const telemetryConfig = normalizeTelemetryOptions(this.config.telemetry);\n if (\n telemetryConfig.traces &&\n (options.telemetryInterceptor?.enabled ?? true)\n ) {\n interceptors.push(\n new TelemetryInterceptor(this.telemetry, options.telemetryInterceptor),\n );\n }\n\n if (options.timeout && options.timeout > 0) {\n interceptors.push(new TimeoutInterceptor(options.timeout));\n }\n\n if (\n options.retry?.enabled &&\n options.retry.attempts &&\n options.retry.attempts > 1\n ) {\n interceptors.push(new RetryInterceptor(options.retry));\n }\n\n if (options.cache?.enabled && options.cache.cacheKey?.length) {\n interceptors.push(new CacheInterceptor(this.cache, options.cache));\n }\n\n return interceptors;\n }\n\n // execute method wrapped with interceptors\n private async _executeWithInterceptors<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n interceptors: ExecutionInterceptor[],\n context: ExecutionContext,\n ): Promise<T> {\n // no interceptors, execute directly\n if (interceptors.length === 0) {\n return fn(context.signal);\n }\n // build nested execution chain from interceptors\n let wrappedFn = () => fn(context.signal);\n\n // wrap each interceptor around the previous function\n for (const interceptor of interceptors) {\n const previousFn = wrappedFn;\n wrappedFn = () => interceptor.intercept(previousFn, context);\n }\n\n return wrappedFn();\n }\n\n private _checkIfGenerator(\n result: any,\n ): result is AsyncGenerator<any, void, unknown> {\n return (\n result && typeof result === \"object\" && Symbol.asyncIterator in result\n );\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ToPlugin } from "../shared/src/plugin.js";
2
+
3
+ //#region src/plugin/to-plugin.d.ts
4
+ declare function toPlugin<T, U, N extends string>(plugin: T, name: N): ToPlugin<T, U, N>;
5
+ //#endregion
6
+ export { toPlugin };
7
+ //# sourceMappingURL=to-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-plugin.d.ts","names":[],"sources":["../../src/plugin/to-plugin.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,yCACN,SACF,IACL,SAAS,GAAG,GAAG"}
@@ -0,0 +1,12 @@
1
+ //#region src/plugin/to-plugin.ts
2
+ function toPlugin(plugin, name) {
3
+ return (config = {}) => ({
4
+ plugin,
5
+ config,
6
+ name
7
+ });
8
+ }
9
+
10
+ //#endregion
11
+ export { toPlugin };
12
+ //# sourceMappingURL=to-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-plugin.js","names":[],"sources":["../../src/plugin/to-plugin.ts"],"sourcesContent":["import type { PluginData, ToPlugin } from \"shared\";\n\nexport function toPlugin<T, U, N extends string>(\n plugin: T,\n name: N,\n): ToPlugin<T, U, N> {\n return (config: U = {} as U): PluginData<T, U, N> => ({\n plugin: plugin as T,\n config: config as U,\n name,\n });\n}\n"],"mappings":";AAEA,SAAgB,SACd,QACA,MACmB;AACnB,SAAQ,SAAY,EAAE,MAAgC;EAC5C;EACA;EACR;EACD"}
@@ -0,0 +1,24 @@
1
+ import { getConfigScript } from "./utils.js";
2
+
3
+ //#region src/server/base-server.ts
4
+ /**
5
+ * Base server for the AppKit.
6
+ *
7
+ * Abstract base class that provides common functionality for serving
8
+ * frontend applications. Subclasses implement specific serving strategies
9
+ * (Vite dev server, static file server, etc.).
10
+ */
11
+ var BaseServer = class {
12
+ constructor(app, endpoints = {}) {
13
+ this.app = app;
14
+ this.endpoints = endpoints;
15
+ }
16
+ async close() {}
17
+ getConfigScript() {
18
+ return getConfigScript(this.endpoints);
19
+ }
20
+ };
21
+
22
+ //#endregion
23
+ export { BaseServer };
24
+ //# sourceMappingURL=base-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-server.js","names":[],"sources":["../../src/server/base-server.ts"],"sourcesContent":["import type express from \"express\";\nimport { type PluginEndpoints, getConfigScript } from \"./utils\";\n\n/**\n * Base server for the AppKit.\n *\n * Abstract base class that provides common functionality for serving\n * frontend applications. Subclasses implement specific serving strategies\n * (Vite dev server, static file server, etc.).\n */\nexport abstract class BaseServer {\n protected app: express.Application;\n protected endpoints: PluginEndpoints;\n\n constructor(app: express.Application, endpoints: PluginEndpoints = {}) {\n this.app = app;\n this.endpoints = endpoints;\n }\n\n abstract setup(): void | Promise<void>;\n\n async close(): Promise<void> {}\n\n protected getConfigScript(): string {\n return getConfigScript(this.endpoints);\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAsB,aAAtB,MAAiC;CAI/B,YAAY,KAA0B,YAA6B,EAAE,EAAE;AACrE,OAAK,MAAM;AACX,OAAK,YAAY;;CAKnB,MAAM,QAAuB;CAE7B,AAAU,kBAA0B;AAClC,SAAO,gBAAgB,KAAK,UAAU"}
@@ -0,0 +1,100 @@
1
+ import { PluginPhase, TelemetryOptions, ToPlugin } from "../shared/src/plugin.js";
2
+ import { Plugin } from "../plugin/plugin.js";
3
+ import { ServerConfig } from "./types.js";
4
+ import express from "express";
5
+ import { Server } from "node:http";
6
+
7
+ //#region src/server/index.d.ts
8
+
9
+ /**
10
+ * Server plugin for the AppKit.
11
+ *
12
+ * This plugin is responsible for starting the server and serving the static files.
13
+ * It also handles the remote tunneling for development purposes.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * createApp({
18
+ * plugins: [server(), telemetryExamples(), analytics({})],
19
+ * });
20
+ * ```
21
+ *
22
+ */
23
+ declare class ServerPlugin extends Plugin {
24
+ static DEFAULT_CONFIG: {
25
+ autoStart: boolean;
26
+ host: string;
27
+ port: number;
28
+ };
29
+ name: "server";
30
+ envVars: string[];
31
+ private serverApplication;
32
+ private server;
33
+ private viteDevServer?;
34
+ private remoteTunnelController?;
35
+ protected config: ServerConfig;
36
+ private serverExtensions;
37
+ static phase: PluginPhase;
38
+ constructor(config: ServerConfig);
39
+ /** Setup the server plugin. */
40
+ setup(): Promise<void>;
41
+ /** Get the server configuration. */
42
+ getConfig(): {
43
+ [key: string]: unknown;
44
+ port?: number;
45
+ staticPath?: string;
46
+ autoStart?: boolean;
47
+ host?: string;
48
+ name?: string;
49
+ telemetry?: TelemetryOptions;
50
+ };
51
+ /** Check if the server should auto start. */
52
+ shouldAutoStart(): boolean | undefined;
53
+ /**
54
+ * Start the server.
55
+ *
56
+ * This method starts the server and sets up the frontend.
57
+ * It also sets up the remote tunneling if enabled.
58
+ *
59
+ * @returns The express application.
60
+ */
61
+ start(): Promise<express.Application>;
62
+ /**
63
+ * Get the low level node.js http server instance.
64
+ *
65
+ * Only use this method if you need to access the server instance for advanced usage like a custom websocket server, etc.
66
+ *
67
+ * @throws {Error} If the server is not started or autoStart is true.
68
+ * @returns {HTTPServer} The server instance.
69
+ */
70
+ getServer(): Server;
71
+ /**
72
+ * Extend the server with custom routes or middleware.
73
+ *
74
+ * @param fn - A function that receives the express application.
75
+ * @returns The server plugin instance for chaining.
76
+ * @throws {Error} If autoStart is true.
77
+ */
78
+ extend(fn: (app: express.Application) => void): this;
79
+ /**
80
+ * Setup the routes with the plugins.
81
+ *
82
+ * This method goes through all the plugins and injects the routes into the server application.
83
+ * Returns a map of plugin names to their registered named endpoints.
84
+ */
85
+ private extendRoutes;
86
+ /**
87
+ * Setup frontend serving based on environment:
88
+ * - If staticPath is explicitly provided: use static server
89
+ * - Dev mode (no staticPath): Vite for HMR
90
+ * - Production (no staticPath): Static files auto-detected
91
+ */
92
+ private setupFrontend;
93
+ private static findStaticPath;
94
+ private logStartupInfo;
95
+ private _gracefulShutdown;
96
+ }
97
+ declare const server: ToPlugin<typeof ServerPlugin, ServerConfig, "server">;
98
+ //#endregion
99
+ export { server };
100
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/server/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA+BA;;;;;;;;;;;;AAAwC,cAA3B,YAAA,SAAqB,MAAA,CAAM;EA4S3B,OAAA,cAGZ,EAAA;IAAA,SAAA,EAAA,OAAA;IAHkB,IAAA,EAAA,MAAA;IAAA,IAAA,EAAA,MAAA;;EAAA,IAAA,EAAA,QAAA;;;;;;oBA/RS;;gBAEZ;sBAEM;;WAaT;;;;;;;;;gBAAA;;;;;;;;;;;;WA0BI,QAAQ,OAAA,CAAQ;;;;;;;;;eA8ClB;;;;;;;;mBAqBI,OAAA,CAAQ;;;;;;;;;;;;;;;;;;;cAiLd,QAAM,gBAAA,cAAA"}