@signstack/cli 0.1.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.
Files changed (269) hide show
  1. package/README.md +458 -0
  2. package/bin/run.js +12 -0
  3. package/dist/apps/signstack-cli/schemas/asset.schema.json +220 -0
  4. package/dist/apps/signstack-cli/schemas/blueprint.schema.json +485 -0
  5. package/dist/apps/signstack-cli/schemas/jsonata-function.schema.json +185 -0
  6. package/dist/apps/signstack-cli/schemas/schema.schema.json +97 -0
  7. package/dist/apps/signstack-cli/schemas/template.schema.json +295 -0
  8. package/dist/apps/signstack-cli/src/commands/auth/login.d.ts +25 -0
  9. package/dist/apps/signstack-cli/src/commands/auth/login.js +229 -0
  10. package/dist/apps/signstack-cli/src/commands/auth/login.js.map +1 -0
  11. package/dist/apps/signstack-cli/src/commands/auth/logout.d.ts +10 -0
  12. package/dist/apps/signstack-cli/src/commands/auth/logout.js +59 -0
  13. package/dist/apps/signstack-cli/src/commands/auth/logout.js.map +1 -0
  14. package/dist/apps/signstack-cli/src/commands/auth/whoami.d.ts +9 -0
  15. package/dist/apps/signstack-cli/src/commands/auth/whoami.js +85 -0
  16. package/dist/apps/signstack-cli/src/commands/auth/whoami.js.map +1 -0
  17. package/dist/apps/signstack-cli/src/commands/generate.d.ts +51 -0
  18. package/dist/apps/signstack-cli/src/commands/generate.js +479 -0
  19. package/dist/apps/signstack-cli/src/commands/generate.js.map +1 -0
  20. package/dist/apps/signstack-cli/src/commands/preview.d.ts +24 -0
  21. package/dist/apps/signstack-cli/src/commands/preview.js +162 -0
  22. package/dist/apps/signstack-cli/src/commands/preview.js.map +1 -0
  23. package/dist/apps/signstack-cli/src/commands/pull.d.ts +28 -0
  24. package/dist/apps/signstack-cli/src/commands/pull.js +244 -0
  25. package/dist/apps/signstack-cli/src/commands/pull.js.map +1 -0
  26. package/dist/apps/signstack-cli/src/commands/push.d.ts +46 -0
  27. package/dist/apps/signstack-cli/src/commands/push.js +460 -0
  28. package/dist/apps/signstack-cli/src/commands/push.js.map +1 -0
  29. package/dist/apps/signstack-cli/src/commands/run.d.ts +22 -0
  30. package/dist/apps/signstack-cli/src/commands/run.js +126 -0
  31. package/dist/apps/signstack-cli/src/commands/run.js.map +1 -0
  32. package/dist/apps/signstack-cli/src/commands/test.d.ts +6 -0
  33. package/dist/apps/signstack-cli/src/commands/test.js +25 -0
  34. package/dist/apps/signstack-cli/src/commands/test.js.map +1 -0
  35. package/dist/apps/signstack-cli/src/commands/validate.d.ts +59 -0
  36. package/dist/apps/signstack-cli/src/commands/validate.js +558 -0
  37. package/dist/apps/signstack-cli/src/commands/validate.js.map +1 -0
  38. package/dist/apps/signstack-cli/src/index.d.ts +1 -0
  39. package/dist/apps/signstack-cli/src/index.js +2 -0
  40. package/dist/apps/signstack-cli/src/index.js.map +1 -0
  41. package/dist/apps/signstack-cli/src/lib/api-client.d.ts +77 -0
  42. package/dist/apps/signstack-cli/src/lib/api-client.js +269 -0
  43. package/dist/apps/signstack-cli/src/lib/api-client.js.map +1 -0
  44. package/dist/apps/signstack-cli/src/lib/base-command.d.ts +38 -0
  45. package/dist/apps/signstack-cli/src/lib/base-command.js +135 -0
  46. package/dist/apps/signstack-cli/src/lib/base-command.js.map +1 -0
  47. package/dist/apps/signstack-cli/src/lib/config.d.ts +47 -0
  48. package/dist/apps/signstack-cli/src/lib/config.js +106 -0
  49. package/dist/apps/signstack-cli/src/lib/config.js.map +1 -0
  50. package/dist/apps/signstack-cli/src/lib/entity-data-resolver.d.ts +31 -0
  51. package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js +107 -0
  52. package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js.map +1 -0
  53. package/dist/apps/signstack-cli/src/lib/local-resource-loader.d.ts +72 -0
  54. package/dist/apps/signstack-cli/src/lib/local-resource-loader.js +238 -0
  55. package/dist/apps/signstack-cli/src/lib/local-resource-loader.js.map +1 -0
  56. package/dist/apps/signstack-cli/src/lib/path-utils.d.ts +4 -0
  57. package/dist/apps/signstack-cli/src/lib/path-utils.js +7 -0
  58. package/dist/apps/signstack-cli/src/lib/path-utils.js.map +1 -0
  59. package/dist/apps/signstack-cli/src/lib/payload-builder.d.ts +127 -0
  60. package/dist/apps/signstack-cli/src/lib/payload-builder.js +545 -0
  61. package/dist/apps/signstack-cli/src/lib/payload-builder.js.map +1 -0
  62. package/dist/apps/signstack-cli/src/lib/preview-handler.d.ts +95 -0
  63. package/dist/apps/signstack-cli/src/lib/preview-handler.js +611 -0
  64. package/dist/apps/signstack-cli/src/lib/preview-handler.js.map +1 -0
  65. package/dist/apps/signstack-cli/src/lib/preview-output-formatter.d.ts +63 -0
  66. package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js +198 -0
  67. package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js.map +1 -0
  68. package/dist/apps/signstack-cli/src/lib/public-api-client.d.ts +13 -0
  69. package/dist/apps/signstack-cli/src/lib/public-api-client.js +39 -0
  70. package/dist/apps/signstack-cli/src/lib/public-api-client.js.map +1 -0
  71. package/dist/apps/signstack-cli/src/lib/resource-puller.d.ts +131 -0
  72. package/dist/apps/signstack-cli/src/lib/resource-puller.js +800 -0
  73. package/dist/apps/signstack-cli/src/lib/resource-puller.js.map +1 -0
  74. package/dist/apps/signstack-cli/src/lib/resource-pusher.d.ts +87 -0
  75. package/dist/apps/signstack-cli/src/lib/resource-pusher.js +361 -0
  76. package/dist/apps/signstack-cli/src/lib/resource-pusher.js.map +1 -0
  77. package/dist/apps/signstack-cli/src/lib/resource-scanner.d.ts +29 -0
  78. package/dist/apps/signstack-cli/src/lib/resource-scanner.js +101 -0
  79. package/dist/apps/signstack-cli/src/lib/resource-scanner.js.map +1 -0
  80. package/dist/apps/signstack-cli/src/lib/resource-validator.d.ts +44 -0
  81. package/dist/apps/signstack-cli/src/lib/resource-validator.js +158 -0
  82. package/dist/apps/signstack-cli/src/lib/resource-validator.js.map +1 -0
  83. package/dist/apps/signstack-cli/src/lib/run-handler.d.ts +47 -0
  84. package/dist/apps/signstack-cli/src/lib/run-handler.js +266 -0
  85. package/dist/apps/signstack-cli/src/lib/run-handler.js.map +1 -0
  86. package/dist/apps/signstack-cli/src/lib/safe-path.d.ts +28 -0
  87. package/dist/apps/signstack-cli/src/lib/safe-path.js +44 -0
  88. package/dist/apps/signstack-cli/src/lib/safe-path.js.map +1 -0
  89. package/dist/apps/signstack-cli/src/lib/scenario-file.d.ts +35 -0
  90. package/dist/apps/signstack-cli/src/lib/scenario-file.js +80 -0
  91. package/dist/apps/signstack-cli/src/lib/scenario-file.js.map +1 -0
  92. package/dist/apps/signstack-cli/src/lib/schema-validator.d.ts +8 -0
  93. package/dist/apps/signstack-cli/src/lib/schema-validator.js +39 -0
  94. package/dist/apps/signstack-cli/src/lib/schema-validator.js.map +1 -0
  95. package/dist/apps/signstack-cli/src/lib/url-validator.d.ts +17 -0
  96. package/dist/apps/signstack-cli/src/lib/url-validator.js +61 -0
  97. package/dist/apps/signstack-cli/src/lib/url-validator.js.map +1 -0
  98. package/dist/apps/signstack-cli/src/lib/yaml-document-parser.d.ts +25 -0
  99. package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js +133 -0
  100. package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js.map +1 -0
  101. package/dist/apps/signstack-cli/src/lib/yaml-transforms.d.ts +3 -0
  102. package/dist/apps/signstack-cli/src/lib/yaml-transforms.js +32 -0
  103. package/dist/apps/signstack-cli/src/lib/yaml-transforms.js.map +1 -0
  104. package/dist/apps/signstack-cli/src/lib/yaml-writer.d.ts +47 -0
  105. package/dist/apps/signstack-cli/src/lib/yaml-writer.js +160 -0
  106. package/dist/apps/signstack-cli/src/lib/yaml-writer.js.map +1 -0
  107. package/dist/apps/signstack-cli/src/types/auth.types.d.ts +48 -0
  108. package/dist/apps/signstack-cli/src/types/auth.types.js +31 -0
  109. package/dist/apps/signstack-cli/src/types/auth.types.js.map +1 -0
  110. package/dist/apps/signstack-cli/src/types/schema.types.d.ts +14 -0
  111. package/dist/apps/signstack-cli/src/types/schema.types.js +16 -0
  112. package/dist/apps/signstack-cli/src/types/schema.types.js.map +1 -0
  113. package/dist/apps/signstack-cli/src/types/yaml.types.d.ts +144 -0
  114. package/dist/apps/signstack-cli/src/types/yaml.types.js +2 -0
  115. package/dist/apps/signstack-cli/src/types/yaml.types.js.map +1 -0
  116. package/dist/libs/common/base/src/index.d.ts +14 -0
  117. package/dist/libs/common/base/src/index.js +44 -0
  118. package/dist/libs/common/base/src/index.js.map +1 -0
  119. package/dist/libs/common/base/src/lib/address.util.d.ts +12 -0
  120. package/dist/libs/common/base/src/lib/address.util.js +55 -0
  121. package/dist/libs/common/base/src/lib/address.util.js.map +1 -0
  122. package/dist/libs/common/base/src/lib/country-code-data.d.ts +5 -0
  123. package/dist/libs/common/base/src/lib/country-code-data.js +1256 -0
  124. package/dist/libs/common/base/src/lib/country-code-data.js.map +1 -0
  125. package/dist/libs/common/base/src/lib/date.util.d.ts +13 -0
  126. package/dist/libs/common/base/src/lib/date.util.js +135 -0
  127. package/dist/libs/common/base/src/lib/date.util.js.map +1 -0
  128. package/dist/libs/common/base/src/lib/headers.d.ts +1 -0
  129. package/dist/libs/common/base/src/lib/headers.js +5 -0
  130. package/dist/libs/common/base/src/lib/headers.js.map +1 -0
  131. package/dist/libs/common/base/src/lib/jsonata.service.d.ts +32 -0
  132. package/dist/libs/common/base/src/lib/jsonata.service.js +207 -0
  133. package/dist/libs/common/base/src/lib/jsonata.service.js.map +1 -0
  134. package/dist/libs/common/base/src/lib/key-validation.constants.d.ts +37 -0
  135. package/dist/libs/common/base/src/lib/key-validation.constants.js +144 -0
  136. package/dist/libs/common/base/src/lib/key-validation.constants.js.map +1 -0
  137. package/dist/libs/common/base/src/lib/phone-util.d.ts +16 -0
  138. package/dist/libs/common/base/src/lib/phone-util.js +61 -0
  139. package/dist/libs/common/base/src/lib/phone-util.js.map +1 -0
  140. package/dist/libs/common/base/src/lib/schema-validation.util.d.ts +24 -0
  141. package/dist/libs/common/base/src/lib/schema-validation.util.js +155 -0
  142. package/dist/libs/common/base/src/lib/schema-validation.util.js.map +1 -0
  143. package/dist/libs/common/base/src/lib/string-builder.d.ts +48 -0
  144. package/dist/libs/common/base/src/lib/string-builder.js +90 -0
  145. package/dist/libs/common/base/src/lib/string-builder.js.map +1 -0
  146. package/dist/libs/common/base/src/lib/util.d.ts +20 -0
  147. package/dist/libs/common/base/src/lib/util.js +110 -0
  148. package/dist/libs/common/base/src/lib/util.js.map +1 -0
  149. package/dist/libs/signstack/base/schemas/asset.schema.json +220 -0
  150. package/dist/libs/signstack/base/schemas/blueprint.schema.json +485 -0
  151. package/dist/libs/signstack/base/schemas/jsonata-function.schema.json +185 -0
  152. package/dist/libs/signstack/base/schemas/schema.schema.json +97 -0
  153. package/dist/libs/signstack/base/schemas/template.schema.json +295 -0
  154. package/dist/libs/signstack/base/src/index.d.ts +28 -0
  155. package/dist/libs/signstack/base/src/index.js +32 -0
  156. package/dist/libs/signstack/base/src/index.js.map +1 -0
  157. package/dist/libs/signstack/base/src/lib/constants.d.ts +123 -0
  158. package/dist/libs/signstack/base/src/lib/constants.js +131 -0
  159. package/dist/libs/signstack/base/src/lib/constants.js.map +1 -0
  160. package/dist/libs/signstack/base/src/lib/hash.util.d.ts +58 -0
  161. package/dist/libs/signstack/base/src/lib/hash.util.js +90 -0
  162. package/dist/libs/signstack/base/src/lib/hash.util.js.map +1 -0
  163. package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.d.ts +29 -0
  164. package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js +93 -0
  165. package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js.map +1 -0
  166. package/dist/libs/signstack/base/src/lib/models/ai-chat.d.ts +41 -0
  167. package/dist/libs/signstack/base/src/lib/models/ai-chat.js +3 -0
  168. package/dist/libs/signstack/base/src/lib/models/ai-chat.js.map +1 -0
  169. package/dist/libs/signstack/base/src/lib/models/api-key.d.ts +54 -0
  170. package/dist/libs/signstack/base/src/lib/models/api-key.js +18 -0
  171. package/dist/libs/signstack/base/src/lib/models/api-key.js.map +1 -0
  172. package/dist/libs/signstack/base/src/lib/models/asset.d.ts +101 -0
  173. package/dist/libs/signstack/base/src/lib/models/asset.js +11 -0
  174. package/dist/libs/signstack/base/src/lib/models/asset.js.map +1 -0
  175. package/dist/libs/signstack/base/src/lib/models/auth.d.ts +142 -0
  176. package/dist/libs/signstack/base/src/lib/models/auth.js +35 -0
  177. package/dist/libs/signstack/base/src/lib/models/auth.js.map +1 -0
  178. package/dist/libs/signstack/base/src/lib/models/base.d.ts +134 -0
  179. package/dist/libs/signstack/base/src/lib/models/base.js +71 -0
  180. package/dist/libs/signstack/base/src/lib/models/base.js.map +1 -0
  181. package/dist/libs/signstack/base/src/lib/models/blueprint.d.ts +311 -0
  182. package/dist/libs/signstack/base/src/lib/models/blueprint.js +9 -0
  183. package/dist/libs/signstack/base/src/lib/models/blueprint.js.map +1 -0
  184. package/dist/libs/signstack/base/src/lib/models/file.d.ts +75 -0
  185. package/dist/libs/signstack/base/src/lib/models/file.js +9 -0
  186. package/dist/libs/signstack/base/src/lib/models/file.js.map +1 -0
  187. package/dist/libs/signstack/base/src/lib/models/jsonata-function.d.ts +111 -0
  188. package/dist/libs/signstack/base/src/lib/models/jsonata-function.js +19 -0
  189. package/dist/libs/signstack/base/src/lib/models/jsonata-function.js.map +1 -0
  190. package/dist/libs/signstack/base/src/lib/models/marketplace-listing.d.ts +132 -0
  191. package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js +22 -0
  192. package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js.map +1 -0
  193. package/dist/libs/signstack/base/src/lib/models/membership.d.ts +127 -0
  194. package/dist/libs/signstack/base/src/lib/models/membership.js +22 -0
  195. package/dist/libs/signstack/base/src/lib/models/membership.js.map +1 -0
  196. package/dist/libs/signstack/base/src/lib/models/namespace.d.ts +87 -0
  197. package/dist/libs/signstack/base/src/lib/models/namespace.js +57 -0
  198. package/dist/libs/signstack/base/src/lib/models/namespace.js.map +1 -0
  199. package/dist/libs/signstack/base/src/lib/models/organization.d.ts +79 -0
  200. package/dist/libs/signstack/base/src/lib/models/organization.js +41 -0
  201. package/dist/libs/signstack/base/src/lib/models/organization.js.map +1 -0
  202. package/dist/libs/signstack/base/src/lib/models/render-job.d.ts +88 -0
  203. package/dist/libs/signstack/base/src/lib/models/render-job.js +3 -0
  204. package/dist/libs/signstack/base/src/lib/models/render-job.js.map +1 -0
  205. package/dist/libs/signstack/base/src/lib/models/resource-edge.d.ts +60 -0
  206. package/dist/libs/signstack/base/src/lib/models/resource-edge.js +202 -0
  207. package/dist/libs/signstack/base/src/lib/models/resource-edge.js.map +1 -0
  208. package/dist/libs/signstack/base/src/lib/models/scenario.d.ts +138 -0
  209. package/dist/libs/signstack/base/src/lib/models/scenario.js +14 -0
  210. package/dist/libs/signstack/base/src/lib/models/scenario.js.map +1 -0
  211. package/dist/libs/signstack/base/src/lib/models/schema.d.ts +131 -0
  212. package/dist/libs/signstack/base/src/lib/models/schema.js +44 -0
  213. package/dist/libs/signstack/base/src/lib/models/schema.js.map +1 -0
  214. package/dist/libs/signstack/base/src/lib/models/shareable-link.d.ts +215 -0
  215. package/dist/libs/signstack/base/src/lib/models/shareable-link.js +27 -0
  216. package/dist/libs/signstack/base/src/lib/models/shareable-link.js.map +1 -0
  217. package/dist/libs/signstack/base/src/lib/models/subscription.d.ts +279 -0
  218. package/dist/libs/signstack/base/src/lib/models/subscription.js +105 -0
  219. package/dist/libs/signstack/base/src/lib/models/subscription.js.map +1 -0
  220. package/dist/libs/signstack/base/src/lib/models/template.d.ts +248 -0
  221. package/dist/libs/signstack/base/src/lib/models/template.js +32 -0
  222. package/dist/libs/signstack/base/src/lib/models/template.js.map +1 -0
  223. package/dist/libs/signstack/base/src/lib/models/user.d.ts +30 -0
  224. package/dist/libs/signstack/base/src/lib/models/user.js +3 -0
  225. package/dist/libs/signstack/base/src/lib/models/user.js.map +1 -0
  226. package/dist/libs/signstack/base/src/lib/models/webhook.d.ts +223 -0
  227. package/dist/libs/signstack/base/src/lib/models/webhook.js +62 -0
  228. package/dist/libs/signstack/base/src/lib/models/webhook.js.map +1 -0
  229. package/dist/libs/signstack/base/src/lib/models/workflow.d.ts +917 -0
  230. package/dist/libs/signstack/base/src/lib/models/workflow.js +152 -0
  231. package/dist/libs/signstack/base/src/lib/models/workflow.js.map +1 -0
  232. package/dist/libs/signstack/base/src/lib/util.d.ts +92 -0
  233. package/dist/libs/signstack/base/src/lib/util.js +406 -0
  234. package/dist/libs/signstack/base/src/lib/util.js.map +1 -0
  235. package/dist/libs/signstack/base/src/lib/validation/dependency-graph.d.ts +94 -0
  236. package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js +446 -0
  237. package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js.map +1 -0
  238. package/dist/libs/signstack/base/src/lib/validation/graph.types.d.ts +57 -0
  239. package/dist/libs/signstack/base/src/lib/validation/graph.types.js +8 -0
  240. package/dist/libs/signstack/base/src/lib/validation/graph.types.js.map +1 -0
  241. package/dist/libs/signstack/base/src/lib/validation/index.d.ts +9 -0
  242. package/dist/libs/signstack/base/src/lib/validation/index.js +23 -0
  243. package/dist/libs/signstack/base/src/lib/validation/index.js.map +1 -0
  244. package/dist/libs/signstack/base/src/lib/validation/resource-schemas.d.ts +3 -0
  245. package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js +27 -0
  246. package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js.map +1 -0
  247. package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.d.ts +57 -0
  248. package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js +57 -0
  249. package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js.map +1 -0
  250. package/dist/libs/signstack/base/src/lib/validation/schema-validator.d.ts +38 -0
  251. package/dist/libs/signstack/base/src/lib/validation/schema-validator.js +146 -0
  252. package/dist/libs/signstack/base/src/lib/validation/schema-validator.js.map +1 -0
  253. package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.d.ts +22 -0
  254. package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js +69 -0
  255. package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js.map +1 -0
  256. package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.d.ts +37 -0
  257. package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js +250 -0
  258. package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js.map +1 -0
  259. package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.d.ts +24 -0
  260. package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js +98 -0
  261. package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js.map +1 -0
  262. package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.d.ts +12 -0
  263. package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js +50 -0
  264. package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js.map +1 -0
  265. package/dist/libs/signstack/base/src/lib/yaml-spec-converter.d.ts +101 -0
  266. package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js +998 -0
  267. package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js.map +1 -0
  268. package/oclif.manifest.json +822 -0
  269. package/package.json +101 -0
