@things-factory/board-service 7.0.1-beta.8 → 7.0.1-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist-server/constants/error-code.d.ts +2 -0
  2. package/dist-server/controllers/analyzer/analyze-integration.d.ts +5 -0
  3. package/dist-server/controllers/analyzer/analyze-integration.js +1 -2
  4. package/dist-server/controllers/analyzer/analyze-integration.js.map +1 -1
  5. package/dist-server/controllers/fonts.d.ts +9 -0
  6. package/dist-server/controllers/fonts.js.map +1 -1
  7. package/dist-server/controllers/headless-model.d.ts +6 -0
  8. package/dist-server/controllers/headless-model.js.map +1 -1
  9. package/dist-server/controllers/headless-playlist.d.ts +5 -0
  10. package/dist-server/controllers/headless-playlist.js.map +1 -1
  11. package/dist-server/controllers/headless-pool-for-board.d.ts +1 -0
  12. package/dist-server/controllers/headless-pool-for-board.js +1 -2
  13. package/dist-server/controllers/headless-pool-for-board.js.map +1 -1
  14. package/dist-server/controllers/headless-pool-for-label.d.ts +1 -0
  15. package/dist-server/controllers/headless-pool-for-label.js +4 -10
  16. package/dist-server/controllers/headless-pool-for-label.js.map +1 -1
  17. package/dist-server/controllers/index.d.ts +26 -0
  18. package/dist-server/controllers/label-command.d.ts +19 -0
  19. package/dist-server/controllers/label-command.js.map +1 -1
  20. package/dist-server/controllers/pdf.d.ts +9 -0
  21. package/dist-server/controllers/pdf.js.map +1 -1
  22. package/dist-server/controllers/print.d.ts +21 -0
  23. package/dist-server/controllers/print.js +5 -6
  24. package/dist-server/controllers/print.js.map +1 -1
  25. package/dist-server/controllers/screenshot.d.ts +11 -0
  26. package/dist-server/controllers/screenshot.js.map +1 -1
  27. package/dist-server/controllers/thumbnail.d.ts +7 -0
  28. package/dist-server/errors/index.d.ts +1 -0
  29. package/dist-server/errors/license-error.d.ts +11 -0
  30. package/dist-server/index.d.ts +5 -0
  31. package/dist-server/index.js +1 -2
  32. package/dist-server/index.js.map +1 -1
  33. package/dist-server/migrations/1556862253000-SeedGroup.d.ts +5 -0
  34. package/dist-server/migrations/1556862253000-SeedGroup.js.map +1 -1
  35. package/dist-server/migrations/index.d.ts +1 -0
  36. package/dist-server/routers/board-print-router.d.ts +1 -0
  37. package/dist-server/routers/internal-board-view-router.d.ts +1 -0
  38. package/dist-server/routers/internal-board-view-router.js.map +1 -1
  39. package/dist-server/routers/standalone-board-service-router.d.ts +1 -0
  40. package/dist-server/routers/standalone-board-service-router.js.map +1 -1
  41. package/dist-server/routes.d.ts +1 -0
  42. package/dist-server/routes.js.map +1 -1
  43. package/dist-server/service/analysis/analysis-query.d.ts +3 -0
  44. package/dist-server/service/analysis/analysis-query.js +2 -2
  45. package/dist-server/service/analysis/analysis-query.js.map +1 -1
  46. package/dist-server/service/analysis/index.d.ts +2 -0
  47. package/dist-server/service/board/board-history.d.ts +28 -0
  48. package/dist-server/service/board/board-history.js +2 -2
  49. package/dist-server/service/board/board-history.js.map +1 -1
  50. package/dist-server/service/board/board-mutation.d.ts +12 -0
  51. package/dist-server/service/board/board-mutation.js +2 -2
  52. package/dist-server/service/board/board-mutation.js.map +1 -1
  53. package/dist-server/service/board/board-query.d.ts +20 -0
  54. package/dist-server/service/board/board-query.js +4 -4
  55. package/dist-server/service/board/board-query.js.map +1 -1
  56. package/dist-server/service/board/board-subscription.d.ts +6 -0
  57. package/dist-server/service/board/board-subscription.js +2 -2
  58. package/dist-server/service/board/board-subscription.js.map +1 -1
  59. package/dist-server/service/board/board-type.d.ts +24 -0
  60. package/dist-server/service/board/board-type.js +8 -8
  61. package/dist-server/service/board/board-type.js.map +1 -1
  62. package/dist-server/service/board/board.d.ts +25 -0
  63. package/dist-server/service/board/board.js +2 -2
  64. package/dist-server/service/board/board.js.map +1 -1
  65. package/dist-server/service/board/event-subscriber.d.ts +15 -0
  66. package/dist-server/service/board/event-subscriber.js +4 -4
  67. package/dist-server/service/board/event-subscriber.js.map +1 -1
  68. package/dist-server/service/board/index.d.ts +9 -0
  69. package/dist-server/service/board-favorite/board-favorite-query.d.ts +5 -0
  70. package/dist-server/service/board-favorite/board-favorite-query.js +3 -3
  71. package/dist-server/service/board-favorite/board-favorite-query.js.map +1 -1
  72. package/dist-server/service/board-favorite/board-favorite-type.d.ts +8 -0
  73. package/dist-server/service/board-favorite/board-favorite-type.js +4 -4
  74. package/dist-server/service/board-favorite/board-favorite-type.js.map +1 -1
  75. package/dist-server/service/board-favorite/index.d.ts +3 -0
  76. package/dist-server/service/board-template/board-template-mutation.d.ts +8 -0
  77. package/dist-server/service/board-template/board-template-mutation.js +2 -2
  78. package/dist-server/service/board-template/board-template-mutation.js.map +1 -1
  79. package/dist-server/service/board-template/board-template-query.d.ts +13 -0
  80. package/dist-server/service/board-template/board-template-query.js +4 -4
  81. package/dist-server/service/board-template/board-template-query.js.map +1 -1
  82. package/dist-server/service/board-template/board-template-type.d.ts +21 -0
  83. package/dist-server/service/board-template/board-template-type.js +6 -6
  84. package/dist-server/service/board-template/board-template-type.js.map +1 -1
  85. package/dist-server/service/board-template/board-template.d.ts +23 -0
  86. package/dist-server/service/board-template/board-template.js +3 -3
  87. package/dist-server/service/board-template/board-template.js.map +1 -1
  88. package/dist-server/service/board-template/index.d.ts +6 -0
  89. package/dist-server/service/group/group-mutation.d.ts +8 -0
  90. package/dist-server/service/group/group-mutation.js +2 -2
  91. package/dist-server/service/group/group-mutation.js.map +1 -1
  92. package/dist-server/service/group/group-query.d.ts +13 -0
  93. package/dist-server/service/group/group-query.js +3 -3
  94. package/dist-server/service/group/group-query.js.map +1 -1
  95. package/dist-server/service/group/group-type.d.ts +13 -0
  96. package/dist-server/service/group/group-type.js +6 -6
  97. package/dist-server/service/group/group-type.js.map +1 -1
  98. package/dist-server/service/group/group.d.ts +17 -0
  99. package/dist-server/service/group/group.js +2 -2
  100. package/dist-server/service/group/group.js.map +1 -1
  101. package/dist-server/service/group/index.d.ts +5 -0
  102. package/dist-server/service/index.d.ts +10 -0
  103. package/dist-server/service/permission/domain-permission-subscriber.d.ts +9 -0
  104. package/dist-server/service/permission/domain-permission-subscriber.js +2 -2
  105. package/dist-server/service/permission/domain-permission-subscriber.js.map +1 -1
  106. package/dist-server/service/permission/index.d.ts +2 -0
  107. package/dist-server/service/play-group/event-subscriber.d.ts +6 -0
  108. package/dist-server/service/play-group/event-subscriber.js +2 -2
  109. package/dist-server/service/play-group/event-subscriber.js.map +1 -1
  110. package/dist-server/service/play-group/index.d.ts +8 -0
  111. package/dist-server/service/play-group/play-group-mutation.d.ts +10 -0
  112. package/dist-server/service/play-group/play-group-mutation.js +2 -2
  113. package/dist-server/service/play-group/play-group-mutation.js.map +1 -1
  114. package/dist-server/service/play-group/play-group-query.d.ts +14 -0
  115. package/dist-server/service/play-group/play-group-query.js +3 -3
  116. package/dist-server/service/play-group/play-group-query.js.map +1 -1
  117. package/dist-server/service/play-group/play-group-subscription.d.ts +6 -0
  118. package/dist-server/service/play-group/play-group-subscription.js +2 -2
  119. package/dist-server/service/play-group/play-group-subscription.js.map +1 -1
  120. package/dist-server/service/play-group/play-group-type.d.ts +13 -0
  121. package/dist-server/service/play-group/play-group-type.js +6 -6
  122. package/dist-server/service/play-group/play-group-type.js.map +1 -1
  123. package/dist-server/service/play-group/play-group.d.ts +18 -0
  124. package/dist-server/service/play-group/play-group.js +2 -2
  125. package/dist-server/service/play-group/play-group.js.map +1 -1
  126. package/dist-server/service/theme/index.d.ts +6 -0
  127. package/dist-server/service/theme/theme-mutation.d.ts +10 -0
  128. package/dist-server/service/theme/theme-mutation.js +2 -2
  129. package/dist-server/service/theme/theme-mutation.js.map +1 -1
  130. package/dist-server/service/theme/theme-query.d.ts +11 -0
  131. package/dist-server/service/theme/theme-query.js +3 -3
  132. package/dist-server/service/theme/theme-query.js.map +1 -1
  133. package/dist-server/service/theme/theme-type.d.ts +21 -0
  134. package/dist-server/service/theme/theme-type.js +6 -6
  135. package/dist-server/service/theme/theme-type.js.map +1 -1
  136. package/dist-server/service/theme/theme.d.ts +25 -0
  137. package/dist-server/service/theme/theme.js +2 -2
  138. package/dist-server/service/theme/theme.js.map +1 -1
  139. package/dist-server/tsconfig.tsbuildinfo +1 -1
  140. package/package.json +7 -7
  141. package/server/controllers/fonts.ts +1 -1
  142. package/server/service/board/board-query.ts +5 -2
  143. package/server/service/board-favorite/board-favorite-query.ts +4 -1
  144. package/server/service/board-template/board-template-query.ts +5 -2
  145. package/server/service/group/group-query.ts +1 -1
  146. package/server/service/play-group/play-group-query.ts +4 -1
  147. package/server/service/theme/theme-query.ts +1 -1
