@things-factory/integration-headless 9.1.19 → 10.0.0-beta.1
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.
|
@@ -63,7 +63,15 @@ async function HeadlessPDFCaptureBoard(step, context) {
|
|
|
63
63
|
await page.setRequestInterception(true);
|
|
64
64
|
await page.setDefaultTimeout(10000);
|
|
65
65
|
page.on('console', async (msg) => {
|
|
66
|
-
|
|
66
|
+
const args = await Promise.all(msg.args().map(arg => arg.jsonValue().catch(() => undefined)));
|
|
67
|
+
if (args.some(a => a !== undefined)) {
|
|
68
|
+
console.log(`[browser ${msg.type()}]`, ...args.filter(a => a !== undefined));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const text = msg.text();
|
|
72
|
+
if (text)
|
|
73
|
+
console.log(`[browser ${msg.type()}]`, text);
|
|
74
|
+
}
|
|
67
75
|
});
|
|
68
76
|
page.on('requestfailed', request => {
|
|
69
77
|
console.log('Request failed:', request.url());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-pdf-capture-board.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-capture-board.ts"],"names":[],"mappings":";;AA4BA,0DA6HC;AAzJD,uEAA+D;AAC/D,yDAA2E;AAC3E,iEAAyD;AACzD,iDAA8C;AAE9C,MAAM,YAAY,GAAG;IACnB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IACrC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IACtC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACnC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;CACpC,CAAA;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,GAAG,GAAG,EAAE,CAAA,CAAC,uBAAuB;IAEtC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAChC,OAAO,MAAM,GAAG,GAAG,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC5B,OAAO,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,CAAC,CAAA;AACV,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,IAAI,EAAE,OAAO;IACzD,MAAM,OAAO,GAAG,IAAI,iCAAc,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAE1C,IAAI,CAAC;QACH,IAAI,EACF,KAAK,EAAE,WAAW,EAClB,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,GAAG,IAAI,EACb,KAAK,EACL,MAAM,EACN,SAAS,EACT,UAAU,GAAG,CAAC,EACd,WAAW,GAAG,CAAC,EACf,SAAS,GAAG,CAAC,EACb,YAAY,GAAG,CAAC,EACjB,GAAG,IAAI,CAAC,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAA,cAAM,EAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAA;QAE7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAEzC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,yBAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QACrF,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,yBAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAE9D,KAAK,CAAC,KAAK,GAAG,UAAU,CAAA;QACxB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAA;QAE7B,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAElD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;YAC3C,MAAM,GAAG,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YACzC,OAAO,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,SAAS,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACnC,CAAC;YAAA,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACxC,CAAC;QAED,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;QACxC,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;QACtC,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC5C,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;QAE1C,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;QACtD,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;QAExD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAQ,CAAC,OAAO,EAAE,CAAA;QAE7C,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QAC9F,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QAEnC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,CAAA;QACvB,MAAM,IAAI,GAAG,WAAW,CAAA;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3D,MAAM,IAAI,GAAG,8BAA8B,CAAA;QAC3C,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;QAEjD,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,CAAA;QAEhC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;YAC3B,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO,CAAC,QAAQ,CAAC;oBACf,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,yBAAyB,EAAE,MAAM,EAAE,SAAS;wBAC5C,aAAa,EAAE,SAAS,GAAG,KAAK;qBACjC;oBACD,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;wBACvB,KAAK;wBACL,IAAI;qBACL,CAAC;iBACH,CAAC,CAAA;YACJ,CAAC;iBAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,QAAQ,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpE,OAAO,CAAC,QAAQ,CAAC;oBACf,OAAO,EAAE;wBACP,GAAG,OAAO,CAAC,OAAO,EAAE;wBACpB,yBAAyB,EAAE,MAAM,EAAE,SAAS;wBAC5C,aAAa,EAAE,SAAS,GAAG,KAAK;qBACjC;iBACF,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,QAAQ,EAAE,CAAA;YACpB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEpB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACzB,YAAY;YACZ,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;YACb,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC3B,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE,UAAU,CAAC,CAAA;QAEd,MAAM,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAEhE,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,cAAc;SAC7B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,uBAAuB,CAAC,aAAa,GAAG;IACtC,GAAG,IAAA,yCAAsB,GAAE;IAC3B;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE;YACR,SAAS,EAAE,QAAQ;SACpB;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,6EAA6E;KAC3F;CACF,CAAA;AAED,uBAAuB,CAAC,IAAI,GAAG,6CAA6C,CAAA;AAE5E,+BAAY,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,uBAAuB,CAAC,CAAA","sourcesContent":["import { TaskRegistry } from '@things-factory/integration-base'\nimport { PDFCaptureUtil, getCommonParameterSpec } from './pdf-capture-util'\nimport { BoardFunc } from '@things-factory/board-service'\nimport { access } from '@things-factory/utils'\n\nconst PAGE_FORMATS = {\n A4: { width: 595.28, height: 841.89 },\n A3: { width: 841.89, height: 1190.55 },\n Letter: { width: 612, height: 792 },\n Legal: { width: 612, height: 1008 }\n}\n\nfunction convertToPixels(value: string): number {\n const dpi = 96 // PDF에서 기본적으로 사용하는 DPI\n\n if (value.endsWith('px')) {\n return parseFloat(value)\n } else if (value.endsWith('in')) {\n const inches = parseFloat(value)\n return inches * dpi\n } else if (value.endsWith('cm')) {\n const cm = parseFloat(value)\n return cm * (dpi / 2.54)\n }\n\n return 0\n}\n\nexport async function HeadlessPDFCaptureBoard(step, context) {\n const pdfUtil = new PDFCaptureUtil(context)\n await pdfUtil.initBrowser(step.connection)\n\n try {\n var {\n board: boardObject,\n accessor,\n boardAccessor,\n draft,\n format = 'A4',\n width,\n height,\n landscape,\n marginLeft = 0,\n marginRight = 0,\n marginTop = 0,\n marginBottom = 0\n } = step.params\n var { domain, data, user, logger } = context\n\n const boardId = boardAccessor ? access(boardAccessor, data) : boardObject?.id\n\n if (!boardId) {\n throw new Error('The board property must be set')\n }\n\n const boardInput = access(accessor, data)\n\n const { model, base } = await BoardFunc.headlessModel({ domain, id: boardId }, draft)\n const [fontsToUse, fontStyles] = await BoardFunc.fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n var widthN = width ? convertToPixels(width) : 0\n var heightN = height ? convertToPixels(height) : 0\n\n if (!widthN && !heightN && PAGE_FORMATS[format]) {\n const pageDimensions = PAGE_FORMATS[format]\n widthN = pageDimensions.width * (96 / 72)\n heightN = pageDimensions.height * (96 / 72)\n }\n\n if (landscape && widthN && heightN) {\n ;[widthN, heightN] = [heightN, widthN]\n }\n\n marginLeft = convertToPixels(marginLeft)\n marginTop = convertToPixels(marginTop)\n marginBottom = convertToPixels(marginBottom)\n marginRight = convertToPixels(marginRight)\n\n const contentWidth = widthN - marginLeft - marginRight\n const contentHeight = heightN - marginTop - marginBottom\n\n const page = await pdfUtil.browser!.newPage()\n\n await page.setViewport({ width: Math.round(contentWidth), height: Math.round(contentHeight) })\n await page.setRequestInterception(true)\n await page.setDefaultTimeout(10000)\n\n page.on('console', async msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n const protocol = 'http'\n const host = 'localhost'\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const path = '/internal-board-service-view'\n const url = `${protocol}://${host}${port}${path}`\n\n const token = await user?.sign()\n\n page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n },\n postData: JSON.stringify({\n model,\n base\n })\n })\n } else if (request.url().startsWith(`${protocol}://${host}${port}`)) {\n request.continue({\n headers: {\n ...request.headers(),\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n }\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url)\n\n await page.evaluate(data => {\n //@ts-ignore\n s.data = data\n return new Promise(resolve => {\n requestAnimationFrame(() => resolve(0))\n })\n }, boardInput)\n\n await pdfUtil.processPageAndGeneratePDF(step.params, null, page)\n\n return {\n data: context.__headless_pdf\n }\n } catch (error) {\n throw error\n } finally {\n await pdfUtil.closeBrowser()\n }\n}\n\nHeadlessPDFCaptureBoard.parameterSpec = [\n ...getCommonParameterSpec(),\n {\n type: 'string',\n name: 'boardAccessor',\n label: 'board-accessor'\n },\n {\n type: 'resource-object',\n name: 'board',\n label: 'board',\n property: {\n queryName: 'boards'\n }\n },\n {\n type: 'boolean',\n name: 'draft',\n label: 'board-draft',\n defaultValue: false,\n description: 'Set whether to get the current working version or the last released version'\n }\n]\n\nHeadlessPDFCaptureBoard.help = 'integration/task/headless-pdf-capture-board'\n\nTaskRegistry.registerTaskHandler('headless-pdf-capture-board', HeadlessPDFCaptureBoard)\n"]}
|
|
1
|
+
{"version":3,"file":"headless-pdf-capture-board.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-capture-board.ts"],"names":[],"mappings":"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","sourcesContent":["import { TaskRegistry } from '@things-factory/integration-base'\nimport { PDFCaptureUtil, getCommonParameterSpec } from './pdf-capture-util'\nimport { BoardFunc } from '@things-factory/board-service'\nimport { access } from '@things-factory/utils'\n\nconst PAGE_FORMATS = {\n A4: { width: 595.28, height: 841.89 },\n A3: { width: 841.89, height: 1190.55 },\n Letter: { width: 612, height: 792 },\n Legal: { width: 612, height: 1008 }\n}\n\nfunction convertToPixels(value: string): number {\n const dpi = 96 // PDF에서 기본적으로 사용하는 DPI\n\n if (value.endsWith('px')) {\n return parseFloat(value)\n } else if (value.endsWith('in')) {\n const inches = parseFloat(value)\n return inches * dpi\n } else if (value.endsWith('cm')) {\n const cm = parseFloat(value)\n return cm * (dpi / 2.54)\n }\n\n return 0\n}\n\nexport async function HeadlessPDFCaptureBoard(step, context) {\n const pdfUtil = new PDFCaptureUtil(context)\n await pdfUtil.initBrowser(step.connection)\n\n try {\n var {\n board: boardObject,\n accessor,\n boardAccessor,\n draft,\n format = 'A4',\n width,\n height,\n landscape,\n marginLeft = 0,\n marginRight = 0,\n marginTop = 0,\n marginBottom = 0\n } = step.params\n var { domain, data, user, logger } = context\n\n const boardId = boardAccessor ? access(boardAccessor, data) : boardObject?.id\n\n if (!boardId) {\n throw new Error('The board property must be set')\n }\n\n const boardInput = access(accessor, data)\n\n const { model, base } = await BoardFunc.headlessModel({ domain, id: boardId }, draft)\n const [fontsToUse, fontStyles] = await BoardFunc.fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n var widthN = width ? convertToPixels(width) : 0\n var heightN = height ? convertToPixels(height) : 0\n\n if (!widthN && !heightN && PAGE_FORMATS[format]) {\n const pageDimensions = PAGE_FORMATS[format]\n widthN = pageDimensions.width * (96 / 72)\n heightN = pageDimensions.height * (96 / 72)\n }\n\n if (landscape && widthN && heightN) {\n ;[widthN, heightN] = [heightN, widthN]\n }\n\n marginLeft = convertToPixels(marginLeft)\n marginTop = convertToPixels(marginTop)\n marginBottom = convertToPixels(marginBottom)\n marginRight = convertToPixels(marginRight)\n\n const contentWidth = widthN - marginLeft - marginRight\n const contentHeight = heightN - marginTop - marginBottom\n\n const page = await pdfUtil.browser!.newPage()\n\n await page.setViewport({ width: Math.round(contentWidth), height: Math.round(contentHeight) })\n await page.setRequestInterception(true)\n await page.setDefaultTimeout(10000)\n\n page.on('console', async msg => {\n const args = await Promise.all(msg.args().map(arg => arg.jsonValue().catch(() => undefined)))\n\n if (args.some(a => a !== undefined)) {\n console.log(`[browser ${msg.type()}]`, ...args.filter(a => a !== undefined))\n } else {\n const text = msg.text()\n if (text) console.log(`[browser ${msg.type()}]`, text)\n }\n })\n\n page.on('requestfailed', request => {\n console.log('Request failed:', request.url())\n })\n\n const protocol = 'http'\n const host = 'localhost'\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const path = '/internal-board-service-view'\n const url = `${protocol}://${host}${port}${path}`\n\n const token = await user?.sign()\n\n page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n },\n postData: JSON.stringify({\n model,\n base\n })\n })\n } else if (request.url().startsWith(`${protocol}://${host}${port}`)) {\n request.continue({\n headers: {\n ...request.headers(),\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n }\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url)\n\n await page.evaluate(data => {\n //@ts-ignore\n s.data = data\n return new Promise(resolve => {\n requestAnimationFrame(() => resolve(0))\n })\n }, boardInput)\n\n await pdfUtil.processPageAndGeneratePDF(step.params, null, page)\n\n return {\n data: context.__headless_pdf\n }\n } catch (error) {\n throw error\n } finally {\n await pdfUtil.closeBrowser()\n }\n}\n\nHeadlessPDFCaptureBoard.parameterSpec = [\n ...getCommonParameterSpec(),\n {\n type: 'string',\n name: 'boardAccessor',\n label: 'board-accessor'\n },\n {\n type: 'resource-object',\n name: 'board',\n label: 'board',\n property: {\n queryName: 'boards'\n }\n },\n {\n type: 'boolean',\n name: 'draft',\n label: 'board-draft',\n defaultValue: false,\n description: 'Set whether to get the current working version or the last released version'\n }\n]\n\nHeadlessPDFCaptureBoard.help = 'integration/task/headless-pdf-capture-board'\n\nTaskRegistry.registerTaskHandler('headless-pdf-capture-board', HeadlessPDFCaptureBoard)\n"]}
|