@databricks/appkit 0.15.0 → 0.16.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.
Files changed (159) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +2 -0
  2. package/dist/app/index.d.ts.map +1 -1
  3. package/dist/appkit/package.js +1 -1
  4. package/dist/cache/index.d.ts +1 -1
  5. package/dist/cache/index.d.ts.map +1 -1
  6. package/dist/cli/commands/plugin/add-resource/add-resource.js +10 -4
  7. package/dist/cli/commands/plugin/add-resource/add-resource.js.map +1 -1
  8. package/dist/cli/commands/plugin/create/scaffold.js +10 -16
  9. package/dist/cli/commands/plugin/create/scaffold.js.map +1 -1
  10. package/dist/cli/commands/plugin/list/list.js +44 -26
  11. package/dist/cli/commands/plugin/list/list.js.map +1 -1
  12. package/dist/cli/commands/plugin/manifest-resolve.js +57 -0
  13. package/dist/cli/commands/plugin/manifest-resolve.js.map +1 -0
  14. package/dist/cli/commands/plugin/sync/sync.js +121 -71
  15. package/dist/cli/commands/plugin/sync/sync.js.map +1 -1
  16. package/dist/cli/commands/plugin/trusted-js-manifest.js +28 -0
  17. package/dist/cli/commands/plugin/trusted-js-manifest.js.map +1 -0
  18. package/dist/cli/commands/plugin/validate/validate.js +32 -14
  19. package/dist/cli/commands/plugin/validate/validate.js.map +1 -1
  20. package/dist/connectors/genie/client.d.ts +4 -0
  21. package/dist/connectors/genie/index.d.ts +3 -0
  22. package/dist/connectors/genie/types.d.ts +1 -0
  23. package/dist/connectors/genie/types.d.ts.map +1 -1
  24. package/dist/connectors/lakebase/index.d.ts +2 -3
  25. package/dist/connectors/lakebase/index.d.ts.map +1 -1
  26. package/dist/connectors/lakebase/index.js.map +1 -1
  27. package/dist/connectors/lakebase-v1/client.js +1 -1
  28. package/dist/context/execution-context.d.ts +0 -1
  29. package/dist/context/execution-context.d.ts.map +1 -1
  30. package/dist/context/index.d.ts +3 -0
  31. package/dist/context/service-context.d.ts +1 -1
  32. package/dist/context/service-context.d.ts.map +1 -1
  33. package/dist/context/user-context.d.ts +1 -2
  34. package/dist/context/user-context.d.ts.map +1 -1
  35. package/dist/core/appkit.d.ts +2 -1
  36. package/dist/core/appkit.d.ts.map +1 -1
  37. package/dist/core/index.d.ts +1 -0
  38. package/dist/errors/authentication.d.ts +0 -1
  39. package/dist/errors/authentication.d.ts.map +1 -1
  40. package/dist/errors/base.d.ts.map +1 -1
  41. package/dist/errors/configuration.d.ts +0 -1
  42. package/dist/errors/configuration.d.ts.map +1 -1
  43. package/dist/errors/connection.d.ts +0 -1
  44. package/dist/errors/connection.d.ts.map +1 -1
  45. package/dist/errors/execution.d.ts +0 -1
  46. package/dist/errors/execution.d.ts.map +1 -1
  47. package/dist/errors/initialization.d.ts +0 -1
  48. package/dist/errors/initialization.d.ts.map +1 -1
  49. package/dist/errors/server.d.ts +0 -1
  50. package/dist/errors/server.d.ts.map +1 -1
  51. package/dist/errors/tunnel.d.ts +0 -1
  52. package/dist/errors/tunnel.d.ts.map +1 -1
  53. package/dist/errors/validation.d.ts +0 -1
  54. package/dist/errors/validation.d.ts.map +1 -1
  55. package/dist/index.d.ts +7 -1
  56. package/dist/plugin/dev-reader.d.ts +5 -4
  57. package/dist/plugin/dev-reader.d.ts.map +1 -1
  58. package/dist/plugin/index.d.ts +4 -0
  59. package/dist/plugin/plugin.d.ts +3 -1
  60. package/dist/plugin/plugin.d.ts.map +1 -1
  61. package/dist/plugin/to-plugin.d.ts +1 -1
  62. package/dist/plugin/to-plugin.d.ts.map +1 -1
  63. package/dist/plugins/analytics/analytics.d.ts +5 -2
  64. package/dist/plugins/analytics/analytics.d.ts.map +1 -1
  65. package/dist/plugins/analytics/analytics.js +2 -2
  66. package/dist/plugins/analytics/analytics.js.map +1 -1
  67. package/dist/plugins/analytics/index.d.ts +2 -0
  68. package/dist/plugins/analytics/index.js +0 -1
  69. package/dist/plugins/analytics/manifest.js +30 -18
  70. package/dist/plugins/analytics/manifest.js.map +1 -1
  71. package/dist/plugins/analytics/types.d.ts +1 -0
  72. package/dist/plugins/analytics/types.d.ts.map +1 -1
  73. package/dist/plugins/genie/genie.d.ts +4 -1
  74. package/dist/plugins/genie/genie.d.ts.map +1 -1
  75. package/dist/plugins/genie/genie.js +2 -2
  76. package/dist/plugins/genie/genie.js.map +1 -1
  77. package/dist/plugins/genie/index.d.ts +4 -0
  78. package/dist/plugins/genie/index.js +0 -1
  79. package/dist/plugins/genie/manifest.js +37 -8
  80. package/dist/plugins/genie/manifest.js.map +1 -1
  81. package/dist/plugins/genie/types.d.ts +2 -0
  82. package/dist/plugins/genie/types.d.ts.map +1 -1
  83. package/dist/plugins/index.d.ts +13 -0
  84. package/dist/plugins/index.js +0 -4
  85. package/dist/plugins/lakebase/index.d.ts +2 -0
  86. package/dist/plugins/lakebase/index.js +0 -1
  87. package/dist/plugins/lakebase/lakebase.d.ts +14 -12
  88. package/dist/plugins/lakebase/lakebase.d.ts.map +1 -1
  89. package/dist/plugins/lakebase/lakebase.js +2 -2
  90. package/dist/plugins/lakebase/lakebase.js.map +1 -1
  91. package/dist/plugins/lakebase/manifest.js +14 -8
  92. package/dist/plugins/lakebase/manifest.js.map +1 -1
  93. package/dist/plugins/lakebase/types.d.ts +1 -1
  94. package/dist/plugins/lakebase/types.d.ts.map +1 -1
  95. package/dist/plugins/server/index.d.ts +7 -9
  96. package/dist/plugins/server/index.d.ts.map +1 -1
  97. package/dist/plugins/server/index.js +2 -2
  98. package/dist/plugins/server/index.js.map +1 -1
  99. package/dist/plugins/server/manifest.js +36 -18
  100. package/dist/plugins/server/manifest.js.map +1 -1
  101. package/dist/plugins/server/types.d.ts +2 -0
  102. package/dist/plugins/server/types.d.ts.map +1 -1
  103. package/dist/registry/index.d.ts +4 -0
  104. package/dist/registry/manifest-loader.d.ts +1 -1
  105. package/dist/registry/manifest-loader.d.ts.map +1 -1
  106. package/dist/registry/resource-registry.d.ts +1 -1
  107. package/dist/registry/resource-registry.d.ts.map +1 -1
  108. package/dist/registry/types.d.ts +1 -4
  109. package/dist/registry/types.d.ts.map +1 -1
  110. package/dist/registry/types.generated.d.ts +1 -1
  111. package/dist/registry/types.generated.d.ts.map +1 -1
  112. package/dist/registry/types.generated.js.map +1 -1
  113. package/dist/shared/src/cache.d.ts +1 -1
  114. package/dist/shared/src/cache.d.ts.map +1 -1
  115. package/dist/shared/src/execute.d.ts +1 -1
  116. package/dist/shared/src/execute.d.ts.map +1 -1
  117. package/dist/shared/src/genie.d.ts.map +1 -1
  118. package/dist/shared/src/index.d.ts +7 -0
  119. package/dist/shared/src/plugin.d.ts +2 -3
  120. package/dist/shared/src/plugin.d.ts.map +1 -1
  121. package/dist/shared/src/sql/helpers.d.ts +0 -1
  122. package/dist/shared/src/sql/helpers.d.ts.map +1 -1
  123. package/dist/shared/src/sql/types.d.ts.map +1 -1
  124. package/dist/shared/src/tunnel.d.ts +1 -1
  125. package/dist/shared/src/tunnel.d.ts.map +1 -1
  126. package/dist/stream/arrow-stream-processor.d.ts +1 -0
  127. package/dist/stream/buffers.d.ts +1 -0
  128. package/dist/stream/index.d.ts +3 -0
  129. package/dist/stream/stream-manager.d.ts +1 -0
  130. package/dist/stream/stream-manager.d.ts.map +1 -1
  131. package/dist/stream/types.d.ts +3 -0
  132. package/dist/telemetry/config.d.ts +1 -0
  133. package/dist/telemetry/index.d.ts +4 -0
  134. package/dist/telemetry/instrumentations.d.ts +1 -0
  135. package/dist/telemetry/telemetry-manager.d.ts +4 -0
  136. package/dist/telemetry/telemetry-provider.d.ts +6 -0
  137. package/dist/telemetry/types.d.ts.map +1 -1
  138. package/dist/type-generator/cache.js +10 -12
  139. package/dist/type-generator/cache.js.map +1 -1
  140. package/dist/type-generator/index.js +2 -2
  141. package/dist/type-generator/index.js.map +1 -1
  142. package/dist/type-generator/query-registry.js +165 -52
  143. package/dist/type-generator/query-registry.js.map +1 -1
  144. package/dist/type-generator/spinner.js +5 -1
  145. package/dist/type-generator/spinner.js.map +1 -1
  146. package/dist/type-generator/vite-plugin.d.ts +0 -1
  147. package/dist/type-generator/vite-plugin.d.ts.map +1 -1
  148. package/dist/type-generator/vite-plugin.js +2 -2
  149. package/dist/type-generator/vite-plugin.js.map +1 -1
  150. package/docs/development/project-setup.md +1 -1
  151. package/docs/plugins/plugin-management.md +16 -2
  152. package/package.json +3 -1
  153. package/dist/plugins/analytics/manifest.json +0 -36
  154. package/dist/plugins/genie/manifest.json +0 -43
  155. package/dist/plugins/lakebase/manifest.json +0 -12
  156. package/dist/plugins/server/manifest.json +0 -36
  157. /package/dist/plugins/server/remote-tunnel/{denied.html → denied.html/denied.html} +0 -0
  158. /package/dist/plugins/server/remote-tunnel/{index.html → index.html/index.html} +0 -0
  159. /package/dist/plugins/server/remote-tunnel/{wait.html → wait.html/wait.html} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/server/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { Server as HTTPServer } from \"node:http\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\nimport express from \"express\";\nimport type { PluginPhase } from \"shared\";\nimport { ServerError } from \"../../errors\";\nimport { createLogger } from \"../../logging/logger\";\nimport { Plugin, toPlugin } from \"../../plugin\";\nimport { instrumentations } from \"../../telemetry\";\nimport { serverManifest } from \"./manifest\";\nimport { RemoteTunnelController } from \"./remote-tunnel/remote-tunnel-controller\";\nimport { StaticServer } from \"./static-server\";\nimport type { ServerConfig } from \"./types\";\nimport { getRoutes, type PluginEndpoints, printRoutes } from \"./utils\";\nimport { ViteDevServer } from \"./vite-dev-server\";\n\ndotenv.config({ path: path.resolve(process.cwd(), \"./.env\") });\n\nconst logger = createLogger(\"server\");\n\n/**\n * Server plugin for the AppKit.\n *\n * This plugin is responsible for starting the server and serving the static files.\n * It also handles the remote tunneling for development purposes.\n *\n * @example\n * ```ts\n * createApp({\n * plugins: [server(), telemetryExamples(), analytics({})],\n * });\n * ```\n *\n */\nexport class ServerPlugin extends Plugin {\n public static DEFAULT_CONFIG = {\n autoStart: true,\n host: process.env.FLASK_RUN_HOST || \"0.0.0.0\",\n port: Number(process.env.DATABRICKS_APP_PORT) || 8000,\n };\n\n /** Plugin manifest declaring metadata and resource requirements */\n static manifest = serverManifest;\n\n public name = \"server\" as const;\n private serverApplication: express.Application;\n private server: HTTPServer | null;\n private viteDevServer?: ViteDevServer;\n private remoteTunnelController?: RemoteTunnelController;\n protected declare config: ServerConfig;\n private serverExtensions: ((app: express.Application) => void)[] = [];\n static phase: PluginPhase = \"deferred\";\n\n constructor(config: ServerConfig) {\n super(config);\n this.config = config;\n this.serverApplication = express();\n this.server = null;\n this.serverExtensions = [];\n this.telemetry.registerInstrumentations([\n instrumentations.http,\n instrumentations.express,\n ]);\n }\n\n /** Setup the server plugin. */\n async setup() {\n if (this.shouldAutoStart()) {\n await this.start();\n }\n }\n\n /** Get the server configuration. */\n getConfig() {\n const { plugins: _plugins, ...config } = this.config;\n\n return config;\n }\n\n /** Check if the server should auto start. */\n shouldAutoStart() {\n return this.config.autoStart;\n }\n\n /**\n * Start the server.\n *\n * This method starts the server and sets up the frontend.\n * It also sets up the remote tunneling if enabled.\n *\n * @returns The express application.\n */\n async start(): Promise<express.Application> {\n this.serverApplication.use(express.json());\n\n const endpoints = await this.extendRoutes();\n\n for (const extension of this.serverExtensions) {\n extension(this.serverApplication);\n }\n\n // register remote tunnel controller (before static/vite)\n this.remoteTunnelController = new RemoteTunnelController(\n this.devFileReader,\n );\n this.serverApplication.use(this.remoteTunnelController.middleware);\n\n await this.setupFrontend(endpoints);\n\n const server = this.serverApplication.listen(\n this.config.port ?? ServerPlugin.DEFAULT_CONFIG.port,\n this.config.host ?? ServerPlugin.DEFAULT_CONFIG.host,\n () => this.logStartupInfo(),\n );\n\n this.server = server;\n\n // attach server to remote tunnel controller\n this.remoteTunnelController.setServer(server);\n\n process.on(\"SIGTERM\", () => this._gracefulShutdown());\n process.on(\"SIGINT\", () => this._gracefulShutdown());\n\n if (process.env.NODE_ENV === \"development\") {\n const allRoutes = getRoutes(this.serverApplication._router.stack);\n printRoutes(allRoutes);\n }\n return this.serverApplication;\n }\n\n /**\n * Get the low level node.js http server instance.\n *\n * Only use this method if you need to access the server instance for advanced usage like a custom websocket server, etc.\n *\n * @throws {Error} If the server is not started or autoStart is true.\n * @returns {HTTPServer} The server instance.\n */\n getServer(): HTTPServer {\n if (this.shouldAutoStart()) {\n throw ServerError.autoStartConflict(\"get server\");\n }\n\n if (!this.server) {\n throw ServerError.notStarted();\n }\n\n return this.server;\n }\n\n /**\n * Extend the server with custom routes or middleware.\n *\n * @param fn - A function that receives the express application.\n * @returns The server plugin instance for chaining.\n * @throws {Error} If autoStart is true.\n */\n extend(fn: (app: express.Application) => void) {\n if (this.shouldAutoStart()) {\n throw ServerError.autoStartConflict(\"extend server\");\n }\n\n this.serverExtensions.push(fn);\n return this;\n }\n\n /**\n * Setup the routes with the plugins.\n *\n * This method goes through all the plugins and injects the routes into the server application.\n * Returns a map of plugin names to their registered named endpoints.\n */\n private async extendRoutes(): Promise<PluginEndpoints> {\n const endpoints: PluginEndpoints = {};\n\n if (!this.config.plugins) return endpoints;\n\n this.serverApplication.get(\"/health\", (_, res) => {\n res.status(200).json({ status: \"ok\" });\n });\n this.registerEndpoint(\"health\", \"/health\");\n\n for (const plugin of Object.values(this.config.plugins)) {\n if (EXCLUDED_PLUGINS.includes(plugin.name)) continue;\n\n if (plugin?.injectRoutes && typeof plugin.injectRoutes === \"function\") {\n const router = express.Router();\n\n plugin.injectRoutes(router);\n\n const basePath = `/api/${plugin.name}`;\n this.serverApplication.use(basePath, router);\n\n // Collect named endpoints from the plugin\n endpoints[plugin.name] = plugin.getEndpoints();\n }\n }\n\n return endpoints;\n }\n\n /**\n * Setup frontend serving based on environment:\n * - If staticPath is explicitly provided: use static server\n * - Dev mode (no staticPath): Vite for HMR\n * - Production (no staticPath): Static files auto-detected\n */\n private async setupFrontend(endpoints: PluginEndpoints) {\n const isDev = process.env.NODE_ENV === \"development\";\n const hasExplicitStaticPath = this.config.staticPath !== undefined;\n\n // explict static path provided\n if (hasExplicitStaticPath) {\n const staticServer = new StaticServer(\n this.serverApplication,\n this.config.staticPath as string,\n endpoints,\n );\n staticServer.setup();\n return;\n }\n\n // auto-detection based on environment\n if (isDev) {\n this.viteDevServer = new ViteDevServer(this.serverApplication, endpoints);\n await this.viteDevServer.setup();\n return;\n }\n\n // auto-detection based on static path\n const staticPath = ServerPlugin.findStaticPath();\n if (staticPath) {\n const staticServer = new StaticServer(\n this.serverApplication,\n staticPath,\n endpoints,\n );\n\n staticServer.setup();\n }\n }\n\n private static findStaticPath() {\n const staticPaths = [\"dist\", \"client/dist\", \"build\", \"public\", \"out\"];\n const cwd = process.cwd();\n for (const p of staticPaths) {\n const fullPath = path.resolve(cwd, p);\n if (fs.existsSync(path.resolve(fullPath, \"index.html\"))) {\n logger.debug(\"Static files: serving from %s\", fullPath);\n return fullPath;\n }\n }\n return undefined;\n }\n\n private logStartupInfo() {\n const isDev = process.env.NODE_ENV === \"development\";\n const hasExplicitStaticPath = this.config.staticPath !== undefined;\n const port = this.config.port ?? ServerPlugin.DEFAULT_CONFIG.port;\n const host = this.config.host ?? ServerPlugin.DEFAULT_CONFIG.host;\n\n logger.info(\"Server running on http://%s:%d\", host, port);\n\n if (hasExplicitStaticPath) {\n logger.info(\"Mode: static (%s)\", this.config.staticPath);\n } else if (isDev) {\n logger.info(\"Mode: development (Vite HMR)\");\n } else {\n logger.info(\"Mode: production (static)\");\n }\n\n const remoteServerController = this.remoteTunnelController;\n if (!remoteServerController) {\n logger.debug(\"Remote tunnel: disabled (controller not initialized)\");\n } else {\n logger.debug(\n \"Remote tunnel: %s; %s\",\n remoteServerController.isAllowedByEnv() ? \"allowed\" : \"blocked\",\n remoteServerController.isActive() ? \"active\" : \"inactive\",\n );\n }\n }\n\n private async _gracefulShutdown() {\n logger.info(\"Starting graceful shutdown...\");\n\n if (this.viteDevServer) {\n await this.viteDevServer.close();\n }\n\n if (this.remoteTunnelController) {\n this.remoteTunnelController.cleanup();\n }\n\n // 1. abort active operations from plugins\n if (this.config.plugins) {\n for (const plugin of Object.values(this.config.plugins)) {\n if (plugin.abortActiveOperations) {\n try {\n plugin.abortActiveOperations();\n } catch (err) {\n logger.error(\n \"Error aborting operations for plugin %s: %O\",\n plugin.name,\n err,\n );\n }\n }\n }\n }\n\n // 2. close the server\n if (this.server) {\n this.server.close(() => {\n logger.debug(\"Server closed gracefully\");\n process.exit(0);\n });\n\n // 3. timeout to force shutdown after 15 seconds\n setTimeout(() => {\n logger.debug(\"Force shutdown after timeout\");\n process.exit(1);\n }, 15000);\n } else {\n process.exit(0);\n }\n }\n\n /**\n * Returns the public exports for the server plugin.\n * Exposes server management methods.\n */\n exports() {\n const self = this;\n return {\n /** Start the server */\n start: this.start,\n /** Extend the server with custom routes or middleware */\n extend(fn: (app: express.Application) => void) {\n self.extend(fn);\n return this;\n },\n /** Get the underlying HTTP server instance */\n getServer: this.getServer,\n /** Get the server configuration */\n getConfig: this.getConfig,\n };\n }\n}\n\nconst EXCLUDED_PLUGINS = [ServerPlugin.name];\n\n/**\n * @internal\n */\nexport const server = toPlugin<typeof ServerPlugin, ServerConfig, \"server\">(\n ServerPlugin,\n \"server\",\n);\n\n// Export manifest and types\nexport { serverManifest } from \"./manifest\";\nexport type { ServerConfig } from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["manifest"],"sources":["../../../src/plugins/server/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { Server as HTTPServer } from \"node:http\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\nimport express from \"express\";\nimport type { PluginPhase } from \"shared\";\nimport { ServerError } from \"../../errors\";\nimport { createLogger } from \"../../logging/logger\";\nimport { Plugin, toPlugin } from \"../../plugin\";\nimport type { PluginManifest } from \"../../registry\";\nimport { instrumentations } from \"../../telemetry\";\nimport manifest from \"./manifest.json\";\nimport { RemoteTunnelController } from \"./remote-tunnel/remote-tunnel-controller\";\nimport { StaticServer } from \"./static-server\";\nimport type { ServerConfig } from \"./types\";\nimport { getRoutes, type PluginEndpoints, printRoutes } from \"./utils\";\nimport { ViteDevServer } from \"./vite-dev-server\";\n\ndotenv.config({ path: path.resolve(process.cwd(), \"./.env\") });\n\nconst logger = createLogger(\"server\");\n\n/**\n * Server plugin for the AppKit.\n *\n * This plugin is responsible for starting the server and serving the static files.\n * It also handles the remote tunneling for development purposes.\n *\n * @example\n * ```ts\n * createApp({\n * plugins: [server(), telemetryExamples(), analytics({})],\n * });\n * ```\n *\n */\nexport class ServerPlugin extends Plugin {\n public static DEFAULT_CONFIG = {\n autoStart: true,\n host: process.env.FLASK_RUN_HOST || \"0.0.0.0\",\n port: Number(process.env.DATABRICKS_APP_PORT) || 8000,\n };\n\n /** Plugin manifest declaring metadata and resource requirements */\n static manifest = manifest as PluginManifest;\n\n public name = \"server\" as const;\n private serverApplication: express.Application;\n private server: HTTPServer | null;\n private viteDevServer?: ViteDevServer;\n private remoteTunnelController?: RemoteTunnelController;\n protected declare config: ServerConfig;\n private serverExtensions: ((app: express.Application) => void)[] = [];\n static phase: PluginPhase = \"deferred\";\n\n constructor(config: ServerConfig) {\n super(config);\n this.config = config;\n this.serverApplication = express();\n this.server = null;\n this.serverExtensions = [];\n this.telemetry.registerInstrumentations([\n instrumentations.http,\n instrumentations.express,\n ]);\n }\n\n /** Setup the server plugin. */\n async setup() {\n if (this.shouldAutoStart()) {\n await this.start();\n }\n }\n\n /** Get the server configuration. */\n getConfig() {\n const { plugins: _plugins, ...config } = this.config;\n\n return config;\n }\n\n /** Check if the server should auto start. */\n shouldAutoStart() {\n return this.config.autoStart;\n }\n\n /**\n * Start the server.\n *\n * This method starts the server and sets up the frontend.\n * It also sets up the remote tunneling if enabled.\n *\n * @returns The express application.\n */\n async start(): Promise<express.Application> {\n this.serverApplication.use(express.json());\n\n const endpoints = await this.extendRoutes();\n\n for (const extension of this.serverExtensions) {\n extension(this.serverApplication);\n }\n\n // register remote tunnel controller (before static/vite)\n this.remoteTunnelController = new RemoteTunnelController(\n this.devFileReader,\n );\n this.serverApplication.use(this.remoteTunnelController.middleware);\n\n await this.setupFrontend(endpoints);\n\n const server = this.serverApplication.listen(\n this.config.port ?? ServerPlugin.DEFAULT_CONFIG.port,\n this.config.host ?? ServerPlugin.DEFAULT_CONFIG.host,\n () => this.logStartupInfo(),\n );\n\n this.server = server;\n\n // attach server to remote tunnel controller\n this.remoteTunnelController.setServer(server);\n\n process.on(\"SIGTERM\", () => this._gracefulShutdown());\n process.on(\"SIGINT\", () => this._gracefulShutdown());\n\n if (process.env.NODE_ENV === \"development\") {\n const allRoutes = getRoutes(this.serverApplication._router.stack);\n printRoutes(allRoutes);\n }\n return this.serverApplication;\n }\n\n /**\n * Get the low level node.js http server instance.\n *\n * Only use this method if you need to access the server instance for advanced usage like a custom websocket server, etc.\n *\n * @throws {Error} If the server is not started or autoStart is true.\n * @returns {HTTPServer} The server instance.\n */\n getServer(): HTTPServer {\n if (this.shouldAutoStart()) {\n throw ServerError.autoStartConflict(\"get server\");\n }\n\n if (!this.server) {\n throw ServerError.notStarted();\n }\n\n return this.server;\n }\n\n /**\n * Extend the server with custom routes or middleware.\n *\n * @param fn - A function that receives the express application.\n * @returns The server plugin instance for chaining.\n * @throws {Error} If autoStart is true.\n */\n extend(fn: (app: express.Application) => void) {\n if (this.shouldAutoStart()) {\n throw ServerError.autoStartConflict(\"extend server\");\n }\n\n this.serverExtensions.push(fn);\n return this;\n }\n\n /**\n * Setup the routes with the plugins.\n *\n * This method goes through all the plugins and injects the routes into the server application.\n * Returns a map of plugin names to their registered named endpoints.\n */\n private async extendRoutes(): Promise<PluginEndpoints> {\n const endpoints: PluginEndpoints = {};\n\n if (!this.config.plugins) return endpoints;\n\n this.serverApplication.get(\"/health\", (_, res) => {\n res.status(200).json({ status: \"ok\" });\n });\n this.registerEndpoint(\"health\", \"/health\");\n\n for (const plugin of Object.values(this.config.plugins)) {\n if (EXCLUDED_PLUGINS.includes(plugin.name)) continue;\n\n if (plugin?.injectRoutes && typeof plugin.injectRoutes === \"function\") {\n const router = express.Router();\n\n plugin.injectRoutes(router);\n\n const basePath = `/api/${plugin.name}`;\n this.serverApplication.use(basePath, router);\n\n // Collect named endpoints from the plugin\n endpoints[plugin.name] = plugin.getEndpoints();\n }\n }\n\n return endpoints;\n }\n\n /**\n * Setup frontend serving based on environment:\n * - If staticPath is explicitly provided: use static server\n * - Dev mode (no staticPath): Vite for HMR\n * - Production (no staticPath): Static files auto-detected\n */\n private async setupFrontend(endpoints: PluginEndpoints) {\n const isDev = process.env.NODE_ENV === \"development\";\n const hasExplicitStaticPath = this.config.staticPath !== undefined;\n\n // explict static path provided\n if (hasExplicitStaticPath) {\n const staticServer = new StaticServer(\n this.serverApplication,\n this.config.staticPath as string,\n endpoints,\n );\n staticServer.setup();\n return;\n }\n\n // auto-detection based on environment\n if (isDev) {\n this.viteDevServer = new ViteDevServer(this.serverApplication, endpoints);\n await this.viteDevServer.setup();\n return;\n }\n\n // auto-detection based on static path\n const staticPath = ServerPlugin.findStaticPath();\n if (staticPath) {\n const staticServer = new StaticServer(\n this.serverApplication,\n staticPath,\n endpoints,\n );\n\n staticServer.setup();\n }\n }\n\n private static findStaticPath() {\n const staticPaths = [\"dist\", \"client/dist\", \"build\", \"public\", \"out\"];\n const cwd = process.cwd();\n for (const p of staticPaths) {\n const fullPath = path.resolve(cwd, p);\n if (fs.existsSync(path.resolve(fullPath, \"index.html\"))) {\n logger.debug(\"Static files: serving from %s\", fullPath);\n return fullPath;\n }\n }\n return undefined;\n }\n\n private logStartupInfo() {\n const isDev = process.env.NODE_ENV === \"development\";\n const hasExplicitStaticPath = this.config.staticPath !== undefined;\n const port = this.config.port ?? ServerPlugin.DEFAULT_CONFIG.port;\n const host = this.config.host ?? ServerPlugin.DEFAULT_CONFIG.host;\n\n logger.info(\"Server running on http://%s:%d\", host, port);\n\n if (hasExplicitStaticPath) {\n logger.info(\"Mode: static (%s)\", this.config.staticPath);\n } else if (isDev) {\n logger.info(\"Mode: development (Vite HMR)\");\n } else {\n logger.info(\"Mode: production (static)\");\n }\n\n const remoteServerController = this.remoteTunnelController;\n if (!remoteServerController) {\n logger.debug(\"Remote tunnel: disabled (controller not initialized)\");\n } else {\n logger.debug(\n \"Remote tunnel: %s; %s\",\n remoteServerController.isAllowedByEnv() ? \"allowed\" : \"blocked\",\n remoteServerController.isActive() ? \"active\" : \"inactive\",\n );\n }\n }\n\n private async _gracefulShutdown() {\n logger.info(\"Starting graceful shutdown...\");\n\n if (this.viteDevServer) {\n await this.viteDevServer.close();\n }\n\n if (this.remoteTunnelController) {\n this.remoteTunnelController.cleanup();\n }\n\n // 1. abort active operations from plugins\n if (this.config.plugins) {\n for (const plugin of Object.values(this.config.plugins)) {\n if (plugin.abortActiveOperations) {\n try {\n plugin.abortActiveOperations();\n } catch (err) {\n logger.error(\n \"Error aborting operations for plugin %s: %O\",\n plugin.name,\n err,\n );\n }\n }\n }\n }\n\n // 2. close the server\n if (this.server) {\n this.server.close(() => {\n logger.debug(\"Server closed gracefully\");\n process.exit(0);\n });\n\n // 3. timeout to force shutdown after 15 seconds\n setTimeout(() => {\n logger.debug(\"Force shutdown after timeout\");\n process.exit(1);\n }, 15000);\n } else {\n process.exit(0);\n }\n }\n\n /**\n * Returns the public exports for the server plugin.\n * Exposes server management methods.\n */\n exports() {\n const self = this;\n return {\n /** Start the server */\n start: this.start,\n /** Extend the server with custom routes or middleware */\n extend(fn: (app: express.Application) => void) {\n self.extend(fn);\n return this;\n },\n /** Get the underlying HTTP server instance */\n getServer: this.getServer,\n /** Get the server configuration */\n getConfig: this.getConfig,\n };\n }\n}\n\nconst EXCLUDED_PLUGINS = [ServerPlugin.name];\n\n/**\n * @internal\n */\nexport const server = toPlugin<typeof ServerPlugin, ServerConfig, \"server\">(\n ServerPlugin,\n \"server\",\n);\n\n// Export manifest and types\nexport type { ServerConfig } from \"./types\";\n"],"mappings":"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"}