@@ -0,0 +1,2 @@
1
+ export declare const VERIFICATION_ERROR = "error.license token not valid";
2
+ export declare const OVER_LIMIT = "error.count over license limit";
@@ -0,0 +1,5 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ export declare function analyzeBoardIntegration(domain: Domain): Promise<{
3
+ nodes: any[];
4
+ relationships: any[];
5
+ }>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.analyzeBoardIntegration = void 0;
3
+ exports.analyzeBoardIntegration = analyzeBoardIntegration;
4
4
  const tslib_1 = require("tslib");
5
5
  const uniq_1 = tslib_1.__importDefault(require("lodash/uniq"));
6
6
  const shell_1 = require("@things-factory/shell");
@@ -114,5 +114,4 @@ async function analyzeBoardIntegration(domain) {
114
114
  });
115
115
  return model;
116
116
  }
117
- exports.analyzeBoardIntegration = analyzeBoardIntegration;
118
117
  //# sourceMappingURL=analyze-integration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-integration.js","sourceRoot":"","sources":["../../../server/controllers/analyzer/analyze-integration.ts"],"names":[],"mappings":"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","sourcesContent":["import uniq from 'lodash/uniq'\n\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { analyzeIntegration } from '@things-factory/integration-base'\nimport { Board } from '../../service/board/board'\n\nfunction findObjectsWithCondition(container, condition: (component: any) => boolean) {\n let result = []\n\n if (condition(container)) {\n result.push(container)\n }\n\n if (container.components) {\n for (const component of container.components) {\n result = result.concat(findObjectsWithCondition(component, condition))\n }\n }\n\n return result\n}\n\nfunction getRelationsInBoard(board: Board) {\n try {\n const model = JSON.parse(board.model) || {}\n\n const scenarioNames = findObjectsWithCondition(model, component => component.scenarioName).map(\n component => component.scenarioName\n )\n\n const tags = findObjectsWithCondition(model, component => component.tag).map(component => component.tag)\n\n return {\n scenarioNames: uniq(scenarioNames.filter(Boolean)),\n tags: uniq(tags.filter(Boolean))\n }\n } catch (err) {\n console.error('analyze-integration::getRelationsInBoard error', err)\n return {\n scenarioNames: [],\n tags: []\n }\n }\n}\n\nexport async function analyzeBoardIntegration(domain: Domain) {\n const model = await analyzeIntegration(domain)\n\n var id = 0\n\n const boards = await getRepository(Board).find({\n where: { domain: { id: domain.id } }\n })\n\n model.nodes = model.nodes.concat(\n boards.map(board => {\n return {\n id: board.id,\n labels: ['Board'],\n text: board.name,\n icon: 'dashboard',\n properties: {\n name: board.name,\n description: board.description\n }\n }\n })\n )\n\n boards.forEach(board => {\n const { scenarioNames, tags } = getRelationsInBoard(board)\n\n var scenarioNodes = scenarioNames.map(name =>\n model.nodes.find(node => node.labels.includes('Scenario') && node.properties?.name == name)\n )\n var tagNodes = tags.map(tag => model.nodes.find(node => node.labels.includes('Tag') && node.properties?.tag == tag))\n\n const missingScenarioNodes = scenarioNodes\n .filter(node => !node)\n .map((_, i) => scenarioNames[i])\n .map(missingScenario => {\n return {\n id: `missing-scenario-${missingScenario}`,\n labels: ['Scenario'],\n text: missingScenario,\n icon: 'settings',\n properties: {\n name: missingScenario,\n missing: true\n }\n }\n })\n\n model.nodes = model.nodes.concat(missingScenarioNodes)\n\n const missingTagNodes = tagNodes\n .filter(node => !node)\n .map((_, i) => tags[i])\n .map(missingTag => {\n return {\n id: `missing-tag-${missingTag}`,\n labels: ['Tag'],\n text: missingTag,\n icon: 'label',\n properties: {\n name: missingTag,\n missing: true\n }\n }\n })\n\n model.nodes = model.nodes.concat(missingTagNodes)\n\n tagNodes.filter(node => !node).map((_, i) => tags[i])\n\n var relationships = [...scenarioNodes.filter(Boolean), ...missingScenarioNodes].map(node => {\n return {\n id: `bsce-${++id}`,\n type: 'call',\n startNode: board.id,\n endNode: node.id,\n properties: {}\n }\n })\n\n model.relationships = model.relationships.concat(relationships)\n\n relationships = [...tagNodes.filter(Boolean), ...missingTagNodes].map(node => {\n return {\n id: `btag-${++id}`,\n type: 'subscribe',\n startNode: board.id,\n endNode: node.id,\n properties: {}\n }\n })\n\n model.relationships = model.relationships.concat(relationships)\n })\n\n return model\n}\n"]}
