@bubblydoo/uxp-devtools-common 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,7 +3,6 @@ import fs from 'fs/promises';
3
3
  import path from 'path';
4
4
  import AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';
5
5
  import Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';
6
- import DevToolsHelper from '@adobe-fixed-uxp/uxp-devtools-helper';
7
6
  import z from 'zod';
8
7
  import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';
9
8
 
@@ -69,6 +68,7 @@ async function fileExists(path2) {
69
68
  }
70
69
  }
71
70
  async function setupDevtoolsConnection(pluginPath, ports = DEFAULT_PORTS) {
71
+ const { default: DevToolsHelper } = await import('@adobe-fixed-uxp/uxp-devtools-helper');
72
72
  if (!path.isAbsolute(pluginPath)) {
73
73
  throw new Error("pluginPath must be an absolute path");
74
74
  }
@@ -161,7 +161,6 @@ async function setupDevtoolsConnection(pluginPath, ports = DEFAULT_PORTS) {
161
161
  const connection = {
162
162
  url: cdtUrl,
163
163
  teardown: async () => {
164
- console.log("Tearing down devtools URL");
165
164
  try {
166
165
  await callPluginHandler(
167
166
  psClient,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cdp-session.ts","../src/uxp-logger.ts","../src/setup-devtools-url.ts","../src/uxp-cdp-defaults.ts"],"names":["path","psClient"],"mappings":"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","file":"index.js","sourcesContent":["import CDP from 'chrome-remote-interface';\n\nexport async function setupCdpSession(cdtUrl: string) {\n const uuid = crypto.randomUUID();\n\n const cdp = await CDP({\n useHostName: false,\n local: true,\n target: {\n description: 'CDT',\n devtoolsFrontendUrl: null!,\n id: `cdt-${uuid}`,\n title: 'CDT',\n type: 'page',\n url: 'about:blank',\n webSocketDebuggerUrl: cdtUrl,\n },\n });\n\n return cdp;\n}\n\ninterface ExecutionContextDescription {\n id: number;\n origin: string;\n name: string;\n uniqueId: string;\n}\n\nexport async function waitForExecutionContextCreated(cdp: CDP.Client, runAfterListenerAttached?: () => Promise<void>) {\n const executionContextCreatedPromise = new Promise<ExecutionContextDescription>((resolve) => {\n cdp.Runtime.on('executionContextCreated', (event) => {\n resolve(event.context);\n });\n });\n if (runAfterListenerAttached) {\n await runAfterListenerAttached();\n }\n return executionContextCreatedPromise;\n}\n","import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';\n\n/* eslint-disable vars-on-top */\ndeclare global {\n var UxpLogger: Logger;\n}\n\nexport function setGlobalUxpLogger() {\n globalThis.UxpLogger = new Logger();\n}\n","/* eslint-disable no-console */\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';\nimport Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';\nimport DevToolsHelper from '@adobe-fixed-uxp/uxp-devtools-helper';\nimport z from 'zod';\nimport { setGlobalUxpLogger } from './uxp-logger';\n\nError.stackTraceLimit = Infinity;\n\nsetGlobalUxpLogger();\n\nconst DEFAULT_PORTS = [14001, 14002, 14003, 14004, 14005, 14006, 14007, 14008, 14009, 14010];\n\nconst loadReplySchema = z.object({\n command: z.literal('reply'),\n pluginSessionId: z.string(),\n breakOnStart: z.boolean(),\n requestId: z.number(),\n});\n\nconst validateReplySchema = z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n success: z.boolean(),\n});\n\nconst debugReplySchema = z.object({\n command: z.literal('reply'),\n wsdebugUrl: z.string(),\n chromeDevToolsUrl: z.string(),\n});\n\nasync function fileExists(path: string) {\n try {\n await fs.access(path);\n return true;\n }\n catch {\n return false;\n }\n}\n\nexport interface DevtoolsConnection {\n /** Debugger websocket URL */\n url: string;\n /** Unload the plugin and tear down the Vulcan connection */\n teardown: () => Promise<void>;\n}\n\nexport async function setupDevtoolsConnection(pluginPath: string, ports: number[] = DEFAULT_PORTS): Promise<DevtoolsConnection> {\n if (!path.isAbsolute(pluginPath)) {\n throw new Error('pluginPath must be an absolute path');\n }\n const manifestPath = path.join(pluginPath, 'manifest.json');\n if (!await fileExists(manifestPath)) {\n throw new Error('manifest.json not found');\n }\n\n const devtoolsManager = new DevToolsHelper(true);\n const appsList = devtoolsManager.getAppsList();\n\n const isPsOpen = appsList.some(app => app.appId === 'PS');\n if (!isPsOpen) {\n throw new Error('Photoshop is not open');\n }\n\n const PORT = ports[Math.floor(Math.random() * ports.length)]!;\n\n const server = new Server(PORT);\n server.run();\n\n // this goes through Adobe's Vulcan system, which is a binary black box\n devtoolsManager.setServerDetails(PORT);\n\n console.log('port', PORT);\n\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n const psClient = server.clients.values().next().value;\n\n if (!psClient) {\n throw new Error('No PS client found');\n }\n\n if (!(psClient instanceof AppClient)) {\n throw new TypeError('PS client is not an AppClient');\n }\n\n // const discoverReplySchema = z.object({\n // command: z.literal('reply'),\n // pluginSessionId: z.string(),\n // breakOnStart: z.boolean(),\n // requestId: z.number(),\n // });\n\n /**\n * Helper to promisify handler_Plugin calls with error handling and schema validation\n */\n function callPluginHandler<T extends z.ZodTypeAny>(\n psClient: AppClient,\n message: Parameters<AppClient['handler_Plugin']>[0],\n schema: T,\n ): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n psClient.handler_Plugin(message, (error: Error | null, response: any) => {\n if (response?.error) {\n reject(new Error(response.error));\n return;\n }\n if (error) {\n reject(error);\n return;\n }\n console.log('response for', message.action, response);\n resolve(schema.parse(response));\n });\n });\n }\n\n const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n const pluginId = manifest.id;\n\n const validateResult = await callPluginHandler(\n psClient,\n {\n action: 'validate',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n manifest,\n },\n validateReplySchema,\n );\n\n if (!validateResult.success) {\n throw new Error('Validation failed');\n }\n\n const { pluginSessionId } = await callPluginHandler(\n psClient,\n {\n action: 'load',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n breakOnStart: false,\n },\n loadReplySchema,\n );\n\n const result = await callPluginHandler(\n psClient,\n {\n action: 'debug',\n command: 'Plugin',\n pluginSessionId,\n },\n debugReplySchema,\n );\n\n const cdtUrl = result.wsdebugUrl.replace('ws=', 'ws://');\n\n const connection: DevtoolsConnection = {\n url: cdtUrl,\n teardown: async () => {\n console.log('Tearing down devtools URL');\n // Unload the plugin from Photoshop\n try {\n await callPluginHandler(\n psClient,\n {\n action: 'unload',\n command: 'Plugin',\n pluginSessionId,\n },\n z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n }),\n );\n console.log('Plugin unloaded');\n }\n catch (error) {\n console.error('Error unloading plugin:', error);\n }\n\n try {\n await server.close();\n }\n catch (error) {\n console.error('Error closing server:', error);\n }\n\n // Terminate the DevToolsHelper (Adobe Vulcan native library)\n // This is crucial to prevent hanging handles\n try {\n devtoolsManager.terminate();\n console.log('DevToolsHelper terminated');\n }\n catch (error) {\n console.error('Error terminating DevToolsHelper:', error);\n }\n },\n };\n\n return connection;\n}\n","import type CDP from 'chrome-remote-interface';\n\nexport async function setupCdpSessionWithUxpDefaults(cdp: CDP.Client) {\n // these were all copied from wireshark\n console.log('Setting up CDP defaults');\n await cdp.Network.enable();\n await cdp.Page.enable();\n await cdp.Page.getResourceTree();\n await cdp.Runtime.enable();\n await cdp.DOM.enable();\n await cdp.CSS.enable();\n await cdp.Debugger.enable({ maxScriptsCacheSize: 10000000 });\n await cdp.Debugger.setPauseOnExceptions({ state: 'none' });\n await cdp.Debugger.setAsyncCallStackDepth({ maxDepth: 32 });\n await cdp.Overlay.enable();\n await cdp.Overlay.setShowViewportSizeOnResize({ show: true });\n await cdp.Profiler.enable();\n await cdp.Log.enable();\n await cdp.Target.setAutoAttach({\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n });\n await cdp.Debugger.setBlackboxPatterns({ patterns: [] });\n await cdp.Runtime.runIfWaitingForDebugger();\n}\n"]}
1
+ {"version":3,"sources":["../src/cdp-session.ts","../src/uxp-logger.ts","../src/setup-devtools-url.ts","../src/uxp-cdp-defaults.ts"],"names":["path","psClient"],"mappings":"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","file":"index.js","sourcesContent":["import CDP from 'chrome-remote-interface';\n\nexport async function setupCdpSession(cdtUrl: string) {\n const uuid = crypto.randomUUID();\n\n const cdp = await CDP({\n useHostName: false,\n local: true,\n target: {\n description: 'CDT',\n devtoolsFrontendUrl: null!,\n id: `cdt-${uuid}`,\n title: 'CDT',\n type: 'page',\n url: 'about:blank',\n webSocketDebuggerUrl: cdtUrl,\n },\n });\n\n return cdp;\n}\n\ninterface ExecutionContextDescription {\n id: number;\n origin: string;\n name: string;\n uniqueId: string;\n}\n\nexport async function waitForExecutionContextCreated(cdp: CDP.Client, runAfterListenerAttached?: () => Promise<void>) {\n const executionContextCreatedPromise = new Promise<ExecutionContextDescription>((resolve) => {\n cdp.Runtime.on('executionContextCreated', (event) => {\n resolve(event.context);\n });\n });\n if (runAfterListenerAttached) {\n await runAfterListenerAttached();\n }\n return executionContextCreatedPromise;\n}\n","import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';\n\n/* eslint-disable vars-on-top */\ndeclare global {\n var UxpLogger: Logger;\n}\n\nexport function setGlobalUxpLogger() {\n globalThis.UxpLogger = new Logger();\n}\n","/* eslint-disable no-console */\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';\nimport Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';\nimport z from 'zod';\nimport { setGlobalUxpLogger } from './uxp-logger';\n\nError.stackTraceLimit = Infinity;\n\nsetGlobalUxpLogger();\n\nconst DEFAULT_PORTS = [14001, 14002, 14003, 14004, 14005, 14006, 14007, 14008, 14009, 14010];\n\nconst loadReplySchema = z.object({\n command: z.literal('reply'),\n pluginSessionId: z.string(),\n breakOnStart: z.boolean(),\n requestId: z.number(),\n});\n\nconst validateReplySchema = z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n success: z.boolean(),\n});\n\nconst debugReplySchema = z.object({\n command: z.literal('reply'),\n wsdebugUrl: z.string(),\n chromeDevToolsUrl: z.string(),\n});\n\nasync function fileExists(path: string) {\n try {\n await fs.access(path);\n return true;\n }\n catch {\n return false;\n }\n}\n\nexport interface DevtoolsConnection {\n /** Debugger websocket URL */\n url: string;\n /** Unload the plugin and tear down the Vulcan connection */\n teardown: () => Promise<void>;\n}\n\nexport async function setupDevtoolsConnection(pluginPath: string, ports: number[] = DEFAULT_PORTS): Promise<DevtoolsConnection> {\n const { default: DevToolsHelper } = await import('@adobe-fixed-uxp/uxp-devtools-helper');\n\n if (!path.isAbsolute(pluginPath)) {\n throw new Error('pluginPath must be an absolute path');\n }\n const manifestPath = path.join(pluginPath, 'manifest.json');\n if (!await fileExists(manifestPath)) {\n throw new Error('manifest.json not found');\n }\n\n const devtoolsManager = new DevToolsHelper(true);\n const appsList = devtoolsManager.getAppsList();\n\n const isPsOpen = appsList.some(app => app.appId === 'PS');\n if (!isPsOpen) {\n throw new Error('Photoshop is not open');\n }\n\n const PORT = ports[Math.floor(Math.random() * ports.length)]!;\n\n const server = new Server(PORT);\n server.run();\n\n // this goes through Adobe's Vulcan system, which is a binary black box\n devtoolsManager.setServerDetails(PORT);\n\n console.log('port', PORT);\n\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n const psClient = server.clients.values().next().value;\n\n if (!psClient) {\n throw new Error('No PS client found');\n }\n\n if (!(psClient instanceof AppClient)) {\n throw new TypeError('PS client is not an AppClient');\n }\n\n // const discoverReplySchema = z.object({\n // command: z.literal('reply'),\n // pluginSessionId: z.string(),\n // breakOnStart: z.boolean(),\n // requestId: z.number(),\n // });\n\n /**\n * Helper to promisify handler_Plugin calls with error handling and schema validation\n */\n function callPluginHandler<T extends z.ZodTypeAny>(\n psClient: AppClient,\n message: Parameters<AppClient['handler_Plugin']>[0],\n schema: T,\n ): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n psClient.handler_Plugin(message, (error: Error | null, response: any) => {\n if (response?.error) {\n reject(new Error(response.error));\n return;\n }\n if (error) {\n reject(error);\n return;\n }\n console.log('response for', message.action, response);\n resolve(schema.parse(response));\n });\n });\n }\n\n const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n const pluginId = manifest.id;\n\n const validateResult = await callPluginHandler(\n psClient,\n {\n action: 'validate',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n manifest,\n },\n validateReplySchema,\n );\n\n if (!validateResult.success) {\n throw new Error('Validation failed');\n }\n\n const { pluginSessionId } = await callPluginHandler(\n psClient,\n {\n action: 'load',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n breakOnStart: false,\n },\n loadReplySchema,\n );\n\n const result = await callPluginHandler(\n psClient,\n {\n action: 'debug',\n command: 'Plugin',\n pluginSessionId,\n },\n debugReplySchema,\n );\n\n const cdtUrl = result.wsdebugUrl.replace('ws=', 'ws://');\n\n const connection: DevtoolsConnection = {\n url: cdtUrl,\n teardown: async () => {\n // Unload the plugin from Photoshop\n try {\n await callPluginHandler(\n psClient,\n {\n action: 'unload',\n command: 'Plugin',\n pluginSessionId,\n },\n z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n }),\n );\n console.log('Plugin unloaded');\n }\n catch (error) {\n console.error('Error unloading plugin:', error);\n }\n\n try {\n await server.close();\n }\n catch (error) {\n console.error('Error closing server:', error);\n }\n\n // Terminate the DevToolsHelper (Adobe Vulcan native library)\n // This is crucial to prevent hanging handles\n try {\n devtoolsManager.terminate();\n console.log('DevToolsHelper terminated');\n }\n catch (error) {\n console.error('Error terminating DevToolsHelper:', error);\n }\n },\n };\n\n return connection;\n}\n","import type CDP from 'chrome-remote-interface';\n\nexport async function setupCdpSessionWithUxpDefaults(cdp: CDP.Client) {\n // these were all copied from wireshark\n console.log('Setting up CDP defaults');\n await cdp.Network.enable();\n await cdp.Page.enable();\n await cdp.Page.getResourceTree();\n await cdp.Runtime.enable();\n await cdp.DOM.enable();\n await cdp.CSS.enable();\n await cdp.Debugger.enable({ maxScriptsCacheSize: 10000000 });\n await cdp.Debugger.setPauseOnExceptions({ state: 'none' });\n await cdp.Debugger.setAsyncCallStackDepth({ maxDepth: 32 });\n await cdp.Overlay.enable();\n await cdp.Overlay.setShowViewportSizeOnResize({ show: true });\n await cdp.Profiler.enable();\n await cdp.Log.enable();\n await cdp.Target.setAutoAttach({\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n });\n await cdp.Debugger.setBlackboxPatterns({ patterns: [] });\n await cdp.Runtime.runIfWaitingForDebugger();\n}\n"]}
@@ -2,7 +2,6 @@ import fs from 'fs/promises';
2
2
  import path from 'path';
3
3
  import AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';
4
4
  import Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';
5
- import DevToolsHelper from '@adobe-fixed-uxp/uxp-devtools-helper';
6
5
  import z from 'zod';
7
6
  import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';
8
7
 
@@ -40,6 +39,7 @@ async function fileExists(path2) {
40
39
  }
41
40
  }
42
41
  async function setupDevtoolsConnection(pluginPath, ports = DEFAULT_PORTS) {
42
+ const { default: DevToolsHelper } = await import('@adobe-fixed-uxp/uxp-devtools-helper');
43
43
  if (!path.isAbsolute(pluginPath)) {
44
44
  throw new Error("pluginPath must be an absolute path");
45
45
  }
@@ -132,7 +132,6 @@ async function setupDevtoolsConnection(pluginPath, ports = DEFAULT_PORTS) {
132
132
  const connection = {
133
133
  url: cdtUrl,
134
134
  teardown: async () => {
135
- console.log("Tearing down devtools URL");
136
135
  try {
137
136
  await callPluginHandler(
138
137
  psClient,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/uxp-logger.ts","../src/setup-devtools-url.ts"],"names":["path","psClient"],"mappings":"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","file":"setup-devtools-url.js","sourcesContent":["import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';\n\n/* eslint-disable vars-on-top */\ndeclare global {\n var UxpLogger: Logger;\n}\n\nexport function setGlobalUxpLogger() {\n globalThis.UxpLogger = new Logger();\n}\n","/* eslint-disable no-console */\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';\nimport Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';\nimport DevToolsHelper from '@adobe-fixed-uxp/uxp-devtools-helper';\nimport z from 'zod';\nimport { setGlobalUxpLogger } from './uxp-logger';\n\nError.stackTraceLimit = Infinity;\n\nsetGlobalUxpLogger();\n\nconst DEFAULT_PORTS = [14001, 14002, 14003, 14004, 14005, 14006, 14007, 14008, 14009, 14010];\n\nconst loadReplySchema = z.object({\n command: z.literal('reply'),\n pluginSessionId: z.string(),\n breakOnStart: z.boolean(),\n requestId: z.number(),\n});\n\nconst validateReplySchema = z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n success: z.boolean(),\n});\n\nconst debugReplySchema = z.object({\n command: z.literal('reply'),\n wsdebugUrl: z.string(),\n chromeDevToolsUrl: z.string(),\n});\n\nasync function fileExists(path: string) {\n try {\n await fs.access(path);\n return true;\n }\n catch {\n return false;\n }\n}\n\nexport interface DevtoolsConnection {\n /** Debugger websocket URL */\n url: string;\n /** Unload the plugin and tear down the Vulcan connection */\n teardown: () => Promise<void>;\n}\n\nexport async function setupDevtoolsConnection(pluginPath: string, ports: number[] = DEFAULT_PORTS): Promise<DevtoolsConnection> {\n if (!path.isAbsolute(pluginPath)) {\n throw new Error('pluginPath must be an absolute path');\n }\n const manifestPath = path.join(pluginPath, 'manifest.json');\n if (!await fileExists(manifestPath)) {\n throw new Error('manifest.json not found');\n }\n\n const devtoolsManager = new DevToolsHelper(true);\n const appsList = devtoolsManager.getAppsList();\n\n const isPsOpen = appsList.some(app => app.appId === 'PS');\n if (!isPsOpen) {\n throw new Error('Photoshop is not open');\n }\n\n const PORT = ports[Math.floor(Math.random() * ports.length)]!;\n\n const server = new Server(PORT);\n server.run();\n\n // this goes through Adobe's Vulcan system, which is a binary black box\n devtoolsManager.setServerDetails(PORT);\n\n console.log('port', PORT);\n\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n const psClient = server.clients.values().next().value;\n\n if (!psClient) {\n throw new Error('No PS client found');\n }\n\n if (!(psClient instanceof AppClient)) {\n throw new TypeError('PS client is not an AppClient');\n }\n\n // const discoverReplySchema = z.object({\n // command: z.literal('reply'),\n // pluginSessionId: z.string(),\n // breakOnStart: z.boolean(),\n // requestId: z.number(),\n // });\n\n /**\n * Helper to promisify handler_Plugin calls with error handling and schema validation\n */\n function callPluginHandler<T extends z.ZodTypeAny>(\n psClient: AppClient,\n message: Parameters<AppClient['handler_Plugin']>[0],\n schema: T,\n ): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n psClient.handler_Plugin(message, (error: Error | null, response: any) => {\n if (response?.error) {\n reject(new Error(response.error));\n return;\n }\n if (error) {\n reject(error);\n return;\n }\n console.log('response for', message.action, response);\n resolve(schema.parse(response));\n });\n });\n }\n\n const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n const pluginId = manifest.id;\n\n const validateResult = await callPluginHandler(\n psClient,\n {\n action: 'validate',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n manifest,\n },\n validateReplySchema,\n );\n\n if (!validateResult.success) {\n throw new Error('Validation failed');\n }\n\n const { pluginSessionId } = await callPluginHandler(\n psClient,\n {\n action: 'load',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n breakOnStart: false,\n },\n loadReplySchema,\n );\n\n const result = await callPluginHandler(\n psClient,\n {\n action: 'debug',\n command: 'Plugin',\n pluginSessionId,\n },\n debugReplySchema,\n );\n\n const cdtUrl = result.wsdebugUrl.replace('ws=', 'ws://');\n\n const connection: DevtoolsConnection = {\n url: cdtUrl,\n teardown: async () => {\n console.log('Tearing down devtools URL');\n // Unload the plugin from Photoshop\n try {\n await callPluginHandler(\n psClient,\n {\n action: 'unload',\n command: 'Plugin',\n pluginSessionId,\n },\n z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n }),\n );\n console.log('Plugin unloaded');\n }\n catch (error) {\n console.error('Error unloading plugin:', error);\n }\n\n try {\n await server.close();\n }\n catch (error) {\n console.error('Error closing server:', error);\n }\n\n // Terminate the DevToolsHelper (Adobe Vulcan native library)\n // This is crucial to prevent hanging handles\n try {\n devtoolsManager.terminate();\n console.log('DevToolsHelper terminated');\n }\n catch (error) {\n console.error('Error terminating DevToolsHelper:', error);\n }\n },\n };\n\n return connection;\n}\n"]}
1
+ {"version":3,"sources":["../src/uxp-logger.ts","../src/setup-devtools-url.ts"],"names":["path","psClient"],"mappings":"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","file":"setup-devtools-url.js","sourcesContent":["import { Logger } from '@adobe-fixed-uxp/uxp-devtools-core/core/common/Logger';\n\n/* eslint-disable vars-on-top */\ndeclare global {\n var UxpLogger: Logger;\n}\n\nexport function setGlobalUxpLogger() {\n globalThis.UxpLogger = new Logger();\n}\n","/* eslint-disable no-console */\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport AppClient from '@adobe-fixed-uxp/uxp-devtools-core/core/service/clients/AppClient';\nimport Server from '@adobe-fixed-uxp/uxp-devtools-core/core/service/Server';\nimport z from 'zod';\nimport { setGlobalUxpLogger } from './uxp-logger';\n\nError.stackTraceLimit = Infinity;\n\nsetGlobalUxpLogger();\n\nconst DEFAULT_PORTS = [14001, 14002, 14003, 14004, 14005, 14006, 14007, 14008, 14009, 14010];\n\nconst loadReplySchema = z.object({\n command: z.literal('reply'),\n pluginSessionId: z.string(),\n breakOnStart: z.boolean(),\n requestId: z.number(),\n});\n\nconst validateReplySchema = z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n success: z.boolean(),\n});\n\nconst debugReplySchema = z.object({\n command: z.literal('reply'),\n wsdebugUrl: z.string(),\n chromeDevToolsUrl: z.string(),\n});\n\nasync function fileExists(path: string) {\n try {\n await fs.access(path);\n return true;\n }\n catch {\n return false;\n }\n}\n\nexport interface DevtoolsConnection {\n /** Debugger websocket URL */\n url: string;\n /** Unload the plugin and tear down the Vulcan connection */\n teardown: () => Promise<void>;\n}\n\nexport async function setupDevtoolsConnection(pluginPath: string, ports: number[] = DEFAULT_PORTS): Promise<DevtoolsConnection> {\n const { default: DevToolsHelper } = await import('@adobe-fixed-uxp/uxp-devtools-helper');\n\n if (!path.isAbsolute(pluginPath)) {\n throw new Error('pluginPath must be an absolute path');\n }\n const manifestPath = path.join(pluginPath, 'manifest.json');\n if (!await fileExists(manifestPath)) {\n throw new Error('manifest.json not found');\n }\n\n const devtoolsManager = new DevToolsHelper(true);\n const appsList = devtoolsManager.getAppsList();\n\n const isPsOpen = appsList.some(app => app.appId === 'PS');\n if (!isPsOpen) {\n throw new Error('Photoshop is not open');\n }\n\n const PORT = ports[Math.floor(Math.random() * ports.length)]!;\n\n const server = new Server(PORT);\n server.run();\n\n // this goes through Adobe's Vulcan system, which is a binary black box\n devtoolsManager.setServerDetails(PORT);\n\n console.log('port', PORT);\n\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n const psClient = server.clients.values().next().value;\n\n if (!psClient) {\n throw new Error('No PS client found');\n }\n\n if (!(psClient instanceof AppClient)) {\n throw new TypeError('PS client is not an AppClient');\n }\n\n // const discoverReplySchema = z.object({\n // command: z.literal('reply'),\n // pluginSessionId: z.string(),\n // breakOnStart: z.boolean(),\n // requestId: z.number(),\n // });\n\n /**\n * Helper to promisify handler_Plugin calls with error handling and schema validation\n */\n function callPluginHandler<T extends z.ZodTypeAny>(\n psClient: AppClient,\n message: Parameters<AppClient['handler_Plugin']>[0],\n schema: T,\n ): Promise<z.infer<T>> {\n return new Promise((resolve, reject) => {\n psClient.handler_Plugin(message, (error: Error | null, response: any) => {\n if (response?.error) {\n reject(new Error(response.error));\n return;\n }\n if (error) {\n reject(error);\n return;\n }\n console.log('response for', message.action, response);\n resolve(schema.parse(response));\n });\n });\n }\n\n const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n const pluginId = manifest.id;\n\n const validateResult = await callPluginHandler(\n psClient,\n {\n action: 'validate',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n manifest,\n },\n validateReplySchema,\n );\n\n if (!validateResult.success) {\n throw new Error('Validation failed');\n }\n\n const { pluginSessionId } = await callPluginHandler(\n psClient,\n {\n action: 'load',\n command: 'Plugin',\n params: {\n provider: {\n type: 'disk',\n id: pluginId,\n path: pluginPath,\n },\n },\n breakOnStart: false,\n },\n loadReplySchema,\n );\n\n const result = await callPluginHandler(\n psClient,\n {\n action: 'debug',\n command: 'Plugin',\n pluginSessionId,\n },\n debugReplySchema,\n );\n\n const cdtUrl = result.wsdebugUrl.replace('ws=', 'ws://');\n\n const connection: DevtoolsConnection = {\n url: cdtUrl,\n teardown: async () => {\n // Unload the plugin from Photoshop\n try {\n await callPluginHandler(\n psClient,\n {\n action: 'unload',\n command: 'Plugin',\n pluginSessionId,\n },\n z.object({\n command: z.literal('reply'),\n requestId: z.number(),\n }),\n );\n console.log('Plugin unloaded');\n }\n catch (error) {\n console.error('Error unloading plugin:', error);\n }\n\n try {\n await server.close();\n }\n catch (error) {\n console.error('Error closing server:', error);\n }\n\n // Terminate the DevToolsHelper (Adobe Vulcan native library)\n // This is crucial to prevent hanging handles\n try {\n devtoolsManager.terminate();\n console.log('DevToolsHelper terminated');\n }\n catch (error) {\n console.error('Error terminating DevToolsHelper:', error);\n }\n },\n };\n\n return connection;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bubblydoo/uxp-devtools-common",
3
3
  "type": "module",
4
- "version": "0.0.3",
4
+ "version": "0.0.4",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",