@@ -0,0 +1,611 @@
1
+ import ora from 'ora';
2
+ import pc from 'picocolors';
3
+ import { resolve } from 'node:path';
4
+ import { resolveEntityData, } from './entity-data-resolver.js';
5
+ import { LocalResourceLoader, } from './local-resource-loader.js';
6
+ import { PayloadBuilder } from './payload-builder.js';
7
+ import { PreviewOutputFormatter } from './preview-output-formatter.js';
8
+ import { isScenarioFilePath, loadDefaultScenario, loadScenario, loadScenarioFromPath, saveScenarios, } from './scenario-file.js';
9
+ import { SchemaKind } from '../types/schema.types.js';
10
+ import { normalizePath } from './path-utils.js';
11
+ /**
12
+ * Unified preview handler for all modes:
13
+ * - Remote (--remote): API resolves everything from blueprintKey/version
14
+ * - Local (--local): All resources from local YAML files
15
+ * - Hybrid (default): Local files + fetch missing deps from API
16
+ */
17
+ export class PreviewHandler {
18
+ apiClient;
19
+ config;
20
+ log;
21
+ error;
22
+ payloadBuilder;
23
+ localLoader;
24
+ formatter;
25
+ constructor(apiClient, config, log, error) {
26
+ this.apiClient = apiClient;
27
+ this.config = config;
28
+ this.log = log;
29
+ this.error = error;
30
+ this.payloadBuilder = new PayloadBuilder();
31
+ this.localLoader = new LocalResourceLoader(apiClient, config.orgId, this.payloadBuilder, log, error);
32
+ this.formatter = new PreviewOutputFormatter(log);
33
+ }
34
+ // ── Remote mode ──────────────────────────────────────────────────
35
+ /**
36
+ * Run remote preview. API resolves all dependencies from blueprintKey/version.
37
+ */
38
+ async runRemote(blueprintKey, version, scenarioKey, jsonOutput, skipSignatureFields, combinePdfs) {
39
+ // Step 1: Load blueprint from API (need entitySlots for entity data generation)
40
+ const blueprintData = await this.loadBlueprintFromApi(blueprintKey, version, jsonOutput);
41
+ // Step 2: Get entity data (from scenario or generate dynamically via API)
42
+ const entityData = await resolveEntityData({
43
+ entitySlots: blueprintData.inputs,
44
+ scenarioKey,
45
+ jsonOutput,
46
+ fetchScenario: (key) => this.apiClient.get(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/scenarios/${encodeURIComponent(key)}`),
47
+ generateFromApi: (schemaKeys) => this.apiClient.post(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/schemas/examples`, { schemaKeys }),
48
+ log: this.log,
49
+ });
50
+ // Step 3: Render with remote mode (API resolves all dependencies)
51
+ const result = await this.performRender(() => this.renderBlueprintViaJobs({
52
+ blueprintKey: blueprintData.key,
53
+ blueprintVersion: blueprintData.version,
54
+ entities: entityData.entities.map((e) => ({
55
+ inputKey: e.key,
56
+ data: e.data,
57
+ })),
58
+ options: {
59
+ skipSignatureFields,
60
+ combinePdfs,
61
+ },
62
+ }), {
63
+ start: 'Rendering preview...',
64
+ success: (res) => `Rendered ${res.envelopes.flatMap((e) => e.documents).length} document(s)`,
65
+ fail: 'Failed to render preview',
66
+ }, jsonOutput);
67
+ // Step 4: Output results
68
+ this.formatter.printPreviewResults(result, jsonOutput, entityData, {
69
+ key: blueprintData.key,
70
+ version: blueprintData.version,
71
+ name: blueprintData.name,
72
+ source: 'signstack',
73
+ });
74
+ }
75
+ // ── Local / Hybrid mode ──────────────────────────────────────────
76
+ /**
77
+ * Run local or hybrid preview.
78
+ * @param inlineOnly - When true (--local), fail on missing deps. When false (hybrid), prompt to fetch.
79
+ */
80
+ async runLocal(pathArg, blueprintRef, scenarioKey, jsonOutput, inlineOnly = false, skipSignatureFields, combinePdfs) {
81
+ // Step 1-4: Validate, find blueprint, collect deps, upload assets
82
+ pathArg = normalizePath(pathArg);
83
+ const { missingDeps, targetDoc: blueprintDoc, relevantDocs, fileIdMap, } = await this.prepareLocalPreview({
84
+ pathArg,
85
+ resourceRef: blueprintRef,
86
+ resourceKind: SchemaKind.Blueprint,
87
+ resourceType: 'blueprint',
88
+ jsonOutput,
89
+ inlineOnly,
90
+ });
91
+ // Step 5: Build blueprint resource (for entity slots + inline request)
92
+ const blueprint = this.payloadBuilder.buildBlueprintPayload(blueprintDoc);
93
+ // Step 6: Collect local resource docs
94
+ const templateDocs = relevantDocs.filter((d) => d.kind === SchemaKind.Template);
95
+ const assetDocs = relevantDocs.filter((d) => d.kind === SchemaKind.Asset);
96
+ const functionDocs = relevantDocs.filter((d) => d.kind === SchemaKind.JsonataFunction);
97
+ // Step 7: Log missing deps info (backend resolves them in hybrid mode)
98
+ if (missingDeps.size > 0 && !jsonOutput) {
99
+ const allMissing = new Set();
100
+ for (const deps of missingDeps.values()) {
101
+ for (const dep of deps)
102
+ allMissing.add(dep);
103
+ }
104
+ this.log(`\n${pc.dim(`${allMissing.size} missing local dependency(ies) will be resolved from deployed resources.`)}`);
105
+ }
106
+ // Step 8: Resolve entity data — local scenario files first, then AI generation
107
+ const schemaDocs = relevantDocs
108
+ .filter((d) => d.kind === SchemaKind.Schema)
109
+ .map((d) => this.payloadBuilder.buildSchemaPayload(d));
110
+ const entityData = await this.resolveLocalScenarioEntities({
111
+ contractDir: pathArg,
112
+ scenarioKey,
113
+ entitySlots: blueprint.spec.inputs ?? [],
114
+ schemaDocs,
115
+ jsonOutput,
116
+ inlineOnly,
117
+ blueprintName: blueprint.metadata.name,
118
+ });
119
+ // Step 9: Build unified render request from local docs
120
+ const renderReq = this.payloadBuilder.buildRenderBlueprintReq({
121
+ blueprintDoc,
122
+ templateDocs,
123
+ assetDocs,
124
+ functionDocs,
125
+ schemaDocs,
126
+ fileIdMap,
127
+ entities: entityData.entities.length > 0 ? entityData.entities : undefined,
128
+ inlineOnly,
129
+ skipSignatureFields,
130
+ combinePdfs,
131
+ });
132
+ // Step 10: Call unified render API
133
+ const result = await this.callRenderBlueprint(renderReq, jsonOutput);
134
+ // Step 11: Print results
135
+ this.formatter.printPreviewResults(result, jsonOutput, entityData, {
136
+ ref: blueprintRef,
137
+ source: 'local',
138
+ });
139
+ }
140
+ // ── Template Remote mode ────────────────────────────────────────
141
+ /**
142
+ * Run remote template preview. Backend resolves template + assets from key/version.
143
+ */
144
+ async runTemplateRemote(templateKey, version, scenarioKey, jsonOutput, skipSignatureFields, _combinePdfs) {
145
+ // Step 1: Load template metadata (for display + entity data generation)
146
+ const template = await this.loadTemplateFromApi(templateKey, version, jsonOutput);
147
+ // Step 2: Get entity data (from scenario or generate dynamically via API)
148
+ const entityData = await resolveEntityData({
149
+ entitySlots: (template.spec.inputs || []).map((i) => ({
150
+ key: i.key,
151
+ schemaKey: i.schemaKey,
152
+ schemaVersion: i.schemaVersion,
153
+ })),
154
+ scenarioKey,
155
+ jsonOutput,
156
+ fetchScenario: (key) => this.apiClient.get(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/scenarios/${encodeURIComponent(key)}`),
157
+ generateFromApi: (template.spec.inputs?.length ?? 0) > 0
158
+ ? (schemaKeys) => this.apiClient.post(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/schemas/examples`, { schemaKeys })
159
+ : undefined,
160
+ log: this.log,
161
+ });
162
+ // Step 3: Call render — backend resolves template + assets from DB
163
+ const renderReq = {
164
+ entities: entityData.entities.length > 0
165
+ ? entityData.entities.map((e) => ({
166
+ inputKey: e.key,
167
+ data: e.data,
168
+ }))
169
+ : undefined,
170
+ options: {
171
+ skipSignatureFields,
172
+ },
173
+ };
174
+ const renderResult = await this.callRenderTemplate(renderReq, jsonOutput, template.metadata.key, template.metadata.version);
175
+ // Step 4: Output results (signedUrl comes from the API directly)
176
+ this.formatter.printTemplatePreviewResults({
177
+ signedUrl: renderResult.signedUrl,
178
+ detectedFields: renderResult.detectedFields,
179
+ }, jsonOutput, entityData, {
180
+ key: template.metadata.key,
181
+ version: template.metadata.version,
182
+ name: template.metadata.name,
183
+ type: template.spec.type,
184
+ source: 'signstack',
185
+ });
186
+ }
187
+ // ── Template Local / Hybrid mode ───────────────────────────────
188
+ /**
189
+ * Run local or hybrid template preview.
190
+ * @param inlineOnly - When true (--local), fail on missing deps. When false (hybrid), prompt to fetch.
191
+ */
192
+ async runTemplateLocal(pathArg, templateRef, scenarioKey, jsonOutput, inlineOnly = false, skipSignatureFields, _combinePdfs) {
193
+ // Step 1-4: Validate, find template, collect deps, upload assets
194
+ const { missingDeps, targetDoc: templateDoc, relevantDocs, fileIdMap, assetDocs, } = await this.prepareLocalPreview({
195
+ pathArg,
196
+ resourceRef: templateRef,
197
+ resourceKind: SchemaKind.Template,
198
+ resourceType: 'template',
199
+ jsonOutput,
200
+ inlineOnly,
201
+ });
202
+ // Step 5: Log missing deps info (backend resolves them in hybrid mode)
203
+ if (missingDeps.size > 0 && !jsonOutput) {
204
+ const allMissing = new Set();
205
+ for (const deps of missingDeps.values()) {
206
+ for (const dep of deps)
207
+ allMissing.add(dep);
208
+ }
209
+ this.log(`\n${pc.dim(`${allMissing.size} missing local dependency(ies) will be resolved from deployed resources.`)}`);
210
+ }
211
+ // Step 6: Collect docs for inline resources
212
+ const spec = templateDoc.content['spec'];
213
+ const templateType = spec?.['type'] || 'pdf';
214
+ const functionDocs = relevantDocs.filter((d) => d.kind === SchemaKind.JsonataFunction);
215
+ const schemaDocs = relevantDocs
216
+ .filter((d) => d.kind === SchemaKind.Schema)
217
+ .map((d) => this.payloadBuilder.buildSchemaPayload(d));
218
+ // Step 7: Resolve entity data — local scenario files first, then AI generation
219
+ const templateResource = this.payloadBuilder.buildTemplateResource(templateDoc);
220
+ const entityData = await this.resolveLocalScenarioEntities({
221
+ contractDir: pathArg,
222
+ scenarioKey,
223
+ entitySlots: (templateResource.spec.inputs || []).map((i) => ({
224
+ key: i.key,
225
+ schemaKey: i.schemaKey,
226
+ schemaVersion: i.schemaVersion,
227
+ })),
228
+ schemaDocs,
229
+ jsonOutput,
230
+ inlineOnly,
231
+ blueprintName: templateResource.metadata.name,
232
+ });
233
+ // Step 8: Build unified render request
234
+ const renderReq = this.payloadBuilder.buildRenderTemplateReq({
235
+ templateDoc,
236
+ assetDocs,
237
+ functionDocs,
238
+ schemaDocs,
239
+ fileIdMap,
240
+ entities: entityData.entities.length > 0 ? entityData.entities : undefined,
241
+ inlineOnly,
242
+ skipSignatureFields,
243
+ });
244
+ // Step 9: Call render API (keyless — inline resources in body)
245
+ const renderResult = await this.callRenderTemplate(renderReq, jsonOutput);
246
+ // Step 10: Print results
247
+ this.formatter.printTemplatePreviewResults({
248
+ signedUrl: renderResult.signedUrl,
249
+ detectedFields: renderResult.detectedFields,
250
+ }, jsonOutput, entityData, {
251
+ ref: templateRef,
252
+ key: templateResource.metadata.key,
253
+ version: templateResource.metadata.version,
254
+ name: templateResource.metadata.name,
255
+ type: templateType,
256
+ source: 'local',
257
+ });
258
+ }
259
+ // ── List scenarios ─────────────────────────────────────────────
260
+ async listScenarios(jsonOutput) {
261
+ const fetchSpinner = jsonOutput
262
+ ? null
263
+ : ora({
264
+ text: 'Fetching scenarios...',
265
+ color: 'cyan',
266
+ }).start();
267
+ let resp;
268
+ try {
269
+ resp = await this.apiClient.get(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/scenarios`);
270
+ fetchSpinner?.succeed(`Fetched ${resp.data.length} scenario(s)`);
271
+ }
272
+ catch (error) {
273
+ fetchSpinner?.fail('Failed to fetch scenarios');
274
+ throw error;
275
+ }
276
+ this.formatter.printScenariosList(resp.data.map((s) => ({ key: s.metadata.key, name: s.metadata.name })), jsonOutput);
277
+ }
278
+ /**
279
+ * Resolve entity data from local scenario files, with fallback to AI generation + save.
280
+ *
281
+ * Priority:
282
+ * 1. scenarioKey is a file path → load directly
283
+ * 2. scenarioKey is a key → look up scenarios/<key>.json locally, fall back to remote API
284
+ * 3. No scenarioKey → load default scenario (first alphabetically)
285
+ * 4. No scenarios exist → generate via inline API, save to scenarios/, use first one
286
+ * 5. Inline API unavailable → fall through to existing heuristic generation
287
+ */
288
+ async resolveLocalScenarioEntities(params) {
289
+ const { contractDir, scenarioKey, entitySlots, schemaDocs, jsonOutput, inlineOnly, blueprintName, } = params;
290
+ // No entity slots → nothing to resolve
291
+ if (!entitySlots || entitySlots.length === 0) {
292
+ return { entities: [], isAutoGenerated: false };
293
+ }
294
+ // 1. scenarioKey is a file path → load directly
295
+ if (scenarioKey && isScenarioFilePath(scenarioKey)) {
296
+ try {
297
+ const entities = loadScenarioFromPath(resolve(scenarioKey));
298
+ if (!jsonOutput)
299
+ this.log(`Loaded scenario from file: ${scenarioKey}`);
300
+ return { entities, isAutoGenerated: false };
301
+ }
302
+ catch {
303
+ this.error(`Failed to load scenario file: ${scenarioKey}`, {
304
+ exit: 1,
305
+ suggestions: [
306
+ 'Check that the file exists and contains valid JSON',
307
+ 'Scenario files should be an array of { key, data } objects',
308
+ ],
309
+ });
310
+ }
311
+ }
312
+ // 2. scenarioKey is a key → look up locally
313
+ if (scenarioKey) {
314
+ const entities = loadScenario(contractDir, scenarioKey);
315
+ if (entities) {
316
+ if (!jsonOutput)
317
+ this.log(`Using scenario: ${scenarioKey}`);
318
+ return { entities, isAutoGenerated: false };
319
+ }
320
+ // Key not found locally — fall back to remote in non-local mode
321
+ if (!inlineOnly) {
322
+ if (!jsonOutput)
323
+ this.log(`Scenario "${scenarioKey}" not found locally, fetching from API`);
324
+ const scenario = await this.apiClient.get(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/scenarios/${encodeURIComponent(scenarioKey)}`);
325
+ const entityByKey = new Map((scenario.entities || []).map((e) => [e.key, e]));
326
+ const resolved = entitySlots
327
+ .map((slot) => {
328
+ const entity = entityByKey.get(slot.key);
329
+ if (!entity)
330
+ return null;
331
+ return {
332
+ key: slot.key,
333
+ data: entity.data,
334
+ };
335
+ })
336
+ .filter((e) => e !== null);
337
+ return { entities: resolved, isAutoGenerated: false };
338
+ }
339
+ this.error(`Scenario "${scenarioKey}" not found in ${contractDir}/scenarios/`, {
340
+ exit: 1,
341
+ suggestions: [
342
+ `Create a scenario file at: ${contractDir}/scenarios/${scenarioKey}.json`,
343
+ 'Or omit --scenario to auto-generate one',
344
+ 'Or remove --resolve local to use a remote scenario',
345
+ ],
346
+ });
347
+ }
348
+ // 3. No scenarioKey → load default scenario
349
+ const defaultScenario = loadDefaultScenario(contractDir);
350
+ if (defaultScenario) {
351
+ if (!jsonOutput)
352
+ this.log(`Using scenario: ${defaultScenario.key}`);
353
+ return {
354
+ entities: defaultScenario.entities,
355
+ isAutoGenerated: false,
356
+ };
357
+ }
358
+ // 4. No scenarios exist → generate via inline API, save, and use first
359
+ // entitySlots[].schemaKey is key-only (e.g. "client_info"), ParsedDocument has .key and .version
360
+ const entitySchemaKeys = new Set(entitySlots.map((slot) => slot.schemaKey));
361
+ const schemasForApi = [];
362
+ for (const s of schemaDocs) {
363
+ if (!entitySchemaKeys.has(s.key))
364
+ continue;
365
+ const spec = s.content['spec'];
366
+ const definition = spec?.['definition'];
367
+ if (definition) {
368
+ schemasForApi.push({ key: s.key, schemaDefinition: definition });
369
+ }
370
+ }
371
+ if (schemasForApi.length > 0) {
372
+ const spinner = jsonOutput
373
+ ? null
374
+ : ora({
375
+ text: 'Generating scenarios from schemas using AI...',
376
+ color: 'cyan',
377
+ }).start();
378
+ try {
379
+ const resp = await this.apiClient.post(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/schemas/examples/inline`, { schemas: schemasForApi, context: blueprintName });
380
+ if (resp.scenarios.length > 0) {
381
+ const scenariosToSave = resp.scenarios.map((s) => ({
382
+ name: s.name,
383
+ entities: s.entities.map((e) => {
384
+ // Generator returns one example per schema. Map each to the first
385
+ // input slot using that schema; fall back to the schema key itself
386
+ // if no slot matches (shouldn't happen in practice).
387
+ const slot = entitySlots.find((sl) => sl.schemaKey === e.schemaKey);
388
+ return {
389
+ key: slot?.key ?? e.schemaKey,
390
+ data: e.exampleData,
391
+ };
392
+ }),
393
+ }));
394
+ saveScenarios(contractDir, scenariosToSave);
395
+ spinner?.succeed(`Generated ${resp.scenarios.length} scenario(s) → scenarios/`);
396
+ return {
397
+ entities: scenariosToSave[0].entities,
398
+ isAutoGenerated: true,
399
+ };
400
+ }
401
+ spinner?.succeed('No scenarios needed (no meaningful variations)');
402
+ }
403
+ catch (error) {
404
+ spinner?.fail('Failed to generate AI scenarios');
405
+ throw error;
406
+ }
407
+ }
408
+ // No schemas with definitions found — proceed without entity data
409
+ return { entities: [], isAutoGenerated: false };
410
+ }
411
+ /**
412
+ * Shared preparation for local / hybrid preview (used by both blueprint and template flows).
413
+ * Delegates to LocalResourceLoader for validation, dependency collection, and asset upload.
414
+ */
415
+ async prepareLocalPreview(opts) {
416
+ return this.localLoader.prepareLocalResources({
417
+ ...opts,
418
+ callbacks: {
419
+ printValidationErrors: (summary, jsonOutput) => this.formatter.printValidationErrors(summary, jsonOutput),
420
+ printValidationSuccess: (count) => this.formatter.printValidationSuccess(count),
421
+ },
422
+ });
423
+ }
424
+ // ── Shared private methods ─────────────────────────────────────
425
+ /**
426
+ * Call blueprints/:key/render API endpoint (DB mode).
427
+ */
428
+ async performRender(apiCall, spinnerMessages, jsonOutput) {
429
+ const spinner = jsonOutput
430
+ ? null
431
+ : ora({ text: spinnerMessages.start, color: 'cyan' }).start();
432
+ try {
433
+ const result = await apiCall();
434
+ spinner?.succeed(spinnerMessages.success(result));
435
+ if (result.warnings?.length && !jsonOutput) {
436
+ this.formatter.printWarnings(result.warnings);
437
+ }
438
+ return result;
439
+ }
440
+ catch (error) {
441
+ spinner?.fail(spinnerMessages.fail);
442
+ throw error;
443
+ }
444
+ }
445
+ /**
446
+ * Call unified POST /blueprints/render endpoint.
447
+ */
448
+ async callRenderBlueprint(payload, jsonOutput) {
449
+ const spinner = jsonOutput
450
+ ? null
451
+ : ora({
452
+ text: 'Rendering preview...',
453
+ color: 'cyan',
454
+ }).start();
455
+ try {
456
+ const result = await this.renderBlueprintViaJobs(payload);
457
+ spinner?.succeed(`Rendered ${result.envelopes.flatMap((e) => e.documents).length} document(s)`);
458
+ if (result.warnings?.length && !jsonOutput) {
459
+ this.formatter.printWarnings(result.warnings);
460
+ }
461
+ return result;
462
+ }
463
+ catch (error) {
464
+ spinner?.fail('Failed to render preview');
465
+ throw error;
466
+ }
467
+ }
468
+ /**
469
+ * POST /blueprints/render (async) and poll the envelope-job to terminal.
470
+ * The endpoint returns `{ jobId }` immediately (one envelope per request);
471
+ * the spinner stays up while we poll.
472
+ */
473
+ async renderBlueprintViaJobs(payload) {
474
+ const { jobId } = await this.apiClient.post(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/blueprints/render`, payload);
475
+ if (!jobId) {
476
+ throw new Error('Failed to render blueprint: no jobId returned from the API');
477
+ }
478
+ return this.pollRenderJob(jobId);
479
+ }
480
+ /** POST /templates/render (async) and poll the job to terminal. */
481
+ async renderTemplateViaJobs(body) {
482
+ const { jobId } = await this.apiClient.post(`/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/templates/render`, body);
483
+ if (!jobId) {
484
+ throw new Error('Failed to render template: no jobId returned from the API');
485
+ }
486
+ return this.pollRenderJob(jobId);
487
+ }
488
+ /**
489
+ * Poll `GET /render-jobs/:jobId` until the job is terminal, returning its
490
+ * `result` on success. Mirrors the old server-side long-poll cadence.
491
+ */
492
+ async pollRenderJob(jobId) {
493
+ const url = `/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/render-jobs/${jobId}`;
494
+ const deadline = Date.now() + 280_000;
495
+ while (Date.now() < deadline) {
496
+ const job = await this.apiClient.get(url);
497
+ if (job.status === 'completed') {
498
+ if (!job.result) {
499
+ throw new Error(`render job ${jobId} completed without a result`);
500
+ }
501
+ return job.result;
502
+ }
503
+ if (job.status === 'failed') {
504
+ throw new Error(job.error ?? `render job ${jobId} failed`);
505
+ }
506
+ await new Promise((resolve) => setTimeout(resolve, 500));
507
+ }
508
+ throw new Error(`render job ${jobId} polling timed out`);
509
+ }
510
+ /**
511
+ * Load blueprint metadata from SignStack API.
512
+ */
513
+ async loadBlueprintFromApi(blueprintKey, version, jsonOutput) {
514
+ const fetchSpinner = jsonOutput
515
+ ? null
516
+ : ora({
517
+ text: 'Fetching blueprint from SignStack...',
518
+ color: 'cyan',
519
+ }).start();
520
+ let blueprint;
521
+ try {
522
+ const baseUrl = `/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/blueprints/${encodeURIComponent(blueprintKey)}`;
523
+ const url = version
524
+ ? `${baseUrl}?version=${encodeURIComponent(version)}`
525
+ : baseUrl;
526
+ blueprint = await this.apiClient.get(url);
527
+ fetchSpinner?.succeed(`Found blueprint: ${pc.cyan(blueprint.metadata.name)} (v${blueprint.metadata.version})`);
528
+ }
529
+ catch (error) {
530
+ fetchSpinner?.fail('Failed to fetch blueprint from SignStack');
531
+ throw error;
532
+ }
533
+ return {
534
+ key: blueprintKey,
535
+ version: blueprint.metadata.version,
536
+ name: blueprint.metadata.name || blueprintKey,
537
+ inputs: blueprint.spec.inputs || [],
538
+ };
539
+ }
540
+ // ── Template-specific private methods ──────────────────────────
541
+ /**
542
+ * Load template metadata from SignStack API.
543
+ */
544
+ async loadTemplateFromApi(templateKey, version, jsonOutput) {
545
+ const fetchSpinner = jsonOutput
546
+ ? null
547
+ : ora({
548
+ text: 'Fetching template from SignStack...',
549
+ color: 'cyan',
550
+ }).start();
551
+ try {
552
+ const baseUrl = `/v1/orgs/${this.config.orgId}/namespaces/${this.config.namespaceKey}/templates/${encodeURIComponent(templateKey)}`;
553
+ const url = version
554
+ ? `${baseUrl}?version=${encodeURIComponent(version)}`
555
+ : baseUrl;
556
+ const template = await this.apiClient.get(url);
557
+ fetchSpinner?.succeed(`Found template: ${pc.cyan(template.metadata.name)} (v${template.metadata.version}, ${template.spec.type})`);
558
+ return template;
559
+ }
560
+ catch (error) {
561
+ fetchSpinner?.fail('Failed to fetch template from SignStack');
562
+ throw error;
563
+ }
564
+ }
565
+ /**
566
+ * Call render: POST /templates/render with templateKey/templateVersion in body
567
+ */
568
+ async callRenderTemplate(payload, jsonOutput, key, version) {
569
+ const spinner = jsonOutput
570
+ ? null
571
+ : ora({
572
+ text: 'Rendering template preview...',
573
+ color: 'cyan',
574
+ }).start();
575
+ try {
576
+ const body = {
577
+ ...payload,
578
+ ...(key && { templateKey: key }),
579
+ ...(version && { templateVersion: version }),
580
+ };
581
+ const result = await this.renderTemplateViaJobs(body);
582
+ spinner?.succeed('Template rendered successfully');
583
+ return result;
584
+ }
585
+ catch (error) {
586
+ spinner?.fail('Failed to render template preview');
587
+ throw error;
588
+ }
589
+ }
590
+ /**
591
+ * Get signed download URL for a file.
592
+ */
593
+ async getSignedUrl(fileId, jsonOutput) {
594
+ const spinner = jsonOutput
595
+ ? null
596
+ : ora({
597
+ text: 'Getting download URL...',
598
+ color: 'cyan',
599
+ }).start();
600
+ try {
601
+ const file = await this.apiClient.get(`/v1/orgs/${this.config.orgId}/files/${encodeURIComponent(fileId)}`);
602
+ spinner?.succeed('Download URL ready');
603
+ return file.downloadUrl;
604
+ }
605
+ catch (error) {
606
+ spinner?.fail('Failed to get download URL');
607
+ throw error;
608
+ }
609
+ }
610
+ }
611
+ //# sourceMappingURL=preview-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-handler.js","sourceRoot":"","sources":["../../../../../src/lib/preview-handler.ts"],"names":[],"mappings":"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"}