1
+ {"version":3,"file":"analyze-integration.js","sourceRoot":"","sources":["../../../server/controllers/analyzer/analyze-integration.ts"],"names":[],"mappings":";;AA6CA,0DAgGC;;AA7ID,+DAA8B;AAE9B,iDAA6D;AAC7D,uEAAqE;AACrE,qDAAiD;AAEjD,SAAS,wBAAwB,CAAC,SAAS,EAAE,SAAsC;IACjF,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxB,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAY;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAE3C,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,CAC5F,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CACpC,CAAA;QAED,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAExG,OAAO;YACL,aAAa,EAAE,IAAA,cAAI,EAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,EAAE,IAAA,cAAI,EAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SACjC,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAA;QACpE,OAAO;YACL,aAAa,EAAE,EAAE;YACjB,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,MAAc;IAC1D,MAAM,KAAK,GAAG,MAAM,IAAA,qCAAkB,EAAC,MAAM,CAAC,CAAA;IAE9C,IAAI,EAAE,GAAG,CAAC,CAAA;IAEV,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,aAAK,CAAC,CAAC,IAAI,CAAC;QAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE;KACrC,CAAC,CAAA;IAEF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACjB,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,CAAC,OAAO,CAAC;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE;gBACV,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B;SACF,CAAA;IACH,CAAC,CAAC,CACH,CAAA;IAED,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACrB,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAE1D,IAAI,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAC3C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAC,OAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,IAAI,KAAI,IAAI,CAAA,EAAA,CAAC,CAC5F,CAAA;QACD,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAC,OAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,GAAG,KAAI,GAAG,CAAA,EAAA,CAAC,CAAC,CAAA;QAEpH,MAAM,oBAAoB,GAAG,aAAa;aACvC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAC/B,GAAG,CAAC,eAAe,CAAC,EAAE;YACrB,OAAO;gBACL,EAAE,EAAE,oBAAoB,eAAe,EAAE;gBACzC,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE;oBACV,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,IAAI;iBACd;aACF,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;QAEtD,MAAM,eAAe,GAAG,QAAQ;aAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtB,GAAG,CAAC,UAAU,CAAC,EAAE;YAChB,OAAO;gBACL,EAAE,EAAE,eAAe,UAAU,EAAE;gBAC/B,MAAM,EAAE,CAAC,KAAK,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE;oBACV,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,IAAI;iBACd;aACF,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;QAEjD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAErD,IAAI,aAAa,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,oBAAoB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzF,OAAO;gBACL,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAClB,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,KAAK,CAAC,EAAE;gBACnB,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,UAAU,EAAE,EAAE;aACf,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAE/D,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC3E,OAAO;gBACL,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAClB,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,KAAK,CAAC,EAAE;gBACnB,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,UAAU,EAAE,EAAE;aACf,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["import uniq from 'lodash/uniq'\n\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { analyzeIntegration } from '@things-factory/integration-base'\nimport { Board } from '../../service/board/board'\n\nfunction findObjectsWithCondition(container, condition: (component: any) => boolean) {\n let result = []\n\n if (condition(container)) {\n result.push(container)\n }\n\n if (container.components) {\n for (const component of container.components) {\n result = result.concat(findObjectsWithCondition(component, condition))\n }\n }\n\n return result\n}\n\nfunction getRelationsInBoard(board: Board) {\n try {\n const model = JSON.parse(board.model) || {}\n\n const scenarioNames = findObjectsWithCondition(model, component => component.scenarioName).map(\n component => component.scenarioName\n )\n\n const tags = findObjectsWithCondition(model, component => component.tag).map(component => component.tag)\n\n return {\n scenarioNames: uniq(scenarioNames.filter(Boolean)),\n tags: uniq(tags.filter(Boolean))\n }\n } catch (err) {\n console.error('analyze-integration::getRelationsInBoard error', err)\n return {\n scenarioNames: [],\n tags: []\n }\n }\n}\n\nexport async function analyzeBoardIntegration(domain: Domain) {\n const model = await analyzeIntegration(domain)\n\n var id = 0\n\n const boards = await getRepository(Board).find({\n where: { domain: { id: domain.id } }\n })\n\n model.nodes = model.nodes.concat(\n boards.map(board => {\n return {\n id: board.id,\n labels: ['Board'],\n text: board.name,\n icon: 'dashboard',\n properties: {\n name: board.name,\n description: board.description\n }\n }\n })\n )\n\n boards.forEach(board => {\n const { scenarioNames, tags } = getRelationsInBoard(board)\n\n var scenarioNodes = scenarioNames.map(name =>\n model.nodes.find(node => node.labels.includes('Scenario') && node.properties?.name == name)\n )\n var tagNodes = tags.map(tag => model.nodes.find(node => node.labels.includes('Tag') && node.properties?.tag == tag))\n\n const missingScenarioNodes = scenarioNodes\n .filter(node => !node)\n .map((_, i) => scenarioNames[i])\n .map(missingScenario => {\n return {\n id: `missing-scenario-${missingScenario}`,\n labels: ['Scenario'],\n text: missingScenario,\n icon: 'settings',\n properties: {\n name: missingScenario,\n missing: true\n }\n }\n })\n\n model.nodes = model.nodes.concat(missingScenarioNodes)\n\n const missingTagNodes = tagNodes\n .filter(node => !node)\n .map((_, i) => tags[i])\n .map(missingTag => {\n return {\n id: `missing-tag-${missingTag}`,\n labels: ['Tag'],\n text: missingTag,\n icon: 'label',\n properties: {\n name: missingTag,\n missing: true\n }\n }\n })\n\n model.nodes = model.nodes.concat(missingTagNodes)\n\n tagNodes.filter(node => !node).map((_, i) => tags[i])\n\n var relationships = [...scenarioNodes.filter(Boolean), ...missingScenarioNodes].map(node => {\n return {\n id: `bsce-${++id}`,\n type: 'call',\n startNode: board.id,\n endNode: node.id,\n properties: {}\n }\n })\n\n model.relationships = model.relationships.concat(relationships)\n\n relationships = [...tagNodes.filter(Boolean), ...missingTagNodes].map(node => {\n return {\n id: `btag-${++id}`,\n type: 'subscribe',\n startNode: board.id,\n endNode: node.id,\n properties: {}\n }\n })\n\n model.relationships = model.relationships.concat(relationships)\n })\n\n return model\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ export declare const fonts: (domain?: Domain) => Promise<(string | {
3
+ custom: {
4
+ families: any[];
5
+ };
6
+ google: {
7
+ families: any[];
8
+ };
9
+ })[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../server/controllers/fonts.ts"],"names":[],"mappings":";;;AAEA,yDAAgD;AAChD,qEAA4D;AAC5D,iDAA6D;AAEtD,MAAM,KAAK,GAAG,KAAK,EAAE,MAAe,EAAE,EAAE;IAC7C,MAAM,EAAE,GAA6B,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEzF,IAAI,KAAK,GAAG,MAAM;QAChB,CAAC,CAAC,MAAM,EAAE;aACL,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC;aAC3B,QAAQ,CAAC,IAAI,CAAC;aACd,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;aACtC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC;aAC1B,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;aAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAClD,UAAU,EAAE;QACjB,CAAC,CAAC,MAAM,EAAE;aACL,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC;aAC3B,QAAQ,CAAC,IAAI,CAAC;aACd,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;aACtC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC;aAC1B,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;aAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aACvB,UAAU,EAAE,CAAA;IAEnB,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAA;IACtE,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAA;IAEtE,IAAI,aAAa,GAAW,EAAE,CAAA;IAE9B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;QAC9B,IAAI,KAAK,GAAe,MAAM;YAC5B,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,4BAAU,CAAC,CAAC,MAAM,CAAC;gBACrC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;gBACzB,KAAK,EAAE,IAAI,CAAC,EAAE;aACf,CAAC;YACJ,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,4BAAU,CAAC,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,IAAI,CAAC,EAAE;aACf,CAAC,CAAA;QAEN,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,aAAa,IAAI,KAAK;iBACnB,GAAG,CAAC,IAAI,CAAC,EAAE;gBACV,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAE1D,OAAO;4BACW,IAAI,CAAC,IAAI;0BACX,IAAI,CAAC,IAAI,WAAW,QAAQ;2BAC3B,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;;WAExC,CAAA;YACH,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAA;SACd;aAAM;YACL,aAAa,IAAI;0BACG,IAAI,CAAC,IAAI;wBACX,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;;SAEjE,CAAA;SACJ;KACF;IAED,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QACrD,CAAC,CAAC;4CAEO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI;gBAC5B,MAAM,EAAE;oBACN,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;iBAC9C;aACF,CAAC,GACC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI;gBAC5B,MAAM,EAAE;oBACN,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;iBAC9C;aACF,CAAC;YAEJ,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;SAC9C;QACH,CAAC,CAAC,EAAE,CAAA;AACR,CAAC,CAAA;AA5EY,QAAA,KAAK,SA4EjB","sourcesContent":["import { SelectQueryBuilder } from 'typeorm'\n\nimport { Font } from '@things-factory/font-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { getRepository, Domain } from '@things-factory/shell'\n\nexport const fonts = async (domain?: Domain) => {\n const qb: SelectQueryBuilder<Font> = await getRepository(Font).createQueryBuilder('FONT')\n\n var fonts = domain\n ? await qb\n .select('FONT.name', 'name')\n .distinct(true)\n .addSelect('FONT.provider', 'provider')\n .addSelect('FONT.id', 'id')\n .addSelect('FONT.uri', 'uri')\n .where({ domain: { id: domain.id }, active: true })\n .getRawMany()\n : await qb\n .select('FONT.name', 'name')\n .distinct(true)\n .addSelect('FONT.provider', 'provider')\n .addSelect('FONT.id', 'id')\n .addSelect('FONT.uri', 'uri')\n .where({ active: true })\n .getRawMany()\n\n var googleFonts = fonts.filter(({ provider }) => provider == 'google')\n var customFonts = fonts.filter(({ provider }) => provider == 'custom')\n\n var customFontCSS: string = ''\n\n for (const font of customFonts) {\n var files: Attachment = domain\n ? await getRepository(Attachment).findBy({\n domain: { id: domain.id },\n refBy: font.id\n })\n : await getRepository(Attachment).findBy({\n refBy: font.id\n })\n\n if (files && files.length > 0) {\n customFontCSS += files\n .map(file => {\n const { name: filename, fullpath } = file\n const bold = filename.toUpperCase().indexOf('BOLD') !== -1\n\n return `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}'), url(${fullpath});\n font-weight: ${bold ? 'bold' : 'normal'};\n }\n `\n })\n .join('\\n')\n } else {\n customFontCSS += `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}')${font.uri ? `, url(${font.uri})` : ''};\n }\n `\n }\n }\n\n return googleFonts.length > 0 || customFonts.length > 0\n ? [\n {\n ...(googleFonts.length > 0 && {\n google: {\n families: googleFonts.map(({ name }) => name)\n }\n }),\n ...(customFonts.length > 0 && {\n custom: {\n families: customFonts.map(({ name }) => name)\n }\n })\n },\n customFonts.length > 0 ? customFontCSS : null\n ]\n : []\n}\n"]}
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../server/controllers/fonts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SelectQueryBuilder } from 'typeorm'\n\nimport { Font } from '@things-factory/font-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { getRepository, Domain } from '@things-factory/shell'\n\nexport const fonts = async (domain?: Domain) => {\n const qb: SelectQueryBuilder<Font> = await getRepository(Font).createQueryBuilder('FONT')\n\n var fonts = domain\n ? await qb\n .select('FONT.name', 'name')\n .distinct(true)\n .addSelect('FONT.provider', 'provider')\n .addSelect('FONT.id', 'id')\n .addSelect('FONT.uri', 'uri')\n .where({ domain: { id: domain.id }, active: true })\n .getRawMany()\n : await qb\n .select('FONT.name', 'name')\n .distinct(true)\n .addSelect('FONT.provider', 'provider')\n .addSelect('FONT.id', 'id')\n .addSelect('FONT.uri', 'uri')\n .where({ active: true })\n .getRawMany()\n\n var googleFonts = fonts.filter(({ provider }) => provider == 'google')\n var customFonts = fonts.filter(({ provider }) => provider == 'custom')\n\n var customFontCSS: string = ''\n\n for (const font of customFonts) {\n var files: Attachment[] = domain\n ? await getRepository(Attachment).findBy({\n domain: { id: domain.id },\n refBy: font.id\n })\n : await getRepository(Attachment).findBy({\n refBy: font.id\n })\n\n if (files && files.length > 0) {\n customFontCSS += files\n .map(file => {\n const { name: filename, fullpath } = file\n const bold = filename.toUpperCase().indexOf('BOLD') !== -1\n\n return `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}'), url(${fullpath});\n font-weight: ${bold ? 'bold' : 'normal'};\n }\n `\n })\n .join('\\n')\n } else {\n customFontCSS += `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}')${font.uri ? `, url(${font.uri})` : ''};\n }\n `\n }\n }\n\n return googleFonts.length > 0 || customFonts.length > 0\n ? [\n {\n ...(googleFonts.length > 0 && {\n google: {\n families: googleFonts.map(({ name }) => name)\n }\n }),\n ...(customFonts.length > 0 && {\n custom: {\n families: customFonts.map(({ name }) => name)\n }\n })\n },\n customFonts.length > 0 ? customFontCSS : null\n ]\n : []\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { Board } from '../service/board/board';
2
+ export declare const headlessModel: (target: any, draft?: boolean) => Promise<{
3
+ base: string;
4
+ model: any;
5
+ board: Board;
6
+ }>;
@@ -1 +1 @@
1
- {"version":3,"file":"headless-model.js","sourceRoot":"","sources":["../../server/controllers/headless-model.ts"],"names":[],"mappings":";;;AAAA,qCAA4B;AAC5B,iDAAqE;AAErE,kDAA8C;AAC9C,kEAA6D;AAEtD,MAAM,aAAa,GAAG,KAAK,EAAE,MAAM,EAAE,QAAiB,KAAK,EAAE,EAAE;IACpE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAE9C,IAAI,KAAK,EAAE;QACT,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE;YAC5B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;SAC1B;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,MAAM,oCAAoC,CAAA;SAC3C;KACF;SAAM;QACL,IAAI,EAAE,EAAE;YACN,IAAI,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,aAAK,CAAC,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;aAChF,CAAC,CAAA;SACH;aAAM,IAAI,IAAI,EAAE;YACf,IAAI,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,aAAK,CAAC,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;aAClF,CAAC,CAAA;SACH;aAAM;YACL,MAAM,iCAAiC,CAAA;SACxC;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE;YACnB,MAAM,cAAc,GAClB,KAAK,CAAC,KAAK,IAAI,UAAU;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,4BAAY,CAAC;qBAC9B,kBAAkB,CAAC,SAAS,CAAC;qBAC7B,KAAK,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;qBACnE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC;qBAClC,KAAK,CAAC,CAAC,CAAC;qBACR,MAAM,EAAE,CAAA;YAEjB,KAAK,GAAG,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC,KAAK,CAAA;SACxC;aAAM;YACL,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;SACpB;QAED,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;KAC1B;IAED,OAAO;QACL,IAAI,EAAE,IAAA,sBAAc,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,KAAK;QACL,KAAK;KACN,CAAA;AACH,CAAC,CAAA;AA9CY,QAAA,aAAa,iBA8CzB","sourcesContent":["import { In } from 'typeorm'\nimport { getContextPath, getRepository } from '@things-factory/shell'\n\nimport { Board } from '../service/board/board'\nimport { BoardHistory } from '../service/board/board-history'\n\nexport const headlessModel = async (target, draft: boolean = false) => {\n var { domain, id, model, name } = target || {}\n\n if (model) {\n if (typeof model == 'string') {\n model = JSON.parse(model)\n } else if (typeof model !== 'object') {\n throw 'model should be a string or object'\n }\n } else {\n if (id) {\n var board = await getRepository(Board).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id }\n })\n } else if (name) {\n var board = await getRepository(Board).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name }\n })\n } else {\n throw 'parameter model or id mandatory'\n }\n\n if (!draft && board) {\n const latestReleased =\n board.state == 'released'\n ? board\n : await getRepository(BoardHistory)\n .createQueryBuilder('history')\n .where('history.originalId = :originalId', { originalId: board.id })\n .orderBy('history.version', 'DESC')\n .limit(1)\n .getOne()\n\n model = (latestReleased || board).model\n } else {\n model = board.model\n }\n\n model = JSON.parse(model)\n }\n\n return {\n base: getContextPath(domain?.subdomain) + (domain ? '/' : ''),\n model,\n board\n }\n}\n"]}
1
+ {"version":3,"file":"headless-model.js","sourceRoot":"","sources":["../../server/controllers/headless-model.ts"],"names":[],"mappings":";;;AAAA,qCAA4B;AAC5B,iDAAqE;AAErE,kDAA8C;AAC9C,kEAA6D;AAEtD,MAAM,aAAa,GAAG,KAAK,EAAE,MAAM,EAAE,QAAiB,KAAK,EAAE,EAAE;IACpE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAE9C,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,oCAAoC,CAAA;QAC5C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,aAAK,CAAC,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;aAChF,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,IAAI,KAAK,GAAG,MAAM,IAAA,qBAAa,EAAC,aAAK,CAAC,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;aAClF,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,iCAAiC,CAAA;QACzC,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,cAAc,GAClB,KAAK,CAAC,KAAK,IAAI,UAAU;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,4BAAY,CAAC;qBAC9B,kBAAkB,CAAC,SAAS,CAAC;qBAC7B,KAAK,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;qBACnE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC;qBAClC,KAAK,CAAC,CAAC,CAAC;qBACR,MAAM,EAAE,CAAA;YAEjB,KAAK,GAAG,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC,KAAK,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACrB,CAAC;QAED,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAA,sBAAc,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,KAAK;QACL,KAAK;KACN,CAAA;AACH,CAAC,CAAA;AA9CY,QAAA,aAAa,iBA8CzB","sourcesContent":["import { In } from 'typeorm'\nimport { getContextPath, getRepository } from '@things-factory/shell'\n\nimport { Board } from '../service/board/board'\nimport { BoardHistory } from '../service/board/board-history'\n\nexport const headlessModel = async (target, draft: boolean = false) => {\n var { domain, id, model, name } = target || {}\n\n if (model) {\n if (typeof model == 'string') {\n model = JSON.parse(model)\n } else if (typeof model !== 'object') {\n throw 'model should be a string or object'\n }\n } else {\n if (id) {\n var board = await getRepository(Board).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id }\n })\n } else if (name) {\n var board = await getRepository(Board).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, name }\n })\n } else {\n throw 'parameter model or id mandatory'\n }\n\n if (!draft && board) {\n const latestReleased =\n board.state == 'released'\n ? board\n : await getRepository(BoardHistory)\n .createQueryBuilder('history')\n .where('history.originalId = :originalId', { originalId: board.id })\n .orderBy('history.version', 'DESC')\n .limit(1)\n .getOne()\n\n model = (latestReleased || board).model\n } else {\n model = board.model\n }\n\n model = JSON.parse(model)\n }\n\n return {\n base: getContextPath(domain?.subdomain) + (domain ? '/' : ''),\n model,\n board\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { PlayGroup } from '../service/play-group/play-group';
2
+ export declare const headlessPlaylist: (target: any, draft?: boolean) => Promise<{
3
+ base: string;
4
+ playGroup: PlayGroup;
5
+ }>;
@@ -1 +1 @@
1
- {"version":3,"file":"headless-playlist.js","sourceRoot":"","sources":["../../server/controllers/headless-playlist.ts"],"names":[],"mappings":"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","sourcesContent":["import { getContextPath, getRepository } from '@things-factory/shell'\n\nimport { PlayGroup } from '../service/play-group/play-group'\nimport { BoardHistory } from '../service/board/board-history'\n\nexport const headlessPlaylist = async (target, draft: boolean = false) => {\n var { domain, id, name } = target || {}\n\n if (id || name) {\n const repository = getRepository(PlayGroup)\n\n if (id) {\n var playGroup = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['boards']\n })\n } else if (name) {\n var playGroup = await repository.findOne({\n where: { domain: { id: domain.id }, name },\n relations: ['boards']\n })\n }\n\n if (!draft && playGroup) {\n const { boards } = playGroup\n for (let board of boards) {\n const latestReleased =\n board.state == 'released'\n ? board\n : await getRepository(BoardHistory)\n .createQueryBuilder('history')\n .where('history.originalId = :originalId', { originalId: board.id })\n .orderBy('history.version', 'DESC')\n .limit(1)\n .getOne()\n\n if (latestReleased) {\n board.model = latestReleased.model\n }\n }\n }\n\n playGroup.boards = playGroup.boards.sort((a, b) => {\n // 배열 A에 포함된 아이디의 순서를 가져옵니다.\n const indexOfOrder = (playGroup.order || []).indexOf(a.id)\n const indexOfBoards = (playGroup.order || []).indexOf(b.id)\n\n // 두 아이디의 순서를 비교하여 정렬합니다.\n if (indexOfOrder === -1 && indexOfBoards === -1) {\n // 두 아이디 모두 배열 A에 없는 경우, 그대로 유지합니다.\n return 0\n } else if (indexOfOrder === -1) {\n // 아이디 A만 배열 A에 없는 경우, 아이디 B를 먼저 정렬합니다.\n return 1\n } else if (indexOfBoards === -1) {\n // 아이디 B만 배열 A에 없는 경우, 아이디 A를 먼저 정렬합니다.\n return -1\n } else {\n // 두 아이디 모두 배열 A에 있는 경우, 배열 A의 아이디 순서대로 정렬합니다.\n return indexOfOrder - indexOfBoards\n }\n })\n } else {\n throw 'parameter id or name mandatory'\n }\n\n return {\n base: getContextPath(domain?.subdomain) + (domain ? '/' : ''),\n playGroup\n }\n}\n"]}
1
+ {"version":3,"file":"headless-playlist.js","sourceRoot":"","sources":["../../server/controllers/headless-playlist.ts"],"names":[],"mappings":"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","sourcesContent":["import { getContextPath, getRepository } from '@things-factory/shell'\n\nimport { PlayGroup } from '../service/play-group/play-group'\nimport { BoardHistory } from '../service/board/board-history'\n\nexport const headlessPlaylist = async (target, draft: boolean = false) => {\n var { domain, id, name } = target || {}\n\n if (id || name) {\n const repository = getRepository(PlayGroup)\n\n if (id) {\n var playGroup = await repository.findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['boards']\n })\n } else if (name) {\n var playGroup = await repository.findOne({\n where: { domain: { id: domain.id }, name },\n relations: ['boards']\n })\n }\n\n if (!draft && playGroup) {\n const { boards } = playGroup\n for (let board of boards) {\n const latestReleased =\n board.state == 'released'\n ? board\n : await getRepository(BoardHistory)\n .createQueryBuilder('history')\n .where('history.originalId = :originalId', { originalId: board.id })\n .orderBy('history.version', 'DESC')\n .limit(1)\n .getOne()\n\n if (latestReleased) {\n board.model = latestReleased.model\n }\n }\n }\n\n playGroup.boards = playGroup.boards.sort((a, b) => {\n // 배열 A에 포함된 아이디의 순서를 가져옵니다.\n const indexOfOrder = (playGroup.order || []).indexOf(a.id)\n const indexOfBoards = (playGroup.order || []).indexOf(b.id)\n\n // 두 아이디의 순서를 비교하여 정렬합니다.\n if (indexOfOrder === -1 && indexOfBoards === -1) {\n // 두 아이디 모두 배열 A에 없는 경우, 그대로 유지합니다.\n return 0\n } else if (indexOfOrder === -1) {\n // 아이디 A만 배열 A에 없는 경우, 아이디 B를 먼저 정렬합니다.\n return 1\n } else if (indexOfBoards === -1) {\n // 아이디 B만 배열 A에 없는 경우, 아이디 A를 먼저 정렬합니다.\n return -1\n } else {\n // 두 아이디 모두 배열 A에 있는 경우, 배열 A의 아이디 순서대로 정렬합니다.\n return indexOfOrder - indexOfBoards\n }\n })\n } else {\n throw 'parameter id or name mandatory'\n }\n\n return {\n base: getContextPath(domain?.subdomain) + (domain ? '/' : ''),\n playGroup\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function getHeadlessPool(): any;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getHeadlessPool = void 0;
3
+ exports.getHeadlessPool = getHeadlessPool;
4
4
  const tslib_1 = require("tslib");
5
5
  const genericPool = tslib_1.__importStar(require("generic-pool"));
6
6
  const env_1 = require("@things-factory/env");
@@ -41,7 +41,6 @@ function getHeadlessPool() {
41
41
  }
42
42
  return headlessPool;
43
43
  }
44
- exports.getHeadlessPool = getHeadlessPool;
45
44
  const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
46
45
  async function initializeChromium() {
47
46
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"headless-pool-for-board.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-board.ts"],"names":[],"mappings":";;;;AAAA,kEAA2C;AAE3C,6CAAoD;AAEpD,IAAI;IACF,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrC;AAAC,OAAO,GAAG,EAAE;IACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;CAClB;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,WAAW,CAAC,UAAU,CACnC;YACE,MAAM;gBACJ,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;gBACtD,OAAO,kBAAkB,EAAE,CAAA;YAC7B,CAAC;YACD,QAAQ,CAAC,OAAO;gBACd,OAAO,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;oBACtD,OAAO;wBACL,YAAY;yBACX,OAAO,EAAE;yBACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;yBACf,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,CAAC,OAAO;gBACb,YAAY;gBACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;YACxB,CAAC;SACF,EACD;YACE,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,EAAE;YACP,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,KAAK;SAC5B,CACF,CAAA;KACF;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAjCD,0CAiCC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI;QACF,IAAI,CAAC,SAAS,EAAE;YACd,OAAM;SACP;QAED,IAAI,aAAa,GAAG;YAClB,IAAI,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC;YAC3E,QAAQ,EAAE,OAAO;SAClB,CAAA;QAED,IAAI,aAAa,EAAE;YACjB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;SAChD;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;KACf;IAAC,OAAO,GAAG,EAAE;QACZ,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KAClB;AACH,CAAC","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-board about to create')\n return initializeChromium()\n },\n validate(browser) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy(browser) {\n //@ts-ignore\n return browser.close()\n }\n },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n }\n\n return headlessPool\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n"]}
1
+ {"version":3,"file":"headless-pool-for-board.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-board.ts"],"names":[],"mappings":";;AAYA,0CAiCC;;AA7CD,kEAA2C;AAE3C,6CAAoD;AAEpD,IAAI,CAAC;IACH,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,WAAW,CAAC,UAAU,CACnC;YACE,MAAM;gBACJ,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;gBACtD,OAAO,kBAAkB,EAAE,CAAA;YAC7B,CAAC;YACD,QAAQ,CAAC,OAAO;gBACd,OAAO,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;oBACtD,OAAO;wBACL,YAAY;yBACX,OAAO,EAAE;yBACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;yBACf,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,CAAC,OAAO;gBACb,YAAY;gBACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;YACxB,CAAC;SACF,EACD;YACE,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,EAAE;YACP,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,KAAK;SAC5B,CACF,CAAA;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,IAAI,aAAa,GAAG;YAClB,IAAI,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC;YAC3E,QAAQ,EAAE,OAAO;SAClB,CAAA;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;AACH,CAAC","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-board about to create')\n return initializeChromium()\n },\n validate(browser) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy(browser) {\n //@ts-ignore\n return browser.close()\n }\n },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n }\n\n return headlessPool\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function getHeadlessPool(): any;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getHeadlessPool = void 0;
3
+ exports.getHeadlessPool = getHeadlessPool;
4
4
  const tslib_1 = require("tslib");
5
5
  const genericPool = tslib_1.__importStar(require("generic-pool"));
6
6
  const env_1 = require("@things-factory/env");
@@ -44,16 +44,11 @@ function getHeadlessPool() {
44
44
  var _a, e_1, _b, _c;
45
45
  const eventSource = shell_1.pubsub.subscribe('notify-font-changed');
46
46
  try {
47
- for (var _d = true, eventSource_1 = tslib_1.__asyncValues(eventSource), eventSource_1_1; eventSource_1_1 = await eventSource_1.next(), _a = eventSource_1_1.done, !_a;) {
47
+ for (var _d = true, eventSource_1 = tslib_1.__asyncValues(eventSource), eventSource_1_1; eventSource_1_1 = await eventSource_1.next(), _a = eventSource_1_1.done, !_a; _d = true) {
48
48
  _c = eventSource_1_1.value;
49
49
  _d = false;
50
- try {
51
- const data = _c;
52
- headlessPool.clear();
53
- }
54
- finally {
55
- _d = true;
56
- }
50
+ const data = _c;
51
+ headlessPool.clear();
57
52
  }
58
53
  }
59
54
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -67,7 +62,6 @@ function getHeadlessPool() {
67
62
  }
68
63
  return headlessPool;
69
64
  }
70
- exports.getHeadlessPool = getHeadlessPool;
71
65
  const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
72
66
  async function initializeChromium() {
73
67
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"headless-pool-for-label.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-label.ts"],"names":[],"mappings":"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","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\nimport { pubsub } from '@things-factory/shell'\n\nimport { fonts } from './fonts'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-label about to create')\n return initializeScenePage()\n },\n validate({ browser, page }) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy({ browser, page }) {\n //@ts-ignore\n return browser.close()\n }\n },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n\n setTimeout(async () => {\n const eventSource = pubsub.subscribe('notify-font-changed')\n for await (const data of eventSource) {\n headlessPool.clear()\n }\n })\n }\n\n return headlessPool\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n\nasync function initializeScenePage() {\n /* get brand new browser for every request */\n const browser = await initializeChromium()\n\n if (!browser) {\n return\n }\n\n const protocol = 'http'\n const host = 'localhost'\n const path = '/internal-label-command-view'\n\n const port = process.env.PORT\n const url = `${protocol}://${host}:${port}${path}`\n\n const page = await browser.newPage()\n const [fontsToUse, fontStyles] = await fonts()\n\n await page.setRequestInterception(true)\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 page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n postData: JSON.stringify({\n fonts: fontsToUse,\n fontStyles\n })\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url, { timeout: 0, waitUntil: 'load' })\n\n return { browser, page }\n}\n"]}
1
+ {"version":3,"file":"headless-pool-for-label.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-label.ts"],"names":[],"mappings":"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","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\nimport { pubsub } from '@things-factory/shell'\n\nimport { fonts } from './fonts'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-label about to create')\n return initializeScenePage()\n },\n validate({ browser, page }) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy({ browser, page }) {\n //@ts-ignore\n return browser.close()\n }\n },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n\n setTimeout(async () => {\n const eventSource = pubsub.subscribe('notify-font-changed')\n for await (const data of eventSource) {\n headlessPool.clear()\n }\n })\n }\n\n return headlessPool\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n\nasync function initializeScenePage() {\n /* get brand new browser for every request */\n const browser = await initializeChromium()\n\n if (!browser) {\n return\n }\n\n const protocol = 'http'\n const host = 'localhost'\n const path = '/internal-label-command-view'\n\n const port = process.env.PORT\n const url = `${protocol}://${host}:${port}${path}`\n\n const page = await browser.newPage()\n const [fontsToUse, fontStyles] = await fonts()\n\n await page.setRequestInterception(true)\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 page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n postData: JSON.stringify({\n fonts: fontsToUse,\n fontStyles\n })\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url, { timeout: 0, waitUntil: 'load' })\n\n return { browser, page }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { printDirect, getPrinters } from './print';
2
+ export declare const Printer: {
3
+ printDirect: typeof printDirect;
4
+ getPrinters: typeof getPrinters;
5
+ };
6
+ export declare const BoardFunc: {
7
+ boardToZpl: ({ id, model, data, orientation, mirror, upsideDown, context, draft }: {
8
+ id: any;
9
+ model: any;
10
+ data: any;
11
+ orientation: any;
12
+ mirror?: boolean;
13
+ upsideDown?: boolean;
14
+ context: any;
15
+ draft?: boolean;
16
+ }) => Promise<string>;
17
+ boardToPdf: ({ id, model, data, width: w, height: h, options, context }?: {
18
+ id?: string;
19
+ model?: any;
20
+ data?: any;
21
+ width?: number;
22
+ height?: number;
23
+ options?: any;
24
+ context?: any;
25
+ }) => Promise<any>;
26
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 라벨 출력
3
+ *
4
+ * @param {String} id 모델 ID
5
+ * @param {Object} data 매핑할 데이터
6
+ * @param {String} orientation (시계방향) N: 0, R: 90, I: 180, B: 270
7
+ * @param {boolean} mirror 좌우반전
8
+ * @param {boolean} upsideDown 상하반전
9
+ */
10
+ export declare const labelcommand: ({ id, model, data, orientation, mirror, upsideDown, context, draft }: {
11
+ id: any;
12
+ model: any;
13
+ data: any;
14
+ orientation: any;
15
+ mirror?: boolean;
16
+ upsideDown?: boolean;
17
+ context: any;
18
+ draft?: boolean;
19
+ }) => Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"label-command.js","sourceRoot":"","sources":["../../server/controllers/label-command.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uEAA2D;AAC3D,qDAAgD;AAEhD;;;;;;;;GAQG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,EAAE;IACjI,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEhC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,yCAAe,GAAE,CAAC,OAAO,EAAE,CAAQ,CAAA;IAC1D,IAAI,CAAC,OAAO,EAAE;QACZ,OAAM;KACP;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAExB,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,8BAAa,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;IAEjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC7B,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;QACrD,YAAY;QACZ,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,IAAI,EAAE;YACR,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;SACd;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,aAAa;YACb,qBAAqB,CAAC,GAAG,EAAE;gBACzB,aAAa;gBACb,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;gBACnE,OAAO,CAAC,GAAG,CAAC,CAAA;gBACZ,aAAa;gBACb,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACpC,CAAC,CAAC,OAAO,EAAE,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,KAAK,EACL,IAAI,EACJ,WAAW,EACX,MAAM,EACN,UAAU,CACX,CAAA;IAED,IAAA,yCAAe,GAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO;;OAEF,GAAG;;IAEN,CAAA;AACJ,CAAC,CAAA;AA7CY,QAAA,YAAY,gBA6CxB","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { getHeadlessPool } from './headless-pool-for-label'\nimport { headlessModel } from './headless-model'\n\n/**\n * 라벨 출력\n *\n * @param {String} id 모델 ID\n * @param {Object} data 매핑할 데이터\n * @param {String} orientation (시계방향) N: 0, R: 90, I: 180, B: 270\n * @param {boolean} mirror 좌우반전\n * @param {boolean} upsideDown 상하반전\n */\nexport const labelcommand = async ({ id, model, data, orientation, mirror = false, upsideDown = false, context, draft = false }) => {\n const { domain } = context.state\n\n const browser = (await getHeadlessPool().acquire()) as any\n if (!browser) {\n return\n }\n\n const { page } = browser\n\n var { model } = await headlessModel({ domain, model, id }, draft)\n\n const grf = await page.evaluate(\n async (model, data, orientation, mirror, upsideDown) => {\n //@ts-ignore\n let s = createScene(model)\n if (data) {\n s.data = data\n }\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => {\n // @ts-ignore\n let grf = imageDataToGrf(s, model, orientation, mirror, upsideDown)\n resolve(grf)\n // @ts-ignore\n sceneContainer.removeChild(s.target)\n s.dispose()\n })\n })\n },\n model,\n data,\n orientation,\n mirror,\n upsideDown\n )\n\n getHeadlessPool().release(browser)\n\n return `\n^XA\n^GFA,${grf}\n^FS\n^XZ`\n}\n"]}
1
+ {"version":3,"file":"label-command.js","sourceRoot":"","sources":["../../server/controllers/label-command.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uEAA2D;AAC3D,qDAAgD;AAEhD;;;;;;;;GAQG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,EAAE;IACjI,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEhC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,yCAAe,GAAE,CAAC,OAAO,EAAE,CAAQ,CAAA;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAM;IACR,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAExB,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,8BAAa,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;IAEjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC7B,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;QACrD,YAAY;QACZ,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;QACf,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,aAAa;YACb,qBAAqB,CAAC,GAAG,EAAE;gBACzB,aAAa;gBACb,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;gBACnE,OAAO,CAAC,GAAG,CAAC,CAAA;gBACZ,aAAa;gBACb,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACpC,CAAC,CAAC,OAAO,EAAE,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,KAAK,EACL,IAAI,EACJ,WAAW,EACX,MAAM,EACN,UAAU,CACX,CAAA;IAED,IAAA,yCAAe,GAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO;;OAEF,GAAG;;IAEN,CAAA;AACJ,CAAC,CAAA;AA7CY,QAAA,YAAY,gBA6CxB","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { getHeadlessPool } from './headless-pool-for-label'\nimport { headlessModel } from './headless-model'\n\n/**\n * 라벨 출력\n *\n * @param {String} id 모델 ID\n * @param {Object} data 매핑할 데이터\n * @param {String} orientation (시계방향) N: 0, R: 90, I: 180, B: 270\n * @param {boolean} mirror 좌우반전\n * @param {boolean} upsideDown 상하반전\n */\nexport const labelcommand = async ({ id, model, data, orientation, mirror = false, upsideDown = false, context, draft = false }) => {\n const { domain } = context.state\n\n const browser = (await getHeadlessPool().acquire()) as any\n if (!browser) {\n return\n }\n\n const { page } = browser\n\n var { model } = await headlessModel({ domain, model, id }, draft)\n\n const grf = await page.evaluate(\n async (model, data, orientation, mirror, upsideDown) => {\n //@ts-ignore\n let s = createScene(model)\n if (data) {\n s.data = data\n }\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => {\n // @ts-ignore\n let grf = imageDataToGrf(s, model, orientation, mirror, upsideDown)\n resolve(grf)\n // @ts-ignore\n sceneContainer.removeChild(s.target)\n s.dispose()\n })\n })\n },\n model,\n data,\n orientation,\n mirror,\n upsideDown\n )\n\n getHeadlessPool().release(browser)\n\n return `\n^XA\n^GFA,${grf}\n^FS\n^XZ`\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const pdf: ({ id, model, data, width: w, height: h, options, context }?: {
2
+ id?: string;
3
+ model?: any;
4
+ data?: any;
5
+ width?: number;
6
+ height?: number;
7
+ options?: any;
8
+ context?: any;
9
+ }) => Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../server/controllers/pdf.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const pdf = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = {} as any,\n context = {} as any\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n\n if (!browser) {\n return\n }\n\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n let { width, height } = model\n\n width = Number(width)\n height = Number(height)\n\n if (!w) {\n w = width\n }\n if (!h) {\n h = height\n }\n\n let ratio = Math.min(w / width, h / height)\n\n width = Math.floor(width * ratio)\n height = Math.floor(height * ratio)\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n const page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\n await page.setRequestInterception(true)\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 token = await user?.sign() // TODO improve performance\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(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n const pdf = await page.pdf({\n format: 'A4',\n ...options\n })\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return pdf\n}\n"]}
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../server/controllers/pdf.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const pdf = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = {} as any,\n context = {} as any\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n\n if (!browser) {\n return\n }\n\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n let { width, height } = model\n\n width = Number(width)\n height = Number(height)\n\n if (!w) {\n w = width\n }\n if (!h) {\n h = height\n }\n\n let ratio = Math.min(w / width, h / height)\n\n width = Math.floor(width * ratio)\n height = Math.floor(height * ratio)\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n const page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\n await page.setRequestInterception(true)\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 token = await user?.sign() // TODO improve performance\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(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n const pdf = await page.pdf({\n format: 'A4',\n ...options\n })\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return pdf\n}\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * shoot raw data to printer
3
+ *
4
+ * @param printer Printer ID
5
+ * @param command Raw command
6
+ */
7
+ export declare function printDirect(printer: any, command: any): Promise<void>;
8
+ /**
9
+ * get all installed printers
10
+ */
11
+ export declare function getPrinters(): any;
12
+ /**
13
+ * get specific printer by name
14
+ * @param printerName printer name
15
+ */
16
+ export declare function getPrinter(printerName: any): any;
17
+ /**
18
+ * get default printer name
19
+ */
20
+ export declare function getDefaultPrinterName(): any;
21
+ export declare function getSupportedPrintFormats(): any;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSupportedPrintFormats = exports.getDefaultPrinterName = exports.getPrinter = exports.getPrinters = exports.printDirect = void 0;
3
+ exports.printDirect = printDirect;
4
+ exports.getPrinters = getPrinters;
5
+ exports.getPrinter = getPrinter;
6
+ exports.getDefaultPrinterName = getDefaultPrinterName;
7
+ exports.getSupportedPrintFormats = getSupportedPrintFormats;
4
8
  const env_1 = require("@things-factory/env");