@@ -1,21 +1,39 @@
1
- import { dirname, join } from "node:path";
2
- import { readFileSync } from "node:fs";
3
- import { fileURLToPath } from "node:url";
4
-
5
- //#region src/plugins/server/manifest.ts
6
- const __dirname = dirname(fileURLToPath(import.meta.url));
7
- /**
8
- * Server plugin manifest.
9
- *
10
- * The server plugin doesn't require any Databricks resources - it only
11
- * provides HTTP server functionality and static file serving.
12
- *
13
- * @remarks
14
- * The source of truth for this manifest is `manifest.json` in the same directory.
15
- * This file loads the JSON and exports it with proper TypeScript typing.
16
- */
17
- const serverManifest = JSON.parse(readFileSync(join(__dirname, "manifest.json"), "utf-8"));
1
+ //#region src/plugins/server/manifest.json
2
+ var manifest_default = {
3
+ $schema: "https://databricks.github.io/appkit/schemas/plugin-manifest.schema.json",
4
+ name: "server",
5
+ displayName: "Server Plugin",
6
+ description: "HTTP server with Express, static file serving, and Vite dev mode support",
7
+ resources: {
8
+ "required": [],
9
+ "optional": []
10
+ },
11
+ config: { "schema": {
12
+ "type": "object",
13
+ "properties": {
14
+ "autoStart": {
15
+ "type": "boolean",
16
+ "default": true,
17
+ "description": "Automatically start the server on plugin setup"
18
+ },
19
+ "host": {
20
+ "type": "string",
21
+ "default": "0.0.0.0",
22
+ "description": "Host address to bind the server to"
23
+ },
24
+ "port": {
25
+ "type": "number",
26
+ "default": 8e3,
27
+ "description": "Port number for the server"
28
+ },
29
+ "staticPath": {
30
+ "type": "string",
31
+ "description": "Path to static files directory (auto-detected if not provided)"
32
+ }
33
+ }
34
+ } }
35
+ };
18
36
 
