@ms-cloudpack/api-server 0.6.5 → 0.6.7
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/lib/startApiServer.js +1 -1
- package/lib/startApiServer.js.map +1 -1
- package/lib/{utilities → task-scheduler}/TaskScheduler.d.ts +3 -1
- package/lib/task-scheduler/TaskScheduler.d.ts.map +1 -0
- package/lib/task-scheduler/TaskScheduler.js +49 -0
- package/lib/task-scheduler/TaskScheduler.js.map +1 -0
- package/lib/task-scheduler/createBundleTarget.d.ts +4 -0
- package/lib/task-scheduler/createBundleTarget.d.ts.map +1 -0
- package/lib/task-scheduler/createBundleTarget.js +19 -0
- package/lib/task-scheduler/createBundleTarget.js.map +1 -0
- package/lib/task-scheduler/createSimpleScheduler.d.ts +7 -0
- package/lib/task-scheduler/createSimpleScheduler.d.ts.map +1 -0
- package/lib/task-scheduler/createSimpleScheduler.js +37 -0
- package/lib/task-scheduler/createSimpleScheduler.js.map +1 -0
- package/lib/task-scheduler/createTaskSchedulerReporter.d.ts +4 -0
- package/lib/task-scheduler/createTaskSchedulerReporter.d.ts.map +1 -0
- package/lib/task-scheduler/createTaskSchedulerReporter.js +59 -0
- package/lib/task-scheduler/createTaskSchedulerReporter.js.map +1 -0
- package/package.json +1 -1
- package/lib/utilities/TaskScheduler.d.ts.map +0 -1
- package/lib/utilities/TaskScheduler.js +0 -148
- package/lib/utilities/TaskScheduler.js.map +0 -1
package/lib/startApiServer.js
CHANGED
|
@@ -299,7 +299,7 @@ export async function startApiServer({ session, rootSpan, reporter, }) {
|
|
|
299
299
|
};
|
|
300
300
|
let scheduler;
|
|
301
301
|
if (session.config.features?.enableLage) {
|
|
302
|
-
const { TaskScheduler } = await import('./
|
|
302
|
+
const { TaskScheduler } = await import('./task-scheduler/TaskScheduler.js');
|
|
303
303
|
scheduler = new TaskScheduler({ reporter, root: session.appPath });
|
|
304
304
|
}
|
|
305
305
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startApiServer.js","sourceRoot":"","sources":["../src/startApiServer.ts"],"names":[],"mappings":"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","sourcesContent":["import os from 'os';\nimport getPort from 'get-port';\nimport path from 'path';\nimport http from 'http';\nimport https from 'https';\nimport WebSocket, { WebSocketServer } from 'ws';\nimport { createDataBus } from '@ms-cloudpack/data-bus';\nimport { execSync } from 'child_process';\nimport { TaskRunner } from './utilities/TaskRunner.js';\nimport { getCachePath } from './utilities/getCachePath.js';\nimport fsExtra from 'fs-extra';\nimport { startWatcher } from './utilities/startWatcher.js';\nimport type { TaskDescription } from './types/TaskDescription.js';\nimport type { TaskEndDescription } from './types/TaskEndDescription.js';\nimport type { TaskStartDescription } from './types/TaskStartDescription.js';\nimport type { ApiServer } from './types/ApiServer.js';\nimport type { SessionStats } from './types/SessionStats.js';\nimport type { Session } from './types/Session.js';\nimport { PackageDefinitions } from '@ms-cloudpack/package-utilities';\nimport { createPackageOverrideTransform } from './utilities/createPackageOverrideTransform.js';\nimport { readConfigSync } from '@ms-cloudpack/config';\nimport { addOverride } from './utilities/addOverride.js';\nimport { validateOverride } from './utilities/validateOverride.js';\nimport { parseHttpsConfig } from '@ms-cloudpack/create-express-app';\nimport type { Span } from '@ms-cloudpack/telemetry';\nimport { editCloudpackConfig } from './utilities/editCloudpackConfig.js';\nimport type { TaskScheduler } from './utilities/TaskScheduler.js';\nimport type { TaskReporter } from '@ms-cloudpack/task-reporter';\n\n/**\n * The api server handles the data pub/sub (for things like reporting build status)\n * and hosting the dashboard verb backend (for executing actions like loading vscode,\n * changing dependencies, connecting new projects to the running session, etc.)\n *\n * Each time `cloudpack start` is run, an api server will start up for that session. The\n * hosted web page will have a \"cloudpack-api-server\" header which points\n * to the websocket server.\n *\n * The bundle server will call the api server to publish build status updates.\n *\n * The app server will burn the api server url on the host html, so that client-side\n * javascript can connect and subscribe to page changes.\n */\nexport async function startApiServer({\n session,\n rootSpan,\n reporter,\n}: {\n session: Session;\n rootSpan: Span | undefined;\n reporter: TaskReporter;\n}): Promise<ApiServer> {\n const host = session.config?.devServer?.domain || 'localhost';\n const port = await getPort({ port: [9890, 9891, 9892, 9893] });\n const bus = createDataBus();\n const sessionStats: SessionStats = {\n status: 'idle',\n\n remainingTasks: 0,\n totalTasks: 0,\n\n totalErrors: 0,\n totalWarnings: 0,\n };\n\n const allTasks: Map<string, TaskDescription> = new Map();\n const taskRunner = new TaskRunner();\n\n function reportStart(taskStart: TaskStartDescription): void {\n const previousResult = allTasks.get(taskStart.id);\n const now = new Date().getTime();\n\n if (!previousResult) {\n sessionStats.totalTasks++;\n }\n\n if (previousResult?.status === 'complete') {\n sessionStats.totalErrors -= previousResult.errors?.length || 0;\n sessionStats.totalWarnings -= previousResult.warnings?.length || 0;\n }\n\n sessionStats.remainingTasks++;\n sessionStats.status = 'pending';\n\n allTasks.set(taskStart.id, {\n ...taskStart,\n status: 'pending',\n startTime: now,\n });\n\n bus.publish([session.id, 'status'], sessionStats);\n bus.publish([session.id, 'status-details'], { tasks: Array.from(allTasks.values()) });\n }\n\n function reportEnd(taskEnd: TaskEndDescription): void {\n const previousResult = allTasks.get(taskEnd.id);\n const now = new Date().getTime();\n\n if (previousResult) {\n sessionStats.remainingTasks--;\n sessionStats.totalErrors += taskEnd.errors?.length || 0;\n sessionStats.totalWarnings += taskEnd.warnings?.length || 0;\n\n allTasks.set(taskEnd.id, {\n ...previousResult,\n ...taskEnd,\n status: 'complete',\n durationMilliseconds: now - previousResult.startTime,\n lastUpdated: now,\n });\n\n if (sessionStats.remainingTasks === 0) {\n sessionStats.status = 'idle';\n }\n\n bus.publish([session.id, 'status'], sessionStats);\n bus.publish([session.id, 'status-details'], { tasks: Array.from(allTasks.values()) });\n }\n }\n\n bus.publish([session.id, 'status'], sessionStats);\n\n const addTask: ApiServer['addTask'] = (task, options) => {\n if (task.watch) {\n options = options || {};\n options.watch = () => {\n watcher.watch(task, { onSuccess: notifyReload });\n };\n }\n\n return taskRunner.add(\n {\n ...task,\n execute: async () => {\n reportStart({\n ...task.getStartDescription?.(),\n id: task.id,\n });\n\n let taskResult;\n\n try {\n taskResult = await task.execute();\n } catch (err) {\n // no-op\n }\n\n reportEnd({\n ...task.getEndDescription?.(taskResult),\n id: task.id,\n } as TaskEndDescription);\n\n return taskResult;\n },\n },\n options,\n );\n };\n\n const watcher = startWatcher(addTask);\n\n // Create a node http(s) server.\n let server: http.Server | https.Server;\n const httpsConfig = session.config?.devServer?.https;\n const protocol = httpsConfig ? 'wss' : 'ws';\n\n if (httpsConfig) {\n const { key, cert, passphrase } = parseHttpsConfig(httpsConfig);\n\n if (!key || !cert) {\n console.error('Invalid https config in cloudpack.config.js. Make sure key and cert are valid.');\n\n throw new Error('Invalid https config.');\n }\n\n server = https\n .createServer(\n {\n key,\n cert,\n passphrase,\n },\n () => {\n /* no-op */\n },\n )\n .listen(port, host);\n } else {\n server = http.createServer().listen(port, host);\n }\n\n // Create a websocket server which listens for subscriptions and verb requests,\n // and broadcasts the data to all connected clients.\n const socketServer = new WebSocketServer({ server }, () => {\n // console.log(`ApiServer: Started on port ${port}`);\n }).on('connection', (socket: WebSocket) => {\n const disposables = new Map<number, () => void>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function sendMessage(message: any) {\n socket.send(JSON.stringify(message, null, 2));\n }\n\n socket.send(\n JSON.stringify({\n type: 'sequence',\n sequence: session.sequence,\n }),\n );\n\n socket\n .on('message', (rawData) => {\n try {\n const request = JSON.parse(rawData.toString()) as {\n type: string;\n requestId?: string;\n data: Record<string, unknown>;\n };\n\n switch (request.type) {\n /**\n * Subscribe to a data subscription.\n */\n case 'subscribe': {\n const { path: subscriptionPath, id } = request.data;\n\n disposables.set(\n id as number,\n bus.subscribe(\n subscriptionPath as string[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n (data: any) => sendMessage({ type: 'notify', id, path: subscriptionPath, data }),\n ),\n );\n\n break;\n }\n\n /**\n * Unsubscribe from a data subscription.\n */\n case 'unsubscribe': {\n const id = request.data.id as number | undefined;\n if (id) {\n const dispose = disposables.get(id);\n\n if (dispose) {\n dispose();\n disposables.delete(id);\n }\n }\n\n break;\n }\n\n /**\n * Open a file in VSCode.\n */\n case 'openSource': {\n const { rootPath, relativePath = '', line, column } = request.data;\n const fullPath = path.join(rootPath as string, relativePath as string);\n\n console.log(`Opening VSCode with path: ${fullPath}`);\n execSync(`code --goto ${fullPath}:${line}:${column}`, { cwd: process.cwd() });\n break;\n }\n\n /**\n * Open a file or folder in the OS's default file manager.\n */\n case 'open': {\n const { rootPath, relativePath = '' } = request.data;\n const fullPath = path.join(rootPath as string, relativePath as string);\n\n console.log(`Opening path: ${fullPath}`);\n const openCommand = os.platform() == 'win32' ? 'start' : 'open';\n\n execSync(`${openCommand} ${fullPath}`, { cwd: process.cwd() });\n break;\n }\n\n /**\n * Opens the cloudpack config in VSCode for the user to manually edit. If the file doesn't exist,\n * it will be created.\n */\n case 'editConfig': {\n editCloudpackConfig().catch(() => {\n /* no-op */\n });\n break;\n }\n\n /**\n * Adds an override to the cloudpack config.\n */\n case 'addOverride': {\n // TODO: Send filename from request data to findResolveMapEntry when chromium Issue 1371551 is fixed.\n const { packageName, importPath } = request.data as Record<string, string>;\n (async () => {\n await addOverride({ session, packageName, importPath });\n session.incrementSessionVersion();\n notifyReload();\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'validateOverride': {\n // TODO: Get filename from request data when chromium Issue 1371551 is fixed.\n const { requestId, data } = request as { requestId: string; data: Record<string, string> };\n const { packageName, importPath } = data;\n (async () => {\n const fixable = await validateOverride({ session, packageName, importPath });\n sendMessage({ type: 'validateOverride', requestId, data: { fixable } });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'restartAllTasks': {\n console.log('ApiServer: Restarting all tasks');\n\n // Clear entire local cache.\n fsExtra.emptyDirSync(getCachePath());\n\n // All tasks can be removed as notifyReload()\n // will cause the client to add the tasks again.\n allTasks.forEach((_, id) => {\n taskRunner.remove(id);\n });\n\n // Parse config if it exists.\n const cloudpackConfig = readConfigSync();\n\n // Initialize package overrides.\n PackageDefinitions.getInstance().registerTransform(createPackageOverrideTransform(cloudpackConfig));\n\n // Update session version.\n session.incrementSessionVersion();\n\n notifyReload();\n break;\n }\n\n case 'restartTask': {\n const { id, inputPath } = request.data as Record<string, string>;\n console.log(`ApiServer: Restarting task ${id}`);\n taskRunner.remove(id);\n session.incrementTargetVersion(inputPath);\n notifyReload();\n break;\n }\n\n case 'reportMetric': {\n const { metric, value } = request.data as { metric: string; value: number };\n console.debug(`ApiServer: Received metric: ${metric}, value: ${value}`);\n rootSpan?.addEvent(metric, value);\n break;\n }\n }\n } catch (err) {\n console.error('ApiServer: error handling message');\n console.error('Error:', err);\n console.error('Message:', rawData.toString());\n }\n })\n .on('close', () => {\n for (const d of disposables.values()) {\n d();\n }\n });\n });\n\n const notifyReload = () => {\n session.sequence++;\n socketServer.clients.forEach((socket: WebSocket) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(\n JSON.stringify({\n type: 'reload',\n data: { sessionId: session.id },\n }),\n );\n }\n });\n };\n\n let scheduler: TaskScheduler | undefined;\n\n if (session.config.features?.enableLage) {\n const { TaskScheduler } = await import('./utilities/TaskScheduler.js');\n\n scheduler = new TaskScheduler({ reporter, root: session.appPath });\n }\n\n return {\n url: `${protocol}://${host}:${port}`,\n port,\n\n notifyReload,\n\n addTask: (task, options) => {\n return addTask(task, options);\n },\n\n scheduleTask: async (bundleRequest, scripts, options) => {\n if (!scheduler) {\n throw new Error('Cannot schedule task when not using lage');\n }\n\n reportStart({\n id: bundleRequest.id,\n inputPath: bundleRequest.packagePath,\n outputPath: bundleRequest.outputPath,\n name: bundleRequest.packageName,\n });\n\n await scheduler.scheduleTask(bundleRequest, scripts, options);\n\n reportEnd({\n id: bundleRequest.id,\n });\n },\n\n close: () =>\n new Promise<void>((resolve, reject) => {\n socketServer.clients.forEach((socket: WebSocket) => socket.terminate());\n socketServer.close((err) => (err ? reject(err) : resolve()));\n server.close();\n }),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"startApiServer.js","sourceRoot":"","sources":["../src/startApiServer.ts"],"names":[],"mappings":"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","sourcesContent":["import os from 'os';\nimport getPort from 'get-port';\nimport path from 'path';\nimport http from 'http';\nimport https from 'https';\nimport WebSocket, { WebSocketServer } from 'ws';\nimport { createDataBus } from '@ms-cloudpack/data-bus';\nimport { execSync } from 'child_process';\nimport { TaskRunner } from './utilities/TaskRunner.js';\nimport { getCachePath } from './utilities/getCachePath.js';\nimport fsExtra from 'fs-extra';\nimport { startWatcher } from './utilities/startWatcher.js';\nimport type { TaskDescription } from './types/TaskDescription.js';\nimport type { TaskEndDescription } from './types/TaskEndDescription.js';\nimport type { TaskStartDescription } from './types/TaskStartDescription.js';\nimport type { ApiServer } from './types/ApiServer.js';\nimport type { SessionStats } from './types/SessionStats.js';\nimport type { Session } from './types/Session.js';\nimport { PackageDefinitions } from '@ms-cloudpack/package-utilities';\nimport { createPackageOverrideTransform } from './utilities/createPackageOverrideTransform.js';\nimport { readConfigSync } from '@ms-cloudpack/config';\nimport { addOverride } from './utilities/addOverride.js';\nimport { validateOverride } from './utilities/validateOverride.js';\nimport { parseHttpsConfig } from '@ms-cloudpack/create-express-app';\nimport type { Span } from '@ms-cloudpack/telemetry';\nimport { editCloudpackConfig } from './utilities/editCloudpackConfig.js';\nimport type { TaskScheduler } from './task-scheduler/TaskScheduler.js';\nimport type { TaskReporter } from '@ms-cloudpack/task-reporter';\n\n/**\n * The api server handles the data pub/sub (for things like reporting build status)\n * and hosting the dashboard verb backend (for executing actions like loading vscode,\n * changing dependencies, connecting new projects to the running session, etc.)\n *\n * Each time `cloudpack start` is run, an api server will start up for that session. The\n * hosted web page will have a \"cloudpack-api-server\" header which points\n * to the websocket server.\n *\n * The bundle server will call the api server to publish build status updates.\n *\n * The app server will burn the api server url on the host html, so that client-side\n * javascript can connect and subscribe to page changes.\n */\nexport async function startApiServer({\n session,\n rootSpan,\n reporter,\n}: {\n session: Session;\n rootSpan: Span | undefined;\n reporter: TaskReporter;\n}): Promise<ApiServer> {\n const host = session.config?.devServer?.domain || 'localhost';\n const port = await getPort({ port: [9890, 9891, 9892, 9893] });\n const bus = createDataBus();\n const sessionStats: SessionStats = {\n status: 'idle',\n\n remainingTasks: 0,\n totalTasks: 0,\n\n totalErrors: 0,\n totalWarnings: 0,\n };\n\n const allTasks: Map<string, TaskDescription> = new Map();\n const taskRunner = new TaskRunner();\n\n function reportStart(taskStart: TaskStartDescription): void {\n const previousResult = allTasks.get(taskStart.id);\n const now = new Date().getTime();\n\n if (!previousResult) {\n sessionStats.totalTasks++;\n }\n\n if (previousResult?.status === 'complete') {\n sessionStats.totalErrors -= previousResult.errors?.length || 0;\n sessionStats.totalWarnings -= previousResult.warnings?.length || 0;\n }\n\n sessionStats.remainingTasks++;\n sessionStats.status = 'pending';\n\n allTasks.set(taskStart.id, {\n ...taskStart,\n status: 'pending',\n startTime: now,\n });\n\n bus.publish([session.id, 'status'], sessionStats);\n bus.publish([session.id, 'status-details'], { tasks: Array.from(allTasks.values()) });\n }\n\n function reportEnd(taskEnd: TaskEndDescription): void {\n const previousResult = allTasks.get(taskEnd.id);\n const now = new Date().getTime();\n\n if (previousResult) {\n sessionStats.remainingTasks--;\n sessionStats.totalErrors += taskEnd.errors?.length || 0;\n sessionStats.totalWarnings += taskEnd.warnings?.length || 0;\n\n allTasks.set(taskEnd.id, {\n ...previousResult,\n ...taskEnd,\n status: 'complete',\n durationMilliseconds: now - previousResult.startTime,\n lastUpdated: now,\n });\n\n if (sessionStats.remainingTasks === 0) {\n sessionStats.status = 'idle';\n }\n\n bus.publish([session.id, 'status'], sessionStats);\n bus.publish([session.id, 'status-details'], { tasks: Array.from(allTasks.values()) });\n }\n }\n\n bus.publish([session.id, 'status'], sessionStats);\n\n const addTask: ApiServer['addTask'] = (task, options) => {\n if (task.watch) {\n options = options || {};\n options.watch = () => {\n watcher.watch(task, { onSuccess: notifyReload });\n };\n }\n\n return taskRunner.add(\n {\n ...task,\n execute: async () => {\n reportStart({\n ...task.getStartDescription?.(),\n id: task.id,\n });\n\n let taskResult;\n\n try {\n taskResult = await task.execute();\n } catch (err) {\n // no-op\n }\n\n reportEnd({\n ...task.getEndDescription?.(taskResult),\n id: task.id,\n } as TaskEndDescription);\n\n return taskResult;\n },\n },\n options,\n );\n };\n\n const watcher = startWatcher(addTask);\n\n // Create a node http(s) server.\n let server: http.Server | https.Server;\n const httpsConfig = session.config?.devServer?.https;\n const protocol = httpsConfig ? 'wss' : 'ws';\n\n if (httpsConfig) {\n const { key, cert, passphrase } = parseHttpsConfig(httpsConfig);\n\n if (!key || !cert) {\n console.error('Invalid https config in cloudpack.config.js. Make sure key and cert are valid.');\n\n throw new Error('Invalid https config.');\n }\n\n server = https\n .createServer(\n {\n key,\n cert,\n passphrase,\n },\n () => {\n /* no-op */\n },\n )\n .listen(port, host);\n } else {\n server = http.createServer().listen(port, host);\n }\n\n // Create a websocket server which listens for subscriptions and verb requests,\n // and broadcasts the data to all connected clients.\n const socketServer = new WebSocketServer({ server }, () => {\n // console.log(`ApiServer: Started on port ${port}`);\n }).on('connection', (socket: WebSocket) => {\n const disposables = new Map<number, () => void>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function sendMessage(message: any) {\n socket.send(JSON.stringify(message, null, 2));\n }\n\n socket.send(\n JSON.stringify({\n type: 'sequence',\n sequence: session.sequence,\n }),\n );\n\n socket\n .on('message', (rawData) => {\n try {\n const request = JSON.parse(rawData.toString()) as {\n type: string;\n requestId?: string;\n data: Record<string, unknown>;\n };\n\n switch (request.type) {\n /**\n * Subscribe to a data subscription.\n */\n case 'subscribe': {\n const { path: subscriptionPath, id } = request.data;\n\n disposables.set(\n id as number,\n bus.subscribe(\n subscriptionPath as string[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n (data: any) => sendMessage({ type: 'notify', id, path: subscriptionPath, data }),\n ),\n );\n\n break;\n }\n\n /**\n * Unsubscribe from a data subscription.\n */\n case 'unsubscribe': {\n const id = request.data.id as number | undefined;\n if (id) {\n const dispose = disposables.get(id);\n\n if (dispose) {\n dispose();\n disposables.delete(id);\n }\n }\n\n break;\n }\n\n /**\n * Open a file in VSCode.\n */\n case 'openSource': {\n const { rootPath, relativePath = '', line, column } = request.data;\n const fullPath = path.join(rootPath as string, relativePath as string);\n\n console.log(`Opening VSCode with path: ${fullPath}`);\n execSync(`code --goto ${fullPath}:${line}:${column}`, { cwd: process.cwd() });\n break;\n }\n\n /**\n * Open a file or folder in the OS's default file manager.\n */\n case 'open': {\n const { rootPath, relativePath = '' } = request.data;\n const fullPath = path.join(rootPath as string, relativePath as string);\n\n console.log(`Opening path: ${fullPath}`);\n const openCommand = os.platform() == 'win32' ? 'start' : 'open';\n\n execSync(`${openCommand} ${fullPath}`, { cwd: process.cwd() });\n break;\n }\n\n /**\n * Opens the cloudpack config in VSCode for the user to manually edit. If the file doesn't exist,\n * it will be created.\n */\n case 'editConfig': {\n editCloudpackConfig().catch(() => {\n /* no-op */\n });\n break;\n }\n\n /**\n * Adds an override to the cloudpack config.\n */\n case 'addOverride': {\n // TODO: Send filename from request data to findResolveMapEntry when chromium Issue 1371551 is fixed.\n const { packageName, importPath } = request.data as Record<string, string>;\n (async () => {\n await addOverride({ session, packageName, importPath });\n session.incrementSessionVersion();\n notifyReload();\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'validateOverride': {\n // TODO: Get filename from request data when chromium Issue 1371551 is fixed.\n const { requestId, data } = request as { requestId: string; data: Record<string, string> };\n const { packageName, importPath } = data;\n (async () => {\n const fixable = await validateOverride({ session, packageName, importPath });\n sendMessage({ type: 'validateOverride', requestId, data: { fixable } });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'restartAllTasks': {\n console.log('ApiServer: Restarting all tasks');\n\n // Clear entire local cache.\n fsExtra.emptyDirSync(getCachePath());\n\n // All tasks can be removed as notifyReload()\n // will cause the client to add the tasks again.\n allTasks.forEach((_, id) => {\n taskRunner.remove(id);\n });\n\n // Parse config if it exists.\n const cloudpackConfig = readConfigSync();\n\n // Initialize package overrides.\n PackageDefinitions.getInstance().registerTransform(createPackageOverrideTransform(cloudpackConfig));\n\n // Update session version.\n session.incrementSessionVersion();\n\n notifyReload();\n break;\n }\n\n case 'restartTask': {\n const { id, inputPath } = request.data as Record<string, string>;\n console.log(`ApiServer: Restarting task ${id}`);\n taskRunner.remove(id);\n session.incrementTargetVersion(inputPath);\n notifyReload();\n break;\n }\n\n case 'reportMetric': {\n const { metric, value } = request.data as { metric: string; value: number };\n console.debug(`ApiServer: Received metric: ${metric}, value: ${value}`);\n rootSpan?.addEvent(metric, value);\n break;\n }\n }\n } catch (err) {\n console.error('ApiServer: error handling message');\n console.error('Error:', err);\n console.error('Message:', rawData.toString());\n }\n })\n .on('close', () => {\n for (const d of disposables.values()) {\n d();\n }\n });\n });\n\n const notifyReload = () => {\n session.sequence++;\n socketServer.clients.forEach((socket: WebSocket) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(\n JSON.stringify({\n type: 'reload',\n data: { sessionId: session.id },\n }),\n );\n }\n });\n };\n\n let scheduler: TaskScheduler | undefined;\n\n if (session.config.features?.enableLage) {\n const { TaskScheduler } = await import('./task-scheduler/TaskScheduler.js');\n\n scheduler = new TaskScheduler({ reporter, root: session.appPath });\n }\n\n return {\n url: `${protocol}://${host}:${port}`,\n port,\n\n notifyReload,\n\n addTask: (task, options) => {\n return addTask(task, options);\n },\n\n scheduleTask: async (bundleRequest, scripts, options) => {\n if (!scheduler) {\n throw new Error('Cannot schedule task when not using lage');\n }\n\n reportStart({\n id: bundleRequest.id,\n inputPath: bundleRequest.packagePath,\n outputPath: bundleRequest.outputPath,\n name: bundleRequest.packageName,\n });\n\n await scheduler.scheduleTask(bundleRequest, scripts, options);\n\n reportEnd({\n id: bundleRequest.id,\n });\n },\n\n close: () =>\n new Promise<void>((resolve, reject) => {\n socketServer.clients.forEach((socket: WebSocket) => socket.terminate());\n socketServer.close((err) => (err ? reject(err) : resolve()));\n server.close();\n }),\n };\n}\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import type { TaskReporter } from '@ms-cloudpack/task-reporter';
|
|
3
|
+
import type { BundleRequest } from '../types/BundleRequest.js';
|
|
4
|
+
export declare const require: NodeRequire;
|
|
3
5
|
interface TaskSchedulerOptions {
|
|
4
6
|
reporter: TaskReporter;
|
|
5
7
|
root: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskScheduler.d.ts","sourceRoot":"","sources":["../../src/task-scheduler/TaskScheduler.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D,eAAO,MAAM,OAAO,aAAiC,CAAC;AAEtD,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,aAAa;;gBAIZ,OAAO,EAAE,oBAAoB;IAOnC,YAAY,CAAC,CAAC,SAAS,aAAa,EACxC,aAAa,EAAE,CAAC,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CAmBJ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _TaskScheduler_scheduler, _TaskScheduler_targetGraphBuilder;
|
|
13
|
+
import targetGraph from '@lage-run/target-graph';
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import { createSimpleScheduler } from './createSimpleScheduler.js';
|
|
16
|
+
import { createBundleTarget } from './createBundleTarget.js';
|
|
17
|
+
export const require = createRequire(import.meta.url);
|
|
18
|
+
/**
|
|
19
|
+
* A class to abstract the creation of the lage scheduler and scheduling tasks
|
|
20
|
+
*/
|
|
21
|
+
export class TaskScheduler {
|
|
22
|
+
constructor(options) {
|
|
23
|
+
_TaskScheduler_scheduler.set(this, void 0);
|
|
24
|
+
_TaskScheduler_targetGraphBuilder.set(this, void 0);
|
|
25
|
+
__classPrivateFieldSet(this, _TaskScheduler_targetGraphBuilder, new targetGraph.TargetGraphBuilder(), "f");
|
|
26
|
+
__classPrivateFieldSet(this, _TaskScheduler_scheduler, createSimpleScheduler(options), "f");
|
|
27
|
+
}
|
|
28
|
+
// Schedules task to be run according to the bundle request that came through from the bundler server
|
|
29
|
+
// TODO: from a bundle request, we should be able to determine if we need to auto add several targets into the graph
|
|
30
|
+
async scheduleTask(bundleRequest, scripts, options) {
|
|
31
|
+
const target = createBundleTarget(scripts, bundleRequest);
|
|
32
|
+
__classPrivateFieldGet(this, _TaskScheduler_targetGraphBuilder, "f").addTarget(target);
|
|
33
|
+
const graph = __classPrivateFieldGet(this, _TaskScheduler_targetGraphBuilder, "f").build();
|
|
34
|
+
try {
|
|
35
|
+
await __classPrivateFieldGet(this, _TaskScheduler_scheduler, "f").run(target.cwd, graph, options.rerun);
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
if (e instanceof Error) {
|
|
39
|
+
console.error(e.message);
|
|
40
|
+
console.error(e.stack);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.error(String(e));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
_TaskScheduler_scheduler = new WeakMap(), _TaskScheduler_targetGraphBuilder = new WeakMap();
|
|
49
|
+
//# sourceMappingURL=TaskScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskScheduler.js","sourceRoot":"","sources":["../../src/task-scheduler/TaskScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,WAAW,MAAM,wBAAwB,CAAC;AAIjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAOtD;;GAEG;AACH,MAAM,OAAO,aAAa;IAIxB,YAAY,OAA6B;QAHzC,2CAA4B;QAC5B,oDAAoD;QAGlD,uBAAA,IAAI,qCAAuB,IAAI,WAAW,CAAC,kBAAkB,EAAE,MAAA,CAAC;QAChE,uBAAA,IAAI,4BAAc,qBAAqB,CAAC,OAAO,CAAC,MAAA,CAAC;IACnD,CAAC;IAED,qGAAqG;IACrG,oHAAoH;IACpH,KAAK,CAAC,YAAY,CAChB,aAAgB,EAChB,OAA+B,EAC/B,OAEC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAE1D,uBAAA,IAAI,yCAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,uBAAA,IAAI,yCAAoB,CAAC,KAAK,EAAE,CAAC;QAE/C,IAAI;YACF,MAAM,uBAAA,IAAI,gCAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;SAC7D;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,YAAY,KAAK,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACxB;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1B;SACF;IACH,CAAC;CACF","sourcesContent":["import type { SimpleScheduler } from '@lage-run/scheduler';\nimport targetGraph from '@lage-run/target-graph';\nimport type { TaskReporter } from '@ms-cloudpack/task-reporter';\nimport type { BundleRequest } from '../types/BundleRequest.js';\n\nimport { createRequire } from 'node:module';\nimport { createSimpleScheduler } from './createSimpleScheduler.js';\nimport { createBundleTarget } from './createBundleTarget.js';\n\nexport const require = createRequire(import.meta.url);\n\ninterface TaskSchedulerOptions {\n reporter: TaskReporter;\n root: string;\n}\n\n/**\n * A class to abstract the creation of the lage scheduler and scheduling tasks\n */\nexport class TaskScheduler {\n #scheduler: SimpleScheduler;\n #targetGraphBuilder: targetGraph.TargetGraphBuilder;\n\n constructor(options: TaskSchedulerOptions) {\n this.#targetGraphBuilder = new targetGraph.TargetGraphBuilder();\n this.#scheduler = createSimpleScheduler(options);\n }\n\n // Schedules task to be run according to the bundle request that came through from the bundler server\n // TODO: from a bundle request, we should be able to determine if we need to auto add several targets into the graph\n async scheduleTask<T extends BundleRequest>(\n bundleRequest: T,\n scripts: Record<string, string>,\n options: {\n rerun?: boolean;\n },\n ) {\n const target = createBundleTarget(scripts, bundleRequest);\n\n this.#targetGraphBuilder.addTarget(target);\n\n const graph = this.#targetGraphBuilder.build();\n\n try {\n await this.#scheduler.run(target.cwd, graph, options.rerun);\n } catch (e) {\n if (e instanceof Error) {\n console.error(e.message);\n console.error(e.stack);\n } else {\n console.error(String(e));\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Target } from '@lage-run/target-graph';
|
|
2
|
+
import type { BundleRequest } from '../types/BundleRequest.js';
|
|
3
|
+
export declare function createBundleTarget(scripts: Record<string, string>, bundleRequest: BundleRequest): Target;
|
|
4
|
+
//# sourceMappingURL=createBundleTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createBundleTarget.d.ts","sourceRoot":"","sources":["../../src/task-scheduler/createBundleTarget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CAiBxG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function createBundleTarget(scripts, bundleRequest) {
|
|
2
|
+
const cwd = bundleRequest.packagePath;
|
|
3
|
+
const target = {
|
|
4
|
+
id: bundleRequest.id,
|
|
5
|
+
label: `${bundleRequest.packageName} bundle`,
|
|
6
|
+
task: 'bundle',
|
|
7
|
+
type: 'worker',
|
|
8
|
+
cwd,
|
|
9
|
+
dependencies: [],
|
|
10
|
+
dependents: [],
|
|
11
|
+
depSpecs: [],
|
|
12
|
+
options: {
|
|
13
|
+
script: scripts.bundle ?? '',
|
|
14
|
+
bundleRequest,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
return target;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=createBundleTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createBundleTarget.js","sourceRoot":"","sources":["../../src/task-scheduler/createBundleTarget.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,OAA+B,EAAE,aAA4B;IAC9F,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC;IACtC,MAAM,MAAM,GAAW;QACrB,EAAE,EAAE,aAAa,CAAC,EAAE;QACpB,KAAK,EAAE,GAAG,aAAa,CAAC,WAAW,SAAS;QAC5C,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,GAAG;QACH,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,aAAa;SACd;KACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { Target } from '@lage-run/target-graph';\nimport type { BundleRequest } from '../types/BundleRequest.js';\n\nexport function createBundleTarget(scripts: Record<string, string>, bundleRequest: BundleRequest): Target {\n const cwd = bundleRequest.packagePath;\n const target: Target = {\n id: bundleRequest.id,\n label: `${bundleRequest.packageName} bundle`,\n task: 'bundle',\n type: 'worker',\n cwd,\n dependencies: [],\n dependents: [],\n depSpecs: [],\n options: {\n script: scripts.bundle ?? '',\n bundleRequest,\n },\n };\n return target;\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import scheduler from '@lage-run/scheduler';
|
|
2
|
+
import type { TaskReporter } from '@ms-cloudpack/task-reporter';
|
|
3
|
+
export declare function createSimpleScheduler({ reporter, root }: {
|
|
4
|
+
reporter: TaskReporter;
|
|
5
|
+
root: string;
|
|
6
|
+
}): scheduler.SimpleScheduler;
|
|
7
|
+
//# sourceMappingURL=createSimpleScheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSimpleScheduler.d.ts","sourceRoot":"","sources":["../../src/task-scheduler/createSimpleScheduler.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,6BAgCjG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import lageLogger from '@lage-run/logger';
|
|
2
|
+
import scheduler from '@lage-run/scheduler';
|
|
3
|
+
import { TargetHasher } from '@lage-run/hasher';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { createTaskSchedulerReporter } from './createTaskSchedulerReporter.js';
|
|
6
|
+
import { require } from './TaskScheduler.js';
|
|
7
|
+
export function createSimpleScheduler({ reporter, root }) {
|
|
8
|
+
const logger = new lageLogger.Logger();
|
|
9
|
+
logger.addReporter(createTaskSchedulerReporter(reporter));
|
|
10
|
+
const runners = {
|
|
11
|
+
worker: {
|
|
12
|
+
script: require.resolve('@lage-run/scheduler/lib/runners/WorkerRunner.js'),
|
|
13
|
+
options: {},
|
|
14
|
+
},
|
|
15
|
+
noop: {
|
|
16
|
+
script: require.resolve('@lage-run/scheduler/lib/runners/NoOpRunner.js'),
|
|
17
|
+
options: {},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const hasher = new TargetHasher({ root, environmentGlob: [] });
|
|
21
|
+
return new scheduler.SimpleScheduler({
|
|
22
|
+
concurrency: 10,
|
|
23
|
+
continueOnError: true,
|
|
24
|
+
logger,
|
|
25
|
+
maxWorkersPerTask: new Map(),
|
|
26
|
+
workerData: {
|
|
27
|
+
runners,
|
|
28
|
+
root,
|
|
29
|
+
taskArgs: [],
|
|
30
|
+
},
|
|
31
|
+
shouldCache: true,
|
|
32
|
+
shouldResetCache: false,
|
|
33
|
+
workerIdleMemoryLimit: os.totalmem(),
|
|
34
|
+
hasher,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=createSimpleScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSimpleScheduler.js","sourceRoot":"","sources":["../../src/task-scheduler/createSimpleScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAA4C;IAChG,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,CAAC,WAAW,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG;QACd,MAAM,EAAE;YACN,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,iDAAiD,CAAC;YAC1E,OAAO,EAAE,EAAE;SACZ;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,+CAA+C,CAAC;YACxE,OAAO,EAAE,EAAE;SACZ;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/D,OAAO,IAAI,SAAS,CAAC,eAAe,CAAC;QACnC,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,IAAI;QACrB,MAAM;QACN,iBAAiB,EAAE,IAAI,GAAG,EAAE;QAC5B,UAAU,EAAE;YACV,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,EAAE;SACb;QACD,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,KAAK;QACvB,qBAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE;QACpC,MAAM;KACP,CAAC,CAAC;AACL,CAAC","sourcesContent":["import lageLogger from '@lage-run/logger';\nimport scheduler from '@lage-run/scheduler';\nimport { TargetHasher } from '@lage-run/hasher';\nimport os from 'os';\nimport type { TaskReporter } from '@ms-cloudpack/task-reporter';\nimport { createTaskSchedulerReporter } from './createTaskSchedulerReporter.js';\nimport { require } from './TaskScheduler.js';\n\nexport function createSimpleScheduler({ reporter, root }: { reporter: TaskReporter; root: string }) {\n const logger = new lageLogger.Logger();\n logger.addReporter(createTaskSchedulerReporter(reporter));\n\n const runners = {\n worker: {\n script: require.resolve('@lage-run/scheduler/lib/runners/WorkerRunner.js'),\n options: {},\n },\n noop: {\n script: require.resolve('@lage-run/scheduler/lib/runners/NoOpRunner.js'),\n options: {},\n },\n };\n\n const hasher = new TargetHasher({ root, environmentGlob: [] });\n\n return new scheduler.SimpleScheduler({\n concurrency: 10,\n continueOnError: true,\n logger,\n maxWorkersPerTask: new Map(),\n workerData: {\n runners,\n root,\n taskArgs: [],\n },\n shouldCache: true,\n shouldResetCache: false,\n workerIdleMemoryLimit: os.totalmem(),\n hasher,\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTaskSchedulerReporter.d.ts","sourceRoot":"","sources":["../../src/task-scheduler/createTaskSchedulerReporter.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,6BAA6B,CAAC;AAElF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,CAAC,QAAQ,CAmEvF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import lageLogger from '@lage-run/logger';
|
|
2
|
+
export function createTaskSchedulerReporter(reporter) {
|
|
3
|
+
const reporterTasks = new Map();
|
|
4
|
+
return {
|
|
5
|
+
log(entry) {
|
|
6
|
+
if (entry.msg && entry.level <= lageLogger.LogLevel.warn && entry.data?.target) {
|
|
7
|
+
const target = entry.data?.target;
|
|
8
|
+
if (reporterTasks.has(target.id)) {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
10
|
+
reporterTasks.get(target.id).message += entry.msg;
|
|
11
|
+
}
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (entry.data && entry.data.status) {
|
|
15
|
+
const { status } = entry.data;
|
|
16
|
+
const target = entry.data.target;
|
|
17
|
+
// Ensure task is in the reporterTasks map
|
|
18
|
+
const task = reporterTasks.has(target.id)
|
|
19
|
+
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
20
|
+
reporterTasks.get(target.id)
|
|
21
|
+
: reporter.addTask(target.label, true);
|
|
22
|
+
reporterTasks.set(target.id, task);
|
|
23
|
+
switch (status) {
|
|
24
|
+
case 'running':
|
|
25
|
+
task.start();
|
|
26
|
+
break;
|
|
27
|
+
case 'success':
|
|
28
|
+
task.complete({ status: 'complete' });
|
|
29
|
+
break;
|
|
30
|
+
case 'skipped':
|
|
31
|
+
task.complete({ status: 'skip' });
|
|
32
|
+
break;
|
|
33
|
+
case 'failed':
|
|
34
|
+
task.complete({ status: 'fail' });
|
|
35
|
+
break;
|
|
36
|
+
case 'aborted':
|
|
37
|
+
task.complete({ status: 'abort' });
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (entry.msg) {
|
|
43
|
+
const logLevelToConsoleFnMap = {
|
|
44
|
+
[lageLogger.LogLevel.error]: console.error,
|
|
45
|
+
[lageLogger.LogLevel.warn]: console.warn,
|
|
46
|
+
[lageLogger.LogLevel.info]: console.info,
|
|
47
|
+
[lageLogger.LogLevel.verbose]: console.debug,
|
|
48
|
+
[lageLogger.LogLevel.silly]: console.debug,
|
|
49
|
+
};
|
|
50
|
+
logLevelToConsoleFnMap[entry.level](entry.msg);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
summarize() {
|
|
55
|
+
// noop
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=createTaskSchedulerReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTaskSchedulerReporter.js","sourceRoot":"","sources":["../../src/task-scheduler/createTaskSchedulerReporter.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,MAAM,UAAU,2BAA2B,CAAC,QAAsB;IAChE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE1D,OAAO;QACL,GAAG,CAAC,KAAK;YACP,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE;gBAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,MAAgB,CAAC;gBAC5C,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;oBAChC,oEAAoE;oBACpE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC;iBACpD;gBACD,OAAO;aACR;YAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBACnC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAgB,CAAC;gBAE3C,0CAA0C;gBAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvC,CAAC,CAAC,oEAAoE;wBACpE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE;oBAC/B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEzC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAEnC,QAAQ,MAAM,EAAE;oBACd,KAAK,SAAS;wBACZ,IAAI,CAAC,KAAK,EAAE,CAAC;wBACb,MAAM;oBAER,KAAK,SAAS;wBACZ,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;wBACtC,MAAM;oBAER,KAAK,SAAS;wBACZ,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;wBAClC,MAAM;oBAER,KAAK,QAAQ;wBACX,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;wBAClC,MAAM;oBAER,KAAK,SAAS;wBACZ,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;wBACnC,MAAM;iBACT;gBACD,OAAO;aACR;YAED,IAAI,KAAK,CAAC,GAAG,EAAE;gBACb,MAAM,sBAAsB,GAAG;oBAC7B,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK;oBAC1C,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI;oBACxC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI;oBACxC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK;oBAC5C,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK;iBAC3C,CAAC;gBAEF,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/C,OAAO;aACR;QACH,CAAC;QACD,SAAS;YACP,OAAO;QACT,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import lageLogger from '@lage-run/logger';\nimport type { Target } from '@lage-run/target-graph';\nimport type { TaskReporter, TaskReporterTask } from '@ms-cloudpack/task-reporter';\n\nexport function createTaskSchedulerReporter(reporter: TaskReporter): lageLogger.Reporter {\n const reporterTasks = new Map<string, TaskReporterTask>();\n\n return {\n log(entry) {\n if (entry.msg && entry.level <= lageLogger.LogLevel.warn && entry.data?.target) {\n const target = entry.data?.target as Target;\n if (reporterTasks.has(target.id)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n reporterTasks.get(target.id)!.message += entry.msg;\n }\n return;\n }\n\n if (entry.data && entry.data.status) {\n const { status } = entry.data;\n const target = entry.data.target as Target;\n\n // Ensure task is in the reporterTasks map\n const task = reporterTasks.has(target.id)\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n reporterTasks.get(target.id)!\n : reporter.addTask(target.label, true);\n\n reporterTasks.set(target.id, task);\n\n switch (status) {\n case 'running':\n task.start();\n break;\n\n case 'success':\n task.complete({ status: 'complete' });\n break;\n\n case 'skipped':\n task.complete({ status: 'skip' });\n break;\n\n case 'failed':\n task.complete({ status: 'fail' });\n break;\n\n case 'aborted':\n task.complete({ status: 'abort' });\n break;\n }\n return;\n }\n\n if (entry.msg) {\n const logLevelToConsoleFnMap = {\n [lageLogger.LogLevel.error]: console.error,\n [lageLogger.LogLevel.warn]: console.warn,\n [lageLogger.LogLevel.info]: console.info,\n [lageLogger.LogLevel.verbose]: console.debug,\n [lageLogger.LogLevel.silly]: console.debug,\n };\n\n logLevelToConsoleFnMap[entry.level](entry.msg);\n return;\n }\n },\n summarize() {\n // noop\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskScheduler.d.ts","sourceRoot":"","sources":["../../src/utilities/TaskScheduler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,6BAA6B,CAAC;AAKlF,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,aAAa;;gBAMZ,OAAO,EAAE,oBAAoB;IAyGnC,YAAY,CAAC,CAAC,SAAS,aAAa,EACxC,aAAa,EAAE,CAAC,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CAiCJ"}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
-
};
|
|
6
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
7
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
|
-
};
|
|
12
|
-
var _TaskScheduler_scheduler, _TaskScheduler_targetGraphBuilder, _TaskScheduler_reporterTasks;
|
|
13
|
-
import { Logger, LogLevel } from '@lage-run/logger';
|
|
14
|
-
import scheduler from '@lage-run/scheduler';
|
|
15
|
-
import targetGraph, {} from '@lage-run/target-graph';
|
|
16
|
-
import { TargetHasher } from '@lage-run/hasher';
|
|
17
|
-
import os from 'os';
|
|
18
|
-
import { createRequire } from 'node:module';
|
|
19
|
-
const require = createRequire(import.meta.url);
|
|
20
|
-
/**
|
|
21
|
-
* A class to abstract the creation of the lage scheduler and scheduling tasks
|
|
22
|
-
*/
|
|
23
|
-
export class TaskScheduler {
|
|
24
|
-
constructor(options) {
|
|
25
|
-
_TaskScheduler_scheduler.set(this, void 0);
|
|
26
|
-
_TaskScheduler_targetGraphBuilder.set(this, void 0);
|
|
27
|
-
_TaskScheduler_reporterTasks.set(this, new Map());
|
|
28
|
-
const { reporter, root } = options;
|
|
29
|
-
const logger = new Logger();
|
|
30
|
-
const reporterTasks = __classPrivateFieldGet(this, _TaskScheduler_reporterTasks, "f");
|
|
31
|
-
logger.addReporter({
|
|
32
|
-
log(entry) {
|
|
33
|
-
if (entry.msg && entry.level <= LogLevel.warn && entry.data?.target) {
|
|
34
|
-
const target = entry.data?.target;
|
|
35
|
-
if (reporterTasks.has(target.id)) {
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
37
|
-
reporterTasks.get(target.id).message += entry.msg;
|
|
38
|
-
}
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (entry.data && entry.data.status) {
|
|
42
|
-
const { status } = entry.data;
|
|
43
|
-
const target = entry.data.target;
|
|
44
|
-
// Ensure task is in the reporterTasks map
|
|
45
|
-
const task = reporterTasks.has(target.id)
|
|
46
|
-
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
47
|
-
reporterTasks.get(target.id)
|
|
48
|
-
: reporter.addTask(target.label, true);
|
|
49
|
-
reporterTasks.set(target.id, task);
|
|
50
|
-
switch (status) {
|
|
51
|
-
case 'running':
|
|
52
|
-
task.start();
|
|
53
|
-
break;
|
|
54
|
-
case 'success':
|
|
55
|
-
task.complete({ status: 'complete' });
|
|
56
|
-
break;
|
|
57
|
-
case 'skipped':
|
|
58
|
-
task.complete({ status: 'skip' });
|
|
59
|
-
break;
|
|
60
|
-
case 'failed':
|
|
61
|
-
task.complete({ status: 'fail' });
|
|
62
|
-
break;
|
|
63
|
-
case 'aborted':
|
|
64
|
-
task.complete({ status: 'abort' });
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (entry.msg) {
|
|
70
|
-
const logLevelToConsoleFnMap = {
|
|
71
|
-
[LogLevel.error]: console.error,
|
|
72
|
-
[LogLevel.warn]: console.warn,
|
|
73
|
-
[LogLevel.info]: console.info,
|
|
74
|
-
[LogLevel.verbose]: console.debug,
|
|
75
|
-
[LogLevel.silly]: console.debug,
|
|
76
|
-
};
|
|
77
|
-
logLevelToConsoleFnMap[entry.level](entry.msg);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
summarize() {
|
|
82
|
-
// noop
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
const runners = {
|
|
86
|
-
worker: {
|
|
87
|
-
script: require.resolve('@lage-run/scheduler/lib/runners/WorkerRunner.js'),
|
|
88
|
-
options: {},
|
|
89
|
-
},
|
|
90
|
-
noop: {
|
|
91
|
-
script: require.resolve('@lage-run/scheduler/lib/runners/NoOpRunner.js'),
|
|
92
|
-
options: {},
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
const hasher = new TargetHasher({ root, environmentGlob: [] });
|
|
96
|
-
__classPrivateFieldSet(this, _TaskScheduler_targetGraphBuilder, new targetGraph.TargetGraphBuilder(), "f");
|
|
97
|
-
__classPrivateFieldSet(this, _TaskScheduler_scheduler, new scheduler.SimpleScheduler({
|
|
98
|
-
concurrency: 10,
|
|
99
|
-
continueOnError: true,
|
|
100
|
-
logger,
|
|
101
|
-
maxWorkersPerTask: new Map(),
|
|
102
|
-
workerData: {
|
|
103
|
-
runners,
|
|
104
|
-
root,
|
|
105
|
-
taskArgs: [],
|
|
106
|
-
},
|
|
107
|
-
shouldCache: true,
|
|
108
|
-
shouldResetCache: false,
|
|
109
|
-
workerIdleMemoryLimit: os.totalmem(),
|
|
110
|
-
hasher,
|
|
111
|
-
}), "f");
|
|
112
|
-
}
|
|
113
|
-
// Schedules task to be run according to the bundle request that came through from the bundler server
|
|
114
|
-
// TODO: from a bundle request, we should be able to determine if we need to auto add several targets into the graph
|
|
115
|
-
async scheduleTask(bundleRequest, scripts, options) {
|
|
116
|
-
const cwd = bundleRequest.packagePath;
|
|
117
|
-
const target = {
|
|
118
|
-
id: bundleRequest.id,
|
|
119
|
-
label: `${bundleRequest.packageName} bundle`,
|
|
120
|
-
task: 'bundle',
|
|
121
|
-
type: 'worker',
|
|
122
|
-
cwd: bundleRequest.packagePath,
|
|
123
|
-
dependencies: [],
|
|
124
|
-
dependents: [],
|
|
125
|
-
depSpecs: [],
|
|
126
|
-
options: {
|
|
127
|
-
script: scripts.bundle ?? '',
|
|
128
|
-
bundleRequest,
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
__classPrivateFieldGet(this, _TaskScheduler_targetGraphBuilder, "f").addTarget(target);
|
|
132
|
-
const graph = __classPrivateFieldGet(this, _TaskScheduler_targetGraphBuilder, "f").build();
|
|
133
|
-
try {
|
|
134
|
-
await __classPrivateFieldGet(this, _TaskScheduler_scheduler, "f").run(cwd, graph, options.rerun);
|
|
135
|
-
}
|
|
136
|
-
catch (e) {
|
|
137
|
-
if (e instanceof Error) {
|
|
138
|
-
console.error(e.message);
|
|
139
|
-
console.error(e.stack);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
console.error(String(e));
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
_TaskScheduler_scheduler = new WeakMap(), _TaskScheduler_targetGraphBuilder = new WeakMap(), _TaskScheduler_reporterTasks = new WeakMap();
|
|
148
|
-
//# sourceMappingURL=TaskScheduler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskScheduler.js","sourceRoot":"","sources":["../../src/utilities/TaskScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger, LogLevel } from '@lage-run/logger';\nimport scheduler from '@lage-run/scheduler';\nimport targetGraph, { type Target } from '@lage-run/target-graph';\nimport { TargetHasher } from '@lage-run/hasher';\nimport os from 'os';\nimport type { BundleRequest } from '../types/BundleRequest.js';\nimport type { TaskReporter, TaskReporterTask } from '@ms-cloudpack/task-reporter';\n\nimport { createRequire } from 'node:module';\nconst require = createRequire(import.meta.url);\n\ninterface TaskSchedulerOptions {\n reporter: TaskReporter;\n root: string;\n}\n\n/**\n * A class to abstract the creation of the lage scheduler and scheduling tasks\n */\nexport class TaskScheduler {\n #scheduler: scheduler.SimpleScheduler;\n #targetGraphBuilder: targetGraph.TargetGraphBuilder;\n\n #reporterTasks = new Map<string, TaskReporterTask>();\n\n constructor(options: TaskSchedulerOptions) {\n const { reporter, root } = options;\n const logger = new Logger();\n\n const reporterTasks = this.#reporterTasks;\n\n logger.addReporter({\n log(entry) {\n if (entry.msg && entry.level <= LogLevel.warn && entry.data?.target) {\n const target = entry.data?.target as Target;\n if (reporterTasks.has(target.id)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n reporterTasks.get(target.id)!.message += entry.msg;\n }\n return;\n }\n\n if (entry.data && entry.data.status) {\n const { status } = entry.data;\n const target = entry.data.target as Target;\n\n // Ensure task is in the reporterTasks map\n const task = reporterTasks.has(target.id)\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n reporterTasks.get(target.id)!\n : reporter.addTask(target.label, true);\n\n reporterTasks.set(target.id, task);\n\n switch (status) {\n case 'running':\n task.start();\n break;\n\n case 'success':\n task.complete({ status: 'complete' });\n break;\n\n case 'skipped':\n task.complete({ status: 'skip' });\n break;\n\n case 'failed':\n task.complete({ status: 'fail' });\n break;\n\n case 'aborted':\n task.complete({ status: 'abort' });\n break;\n }\n return;\n }\n\n if (entry.msg) {\n const logLevelToConsoleFnMap = {\n [LogLevel.error]: console.error,\n [LogLevel.warn]: console.warn,\n [LogLevel.info]: console.info,\n [LogLevel.verbose]: console.debug,\n [LogLevel.silly]: console.debug,\n };\n\n logLevelToConsoleFnMap[entry.level](entry.msg);\n return;\n }\n },\n\n summarize() {\n // noop\n },\n });\n\n const runners = {\n worker: {\n script: require.resolve('@lage-run/scheduler/lib/runners/WorkerRunner.js'),\n options: {},\n },\n noop: {\n script: require.resolve('@lage-run/scheduler/lib/runners/NoOpRunner.js'),\n options: {},\n },\n };\n\n const hasher = new TargetHasher({ root, environmentGlob: [] });\n\n this.#targetGraphBuilder = new targetGraph.TargetGraphBuilder();\n this.#scheduler = new scheduler.SimpleScheduler({\n concurrency: 10,\n continueOnError: true,\n logger,\n maxWorkersPerTask: new Map(),\n workerData: {\n runners,\n root,\n taskArgs: [],\n },\n shouldCache: true,\n shouldResetCache: false,\n workerIdleMemoryLimit: os.totalmem(),\n hasher,\n });\n }\n\n // Schedules task to be run according to the bundle request that came through from the bundler server\n // TODO: from a bundle request, we should be able to determine if we need to auto add several targets into the graph\n async scheduleTask<T extends BundleRequest>(\n bundleRequest: T,\n scripts: Record<string, string>,\n options: {\n rerun?: boolean;\n },\n ) {\n const cwd = bundleRequest.packagePath;\n const target: Target = {\n id: bundleRequest.id,\n label: `${bundleRequest.packageName} bundle`,\n task: 'bundle',\n type: 'worker',\n cwd: bundleRequest.packagePath,\n dependencies: [],\n dependents: [],\n depSpecs: [],\n options: {\n script: scripts.bundle ?? '',\n bundleRequest,\n },\n };\n\n this.#targetGraphBuilder.addTarget(target);\n\n const graph = this.#targetGraphBuilder.build();\n\n try {\n await this.#scheduler.run(cwd, graph, options.rerun);\n } catch (e) {\n if (e instanceof Error) {\n console.error(e.message);\n console.error(e.stack);\n } else {\n console.error(String(e));\n }\n }\n }\n}\n"]}
|