5
9
  try {
6
10
  var print = require('@thiagoelg/node-printer');
@@ -28,14 +32,12 @@ async function printDirect(printer, command) {
28
32
  }
29
33
  }));
30
34
  }
31
- exports.printDirect = printDirect;
32
35
  /**
33
36
  * get all installed printers
34
37
  */
35
38
  function getPrinters() {
36
39
  return (print === null || print === void 0 ? void 0 : print.getPrinters()) || [];
37
40
  }
38
- exports.getPrinters = getPrinters;
39
41
  /**
40
42
  * get specific printer by name
41
43
  * @param printerName printer name
@@ -43,16 +45,13 @@ exports.getPrinters = getPrinters;
43
45
  function getPrinter(printerName) {
44
46
  return print === null || print === void 0 ? void 0 : print.getPrinter(printerName);
45
47
  }
46
- exports.getPrinter = getPrinter;
47
48
  /**
48
49
  * get default printer name
49
50
  */
50
51
  function getDefaultPrinterName() {
51
52
  return print === null || print === void 0 ? void 0 : print.getDefaultPrinterName();
52
53
  }
53
- exports.getDefaultPrinterName = getDefaultPrinterName;
54
54
  function getSupportedPrintFormats() {
55
55
  return print === null || print === void 0 ? void 0 : print.getSupportedPrintFormats();
56
56
  }