19
37
  //#endregion
20
- export { serverManifest };
38
+ export { manifest_default as default };
21
39
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","names":[],"sources":["../../../src/plugins/server/manifest.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { PluginManifest } from \"../../registry\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Server plugin manifest.\n *\n * The server plugin doesn't require any Databricks resources - it only\n * provides HTTP server functionality and static file serving.\n *\n * @remarks\n * The source of truth for this manifest is `manifest.json` in the same directory.\n * This file loads the JSON and exports it with proper TypeScript typing.\n */\nexport const serverManifest: PluginManifest = JSON.parse(\n readFileSync(join(__dirname, \"manifest.json\"), \"utf-8\"),\n) as PluginManifest;\n"],"mappings":";;;;;AAKA,MAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;;;;;;;;;;;AAYzD,MAAa,iBAAiC,KAAK,MACjD,aAAa,KAAK,WAAW,gBAAgB,EAAE,QAAQ,CACxD"}
1
+ {"version":3,"file":"manifest.js","names":[],"sources":["../../../src/plugins/server/manifest.json"],"sourcesContent":[""],"mappings":""}
@@ -1,5 +1,7 @@
1
1
  import { BasePluginConfig } from "../../shared/src/plugin.js";
2
+ import "../../shared/src/index.js";
2
3
  import { Plugin } from "../../plugin/plugin.js";
4
+ import "../../plugin/index.js";
3
5
 
4
6
  //#region src/plugins/server/types.d.ts
5
7
  interface ServerConfig extends BasePluginConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/plugins/server/types.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,YAAA,SAAqB;;EAArB,OAAA,CAAA,EAEL,MAFkB,CAAA,MAAA,EAEH,MAFG,CAAA;EAAA,UAAA,CAAA,EAAA,MAAA;WAEH,CAAA,EAAA,OAAA;MAAf,CAAA,EAAA,MAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/plugins/server/types.ts"],"mappings":";;;;;;UAGiB,YAAA,SAAqB,gBAAA;EACpC,IAAA;EACA,OAAA,GAAU,MAAA,SAAe,MAAA;EACzB,UAAA;EACA,SAAA;EACA,IAAA;AAAA"}
@@ -0,0 +1,4 @@
1
+ import { AppPermission, DatabasePermission, ExperimentPermission, GenieSpacePermission, JobPermission, ResourcePermission, ResourceType, SecretPermission, ServingEndpointPermission, SqlWarehousePermission, UcConnectionPermission, UcFunctionPermission, VectorSearchIndexPermission, VolumePermission } from "./types.generated.js";
2
+ import { ConfigSchema, PluginManifest, ResourceEntry, ResourceFieldEntry, ResourceRequirement, ValidationResult } from "./types.js";
3
+ import { getPluginManifest, getResourceRequirements } from "./manifest-loader.js";
4
+ import { ResourceRegistry } from "./resource-registry.js";
@@ -1,9 +1,9 @@
1
1
  import { PluginConstructor } from "../shared/src/plugin.js";
2
+ import "../shared/src/index.js";
2
3
  import { ResourcePermission, ResourceType } from "./types.generated.js";
3
4
  import { PluginManifest, ResourceFieldEntry } from "./types.js";
4
5
 
5
6
  //#region src/registry/manifest-loader.d.ts
6
-
7
7
  /**
8
8
  * Loads and validates the manifest from a plugin constructor.
9
9
  * Normalizes string type/permission to strict ResourceType/ResourcePermission.
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-loader.d.ts","names":[],"sources":["../../src/registry/manifest-loader.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA4DA;;;;;AA4FA;AAAuC,iBA5FvB,iBAAA,CA4FuB,MAAA,EA5FG,iBA4FH,CAAA,EA5FuB,cA4FvB;;;;;;;;;;;;;;;;;;;iBAAvB,uBAAA,SAAgC"}
1
+ {"version":3,"file":"manifest-loader.d.ts","names":[],"sources":["../../src/registry/manifest-loader.ts"],"mappings":";;;;;;;;;AA4DA;;;;;iBAAgB,iBAAA,CAAkB,MAAA,EAAQ,iBAAA,GAAoB,cAAA;;;;AA4F9D;;;;;;;;;;;;;;;iBAAgB,uBAAA,CAAwB,MAAA,EAAQ,iBAAA"}
@@ -1,8 +1,8 @@
1
1
  import { PluginConstructor, PluginData } from "../shared/src/plugin.js";
2
+ import "../shared/src/index.js";
2
3
  import { ResourceEntry, ResourceRequirement, ValidationResult } from "./types.js";
3
4
 
4
5
  //#region src/registry/resource-registry.d.ts
5
-
6
6
  /**
7
7
  * Central registry for tracking plugin resource requirements.
8
8
  * Deduplication uses type + resourceKey (machine-stable); alias is for display only.
@@ -1 +1 @@
1
- {"version":3,"file":"resource-registry.d.ts","names":[],"sources":["../../src/registry/resource-registry.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsbgD,cAjYnC,gBAAA,CAiYmC;EAAa,QAAA,SAAA;;;;;;;;;;;;;qCAlXjB;;;;;;;;+BA4B5B,WAAW;;;;;;;;;;;;YAqIR;;;;;;;;0CAW8B;;;;;;;;;;;;;;;;mCAyBP;;;;;;iBAWlB;;;;;;iBASA;;;;;;;;;;;;;;;;;;;;;;cAyBH;;;;;;;;;;;;uBA8DS;;;;;;;yCA6CkB;;;;;;;;yCAqBA"}
1
+ {"version":3,"file":"resource-registry.d.ts","names":[],"sources":["../../src/registry/resource-registry.ts"],"mappings":";;;;;;;;;cAqDa,gBAAA;EAAA,QACH,SAAA;EAgYsC;;;;;;;;;;;;EAlXvC,QAAA,CAAS,MAAA,UAAgB,QAAA,EAAU,mBAAA;EAiKnC;;;;;;;EAtIA,gBAAA,CACL,UAAA,EAAY,UAAA,CAAW,iBAAA;EAyKlB;;;;EAAA,QAjIC,cAAA;EAqJD;;;;;;EAxDA,MAAA,CAAA,GAAU,aAAA;EA4L6B;;;;;;;EAjLvC,GAAA,CAAI,IAAA,UAAc,WAAA,WAAsB,aAAA;;;;;EAQxC,KAAA,CAAA;;;;EAOA,IAAA,CAAA;;;;;;;EAUA,WAAA,CAAY,UAAA,WAAqB,aAAA;;;;;;EAWjC,WAAA,CAAA,GAAe,aAAA;;;;;;EASf,WAAA,CAAA,GAAe,aAAA;;;;;;;;;;;;;;;;;;;;;;EAyBf,QAAA,CAAA,GAAY,gBAAA;;;;;;;;;;;;EA8DZ,iBAAA,CAAA,GAAqB,gBAAA;;;;;;;SA6Cd,sBAAA,CAAuB,OAAA,EAAS,aAAA;;;;;;;;SAqBhC,sBAAA,CAAuB,OAAA,EAAS,aAAA;AAAA"}
@@ -2,7 +2,6 @@ import { AppPermission, DatabasePermission, ExperimentPermission, GenieSpacePerm
2
2
  import { JSONSchema7 } from "json-schema";
3
3
 
4
4
  //#region src/registry/types.d.ts
5
-
6
5
  /**
7
6
  * Defines a single field for a resource. Each field has its own environment variable and optional description.
8
7
  * Single-value types use one key (e.g. id); multi-value types (database, secret) use multiple (e.g. instance_name, database_name or scope, key).
@@ -87,9 +86,7 @@ interface PluginManifest {
87
86
  * Resource requirements declaration
88
87
  */
