@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,80 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const SCENARIOS_DIR = 'scenarios';
4
+ /**
5
+ * Load a specific scenario by key from the contract's scenarios/ folder.
6
+ * Returns null if the file doesn't exist.
7
+ */
8
+ export function loadScenario(contractDir, scenarioKey) {
9
+ const filePath = join(contractDir, SCENARIOS_DIR, `${scenarioKey}.json`);
10
+ if (!existsSync(filePath))
11
+ return null;
12
+ const raw = readFileSync(filePath, 'utf-8');
13
+ return JSON.parse(raw);
14
+ }
15
+ /**
16
+ * Load the default scenario (first alphabetically) from the contract's scenarios/ folder.
17
+ * Returns null if no scenarios/ folder or no .json files exist.
18
+ */
19
+ export function loadDefaultScenario(contractDir) {
20
+ const dir = join(contractDir, SCENARIOS_DIR);
21
+ if (!existsSync(dir))
22
+ return null;
23
+ const files = readdirSync(dir)
24
+ .filter((f) => f.endsWith('.json'))
25
+ .sort();
26
+ if (files.length === 0)
27
+ return null;
28
+ const key = files[0].replace(/\.json$/, '');
29
+ const raw = readFileSync(join(dir, files[0]), 'utf-8');
30
+ return { key, entities: JSON.parse(raw) };
31
+ }
32
+ /**
33
+ * Save multiple scenarios to the contract's scenarios/ folder.
34
+ * Each scenario is written as <snake_case_name>.json.
35
+ */
36
+ export function saveScenarios(contractDir, scenarios) {
37
+ if (scenarios.length === 0)
38
+ return;
39
+ const dir = join(contractDir, SCENARIOS_DIR);
40
+ if (!existsSync(dir)) {
41
+ mkdirSync(dir, { recursive: true });
42
+ }
43
+ for (const scenario of scenarios) {
44
+ const fileName = toSnakeCase(scenario.name) + '.json';
45
+ const filePath = join(dir, fileName);
46
+ writeFileSync(filePath, JSON.stringify(scenario.entities, null, 2), 'utf-8');
47
+ }
48
+ }
49
+ /**
50
+ * List available scenario keys (filenames without .json) in the contract's scenarios/ folder.
51
+ */
52
+ export function listScenarioKeys(contractDir) {
53
+ const dir = join(contractDir, SCENARIOS_DIR);
54
+ if (!existsSync(dir))
55
+ return [];
56
+ return readdirSync(dir)
57
+ .filter((f) => f.endsWith('.json'))
58
+ .map((f) => f.replace(/\.json$/, ''))
59
+ .sort();
60
+ }
61
+ /**
62
+ * Check if a scenario value looks like a file path (vs a key).
63
+ */
64
+ export function isScenarioFilePath(value) {
65
+ return value.includes('/') || value.endsWith('.json');
66
+ }
67
+ /**
68
+ * Load scenario entities from a direct file path.
69
+ */
70
+ export function loadScenarioFromPath(filePath) {
71
+ const raw = readFileSync(filePath, 'utf-8');
72
+ return JSON.parse(raw);
73
+ }
74
+ export function toSnakeCase(str) {
75
+ return str
76
+ .toLowerCase()
77
+ .replace(/[^a-z0-9]+/g, '_')
78
+ .replace(/^_|_$/g, '');
79
+ }
80
+ //# sourceMappingURL=scenario-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-file.js","sourceRoot":"","sources":["../../../../../src/lib/scenario-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SchemaValidator } from '@signstack/base';
2
+ export { SchemaValidator };
3
+ /**
4
+ * Get or create a schema validator instance.
5
+ * Reads schema files from disk and passes them to SchemaValidator.
6
+ * @param schemasDir Optional custom schemas directory (creates new instance if provided)
7
+ */
8
+ export declare function getSchemaValidator(schemasDir?: string): SchemaValidator;
@@ -0,0 +1,39 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { SchemaValidator, SCHEMA_FILE_MAP } from '@signstack/base';
5
+ // Re-export the class so existing CLI imports continue to work
6
+ export { SchemaValidator };
7
+ // ESM __dirname equivalent — used to resolve the schemas directory relative to the CLI build output
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ /**
11
+ * Load all JSON schema files from a directory into a Map.
12
+ */
13
+ function loadSchemas(schemasDir) {
14
+ const schemas = new Map();
15
+ for (const [kind, filename] of Object.entries(SCHEMA_FILE_MAP)) {
16
+ const schemaPath = join(schemasDir, filename);
17
+ const content = readFileSync(schemaPath, 'utf-8');
18
+ schemas.set(kind, JSON.parse(content));
19
+ }
20
+ return schemas;
21
+ }
22
+ /**
23
+ * Singleton instance of the schema validator.
24
+ */
25
+ let validatorInstance = null;
26
+ /**
27
+ * Get or create a schema validator instance.
28
+ * Reads schema files from disk and passes them to SchemaValidator.
29
+ * @param schemasDir Optional custom schemas directory (creates new instance if provided)
30
+ */
31
+ export function getSchemaValidator(schemasDir) {
32
+ if (!validatorInstance || schemasDir) {
33
+ const resolvedDir = schemasDir ?? join(__dirname, '..', '..', 'schemas');
34
+ const schemas = loadSchemas(resolvedDir);
35
+ validatorInstance = new SchemaValidator(schemas);
36
+ }
37
+ return validatorInstance;
38
+ }
39
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../../../src/lib/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAc,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE/E,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,oGAAoG;AACpG,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;GAEG;AACH,SAAS,WAAW,CAAC,UAAkB;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,IAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,IAAI,iBAAiB,GAA2B,IAAI,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAmB;IACpD,IAAI,CAAC,iBAAiB,IAAI,UAAU,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACzC,iBAAiB,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface UrlValidationResult {
2
+ isValid: boolean;
3
+ sanitizedUrl: string;
4
+ error?: string;
5
+ }
6
+ /**
7
+ * Validate and sanitize an API URL
8
+ * - Must be a valid URL format
9
+ * - Must use HTTPS (except for localhost/127.0.0.1 for local development)
10
+ * - Returns sanitized URL with trailing slash removed
11
+ */
12
+ export declare function validateApiUrl(apiUrl: string): UrlValidationResult;
13
+ /**
14
+ * Validate API URL and throw an error if invalid
15
+ * Use this when you want to fail fast on invalid URLs
16
+ */
17
+ export declare function validateApiUrlOrThrow(apiUrl: string): string;
@@ -0,0 +1,61 @@
1
+ import { isIP } from 'node:net';
2
+ /**
3
+ * Validate and sanitize an API URL
4
+ * - Must be a valid URL format
5
+ * - Must use HTTPS (except for localhost/127.0.0.1 for local development)
6
+ * - Returns sanitized URL with trailing slash removed
7
+ */
8
+ export function validateApiUrl(apiUrl) {
9
+ // Parse and validate URL
10
+ let parsedUrl;
11
+ try {
12
+ parsedUrl = new URL(apiUrl);
13
+ }
14
+ catch {
15
+ return {
16
+ isValid: false,
17
+ sanitizedUrl: '',
18
+ error: `Invalid API URL format: ${apiUrl}`,
19
+ };
20
+ }
21
+ // Must be http or https
22
+ if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {
23
+ return {
24
+ isValid: false,
25
+ sanitizedUrl: '',
26
+ error: `Invalid protocol: ${parsedUrl.protocol}. Only http and https are allowed.`,
27
+ };
28
+ }
29
+ // Check if localhost (allowed for HTTP in development)
30
+ const isLocalhost = parsedUrl.hostname === 'localhost' ||
31
+ parsedUrl.hostname === '127.0.0.1' ||
32
+ parsedUrl.hostname === '::1' ||
33
+ (isIP(parsedUrl.hostname) === 4 && parsedUrl.hostname.startsWith('127.'));
34
+ // Enforce HTTPS for non-localhost URLs
35
+ if (parsedUrl.protocol === 'http:' && !isLocalhost) {
36
+ return {
37
+ isValid: false,
38
+ sanitizedUrl: '',
39
+ error: 'Insecure API URL detected. HTTPS is required for non-localhost URLs to protect your credentials. ' +
40
+ `Use ${apiUrl.replace('http://', 'https://')} instead, or use http://localhost for local development.`,
41
+ };
42
+ }
43
+ // Sanitize: remove trailing slash
44
+ const sanitizedUrl = apiUrl.replace(/\/+$/, '');
45
+ return {
46
+ isValid: true,
47
+ sanitizedUrl,
48
+ };
49
+ }
50
+ /**
51
+ * Validate API URL and throw an error if invalid
52
+ * Use this when you want to fail fast on invalid URLs
53
+ */
54
+ export function validateApiUrlOrThrow(apiUrl) {
55
+ const result = validateApiUrl(apiUrl);
56
+ if (!result.isValid) {
57
+ throw new Error(result.error);
58
+ }
59
+ return result.sanitizedUrl;
60
+ }
61
+ //# sourceMappingURL=url-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-validator.js","sourceRoot":"","sources":["../../../../../src/lib/url-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAQhC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,yBAAyB;IACzB,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,2BAA2B,MAAM,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,qBAAqB,SAAS,CAAC,QAAQ,oCAAoC;SACnF,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,MAAM,WAAW,GACf,SAAS,CAAC,QAAQ,KAAK,WAAW;QAClC,SAAS,CAAC,QAAQ,KAAK,WAAW;QAClC,SAAS,CAAC,QAAQ,KAAK,KAAK;QAC5B,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5E,uCAAuC;IACvC,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,EAAE;YAChB,KAAK,EACH,mGAAmG;gBACnG,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,0DAA0D;SACzG,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type ParsedDocument } from '@signstack/base';
2
+ import { type ValidationResult } from '../types/schema.types.js';
3
+ /** Directories to ignore when discovering YAML files */
4
+ export declare const IGNORED_DIRECTORIES: readonly ["**/node_modules/**"];
5
+ /** Standard separator length for CLI output formatting */
6
+ export declare const SEPARATOR_LENGTH = 50;
7
+ /**
8
+ * Discover all YAML files in a folder recursively.
9
+ */
10
+ export declare function discoverYamlFiles(folderPath: string): Promise<string[]>;
11
+ /**
12
+ * Parse a single YAML file into ParsedDocument objects.
13
+ * Handles reading, YAML parsing, and basic document structure validation.
14
+ */
15
+ export declare function parseSingleYamlFile(filePath: string): {
16
+ documents: ParsedDocument[];
17
+ parseErrors: ValidationResult[];
18
+ };
19
+ /**
20
+ * Parse all YAML files into ParsedDocument objects.
21
+ */
22
+ export declare function parseAllYamlFiles(filePaths: string[]): {
23
+ documents: ParsedDocument[];
24
+ parseErrors: ValidationResult[];
25
+ };
@@ -0,0 +1,133 @@
1
+ import fg from 'fast-glob';
2
+ import { readFileSync } from 'node:fs';
3
+ import { parseAllDocuments } from 'yaml';
4
+ import { DependencyGraph, extractReferences } from '@signstack/base';
5
+ import { normalizePath } from './path-utils.js';
6
+ import { isSchemaKind, ValidationErrorKeyword, } from '../types/schema.types.js';
7
+ /** Directories to ignore when discovering YAML files */
8
+ export const IGNORED_DIRECTORIES = ['**/node_modules/**'];
9
+ /** Standard separator length for CLI output formatting */
10
+ export const SEPARATOR_LENGTH = 50;
11
+ /**
12
+ * Discover all YAML files in a folder recursively.
13
+ */
14
+ export async function discoverYamlFiles(folderPath) {
15
+ const pattern = `${normalizePath(folderPath)}/**/*.{yaml,yml}`;
16
+ const matches = await fg(pattern, {
17
+ absolute: true,
18
+ onlyFiles: true,
19
+ ignore: [...IGNORED_DIRECTORIES],
20
+ });
21
+ return matches.sort();
22
+ }
23
+ /**
24
+ * Parse a single YAML file into ParsedDocument objects.
25
+ * Handles reading, YAML parsing, and basic document structure validation.
26
+ */
27
+ export function parseSingleYamlFile(filePath) {
28
+ const documents = [];
29
+ const parseErrors = [];
30
+ let content;
31
+ try {
32
+ content = readFileSync(filePath, 'utf-8');
33
+ }
34
+ catch (error) {
35
+ parseErrors.push({
36
+ valid: false,
37
+ errors: [
38
+ {
39
+ path: '/',
40
+ message: `Failed to read file: ${error.message}`,
41
+ keyword: ValidationErrorKeyword.FileRead,
42
+ },
43
+ ],
44
+ schemaKind: 'unknown',
45
+ filePath,
46
+ });
47
+ return { documents, parseErrors };
48
+ }
49
+ let parsedDocs;
50
+ try {
51
+ const yamlDocs = parseAllDocuments(content);
52
+ parsedDocs = yamlDocs.map((doc) => {
53
+ if (doc.errors?.length) {
54
+ throw new Error(doc.errors.map((e) => e.message).join(', '));
55
+ }
56
+ return doc.toJSON();
57
+ });
58
+ }
59
+ catch (error) {
60
+ parseErrors.push({
61
+ valid: false,
62
+ errors: [
63
+ {
64
+ path: '/',
65
+ message: `YAML parse error: ${error.message}`,
66
+ keyword: ValidationErrorKeyword.YamlParse,
67
+ },
68
+ ],
69
+ schemaKind: 'unknown',
70
+ filePath,
71
+ });
72
+ return { documents, parseErrors };
73
+ }
74
+ const validDocs = parsedDocs.filter((d) => d != null);
75
+ const isMultiDoc = validDocs.length > 1;
76
+ for (let i = 0; i < parsedDocs.length; i++) {
77
+ const doc = parsedDocs[i];
78
+ if (doc == null || typeof doc !== 'object')
79
+ continue;
80
+ const docContent = doc;
81
+ const kind = docContent['kind'];
82
+ const metadata = docContent['metadata'];
83
+ if (!kind || !isSchemaKind(kind))
84
+ continue; // Skip non-SignStack docs
85
+ const docKey = metadata?.['key'];
86
+ const docVersion = metadata?.['version'];
87
+ const documentIndex = isMultiDoc ? i : undefined;
88
+ if (!docKey || !docVersion) {
89
+ parseErrors.push({
90
+ valid: false,
91
+ errors: [
92
+ {
93
+ path: '/metadata',
94
+ message: 'Document missing metadata.key or metadata.version',
95
+ keyword: ValidationErrorKeyword.Type,
96
+ },
97
+ ],
98
+ schemaKind: kind,
99
+ filePath,
100
+ documentIndex,
101
+ });
102
+ continue;
103
+ }
104
+ const schemaKind = kind;
105
+ const id = DependencyGraph.createId(schemaKind, docKey, docVersion);
106
+ const references = extractReferences(docContent, schemaKind);
107
+ documents.push({
108
+ id,
109
+ kind: schemaKind,
110
+ key: docKey,
111
+ version: docVersion,
112
+ filePath,
113
+ documentIndex,
114
+ content: docContent,
115
+ references,
116
+ });
117
+ }
118
+ return { documents, parseErrors };
119
+ }
120
+ /**
121
+ * Parse all YAML files into ParsedDocument objects.
122
+ */
123
+ export function parseAllYamlFiles(filePaths) {
124
+ const documents = [];
125
+ const parseErrors = [];
126
+ for (const filePath of filePaths) {
127
+ const result = parseSingleYamlFile(filePath);
128
+ documents.push(...result.documents);
129
+ parseErrors.push(...result.parseErrors);
130
+ }
131
+ return { documents, parseErrors };
132
+ }
133
+ //# sourceMappingURL=yaml-document-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-document-parser.js","sourceRoot":"","sources":["../../../../../src/lib/yaml-document-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { normalizeExpression, extractExpressionString, splitKeyVersion, extractBlueprintInputKey, resolveRequired, transformInputs, transformRole, transformField, transformAssetObjectRefs, normalizeYamlFunctionsBlock as normalizeYamlFunctions, } from '@signstack/base';
2
+ export declare const MIME_TYPES: Record<string, string>;
3
+ export declare function getContentType(filePath: string): string;
@@ -0,0 +1,32 @@
1
+ import { extname } from 'node:path';
2
+ // Re-export shared transform functions from @signstack/base
3
+ export { normalizeExpression, extractExpressionString, splitKeyVersion, extractBlueprintInputKey, resolveRequired, transformInputs, transformRole, transformField, transformAssetObjectRefs, normalizeYamlFunctionsBlock as normalizeYamlFunctions, } from '@signstack/base';
4
+ // CLI-only: MIME type mapping (requires Node.js `extname`)
5
+ export const MIME_TYPES = {
6
+ '.png': 'image/png',
7
+ '.jpg': 'image/jpeg',
8
+ '.jpeg': 'image/jpeg',
9
+ '.gif': 'image/gif',
10
+ '.svg': 'image/svg+xml',
11
+ '.webp': 'image/webp',
12
+ '.ico': 'image/x-icon',
13
+ '.pdf': 'application/pdf',
14
+ '.doc': 'application/msword',
15
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
16
+ '.html': 'text/html',
17
+ '.htm': 'text/html',
18
+ '.hbs': 'text/html',
19
+ '.css': 'text/css',
20
+ '.js': 'application/javascript',
21
+ '.json': 'application/json',
22
+ '.xml': 'application/xml',
23
+ '.txt': 'text/plain',
24
+ '.md': 'text/markdown',
25
+ '.yaml': 'text/yaml',
26
+ '.yml': 'text/yaml',
27
+ };
28
+ export function getContentType(filePath) {
29
+ const ext = extname(filePath).toLowerCase();
30
+ return MIME_TYPES[ext] || 'application/octet-stream';
31
+ }
32
+ //# sourceMappingURL=yaml-transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-transforms.js","sourceRoot":"","sources":["../../../../../src/lib/yaml-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,4DAA4D;AAC5D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,2BAA2B,IAAI,sBAAsB,GACtD,MAAM,iBAAiB,CAAC;AAEzB,2DAA2D;AAE3D,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,oBAAoB;IAC5B,OAAO,EACL,yEAAyE;IAC3E,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,wBAAwB;IAC/B,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACvD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { SchemaKind } from '../types/schema.types.js';
2
+ /**
3
+ * YamlWriter — Handles all file I/O for the pull operation.
4
+ *
5
+ * Creates the output folder structure and writes YAML documents,
6
+ * JSON schema definitions, text content (HTML/CSS), and binary files.
7
+ */
8
+ export declare class YamlWriter {
9
+ private readonly baseDir;
10
+ constructor(baseDir: string);
11
+ /** Create the output base directory */
12
+ ensureDirectories(): void;
13
+ /** Ensure a subdirectory exists before writing into it */
14
+ private ensureSubdir;
15
+ /**
16
+ * Write a YAML document for a resource.
17
+ * Returns the written file path relative to baseDir.
18
+ */
19
+ writeYaml(kind: SchemaKind, key: string, doc: Record<string, unknown>): string;
20
+ /**
21
+ * Write a JSON schema definition file into the schemas/ folder
22
+ * (co-located with the schema YAML that references it).
23
+ * Returns the relative path from the schema YAML's perspective (e.g., ./employee.json).
24
+ */
25
+ writeJsonDefinition(key: string, definition: Record<string, unknown>): string;
26
+ /**
27
+ * Write text content (HTML or CSS) to the assets/ folder
28
+ * (co-located with the asset YAML that references it).
29
+ * Returns the relative path from the asset YAML's perspective (e.g., ./key.hbs).
30
+ */
31
+ writeTextContent(_subdir: string, filename: string, content: string): string;
32
+ /**
33
+ * Download a binary file from a signed URL and write it to the assets/ folder
34
+ * (co-located with the asset YAML that references it).
35
+ * Returns the relative path from the asset YAML's perspective (e.g., ./key.pdf).
36
+ *
37
+ * The URL is validated to be an HTTPS GCS signed URL before fetching,
38
+ * preventing SSRF if a malicious or misconfigured API returns a bad URL.
39
+ */
40
+ downloadBinaryFile(key: string, ext: string, signedUrl: string): Promise<string>;
41
+ /**
42
+ * Write a minimal placeholder PDF for assets whose actual PDF is resolved
43
+ * dynamically at runtime (e.g. supplement templates with a dynamic fileId).
44
+ * This satisfies the local file-reference validator without a real file.
45
+ */
46
+ writePlaceholderPdf(key: string): void;
47
+ }
@@ -0,0 +1,160 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { stringify } from 'yaml';
4
+ import { SchemaKind } from '../types/schema.types.js';
5
+ /**
6
+ * Valid resource key pattern — must match backend validation.
7
+ * Keys are snake_case: lowercase letters, digits, single underscores only.
8
+ */
9
+ const SAFE_KEY_REGEX = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;
10
+ /**
11
+ * Assert that a key coming from the API is safe to use as a filename component.
12
+ * Throws if it contains path traversal characters or doesn't match the
13
+ * expected snake_case format.
14
+ */
15
+ function assertSafeKey(key) {
16
+ if (!SAFE_KEY_REGEX.test(key)) {
17
+ throw new Error(`Unsafe resource key received from API: "${key}". Keys must be snake_case (lowercase letters, digits, single underscores).`);
18
+ }
19
+ }
20
+ /** Map SchemaKind to output subdirectory name */
21
+ const KIND_DIRS = {
22
+ [SchemaKind.Blueprint]: 'blueprints',
23
+ [SchemaKind.Template]: 'templates',
24
+ [SchemaKind.Asset]: 'assets',
25
+ [SchemaKind.Schema]: 'schemas',
26
+ [SchemaKind.JsonataFunction]: 'functions',
27
+ };
28
+ /**
29
+ * Allowed hostnames for signed file download URLs.
30
+ * GCS signed URLs always use storage.googleapis.com.
31
+ */
32
+ const ALLOWED_SIGNED_URL_HOSTS = new Set([
33
+ 'storage.googleapis.com',
34
+ ]);
35
+ /**
36
+ * Validate that a signed URL is safe to fetch:
37
+ * - Must use HTTPS
38
+ * - Host must be a known GCS domain
39
+ *
40
+ * Throws if the URL fails validation to prevent SSRF.
41
+ */
42
+ function validateSignedUrl(url) {
43
+ let parsed;
44
+ try {
45
+ parsed = new URL(url);
46
+ }
47
+ catch {
48
+ throw new Error(`Invalid signed URL: "${url}"`);
49
+ }
50
+ if (parsed.protocol !== 'https:') {
51
+ throw new Error(`Signed URL must use HTTPS, got "${parsed.protocol}" — rejecting to prevent SSRF`);
52
+ }
53
+ if (!ALLOWED_SIGNED_URL_HOSTS.has(parsed.hostname)) {
54
+ throw new Error(`Signed URL hostname "${parsed.hostname}" is not an allowed GCS domain — rejecting to prevent SSRF`);
55
+ }
56
+ }
57
+ /**
58
+ * YamlWriter — Handles all file I/O for the pull operation.
59
+ *
60
+ * Creates the output folder structure and writes YAML documents,
61
+ * JSON schema definitions, text content (HTML/CSS), and binary files.
62
+ */
63
+ export class YamlWriter {
64
+ baseDir;
65
+ constructor(baseDir) {
66
+ this.baseDir = baseDir;
67
+ }
68
+ /** Create the output base directory */
69
+ ensureDirectories() {
70
+ mkdirSync(this.baseDir, { recursive: true });
71
+ }
72
+ /** Ensure a subdirectory exists before writing into it */
73
+ ensureSubdir(subdir) {
74
+ mkdirSync(join(this.baseDir, subdir), { recursive: true });
75
+ }
76
+ /**
77
+ * Write a YAML document for a resource.
78
+ * Returns the written file path relative to baseDir.
79
+ */
80
+ writeYaml(kind, key, doc) {
81
+ assertSafeKey(key);
82
+ const dir = KIND_DIRS[kind] ?? 'other';
83
+ this.ensureSubdir(dir);
84
+ const relPath = join(dir, `${key}.yaml`);
85
+ const absPath = join(this.baseDir, relPath);
86
+ const yamlStr = stringify(doc, { lineWidth: 0 });
87
+ writeFileSync(absPath, yamlStr, 'utf-8');
88
+ return relPath;
89
+ }
90
+ /**
91
+ * Write a JSON schema definition file into the schemas/ folder
92
+ * (co-located with the schema YAML that references it).
93
+ * Returns the relative path from the schema YAML's perspective (e.g., ./employee.json).
94
+ */
95
+ writeJsonDefinition(key, definition) {
96
+ assertSafeKey(key);
97
+ this.ensureSubdir('schemas');
98
+ const relPath = join('schemas', `${key}.json`);
99
+ const absPath = join(this.baseDir, relPath);
100
+ writeFileSync(absPath, JSON.stringify(definition, null, 2) + '\n', 'utf-8');
101
+ // Path relative to the schemas/ dir (where the YAML lives)
102
+ return `./${key}.json`;
103
+ }
104
+ /**
105
+ * Write text content (HTML or CSS) to the assets/ folder
106
+ * (co-located with the asset YAML that references it).
107
+ * Returns the relative path from the asset YAML's perspective (e.g., ./key.hbs).
108
+ */
109
+ writeTextContent(_subdir, filename, content) {
110
+ // filename is always `${key}${fixedExt}` — the key portion must be safe
111
+ const dotIdx = filename.lastIndexOf('.');
112
+ const keyPart = dotIdx > 0 ? filename.slice(0, dotIdx) : filename;
113
+ assertSafeKey(keyPart);
114
+ this.ensureSubdir('assets');
115
+ const absPath = join(this.baseDir, 'assets', filename);
116
+ writeFileSync(absPath, content, 'utf-8');
117
+ return `./${filename}`;
118
+ }
119
+ /**
120
+ * Download a binary file from a signed URL and write it to the assets/ folder
121
+ * (co-located with the asset YAML that references it).
122
+ * Returns the relative path from the asset YAML's perspective (e.g., ./key.pdf).
123
+ *
124
+ * The URL is validated to be an HTTPS GCS signed URL before fetching,
125
+ * preventing SSRF if a malicious or misconfigured API returns a bad URL.
126
+ */
127
+ async downloadBinaryFile(key, ext, signedUrl) {
128
+ validateSignedUrl(signedUrl);
129
+ assertSafeKey(key);
130
+ this.ensureSubdir('assets');
131
+ const filename = `${key}${ext}`;
132
+ const absPath = join(this.baseDir, 'assets', filename);
133
+ const response = await fetch(signedUrl);
134
+ if (!response.ok) {
135
+ throw new Error(`Failed to download file for ${key}: ${response.status} ${response.statusText}`);
136
+ }
137
+ const buffer = Buffer.from(await response.arrayBuffer());
138
+ writeFileSync(absPath, buffer);
139
+ return `./${filename}`;
140
+ }
141
+ /**
142
+ * Write a minimal placeholder PDF for assets whose actual PDF is resolved
143
+ * dynamically at runtime (e.g. supplement templates with a dynamic fileId).
144
+ * This satisfies the local file-reference validator without a real file.
145
+ */
146
+ writePlaceholderPdf(key) {
147
+ assertSafeKey(key);
148
+ this.ensureSubdir('assets');
149
+ const absPath = join(this.baseDir, 'assets', `${key}.pdf`);
150
+ // Minimal well-formed PDF — 1 empty page
151
+ const placeholder = '%PDF-1.4\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj ' +
152
+ '2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj ' +
153
+ '3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R>>endobj\n' +
154
+ 'xref\n0 4\n0000000000 65535 f\n0000000009 00000 n\n' +
155
+ '0000000058 00000 n\n0000000115 00000 n\n' +
156
+ 'trailer<</Size 4/Root 1 0 R>>\nstartxref\n190\n%%EOF\n';
157
+ writeFileSync(absPath, placeholder, 'utf-8');
158
+ }
159
+ }
160
+ //# sourceMappingURL=yaml-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-writer.js","sourceRoot":"","sources":["../../../../../src/lib/yaml-writer.ts"],"names":[],"mappings":"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"}