57
- exports.getSupportedPrintFormats = getSupportedPrintFormats;
58
57
  //# sourceMappingURL=print.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"print.js","sourceRoot":"","sources":["../../server/controllers/print.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAE5C,IAAI;IACF,IAAI,KAAK,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;CAC/C;AAAC,OAAO,CAAC,EAAE;IACV,YAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;CAChB;AAED;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO;IAChD,KAAK;QACH,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,OAAO;YACP,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,UAAU,KAAK;gBACtB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAA;YACjC,CAAC;YACD,KAAK,EAAE,UAAU,KAAK;gBACpB,YAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SACF,CAAC,CAAC,CAAA;AACP,CAAC;AAbD,kCAaC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,EAAE,KAAI,EAAE,CAAA;AACnC,CAAC;AAFD,kCAEC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,WAAW;IACpC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAC,WAAW,CAAC,CAAA;AACvC,CAAC;AAFD,gCAEC;AAED;;GAEG;AACH,SAAgB,qBAAqB;IACnC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,qBAAqB,EAAE,CAAA;AACvC,CAAC;AAFD,sDAEC;AAED,SAAgB,wBAAwB;IACtC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,wBAAwB,EAAE,CAAA;AAC1C,CAAC;AAFD,4DAEC","sourcesContent":["import { logger } from '@things-factory/env'\n\ntry {\n var print = require('@thiagoelg/node-printer')\n} catch (e) {\n logger.error(e)\n}\n\n/**\n * shoot raw data to printer\n *\n * @param printer Printer ID\n * @param command Raw command\n */\nexport async function printDirect(printer, command) {\n print &&\n (await print.printDirect({\n data: command,\n printer,\n docname: 'RAW print',\n success: function (jobId) {\n console.log(`Job ID: ${jobId}`)\n },\n error: function (error) {\n logger.error(error)\n }\n }))\n}\n\n/**\n * get all installed printers\n */\nexport function getPrinters() {\n return print?.getPrinters() || []\n}\n\n/**\n * get specific printer by name\n * @param printerName printer name\n */\nexport function getPrinter(printerName) {\n return print?.getPrinter(printerName)\n}\n\n/**\n * get default printer name\n */\nexport function getDefaultPrinterName() {\n return print?.getDefaultPrinterName()\n}\n\nexport function getSupportedPrintFormats() {\n return print?.getSupportedPrintFormats()\n}\n"]}
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../../server/controllers/print.ts"],"names":[],"mappings":";;AAcA,kCAaC;AAKD,kCAEC;AAMD,gCAEC;AAKD,sDAEC;AAED,4DAEC;AArDD,6CAA4C;AAE5C,IAAI,CAAC;IACH,IAAI,KAAK,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;AAChD,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,YAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO;IAChD,KAAK;QACH,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,OAAO;YACP,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,UAAU,KAAK;gBACtB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAA;YACjC,CAAC;YACD,KAAK,EAAE,UAAU,KAAK;gBACpB,YAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SACF,CAAC,CAAC,CAAA;AACP,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,EAAE,KAAI,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,WAAW;IACpC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAC,WAAW,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB;IACnC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,qBAAqB,EAAE,CAAA;AACvC,CAAC;AAED,SAAgB,wBAAwB;IACtC,OAAO,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,wBAAwB,EAAE,CAAA;AAC1C,CAAC","sourcesContent":["import { logger } from '@things-factory/env'\n\ntry {\n var print = require('@thiagoelg/node-printer')\n} catch (e) {\n logger.error(e)\n}\n\n/**\n * shoot raw data to printer\n *\n * @param printer Printer ID\n * @param command Raw command\n */\nexport async function printDirect(printer, command) {\n print &&\n (await print.printDirect({\n data: command,\n printer,\n docname: 'RAW print',\n success: function (jobId) {\n console.log(`Job ID: ${jobId}`)\n },\n error: function (error) {\n logger.error(error)\n }\n }))\n}\n\n/**\n * get all installed printers\n */\nexport function getPrinters() {\n return print?.getPrinters() || []\n}\n\n/**\n * get specific printer by name\n * @param printerName printer name\n */\nexport function getPrinter(printerName) {\n return print?.getPrinter(printerName)\n}\n\n/**\n * get default printer name\n */\nexport function getDefaultPrinterName() {\n return print?.getDefaultPrinterName()\n}\n\nexport function getSupportedPrintFormats() {\n return print?.getSupportedPrintFormats()\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const screenshot: ({ id, model, data, width: w, height: h, options, isThumbnail, context, draft }?: {
2
+ id?: string;
3
+ model?: any;
4
+ data?: any;
5
+ width?: number;
6
+ height?: number;
7
+ options?: any;
8
+ isThumbnail?: boolean;
9
+ context?: any;
10
+ draft?: boolean;
11
+ }) => Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../server/controllers/screenshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const screenshot = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = { encoding: 'base64' } as any,\n isThumbnail = false,\n context = {} as any,\n draft = false\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n var screenshot = null\n\n if (!browser) {\n return\n }\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model }, draft)\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n var { width, height } = model\n\n if (isThumbnail) {\n var widthRatio = 400 / width,\n heightRatio = 300 / height\n var ratio = widthRatio < heightRatio ? widthRatio : heightRatio\n width = width * ratio\n height = height * ratio\n }\n width = Math.floor(w || Number(width))\n height = Math.floor(h || Number(height))\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n\n var page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\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 token = await user?.sign() // TODO improve performance\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 await page.goto(url)\n\n await page.evaluate(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n screenshot = await page.screenshot(options)\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return screenshot\n}\n"]}
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../server/controllers/screenshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const screenshot = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = { encoding: 'base64' } as any,\n isThumbnail = false,\n context = {} as any,\n draft = false\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n var screenshot = null\n\n if (!browser) {\n return\n }\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model }, draft)\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n var { width, height } = model\n\n if (isThumbnail) {\n var widthRatio = 400 / width,\n heightRatio = 300 / height\n var ratio = widthRatio < heightRatio ? widthRatio : heightRatio\n width = width * ratio\n height = height * ratio\n }\n width = Math.floor(w || Number(width))\n height = Math.floor(h || Number(height))\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n\n var page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\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 token = await user?.sign() // TODO improve performance\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 await page.goto(url)\n\n await page.evaluate(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n screenshot = await page.screenshot(options)\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return screenshot\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export declare const thumbnail: ({ id, model, data, options, context }?: {
2
+ id?: string;
3
+ model?: any;
4
+ data?: any;
5
+ options?: any;
6
+ context?: {};
7
+ }) => Promise<any>;
@@ -0,0 +1 @@
1
+ export * from './license-error';
@@ -0,0 +1,11 @@
1
+ type LicenseErrorArgument = {
2
+ errorCode: string;
3
+ detail?: Object;
4
+ };
5
+ export declare class LicenseError extends Error {
6
+ static get ERROR_CODES(): any;
7
+ errorCode: any;
8
+ detail: Object;
9
+ constructor({ errorCode, detail }: LicenseErrorArgument);
10
+ }
11
+ export {};
@@ -0,0 +1,5 @@
1
+ export * from './service';
2
+ export * from './migrations';
3
+ export * from './controllers';
4
+ import './routes';
5
+ export declare function initMiddlewares(app: any): void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initMiddlewares = void 0;
3
+ exports.initMiddlewares = initMiddlewares;
4
4
  const tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("./service"), exports);