89
88
  resources: {
90
- /** Resources that must be available for the plugin to function */
91
- required: Omit<ResourceRequirement, "required">[];
92
- /** Resources that enhance functionality but are not mandatory */
89
+ /** Resources that must be available for the plugin to function */required: Omit<ResourceRequirement, "required">[]; /** Resources that enhance functionality but are not mandatory */
93
90
  optional: Omit<ResourceRequirement, "required">[];
94
91
  };
95
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/registry/types.ts"],"sourcesContent":[],"mappings":";;;;;AAmGA;;;;AAesB,UAxDL,kBAAA,CAwDK;;EAfoC,GAAA,EAAA,MAAA;EAqBzC;EAAgB,WAAA,CAAA,EAAA,MAAA;;;;AAmBjC;AAMA;AAA+B,UA5Ed,mBAAA,CA4Ec;;MAejB,EAzFN,YAyFM;;OAGA,EAAA,MAAA;;EAQU,WAAA,EAAA,MAAA;;;;cAxFV;;;;;UAMJ,eAAe;;;;;;;;UAUR,aAAA,SAAsB;;;;;;WAQ5B;;;;;;sBAOW,eAAe;;;;;UAMpB,gBAAA;;;;WAKN;;OAGJ;;;;;;;;KAWK,YAAA,GAAe;;;;;UAMV,cAAA;;;;;;;;;;;;cAeH,KAAK;;cAGL,KAAK;;;;;;;YAQP"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/registry/types.ts"],"mappings":";;;;;;;;UA0DiB,kBAAA;EA+BD;EA7Bd,GAAA;EAWM;EATN,WAAA;AAAA;;;;;UAOe,mBAAA;EAoBQ;EAlBvB,IAAA,EAAM,YAAA;EAqBE;EAlBR,KAAA;EAyBe;EAtBf,WAAA;;EAGA,WAAA;EAkCmC;EA/BnC,UAAA,EAAY,kBAAA;EAgByB;;;;EAVrC,MAAA,EAAQ,MAAA,SAAe,kBAAA;EAevB;EAZA,QAAA;AAAA;;;;;UAOe,aAAA,SAAsB,mBAAA;EAqBtB;EAnBf,MAAA;;EAGA,QAAA;EAkBA;EAfA,MAAA,GAAS,MAAA;EAkBA;;;;;EAXT,iBAAA,GAAoB,MAAA,SAAe,kBAAA;AAAA;;;;UAMpB,gBAAA;EAyBc;EAvB7B,KAAA;EAsCiB;EAnCjB,OAAA,EAAS,aAAA;EAsCQ;EAnCjB,GAAA,EAAK,aAAA;AAAA;;;;;;;KAWK,YAAA,GAAe,WAAA;;;;;UAMV,cAAA;EA0Bb;EAxBF,IAAA;EA8BA;EA3BA,WAAA;EAiCA;EA9BA,WAAA;EAgCA;;;EA3BA,SAAA;sEAEE,QAAA,EAAU,IAAA,CAAK,mBAAA;IAGf,QAAA,EAAU,IAAA,CAAK,mBAAA;EAAA;;;;;EAOjB,MAAA;IACE,MAAA,EAAQ,YAAA;EAAA;;;;EAMV,MAAA;;;;EAKA,MAAA;EACA,OAAA;EACA,UAAA;EACA,QAAA;EACA,OAAA;AAAA"}
@@ -12,7 +12,7 @@ declare enum ResourceType {
12
12
  DATABASE = "database",
13
13
  GENIE_SPACE = "genie_space",
14
14
  EXPERIMENT = "experiment",
15
- APP = "app",
15
+ APP = "app"
16
16
  }
17
17
  /** Permissions for SECRET resources */
18
18
  type SecretPermission = "READ" | "WRITE" | "MANAGE";
@@ -1 +1 @@
1
- {"version":3,"file":"types.generated.d.ts","names":[],"sources":["../../src/registry/types.generated.ts"],"sourcesContent":[],"mappings":";;AAIY,aAAA,YAAA;EAmBA,MAAA,GAAA,QAAA;EAGA,GAAA,GAAA,KAAA;EAGA,aAAA,GAAA,eAAsB;EAGtB,gBAAA,GAAA,kBAAyB;EAGzB,MAAA,GAAA,QAAA;EAGA,mBAAA,GAAA,qBAA2B;EAG3B,WAAA,GAAA,aAAoB;EAGpB,aAAA,GAAA,eAAsB;EAGtB,QAAA,GAAA,UAAkB;EAGlB,WAAA,GAAA,aAAoB;EAGpB,UAAA,GAAA,YAAoB;EAGpB,GAAA,GAAA,KAAA;AAGZ;;AACI,KArCQ,gBAAA,GAqCR,MAAA,GAAA,OAAA,GAAA,QAAA;;AAEA,KApCQ,aAAA,GAoCR,UAAA,GAAA,gBAAA,GAAA,YAAA;;AAEA,KAnCQ,sBAAA,GAmCR,SAAA,GAAA,YAAA;;AAEA,KAlCQ,yBAAA,GAkCR,UAAA,GAAA,WAAA,GAAA,YAAA;;AAEA,KAjCQ,gBAAA,GAiCR,aAAA,GAAA,cAAA;;AAEA,KAhCQ,2BAAA,GAgCR,QAAA;;AACa,KA9BL,oBAAA,GA8BK,SAAA;;KA3BL,sBAAA;;KAGA,kBAAA;;KAGA,oBAAA;;KAGA,oBAAA;;KAGA,aAAA;;KAGA,kBAAA,GACR,mBACA,gBACA,yBACA,4BACA,mBACA,8BACA,uBACA,yBACA,qBACA,uBACA,uBACA"}
1
+ {"version":3,"file":"types.generated.d.ts","names":[],"sources":["../../src/registry/types.generated.ts"],"mappings":";;aAIY,YAAA;EACV,MAAA;EACA,GAAA;EACA,aAAA;EACA,gBAAA;EACA,MAAA;EACA,mBAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,UAAA;EACA,GAAA;AAAA;;KAOU,gBAAA;;KAGA,aAAA;AAHZ;AAAA,KAMY,sBAAA;;KAGA,yBAAA;;KAGA,gBAAA;;KAGA,2BAAA;;KAGA,oBAAA;AAZZ;AAAA,KAeY,sBAAA;;KAGA,kBAAA;;KAGA,oBAAA;;KAGA,oBAAA;;KAGA,aAAA;AArBZ;AAAA,KAwBY,kBAAA,GACR,gBAAA,GACA,aAAA,GACA,sBAAA,GACA,yBAAA,GACA,gBAAA,GACA,2BAAA,GACA,oBAAA,GACA,sBAAA,GACA,kBAAA,GACA,oBAAA,GACA,oBAAA,GACA,aAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.generated.js","names":[],"sources":["../../src/registry/types.generated.ts"],"sourcesContent":["// AUTO-GENERATED from packages/shared/src/schemas/plugin-manifest.schema.json\n// Do not edit. Run: pnpm exec tsx tools/generate-registry-types.ts\n\n/** Resource types from schema $defs.resourceType.enum */\nexport enum ResourceType {\n SECRET = \"secret\",\n JOB = \"job\",\n SQL_WAREHOUSE = \"sql_warehouse\",\n SERVING_ENDPOINT = \"serving_endpoint\",\n VOLUME = \"volume\",\n VECTOR_SEARCH_INDEX = \"vector_search_index\",\n UC_FUNCTION = \"uc_function\",\n UC_CONNECTION = \"uc_connection\",\n DATABASE = \"database\",\n GENIE_SPACE = \"genie_space\",\n EXPERIMENT = \"experiment\",\n APP = \"app\",\n}\n\n// ============================================================================\n// Permissions per resource type (from schema permission $defs)\n// ============================================================================\n/** Permissions for SECRET resources */\nexport type SecretPermission = \"READ\" | \"WRITE\" | \"MANAGE\";\n\n/** Permissions for JOB resources */\nexport type JobPermission = \"CAN_VIEW\" | \"CAN_MANAGE_RUN\" | \"CAN_MANAGE\";\n\n/** Permissions for SQL_WAREHOUSE resources */\nexport type SqlWarehousePermission = \"CAN_USE\" | \"CAN_MANAGE\";\n\n/** Permissions for SERVING_ENDPOINT resources */\nexport type ServingEndpointPermission = \"CAN_VIEW\" | \"CAN_QUERY\" | \"CAN_MANAGE\";\n\n/** Permissions for VOLUME resources */\nexport type VolumePermission = \"READ_VOLUME\" | \"WRITE_VOLUME\";\n\n/** Permissions for VECTOR_SEARCH_INDEX resources */\nexport type VectorSearchIndexPermission = \"SELECT\";\n\n/** Permissions for UC_FUNCTION resources */\nexport type UcFunctionPermission = \"EXECUTE\";\n\n/** Permissions for UC_CONNECTION resources */\nexport type UcConnectionPermission = \"USE_CONNECTION\";\n\n/** Permissions for DATABASE resources */\nexport type DatabasePermission = \"CAN_CONNECT_AND_CREATE\";\n\n/** Permissions for GENIE_SPACE resources */\nexport type GenieSpacePermission = \"CAN_VIEW\" | \"CAN_RUN\" | \"CAN_EDIT\" | \"CAN_MANAGE\";\n\n/** Permissions for EXPERIMENT resources */\nexport type ExperimentPermission = \"CAN_READ\" | \"CAN_EDIT\" | \"CAN_MANAGE\";\n\n/** Permissions for APP resources */\nexport type AppPermission = \"CAN_USE\";\n\n/** Union of all possible permission levels across all resource types. */\nexport type ResourcePermission =\n | SecretPermission\n | JobPermission\n | SqlWarehousePermission\n | ServingEndpointPermission\n | VolumePermission\n | VectorSearchIndexPermission\n | UcFunctionPermission\n | UcConnectionPermission\n | DatabasePermission\n | GenieSpacePermission\n | ExperimentPermission\n | AppPermission;\n\n/** Permission hierarchy per resource type (weakest to strongest). Schema enum order. */\nexport const PERMISSION_HIERARCHY_BY_TYPE: Record<ResourceType, readonly ResourcePermission[]> = {\n [ResourceType.SECRET]: [\"READ\", \"WRITE\", \"MANAGE\"],\n [ResourceType.JOB]: [\"CAN_VIEW\", \"CAN_MANAGE_RUN\", \"CAN_MANAGE\"],\n [ResourceType.SQL_WAREHOUSE]: [\"CAN_USE\", \"CAN_MANAGE\"],\n [ResourceType.SERVING_ENDPOINT]: [\"CAN_VIEW\", \"CAN_QUERY\", \"CAN_MANAGE\"],\n [ResourceType.VOLUME]: [\"READ_VOLUME\", \"WRITE_VOLUME\"],\n [ResourceType.VECTOR_SEARCH_INDEX]: [\"SELECT\"],\n [ResourceType.UC_FUNCTION]: [\"EXECUTE\"],\n [ResourceType.UC_CONNECTION]: [\"USE_CONNECTION\"],\n [ResourceType.DATABASE]: [\"CAN_CONNECT_AND_CREATE\"],\n [ResourceType.GENIE_SPACE]: [\"CAN_VIEW\", \"CAN_RUN\", \"CAN_EDIT\", \"CAN_MANAGE\"],\n [ResourceType.EXPERIMENT]: [\"CAN_READ\", \"CAN_EDIT\", \"CAN_MANAGE\"],\n [ResourceType.APP]: [\"CAN_USE\"],\n} as const;\n\n/** Set of valid permissions per type (for validation). */\nexport const PERMISSIONS_BY_TYPE: Record<ResourceType, readonly ResourcePermission[]> = PERMISSION_HIERARCHY_BY_TYPE;\n"],"mappings":";;AAIA,IAAY,eAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;KACD;;AAyDD,MAAa,+BAAoF;EAC9F,aAAa,SAAS;EAAC;EAAQ;EAAS;EAAS;EACjD,aAAa,MAAM;EAAC;EAAY;EAAkB;EAAa;EAC/D,aAAa,gBAAgB,CAAC,WAAW,aAAa;EACtD,aAAa,mBAAmB;EAAC;EAAY;EAAa;EAAa;EACvE,aAAa,SAAS,CAAC,eAAe,eAAe;EACrD,aAAa,sBAAsB,CAAC,SAAS;EAC7C,aAAa,cAAc,CAAC,UAAU;EACtC,aAAa,gBAAgB,CAAC,iBAAiB;EAC/C,aAAa,WAAW,CAAC,yBAAyB;EAClD,aAAa,cAAc;EAAC;EAAY;EAAW;EAAY;EAAa;EAC5E,aAAa,aAAa;EAAC;EAAY;EAAY;EAAa;EAChE,aAAa,MAAM,CAAC,UAAU;CAChC;;AAGD,MAAa,sBAA2E"}
1
+ {"version":3,"file":"types.generated.js","names":[],"sources":["../../src/registry/types.generated.ts"],"sourcesContent":["// AUTO-GENERATED from packages/shared/src/schemas/plugin-manifest.schema.json\n// Do not edit. Run: pnpm exec tsx tools/generate-registry-types.ts\n\n/** Resource types from schema $defs.resourceType.enum */\nexport enum ResourceType {\n SECRET = \"secret\",\n JOB = \"job\",\n SQL_WAREHOUSE = \"sql_warehouse\",\n SERVING_ENDPOINT = \"serving_endpoint\",\n VOLUME = \"volume\",\n VECTOR_SEARCH_INDEX = \"vector_search_index\",\n UC_FUNCTION = \"uc_function\",\n UC_CONNECTION = \"uc_connection\",\n DATABASE = \"database\",\n GENIE_SPACE = \"genie_space\",\n EXPERIMENT = \"experiment\",\n APP = \"app\",\n}\n\n// ============================================================================\n// Permissions per resource type (from schema permission $defs)\n// ============================================================================\n/** Permissions for SECRET resources */\nexport type SecretPermission = \"READ\" | \"WRITE\" | \"MANAGE\";\n\n/** Permissions for JOB resources */\nexport type JobPermission = \"CAN_VIEW\" | \"CAN_MANAGE_RUN\" | \"CAN_MANAGE\";\n\n/** Permissions for SQL_WAREHOUSE resources */\nexport type SqlWarehousePermission = \"CAN_USE\" | \"CAN_MANAGE\";\n\n/** Permissions for SERVING_ENDPOINT resources */\nexport type ServingEndpointPermission = \"CAN_VIEW\" | \"CAN_QUERY\" | \"CAN_MANAGE\";\n\n/** Permissions for VOLUME resources */\nexport type VolumePermission = \"READ_VOLUME\" | \"WRITE_VOLUME\";\n\n/** Permissions for VECTOR_SEARCH_INDEX resources */\nexport type VectorSearchIndexPermission = \"SELECT\";\n\n/** Permissions for UC_FUNCTION resources */\nexport type UcFunctionPermission = \"EXECUTE\";\n\n/** Permissions for UC_CONNECTION resources */\nexport type UcConnectionPermission = \"USE_CONNECTION\";\n\n/** Permissions for DATABASE resources */\nexport type DatabasePermission = \"CAN_CONNECT_AND_CREATE\";\n\n/** Permissions for GENIE_SPACE resources */\nexport type GenieSpacePermission = \"CAN_VIEW\" | \"CAN_RUN\" | \"CAN_EDIT\" | \"CAN_MANAGE\";\n\n/** Permissions for EXPERIMENT resources */\nexport type ExperimentPermission = \"CAN_READ\" | \"CAN_EDIT\" | \"CAN_MANAGE\";\n\n/** Permissions for APP resources */\nexport type AppPermission = \"CAN_USE\";\n\n/** Union of all possible permission levels across all resource types. */\nexport type ResourcePermission =\n | SecretPermission\n | JobPermission\n | SqlWarehousePermission\n | ServingEndpointPermission\n | VolumePermission\n | VectorSearchIndexPermission\n | UcFunctionPermission\n | UcConnectionPermission\n | DatabasePermission\n | GenieSpacePermission\n | ExperimentPermission\n | AppPermission;\n\n/** Permission hierarchy per resource type (weakest to strongest). Schema enum order. */\nexport const PERMISSION_HIERARCHY_BY_TYPE: Record<ResourceType, readonly ResourcePermission[]> = {\n [ResourceType.SECRET]: [\"READ\", \"WRITE\", \"MANAGE\"],\n [ResourceType.JOB]: [\"CAN_VIEW\", \"CAN_MANAGE_RUN\", \"CAN_MANAGE\"],\n [ResourceType.SQL_WAREHOUSE]: [\"CAN_USE\", \"CAN_MANAGE\"],\n [ResourceType.SERVING_ENDPOINT]: [\"CAN_VIEW\", \"CAN_QUERY\", \"CAN_MANAGE\"],\n [ResourceType.VOLUME]: [\"READ_VOLUME\", \"WRITE_VOLUME\"],\n [ResourceType.VECTOR_SEARCH_INDEX]: [\"SELECT\"],\n [ResourceType.UC_FUNCTION]: [\"EXECUTE\"],\n [ResourceType.UC_CONNECTION]: [\"USE_CONNECTION\"],\n [ResourceType.DATABASE]: [\"CAN_CONNECT_AND_CREATE\"],\n [ResourceType.GENIE_SPACE]: [\"CAN_VIEW\", \"CAN_RUN\", \"CAN_EDIT\", \"CAN_MANAGE\"],\n [ResourceType.EXPERIMENT]: [\"CAN_READ\", \"CAN_EDIT\", \"CAN_MANAGE\"],\n [ResourceType.APP]: [\"CAN_USE\"],\n} as const;\n\n/** Set of valid permissions per type (for validation). */\nexport const PERMISSIONS_BY_TYPE: Record<ResourceType, readonly ResourcePermission[]> = PERMISSION_HIERARCHY_BY_TYPE;\n"],"mappings":";;AAIA,IAAY,sDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AA0DF,MAAa,+BAAoF;EAC9F,aAAa,SAAS;EAAC;EAAQ;EAAS;EAAS;EACjD,aAAa,MAAM;EAAC;EAAY;EAAkB;EAAa;EAC/D,aAAa,gBAAgB,CAAC,WAAW,aAAa;EACtD,aAAa,mBAAmB;EAAC;EAAY;EAAa;EAAa;EACvE,aAAa,SAAS,CAAC,eAAe,eAAe;EACrD,aAAa,sBAAsB,CAAC,SAAS;EAC7C,aAAa,cAAc,CAAC,UAAU;EACtC,aAAa,gBAAgB,CAAC,iBAAiB;EAC/C,aAAa,WAAW,CAAC,yBAAyB;EAClD,aAAa,cAAc;EAAC;EAAY;EAAW;EAAY;EAAa;EAC5E,aAAa,aAAa;EAAC;EAAY;EAAY;EAAa;EAChE,aAAa,MAAM,CAAC,UAAU;CAChC;;AAGD,MAAa,sBAA2E"}
@@ -58,5 +58,5 @@ interface CacheConfig {
58
58
  [key: string]: unknown;
59
59
  }