6
6
  tslib_1.__exportStar(require("./migrations"), exports);
@@ -32,5 +32,4 @@ function initMiddlewares(app) {
32
32
  await next();
33
33
  });
34
34
  }
35
- exports.initMiddlewares = initMiddlewares;
36
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oDAAyB;AACzB,uDAA4B;AAC5B,wDAA6B;AAE7B,oBAAiB;AAEjB,qFAAuE;AAEvE,SAAgB,eAAe,CAAC,GAAG;IACjC,MAAM,mBAAmB,GAAG,CAAC,IAAA,uCAAa,EAAC,6BAA6B,CAAC,IAAI,kBAAkB,CAAC;SAC7F,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAErB,MAAM,UAAU,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;QAC9D;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,OAAO;SAClB;QACD;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,gBAAgB;SAC3B;KACF,CAAA;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,UAAU,EAAE;YACd,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YAE9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAA;SACtF;QACD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AA3BD,0CA2BC","sourcesContent":["export * from './service'\nexport * from './migrations'\nexport * from './controllers'\n\nimport './routes'\n\nimport { getPermission } from '@things-factory/operato-license-checker'\n\nexport function initMiddlewares(app) {\n const licensedPermissions = (getPermission('Permissions For Board Usage') || 'Modeller, Viewer')\n .split(',')\n .map(p => p.trim())\n\n const prohibited = !licensedPermissions.includes('Modeller') && [\n {\n privilege: 'mutation',\n category: 'board'\n },\n {\n privilege: 'mutation',\n category: 'board-template'\n }\n ]\n\n /*\n * board-permission을 prohibitedPrivileges에 반영한다.\n */\n app.use(async (context, next) => {\n if (prohibited) {\n const { prohibitedPrivileges } = context.state\n\n context.state.prohibitedPrivileges = [...(prohibitedPrivileges || []), ...prohibited]\n }\n await next()\n })\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;AAQA,0CA2BC;;AAnCD,oDAAyB;AACzB,uDAA4B;AAC5B,wDAA6B;AAE7B,oBAAiB;AAEjB,qFAAuE;AAEvE,SAAgB,eAAe,CAAC,GAAG;IACjC,MAAM,mBAAmB,GAAG,CAAC,IAAA,uCAAa,EAAC,6BAA6B,CAAC,IAAI,kBAAkB,CAAC;SAC7F,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAErB,MAAM,UAAU,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;QAC9D;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,OAAO;SAClB;QACD;YACE,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,gBAAgB;SAC3B;KACF,CAAA;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YAE9C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["export * from './service'\nexport * from './migrations'\nexport * from './controllers'\n\nimport './routes'\n\nimport { getPermission } from '@things-factory/operato-license-checker'\n\nexport function initMiddlewares(app) {\n const licensedPermissions = (getPermission('Permissions For Board Usage') || 'Modeller, Viewer')\n .split(',')\n .map(p => p.trim())\n\n const prohibited = !licensedPermissions.includes('Modeller') && [\n {\n privilege: 'mutation',\n category: 'board'\n },\n {\n privilege: 'mutation',\n category: 'board-template'\n }\n ]\n\n /*\n * board-permission을 prohibitedPrivileges에 반영한다.\n */\n app.use(async (context, next) => {\n if (prohibited) {\n const { prohibitedPrivileges } = context.state\n\n context.state.prohibitedPrivileges = [...(prohibitedPrivileges || []), ...prohibited]\n }\n await next()\n })\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class SeedGroup1556862253000 implements MigrationInterface {
3
+ up(queryRunner: QueryRunner): Promise<any>;
4
+ down(queryRunner: QueryRunner): Promise<any>;
5
+ }