60
60
  //#endregion
61
- export { CacheConfig };
61
+ export { CacheConfig, CacheEntry, CacheStorage };
62
62
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","names":[],"sources":["../../../../shared/src/cache.ts"],"sourcesContent":[],"mappings":";;;;UAGiB;EAAA,KAAA,EACR,CADQ;EAUA,MAAA,EAAA,MAAA;;;;;;;AAI4B,UAJ5B,YAAA,CAI4B;;KAIlC,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EANY,OAMZ,CANoB,UAMpB,CAN+B,CAM/B,CAAA,GAAA,IAAA,CAAA;;KAID,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EARmB,UAQnB,CAR8B,CAQ9B,CAAA,CAAA,EARmC,OAQnC,CAAA,IAAA,CAAA;;QAMC,CAAA,GAAA,EAAA,MAAA,CAAA,EAZY,OAYZ,CAAA,IAAA,CAAA;EAAO;EAID,KAAA,EAAA,EAdN,OAciB,CAAA,IAAA,CAAA;EAAA;KAYhB,CAAA,GAAA,EAAA,MAAA,CAAA,EAxBQ,OAwBR,CAAA,OAAA,CAAA;;EAIkB,IAAA,EAAA,EA1BpB,OA0BoB,CAAA,MAAA,CAAA;;;;iBAtBb;;WAEN;;;UAIM,WAAA;;;;;;;;;;;;YAYL;;;;cAIE"}
1
+ {"version":3,"file":"cache.d.ts","names":[],"sources":["../../../../shared/src/cache.ts"],"mappings":";;;;UAGiB,UAAA;EACf,KAAA,EAAO,CAAA;EACP,MAAA;AAAA;;;;;;UAQe,YAAA;EART;EAUN,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,UAAA,CAAW,CAAA;EAFb;EAI3B,GAAA,IAAO,GAAA,UAAa,KAAA,EAAO,UAAA,CAAW,CAAA,IAAK,OAAA;EAFH;EAIxC,MAAA,CAAO,GAAA,WAAc,OAAA;EAJA;EAMrB,KAAA,IAAS,OAAA;EAJkB;EAM3B,GAAA,CAAI,GAAA,WAAc,OAAA;EAJG;EAMrB,IAAA,IAAQ,OAAA;EAFU;EAIlB,YAAA;EAEe;EAAf,WAAA,IAAe,OAAA;EAEC;EAAhB,KAAA,IAAS,OAAA;AAAA;;UAIM,WAAA;EApBM;EAsBrB,OAAA;EAtBwC;EAwBxC,GAAA;EAtBI;EAwBJ,QAAA;EAxB2B;EA0B3B,OAAA;EA1BoB;EA4BpB,QAAA;EA1BA;EA4BA,OAAA,GAAU,YAAA;EA5BW;EA8BrB,iBAAA;EA5BS;EA8BT,SAAA,GAAY,gBAAA;EA5BR;EA+BJ,kBAAA;EA7BA;EAgCA,wBAAA;EA9BA;EAiCA,aAAA;EAAA,CAEC,GAAA;AAAA"}
@@ -43,5 +43,5 @@ interface StreamExecutionSettings {
43
43
  stream?: StreamConfig;
44
44
  }
45
45
  //#endregion
46
- export { PluginExecutionSettings, StreamConfig, StreamExecuteHandler, StreamExecutionSettings };
46
+ export { PluginExecuteConfig, PluginExecutionSettings, RetryConfig, StreamConfig, StreamExecuteHandler, StreamExecutionSettings, TelemetryConfig };
47
47
  //# sourceMappingURL=execute.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","names":[],"sources":["../../../../shared/src/execute.ts"],"sourcesContent":[],"mappings":";;;UAEiB,YAAA;eACF;EADE,QAAA,CAAA,EAAA,MAAY;EAYZ,UAAA,CAAA,EAAA,MAAW;EAOX,YAAA,CAAA,EAAA,MAAe;EAMf,SAAA,CAAA,EAAA,MAAA;EAAmB,eAAA,CAAA,EAAA,MAAA;sBAC1B,CAAA,EAAA,MAAA;mBACA,CAAA,EAAA,MAAA;kBAEe,CAAA,EAAA,MAAA;;AACJ,UAlBJ,WAAA,CAkBI;EAKJ,OAAA,CAAA,EAAA,OAAA;EAAuB,QAAA,CAAA,EAAA,MAAA;cAC7B,CAAA,EAAA,MAAA;UACF,CAAA,EAAA,MAAA;;AAIG,UAtBK,eAAA,CAsBe;EAAA,OAAA,CAAA,EAAA,OAAA;UACjB,CAAA,EAAA,MAAA;YAAwB,CAAA,EApBxB,MAoBwB,CAAA,MAAA,EAAA,GAAA,CAAA;;AACxB,UAlBE,mBAAA,CAkBF;OAA+B,CAAA,EAjBpC,WAiBoC;OAAf,CAAA,EAhBrB,WAgBqB;EAAc,oBAAA,CAAA,EAdpB,eAcoB;EAG5B,KAAA,CAAA,EAhBP,WAgBO;EAAuB,OAAA,CAAA,EAAA,MAAA;MAC7B,EAAA,MAAA,CAAA,EAAA,OAAA;;AAEA,UAdM,uBAAA,CAcN;EAAY,OAAA,EAbZ,mBAaY;SAZd;;KAIG,qCACG,gBAAgB,QAAQ,iBACxB,gBAAgB,eAAe;;UAG7B,uBAAA;WACN;SACF;WACE"}
1
+ {"version":3,"file":"execute.d.ts","names":[],"sources":["../../../../shared/src/execute.ts"],"mappings":";;;UAEiB,YAAA;EACf,UAAA,GAAa,WAAA;EACb,QAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,eAAA;EACA,oBAAA;EACA,iBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,WAAA;EACf,OAAA;EACA,QAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,eAAA;EACf,OAAA;EACA,QAAA;EACA,UAAA,GAAa,MAAA;AAAA;AAAA,UAGE,mBAAA;EACf,KAAA,GAAQ,WAAA;EACR,KAAA,GAAQ,WAAA;EAER,oBAAA,GAAuB,eAAA;EACvB,KAAA,GAAQ,WAAA;EACR,OAAA;EAAA,CACC,GAAA;AAAA;AAAA,UAGc,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;AAAA;AAAA,KAIG,oBAAA,QACN,MAAA,GAAS,WAAA,KAAgB,OAAA,CAAQ,CAAA,OACjC,MAAA,GAAS,WAAA,KAAgB,cAAA,CAAe,CAAA;;UAG7B,uBAAA;EACf,OAAA,EAAS,mBAAA;EACT,IAAA,GAAO,mBAAA;EACP,MAAA,GAAS,YAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"genie.d.ts","names":[],"sources":["../../../../shared/src/genie.ts"],"sourcesContent":[],"mappings":";;AACY,KAAA,gBAAA,GAAgB;EAkBX,IAAA,EAAA,eAAA;EAUA,cAAA,EAAA,MAAA;;;;;;;;WApBsB;;;;;;;;;;;UAUtB,oBAAA;;;;;;gBAMD;;;UAIC,uBAAA"}
1
+ {"version":3,"file":"genie.d.ts","names":[],"sources":["../../../../shared/src/genie.ts"],"mappings":";;KACY,gBAAA;EAEN,IAAA;EACA,cAAA;EACA,SAAA;EACA,OAAA;AAAA;EAEA,IAAA;EAAgB,MAAA;AAAA;EAChB,IAAA;EAAwB,OAAA,EAAS,oBAAA;AAAA;EAEjC,IAAA;EACA,YAAA;EACA,WAAA;EACA,IAAA;AAAA;EAEA,IAAA;EAAe,KAAA;AAAA;;UAGJ,oBAAA;EACf,SAAA;EACA,cAAA;EACA,OAAA;EACA,MAAA;EACA,OAAA;EACA,WAAA,GAAc,uBAAA;EACd,KAAA;AAAA;AAAA,UAGe,uBAAA;EACf,YAAA;EACA,KAAA;IACE,KAAA;IACA,WAAA;IACA,KAAA;IACA,WAAA;EAAA;EAEF,IAAA;IAAS,OAAA;EAAA;EACT,kBAAA;AAAA"}
@@ -0,0 +1,7 @@
1
+ import { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceFieldEntry, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser } from "./plugin.js";
2
+ import { CacheConfig, CacheEntry, CacheStorage } from "./cache.js";
3
+ import { PluginExecuteConfig, PluginExecutionSettings, RetryConfig, StreamConfig, StreamExecuteHandler, StreamExecutionSettings, TelemetryConfig } from "./execute.js";
4
+ import { GenieAttachmentResponse, GenieMessageResponse, GenieStreamEvent } from "./genie.js";
5
+ import { SQLBinaryMarker, SQLBooleanMarker, SQLDateMarker, SQLNumberMarker, SQLStringMarker, SQLTimestampMarker, SQLTypeMarker } from "./sql/types.js";
6
+ import { isSQLTypeMarker, sql } from "./sql/helpers.js";
7
+ import { PendingFetch, PendingFileRead, TunnelConnection } from "./tunnel.js";
@@ -131,8 +131,7 @@ type IAppResponse = express.Response;
131
131
  type IAppRequest = express.Request;
132
132
  type HttpMethod = "get" | "post" | "put" | "delete" | "patch" | "head";
133
133
  type RouteConfig = {
134
- /** Unique name for this endpoint (used for frontend access) */
135
- name: string;
134
+ /** Unique name for this endpoint (used for frontend access) */name: string;
136
135
  method: HttpMethod;
137
136
  path: string;
138
137
  handler: (req: IAppRequest, res: IAppResponse) => Promise<void>;
@@ -140,5 +139,5 @@ type RouteConfig = {
140
139
  /** Map of endpoint names to their full paths for a plugin */
141
140
  type PluginEndpointMap = Record<string, string>;
142
141
  //#endregion
143
- export { BasePlugin, BasePluginConfig, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginMap, PluginPhase, RouteConfig, TelemetryOptions, ToPlugin };
142
+ export { BasePlugin, BasePluginConfig, HttpMethod, IAppRequest, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginExports, PluginManifest, PluginMap, PluginPhase, ResourceFieldEntry, ResourceRequirement, RouteConfig, TelemetryOptions, ToPlugin, WithAsUser };
144
143
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../../shared/src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,UAAA;EAAA,IAAA,EAAA,MAAA;EAAU,qBAAA,GAAA,EAAA,IAAA;OAKhB,EAAA,EAAA,OAAA,CAAA,IAAA,CAAA;cAEoB,CAAA,MAAA,EAAR,OAAA,CAAQ,MAAA,CAAA,EAAA,IAAA;cAEb,EAAA,EAAA,iBAAA;EAAiB,OAAA,GAAA,EAAA,OAAA;AAMnC;AAaA;AAaY,UA1BK,gBAAA,CA0BM;EAMX,IAAA,CAAA,EAAA,MAAA;EAAiB,IAAA,CAAA,EAAA,MAAA;MACvB,EAAA,MAAA,CAAA,EAAA,OAAA;WACM,CAAA,EAxBE,gBAwBF;;AAEF,KAvBE,gBAAA,GAuBF,OAAA,GAAA;QACL,CAAA,EAAA,OAAA;SACc,CAAA,EAAA,OAAA;MACT,CAAA,EAAA,OAAA;;AAiBqB,KA9BnB,WAAA,GA8BmB,MAAA,GAAA,QAAA,GAAA,UAAA;;;;;AASnB,KAjCA,iBAiCA,CAAA,IAhCN,gBAgCM,EAAA,UA/BA,UA+BA,GA/Ba,UA+Bb,CAAA,GAAA,CAAA,KAAA,MAAA,EA7BF,CA6BE,EAAA,GA5BP,CA4BO,CAAA,GAAA;EAAW,cAAA,CAAA,EA3BJ,MA2BI,CAAA,MAAA,EAAA,OAAA,CAAA;EAiBN,KAAA,CAAA,EA3CP,WA2CO;EAWA;;;;EAWD,QAAA,EA5DJ,cA4DI;EAqCJ;;;;yBAC2B,EAAA,MAAA,EA7FJ,CA6FI,CAAA,EA7FA,mBA6FA,EAAA;;;AAMvC;;;AAMgB,UAlGC,cAAA,CAkGD;MAAgB,EAAA,MAAA;EAAG,WAAA,EAAA,MAAA;EAQvB,WAAA,EAAS,MAAA;EAAA,SAAA,EAAA;IACW,QAAA,EAtGlB,IAsGkB,CAtGb,mBAsGa,EAAA,UAAA,CAAA,EAAA;IAAX,QAAA,EArGP,IAqGO,CArGF,mBAqGE,EAAA,UAAA,CAAA,EAAA;;QAEA,CAAA,EAAA;IACU,MAAA,EArGnB,WAqGmB;;gBAA3B,CAAA,EAAA,MAAA;QAD6B,CAAA,EAAA,OAAA;EAAU,MAAA,CAAA,EAAA,MAAA;EAK/B,OAAA,CAAA,EAAA,MAAU;EAAA,UAAA,CAAA,EAAA,MAAA;UAAsB,CAAA,EAAA,MAAA,EAAA;SAAW,CAAA,EAAA,MAAA;;;AACvD;;;;;AAEsB,UA3FL,kBAAA,CA2FK;;EAAP,GAAA,EAAA,MAAA;EAGH;EACA,WAAA,CAAA,EAAA,MAAY;AACxB;AAEA;AAEA;;;AAKiB,UA9FA,mBAAA,CA8FA;MAAkB,EAAA,MAAA;OAAiB,EAAA,MAAA;EAAO;EAI/C,WAAA,EAAA,MAAA;;;;;;;UAvFF,eAAe;;;;;;;;KAqCb,wBAAwB,cAClC,uCAAqC,IAAI;;;;;KAM/B,kBAAkB;;;;;;gBAMd,gBAAgB;;;;;;;KAQpB,6BACS,WAAW,iDAExB,aAAa,YAAY,WAC7B,cAAc,aAAa;KAInB;UAAgC;UAAW;QAAS;;KACpD,6CACD,MACN,WAAW,GAAG,GAAG;;KAGV,UAAA,GAAa,OAAA,CAAQ;KACrB,YAAA,GAAe,OAAA,CAAQ;KACvB,WAAA,GAAc,OAAA,CAAQ;KAEtB,UAAA;KAEA,WAAA;;;UAGF;;iBAEO,kBAAkB,iBAAiB;;;KAIxC,iBAAA,GAAoB"}
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../../shared/src/plugin.ts"],"mappings":";;;;;UAIiB,UAAA;EACf,IAAA;EAEA,qBAAA;EAEA,KAAA,IAAS,OAAA;EAET,YAAA,CAAa,MAAA,EAAQ,OAAA,CAAQ,MAAA;EAE7B,YAAA,IAAgB,iBAAA;EAEhB,OAAA;AAAA;;UAIe,gBAAA;EACf,IAAA;EACA,IAAA;EAAA,CAEC,GAAA;EAMD,SAAA,GAAY,gBAAA;AAAA;AAAA,KAGF,gBAAA;EAGN,MAAA;EACA,OAAA;EACA,IAAA;AAAA;AAAA,KAQM,WAAA;;;;;KAMA,iBAAA,KACN,gBAAA,YACM,UAAA,GAAa,UAAA,UAEvB,MAAA,EAAQ,CAAA,KACL,CAAA;EACH,cAAA,GAAiB,MAAA;EACjB,KAAA,GAAQ,WAAA;EA7BoB;AAG9B;;;EA+BE,QAAA,EAAU,cAAA;EA5BN;;;;EAiCJ,uBAAA,EAAyB,MAAA,EAAQ,CAAA,GAAI,mBAAA;AAAA;;;;;UAOtB,cAAA;EACf,IAAA;EACA,WAAA;EACA,WAAA;EACA,SAAA;IACE,QAAA,EAAU,IAAA,CAAK,mBAAA;IACf,QAAA,EAAU,IAAA,CAAK,mBAAA;EAAA;EAEjB,MAAA;IACE,MAAA,EAAQ,WAAA;EAAA;EAEV,cAAA;EACA,MAAA;EACA,MAAA;EACA,OAAA;EACA,UAAA;EACA,QAAA;EACA,OAAA;AAAA;;;;;;;UASe,kBAAA;EA3CP;EA6CR,GAAA;EAxCU;EA0CV,WAAA;AAAA;;;;;UAOe,mBAAA;EACf,IAAA;EACA,KAAA;EAlCiB;EAoCjB,WAAA;EACA,WAAA;EACA,UAAA;EAlCU;;;;EAuCV,MAAA,EAAQ,MAAA,SAAe,kBAAA;EACvB,QAAA;AAAA;;AAvBF;;;;KA2DY,aAAA,WAAwB,UAAA,IAClC,CAAA,sCAAqC,CAAA,GAAI,MAAA;AAjD3C;;;;AAAA,KAuDY,UAAA,QAAkB,GAAA;EArD5B;;;;;EA2DA,MAAA,GAAS,GAAA,EAAK,WAAA,KAAgB,GAAA;AAAA;;;;AAbhC;;KAqBY,SAAA,oBACS,UAAA,CAAW,iBAAA,gCAExB,CAAA,YAAa,CAAA,WAAY,UAAA,CAC7B,aAAA,CAAc,YAAA,CAAa,CAAA;AAAA,KAInB,UAAA;EAAwB,MAAA,EAAQ,CAAA;EAAG,MAAA,EAAQ,CAAA;EAAG,IAAA,EAAM,CAAA;AAAA;AAAA,KACpD,QAAA,4BACV,MAAA,GAAS,CAAA,KACN,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,CAAA;;KAGV,UAAA,GAAa,OAAA,CAAQ,MAAA;AAAA,KACrB,YAAA,GAAe,OAAA,CAAQ,QAAA;AAAA,KACvB,WAAA,GAAc,OAAA,CAAQ,OAAA;AAAA,KAEtB,UAAA;AAAA,KAEA,WAAA;EAlCU,+DAoCpB,IAAA;EACA,MAAA,EAAQ,UAAA;EACR,IAAA;EACA,OAAA,GAAU,GAAA,EAAK,WAAA,EAAa,GAAA,EAAK,YAAA,KAAiB,OAAA;AAAA;;KAIxC,iBAAA,GAAoB,MAAA"}
@@ -1,7 +1,6 @@
1
1
  import { SQLBinaryMarker, SQLBooleanMarker, SQLDateMarker, SQLNumberMarker, SQLStringMarker, SQLTimestampMarker, SQLTypeMarker } from "./types.js";
2
2
 
3
3
  //#region ../shared/src/sql/helpers.d.ts
4
-
5
4
  /**
6
5
  * SQL helper namespace
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","names":[],"sources":["../../../../../shared/src/sql/helpers.ts"],"sourcesContent":[],"mappings":";;;;;;AAaA;AA0TC,cA1TY,GA0TZ,EAAA;;;;;;;;;;;;AAgBD;;;;;cAzTc,gBAAgB;;;;;;;;;;;;;;;;;;;;;;mBAmDX,yBAAyB;;;;;;;;;;;;;;;;;kCA6CV;;;;;;;;;;;;;;;;;;;;;;4CAkDU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAyDC;;;;;;;;;;;;;;;;;;;;;;gBA8D7B,aAAa,uBAAuB;;;;;;;;;;;;;;;;iBAgDpC,eAAA,uBAAsC"}
1
+ {"version":3,"file":"helpers.d.ts","names":[],"sources":["../../../../../shared/src/sql/helpers.ts"],"mappings":";;;;;AAaA;cAAa,GAAA;;;;;;;;;;;;;;;;;cAiBC,IAAA,YAAgB,aAAA;;;;;;;;;;;;;;;;;;;;;AAyT9B;mBAtQmB,IAAA,qBAAyB,kBAAA;;;;;;;;;;;;;;;;;kCA6CV,eAAA;;;;;;;;;;;;;;;;;;;;;;4CAkDU,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAyDC,gBAAA;;;;;;;;;;;;;;;;;;;;;;gBA8D7B,UAAA,GAAa,WAAA,YAAuB,eAAA;AAAA;;;;;;;;;;;;;;;iBAgDpC,eAAA,CAAgB,KAAA,QAAa,KAAA,IAAS,aAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../../shared/src/sql/types.ts"],"sourcesContent":[],"mappings":";UAAiB,eAAA;EAAA,UAAA,EAAA,QAAe;EAKf,KAAA,EAAA,MAAA;AAKjB;AAMiB,UAXA,eAAA,CAWe;EAKf,UAAA,EAAA,SAAa;EAKb,KAAA,EAAA,MAAA;AASjB;AAAyB,UAzBR,gBAAA,CAyBQ;YACrB,EAAA,SAAA;OACA,EAAA,MAAA;;;AAGA,UAxBa,eAAA,CAwBb;YACA,EAAA,QAAA;EAAkB,KAAA,EAAA,MAAA;;UApBL,aAAA;;;;UAKA,kBAAA;;;;;;;;KASL,aAAA,GACR,kBACA,kBACA,mBACA,kBACA,gBACA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../../shared/src/sql/types.ts"],"mappings":";UAAiB,eAAA;EACf,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,eAAA;EACf,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,UAAA;EACA,KAAA;AAAA;;UAIe,eAAA;EACf,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,aAAA;EACf,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,kBAAA;EACf,UAAA;EACA,KAAA;AAAA;;AAFF;;;KASY,aAAA,GACR,eAAA,GACA,eAAA,GACA,gBAAA,GACA,eAAA,GACA,aAAA,GACA,kBAAA"}
@@ -26,5 +26,5 @@ interface PendingFileRead {
26
26
  timeout: NodeJS.Timeout;
27
27
  }
28
28
  //#endregion
29
- export { TunnelConnection };
29
+ export { PendingFetch, PendingFileRead, TunnelConnection };
30
30
  //# sourceMappingURL=tunnel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","names":[],"sources":["../../../../shared/src/tunnel.ts"],"sourcesContent":[],"mappings":";;;UAEiB,gBAAA;MACX;EADW,KAAA,EAAA,MAAA;EAAgB,eAAA,EAGd,GAHc,CAAA,MAAA,CAAA;iBAC3B,EAGa,GAHb,CAAA,MAAA,CAAA;iBAEa,EAEA,GAFA,CAAA,MAAA,CAAA;gBACA,EAED,GAFC,CAAA,MAAA,EAEW,YAFX,CAAA;kBACA,EAEC,GAFD,CAAA,MAAA,EAEa,eAFb,CAAA;sBACW,EAAA,MAAA,GAAA,IAAA;;AACE,UAIf,YAAA,CAJe;SAAZ,EAAA,CAAA,IAAA,EAAA,GAAA,EAAA,GAAA,IAAA;EAAG,MAAA,EAAA,CAAA,GAAA,EAMP,KANO,EAAA,GAAA,IAAA;EAIN,OAAA,EAGN,MAAA,CAAO,OAHW;EAAA,QAAA,CAAA,EAAA;IAEb,MAAA,EAAA,MAAA;IACL,OAAO,EAGL,MAHK,CAAA,MAAA,EAAA,GAAA,CAAA;;;AAOD,UAAA,eAAA,CAAe;EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA;QAEhB,EAAA,CAAA,GAAA,EAAA,KAAA,EAAA,GAAA,IAAA;SACL,EAAA,MAAA,CAAO,OAAA"}
1
+ {"version":3,"file":"tunnel.d.ts","names":[],"sources":["../../../../shared/src/tunnel.ts"],"mappings":";;;UAEiB,gBAAA;EACf,EAAA,EAAI,SAAA;EACJ,KAAA;EACA,eAAA,EAAiB,GAAA;EACjB,eAAA,EAAiB,GAAA;EACjB,eAAA,EAAiB,GAAA;EACjB,cAAA,EAAgB,GAAA,SAAY,YAAA;EAC5B,gBAAA,EAAkB,GAAA,SAAY,eAAA;EAC9B,oBAAA;AAAA;AAAA,UAGe,YAAA;EACf,OAAA,GAAU,IAAA;EACV,MAAA,GAAS,GAAA,EAAK,KAAA;EACd,OAAA,EAAS,MAAA,CAAO,OAAA;EAChB,QAAA;IACE,MAAA;IACA,OAAA,EAAS,MAAA;EAAA;AAAA;AAAA,UAII,eAAA;EACf,OAAA,GAAU,OAAA;EACV,MAAA,GAAS,GAAA,EAAK,KAAA;EACd,OAAA,EAAS,MAAA,CAAO,OAAA;AAAA"}
@@ -0,0 +1 @@
1
+ import "@databricks/sdk-experimental";
@@ -0,0 +1 @@
1
+ import "./types.js";
@@ -0,0 +1,3 @@
1
+ import "./arrow-stream-processor.js";
2
+ import { StreamManager } from "./stream-manager.js";
3
+ import "./types.js";
@@ -1,5 +1,6 @@
1
1
  import { IAppResponse } from "../shared/src/plugin.js";
2
2
  import { StreamConfig } from "../shared/src/execute.js";
3
+ import "../shared/src/index.js";
3
4
 
4
5
  //#region src/stream/stream-manager.d.ts
5
6
  declare class StreamManager {
@@ -1 +1 @@
1
- {"version":3,"file":"stream-manager.d.ts","names":[],"sources":["../../src/stream/stream-manager.ts"],"sourcesContent":[],"mappings":";;;;cAWa,aAAA;;;EAAA,QAAA,SAAa;EAAA,QAAA,YAAA;UAOF,SAAA;aAYf,CAAA,OAAA,CAAA,EAZe,YAYf;QACa,CAAA,GAAA,EADb,YACa,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,GAAgB,cAAhB,CAAA,GAAA,EAAA,IAAA,EAAA,OAAA,CAAA,EAAA,OAAA,CAAA,EACR,YADQ,CAAA,EAEjB,OAFiB,CAAA,IAAA,CAAA;UAAgB,CAAA,CAAA,EAAA,IAAA;gBACxB,CAAA,CAAA,EAAA,MAAA;UACT,uBAAA;EAAO,QAAA,gBAAA"}
1
+ {"version":3,"file":"stream-manager.d.ts","names":[],"sources":["../../src/stream/stream-manager.ts"],"mappings":";;;;;cAWa,aAAA;EAAA,QACH,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,SAAA;EAAA,QACA,YAAA;EAAA,QACA,SAAA;cAEI,OAAA,GAAU,YAAA;EAWhB,MAAA,CACJ,GAAA,EAAK,YAAA,EACL,OAAA,GAAU,MAAA,EAAQ,WAAA,KAAgB,cAAA,sBAClC,OAAA,GAAU,YAAA,GACT,OAAA;EAyBH,QAAA,CAAA;EAUA,cAAA,CAAA;EAAA,QAKc,uBAAA;EAAA,QAoEA,gBAAA;EAAA,QAqEA,6BAAA;EAAA,QAyEN,eAAA;EAAA,QA6BA,yBAAA;EAAA,QAaA,wBAAA;EAAA,QAkBA,gBAAA;EAAA,QASA,cAAA;EAAA,QAUA,gBAAA;AAAA"}
@@ -0,0 +1,3 @@
1
+ import "../shared/src/index.js";
2
+ import "./buffers.js";
3
+ import "@opentelemetry/api";
@@ -0,0 +1 @@
1
+ import "../shared/src/index.js";
@@ -1,4 +1,8 @@
1
+ import "./config.js";
2
+ import "./instrumentations.js";
1
3
  import { ITelemetry, InstrumentConfig, TelemetryConfig } from "./types.js";
4
+ import "./telemetry-provider.js";
5
+ import "./telemetry-manager.js";
2
6
  import { Counter, Histogram, Span as Span$1, SpanStatusCode } from "@opentelemetry/api";
3
7
  import { SeverityNumber as SeverityNumber$1 } from "@opentelemetry/api-logs";
4
8
  export { type Counter, type Histogram, SeverityNumber$1 as SeverityNumber, type Span$1 as Span, SpanStatusCode };
@@ -0,0 +1 @@
1
+ import { Instrumentation } from "@opentelemetry/instrumentation";
@@ -0,0 +1,4 @@
1
+ import "../shared/src/index.js";
2
+ import "./types.js";
3
+ import "./telemetry-provider.js";
4
+ import { Instrumentation } from "@opentelemetry/instrumentation";
@@ -0,0 +1,6 @@
1
+ import "../shared/src/index.js";
2
+ import "./types.js";
3
+ import "./telemetry-manager.js";
4
+ import { Meter, Span, SpanOptions, Tracer } from "@opentelemetry/api";
5
+ import { LogRecord, Logger } from "@opentelemetry/api-logs";
6
+ import { Instrumentation } from "@opentelemetry/instrumentation";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/telemetry/types.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB,eAAA;EAAA,WAAA,CAAA,EAAA,MAAe;EAAA,cAAA,CAAA,EAAA,MAAA;kBAGX,CAAA,EAAA,eAAA,EAAA;kBAET,CAAA,EAAA,MAAA;EAAM,OAAA,CAAA,EAAN,MAAM,CAAA,MAAA,EAAA,MAAA,CAAA;AAMlB;AAiBA;;;AAKyC,UAtBxB,gBAAA,CAsBwB;;;;MAYA,CAAA,EAAA,MAAA;;;;;;eAuBrB,CAAA,EAAA,OAAA;;;;;;UAxCH,UAAA;;;;;sBAKK,mBAAmB;;;;;qBAMpB,mBAAmB;;;;;sBAMlB,mBAAmB;;;;;;kBAOvB;;;;;;;;;;;4CAcL,wBACE,SAAS,QAAQ,oBACZ,mBACf,QAAQ;;;;;;6CAOgC"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/telemetry/types.ts"],"mappings":";;;;;;UAKiB,eAAA;EACf,WAAA;EACA,cAAA;EACA,gBAAA,GAAmB,eAAA;EACnB,gBAAA;EACA,OAAA,GAAU,MAAA;AAAA;;;;UAMK,gBAAA;EANL;;;EAUV,IAAA;EAJ+B;;;;AAiBjC;EAPE,aAAA;AAAA;;;;;UAOe,UAAA;EAiBwB;;;;EAZvC,SAAA,CAAU,OAAA,GAAU,gBAAA,GAAmB,MAAA;EAkCjB;;;;EA5BtB,QAAA,CAAS,OAAA,GAAU,gBAAA,GAAmB,KAAA;EAqCoB;;;;EA/B1D,SAAA,CAAU,OAAA,GAAU,gBAAA,GAAmB,MAAA;EAZA;;;;;EAmBvC,IAAA,CAAK,SAAA,EAAW,SAAA;EAPI;;;;;;;;;;EAmBpB,eAAA,IACE,IAAA,UACA,OAAA,EAAS,WAAA,EACT,EAAA,GAAK,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,CAAA,GAC5B,aAAA,GAAgB,gBAAA,GACf,OAAA,CAAQ,CAAA;EAFE;;;;;EASb,wBAAA,CAAyB,gBAAA,EAAkB,eAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../logging/logger.js";
2
2
  import crypto from "node:crypto";
3
+ import fs from "node:fs/promises";
3
4
  import path from "node:path";
4
- import fs from "node:fs";
5
5
 
6
6
  //#region src/type-generator/cache.ts
7
7
  const logger = createLogger("type-generator:cache");
@@ -22,16 +22,15 @@ function hashSQL(sql) {
22
22
  * If the cache is not found, run the query explain
23
23
  * @returns - the cache
24
24
  */
25
- function loadCache() {
25
+ async function loadCache() {
26
26
  const cachePath = path.join(CACHE_DIR, CACHE_FILE);
27
27
  try {
28
- if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });
29
- if (fs.existsSync(cachePath)) {
30
- const cache = JSON.parse(fs.readFileSync(cachePath, "utf8"));
31
- if (cache.version === CACHE_VERSION) return cache;
32
- }
33
- } catch {
34
- logger.warn("Cache file is corrupted, flushing cache completely.");
28
+ await fs.mkdir(CACHE_DIR, { recursive: true });
29
+ const raw = await fs.readFile(cachePath, "utf8");
30
+ const cache = JSON.parse(raw);
31
+ if (cache.version === CACHE_VERSION) return cache;
32
+ } catch (err) {
33
+ if (err.code !== "ENOENT") logger.warn("Cache file is corrupted, flushing cache completely.");
35
34
  }
36
35
  return {
37
36
  version: CACHE_VERSION,
@@ -40,12 +39,11 @@ function loadCache() {
40
39
  }
41
40
  /**
42
41
  * Save the cache to the file system
43
- * The cache is saved as a JSON file, it is used to avoid running the query explain multiple times
44
42
  * @param cache - cache object to save
45
43
  */
46
- function saveCache(cache) {
44
+ async function saveCache(cache) {
47
45
  const cachePath = path.join(CACHE_DIR, CACHE_FILE);
48
- fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), "utf8");
46
+ await fs.writeFile(cachePath, JSON.stringify(cache, null, 2), "utf8");
49
47
  }
50
48
 
51
49
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":[],"sources":["../../src/type-generator/cache.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createLogger } from \"../logging/logger\";\n\nconst logger = createLogger(\"type-generator:cache\");\n\n/**\n * Cache types\n * @property hash - the hash of the SQL query\n * @property type - the type of the query\n */\ninterface CacheEntry {\n hash: string;\n type: string;\n retry: boolean;\n}\n\n/**\n * Cache interface\n * @property version - the version of the cache\n * @property queries - the queries in the cache\n */\ninterface Cache {\n version: string;\n queries: Record<string, CacheEntry>;\n}\n\nexport const CACHE_VERSION = \"2\";\nconst CACHE_FILE = \".appkit-types-cache.json\";\nconst CACHE_DIR = path.join(\n process.cwd(),\n \"node_modules\",\n \".databricks\",\n \"appkit\",\n);\n\n/**\n * Hash the SQL query\n * Uses MD5 to hash the SQL query\n * @param sql - the SQL query to hash\n * @returns - the hash of the SQL query\n */\nexport function hashSQL(sql: string): string {\n return crypto.createHash(\"md5\").update(sql).digest(\"hex\");\n}\n\n/**\n * Load the cache from the file system\n * If the cache is not found, run the query explain\n * @returns - the cache\n */\nexport function loadCache(): Cache {\n const cachePath = path.join(CACHE_DIR, CACHE_FILE);\n try {\n if (!fs.existsSync(CACHE_DIR)) {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n }\n\n if (fs.existsSync(cachePath)) {\n const cache = JSON.parse(fs.readFileSync(cachePath, \"utf8\")) as Cache;\n if (cache.version === CACHE_VERSION) {\n return cache;\n }\n }\n } catch {\n logger.warn(\"Cache file is corrupted, flushing cache completely.\");\n }\n return { version: CACHE_VERSION, queries: {} };\n}\n\n/**\n * Save the cache to the file system\n * The cache is saved as a JSON file, it is used to avoid running the query explain multiple times\n * @param cache - cache object to save\n */\nexport function saveCache(cache: Cache): void {\n const cachePath = path.join(CACHE_DIR, CACHE_FILE);\n fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), \"utf8\");\n}\n"],"mappings":";;;;;;AAKA,MAAM,SAAS,aAAa,uBAAuB;AAuBnD,MAAa,gBAAgB;AAC7B,MAAM,aAAa;AACnB,MAAM,YAAY,KAAK,KACrB,QAAQ,KAAK,EACb,gBACA,eACA,SACD;;;;;;;AAQD,SAAgB,QAAQ,KAAqB;AAC3C,QAAO,OAAO,WAAW,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM;;;;;;;AAQ3D,SAAgB,YAAmB;CACjC,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;AAClD,KAAI;AACF,MAAI,CAAC,GAAG,WAAW,UAAU,CAC3B,IAAG,UAAU,WAAW,EAAE,WAAW,MAAM,CAAC;AAG9C,MAAI,GAAG,WAAW,UAAU,EAAE;GAC5B,MAAM,QAAQ,KAAK,MAAM,GAAG,aAAa,WAAW,OAAO,CAAC;AAC5D,OAAI,MAAM,YAAY,cACpB,QAAO;;SAGL;AACN,SAAO,KAAK,sDAAsD;;AAEpE,QAAO;EAAE,SAAS;EAAe,SAAS,EAAE;EAAE;;;;;;;AAQhD,SAAgB,UAAU,OAAoB;CAC5C,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;AAClD,IAAG,cAAc,WAAW,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,OAAO"}
1
+ {"version":3,"file":"cache.js","names":[],"sources":["../../src/type-generator/cache.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createLogger } from \"../logging/logger\";\n\nconst logger = createLogger(\"type-generator:cache\");\n\n/**\n * Cache types\n * @property hash - the hash of the SQL query\n * @property type - the type of the query\n */\ninterface CacheEntry {\n hash: string;\n type: string;\n retry: boolean;\n}\n\n/**\n * Cache interface\n * @property version - the version of the cache\n * @property queries - the queries in the cache\n */\ninterface Cache {\n version: string;\n queries: Record<string, CacheEntry>;\n}\n\nexport const CACHE_VERSION = \"2\";\nconst CACHE_FILE = \".appkit-types-cache.json\";\nconst CACHE_DIR = path.join(\n process.cwd(),\n \"node_modules\",\n \".databricks\",\n \"appkit\",\n);\n\n/**\n * Hash the SQL query\n * Uses MD5 to hash the SQL query\n * @param sql - the SQL query to hash\n * @returns - the hash of the SQL query\n */\nexport function hashSQL(sql: string): string {\n return crypto.createHash(\"md5\").update(sql).digest(\"hex\");\n}\n\n/**\n * Load the cache from the file system\n * If the cache is not found, run the query explain\n * @returns - the cache\n */\nexport async function loadCache(): Promise<Cache> {\n const cachePath = path.join(CACHE_DIR, CACHE_FILE);\n try {\n await fs.mkdir(CACHE_DIR, { recursive: true });\n\n const raw = await fs.readFile(cachePath, \"utf8\");\n const cache = JSON.parse(raw) as Cache;\n if (cache.version === CACHE_VERSION) {\n return cache;\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n logger.warn(\"Cache file is corrupted, flushing cache completely.\");\n }\n }\n return { version: CACHE_VERSION, queries: {} };\n}\n\n/**\n * Save the cache to the file system\n * @param cache - cache object to save\n */\nexport async function saveCache(cache: Cache): Promise<void> {\n const cachePath = path.join(CACHE_DIR, CACHE_FILE);\n await fs.writeFile(cachePath, JSON.stringify(cache, null, 2), \"utf8\");\n}\n"],"mappings":";;;;;;AAKA,MAAM,SAAS,aAAa,uBAAuB;AAuBnD,MAAa,gBAAgB;AAC7B,MAAM,aAAa;AACnB,MAAM,YAAY,KAAK,KACrB,QAAQ,KAAK,EACb,gBACA,eACA,SACD;;;;;;;AAQD,SAAgB,QAAQ,KAAqB;AAC3C,QAAO,OAAO,WAAW,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM;;;;;;;AAQ3D,eAAsB,YAA4B;CAChD,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;AAClD,KAAI;AACF,QAAM,GAAG,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;EAE9C,MAAM,MAAM,MAAM,GAAG,SAAS,WAAW,OAAO;EAChD,MAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,MAAM,YAAY,cACpB,QAAO;UAEF,KAAK;AACZ,MAAK,IAA8B,SAAS,SAC1C,QAAO,KAAK,sDAAsD;;AAGtE,QAAO;EAAE,SAAS;EAAe,SAAS,EAAE;EAAE;;;;;;AAOhD,eAAsB,UAAU,OAA6B;CAC3D,MAAM,YAAY,KAAK,KAAK,WAAW,WAAW;AAClD,OAAM,GAAG,UAAU,WAAW,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,OAAO"}
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "../logging/logger.js";
2
2
  import { generateQueriesFromDescribe } from "./query-registry.js";
3
- import fs from "node:fs";
3
+ import fs from "node:fs/promises";
4
4
  import dotenv from "dotenv";
5
5
 
6
6
  //#region src/type-generator/index.ts
@@ -39,7 +39,7 @@ async function generateFromEntryPoint(options) {
39
39
  let queryRegistry = [];
40
40
  if (queryFolder) queryRegistry = await generateQueriesFromDescribe(queryFolder, warehouseId, { noCache });
41
41
  const typeDeclarations = generateTypeDeclarations(queryRegistry);
42
- fs.writeFileSync(outFile, typeDeclarations, "utf-8");
42
+ await fs.writeFile(outFile, typeDeclarations, "utf-8");
43
43
  logger.debug("Type generation complete!");
44
44
  }
45
45
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/type-generator/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport dotenv from \"dotenv\";\nimport { createLogger } from \"../logging/logger\";\nimport { generateQueriesFromDescribe } from \"./query-registry\";\nimport type { QuerySchema } from \"./types\";\n\ndotenv.config();\n\nconst logger = createLogger(\"type-generator\");\n\n/**\n * Generate type declarations for QueryRegistry\n * Create the d.ts file from the plugin routes and query schemas\n * @param querySchemas - the list of query schemas\n * @returns - the type declarations as a string\n */\nfunction generateTypeDeclarations(querySchemas: QuerySchema[] = []): string {\n const queryEntries = querySchemas\n .map(({ name, type }) => {\n const indentedType = type\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : ` ${line}`))\n .join(\"\\n\");\n return ` ${name}: ${indentedType}`;\n })\n .join(\";\\n\");\n\n const querySection = queryEntries ? `\\n${queryEntries};\\n ` : \"\";\n\n return `// Auto-generated by AppKit - DO NOT EDIT\n// Generated by 'npx @databricks/appkit generate-types' or Vite plugin during build\nimport \"@databricks/appkit-ui/react\";\nimport type { SQLTypeMarker, SQLStringMarker, SQLNumberMarker, SQLBooleanMarker, SQLBinaryMarker, SQLDateMarker, SQLTimestampMarker } from \"@databricks/appkit-ui/js\";\n\ndeclare module \"@databricks/appkit-ui/react\" {\n interface QueryRegistry {${querySection}}\n}\n`;\n}\n\n/**\n * Entry point for generating type declarations from all imported files\n * @param options - the options for the generation\n * @param options.entryPoint - the entry point file\n * @param options.outFile - the output file\n * @param options.querySchemaFile - optional path to query schema file (e.g. config/queries/schema.ts)\n */\nexport async function generateFromEntryPoint(options: {\n outFile: string;\n queryFolder?: string;\n warehouseId: string;\n noCache?: boolean;\n}) {\n const { outFile, queryFolder, warehouseId, noCache } = options;\n\n logger.debug(\"Starting type generation...\");\n\n let queryRegistry: QuerySchema[] = [];\n if (queryFolder)\n queryRegistry = await generateQueriesFromDescribe(\n queryFolder,\n warehouseId,\n {\n noCache,\n },\n );\n\n const typeDeclarations = generateTypeDeclarations(queryRegistry);\n\n fs.writeFileSync(outFile, typeDeclarations, \"utf-8\");\n\n logger.debug(\"Type generation complete!\");\n}\n"],"mappings":";;;;;;AAMA,OAAO,QAAQ;AAEf,MAAM,SAAS,aAAa,iBAAiB;;;;;;;AAQ7C,SAAS,yBAAyB,eAA8B,EAAE,EAAU;CAC1E,MAAM,eAAe,aAClB,KAAK,EAAE,MAAM,WAAW;AAKvB,SAAO,OAAO,KAAK,IAJE,KAClB,MAAM,KAAK,CACX,KAAK,MAAM,MAAO,MAAM,IAAI,OAAO,OAAO,OAAQ,CAClD,KAAK,KAAK;GAEb,CACD,KAAK,MAAM;AAId,QAAO;;;;;;6BAFc,eAAe,KAAK,aAAa,SAAS,GAQvB;;;;;;;;;;;AAY1C,eAAsB,uBAAuB,SAK1C;CACD,MAAM,EAAE,SAAS,aAAa,aAAa,YAAY;AAEvD,QAAO,MAAM,8BAA8B;CAE3C,IAAI,gBAA+B,EAAE;AACrC,KAAI,YACF,iBAAgB,MAAM,4BACpB,aACA,aACA,EACE,SACD,CACF;CAEH,MAAM,mBAAmB,yBAAyB,cAAc;AAEhE,IAAG,cAAc,SAAS,kBAAkB,QAAQ;AAEpD,QAAO,MAAM,4BAA4B"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/type-generator/index.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport dotenv from \"dotenv\";\nimport { createLogger } from \"../logging/logger\";\nimport { generateQueriesFromDescribe } from \"./query-registry\";\nimport type { QuerySchema } from \"./types\";\n\ndotenv.config();\n\nconst logger = createLogger(\"type-generator\");\n\n/**\n * Generate type declarations for QueryRegistry\n * Create the d.ts file from the plugin routes and query schemas\n * @param querySchemas - the list of query schemas\n * @returns - the type declarations as a string\n */\nfunction generateTypeDeclarations(querySchemas: QuerySchema[] = []): string {\n const queryEntries = querySchemas\n .map(({ name, type }) => {\n const indentedType = type\n .split(\"\\n\")\n .map((line, i) => (i === 0 ? line : ` ${line}`))\n .join(\"\\n\");\n return ` ${name}: ${indentedType}`;\n })\n .join(\";\\n\");\n\n const querySection = queryEntries ? `\\n${queryEntries};\\n ` : \"\";\n\n return `// Auto-generated by AppKit - DO NOT EDIT\n// Generated by 'npx @databricks/appkit generate-types' or Vite plugin during build\nimport \"@databricks/appkit-ui/react\";\nimport type { SQLTypeMarker, SQLStringMarker, SQLNumberMarker, SQLBooleanMarker, SQLBinaryMarker, SQLDateMarker, SQLTimestampMarker } from \"@databricks/appkit-ui/js\";\n\ndeclare module \"@databricks/appkit-ui/react\" {\n interface QueryRegistry {${querySection}}\n}\n`;\n}\n\n/**\n * Entry point for generating type declarations from all imported files\n * @param options - the options for the generation\n * @param options.entryPoint - the entry point file\n * @param options.outFile - the output file\n * @param options.querySchemaFile - optional path to query schema file (e.g. config/queries/schema.ts)\n */\nexport async function generateFromEntryPoint(options: {\n outFile: string;\n queryFolder?: string;\n warehouseId: string;\n noCache?: boolean;\n}) {\n const { outFile, queryFolder, warehouseId, noCache } = options;\n\n logger.debug(\"Starting type generation...\");\n\n let queryRegistry: QuerySchema[] = [];\n if (queryFolder)\n queryRegistry = await generateQueriesFromDescribe(\n queryFolder,\n warehouseId,\n {\n noCache,\n },\n );\n\n const typeDeclarations = generateTypeDeclarations(queryRegistry);\n\n await fs.writeFile(outFile, typeDeclarations, \"utf-8\");\n\n logger.debug(\"Type generation complete!\");\n}\n"],"mappings":";;;;;;AAMA,OAAO,QAAQ;AAEf,MAAM,SAAS,aAAa,iBAAiB;;;;;;;AAQ7C,SAAS,yBAAyB,eAA8B,EAAE,EAAU;CAC1E,MAAM,eAAe,aAClB,KAAK,EAAE,MAAM,WAAW;AAKvB,SAAO,OAAO,KAAK,IAJE,KAClB,MAAM,KAAK,CACX,KAAK,MAAM,MAAO,MAAM,IAAI,OAAO,OAAO,OAAQ,CAClD,KAAK,KAAK;GAEb,CACD,KAAK,MAAM;AAId,QAAO;;;;;;6BAFc,eAAe,KAAK,aAAa,SAAS,GAQvB;;;;;;;;;;;AAY1C,eAAsB,uBAAuB,SAK1C;CACD,MAAM,EAAE,SAAS,aAAa,aAAa,YAAY;AAEvD,QAAO,MAAM,8BAA8B;CAE3C,IAAI,gBAA+B,EAAE;AACrC,KAAI,YACF,iBAAgB,MAAM,4BACpB,aACA,aACA,EACE,SACD,CACF;CAEH,MAAM,mBAAmB,yBAAyB,cAAc;AAEhE,OAAM,GAAG,UAAU,SAAS,kBAAkB,QAAQ;AAEtD,QAAO,MAAM,4BAA4B"}