@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.
- package/README.md +458 -0
- package/bin/run.js +12 -0
- package/dist/apps/signstack-cli/schemas/asset.schema.json +220 -0
- package/dist/apps/signstack-cli/schemas/blueprint.schema.json +485 -0
- package/dist/apps/signstack-cli/schemas/jsonata-function.schema.json +185 -0
- package/dist/apps/signstack-cli/schemas/schema.schema.json +97 -0
- package/dist/apps/signstack-cli/schemas/template.schema.json +295 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.d.ts +25 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.js +229 -0
- package/dist/apps/signstack-cli/src/commands/auth/login.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.d.ts +10 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.js +59 -0
- package/dist/apps/signstack-cli/src/commands/auth/logout.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.d.ts +9 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.js +85 -0
- package/dist/apps/signstack-cli/src/commands/auth/whoami.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/generate.d.ts +51 -0
- package/dist/apps/signstack-cli/src/commands/generate.js +479 -0
- package/dist/apps/signstack-cli/src/commands/generate.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/preview.d.ts +24 -0
- package/dist/apps/signstack-cli/src/commands/preview.js +162 -0
- package/dist/apps/signstack-cli/src/commands/preview.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/pull.d.ts +28 -0
- package/dist/apps/signstack-cli/src/commands/pull.js +244 -0
- package/dist/apps/signstack-cli/src/commands/pull.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/push.d.ts +46 -0
- package/dist/apps/signstack-cli/src/commands/push.js +460 -0
- package/dist/apps/signstack-cli/src/commands/push.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/run.d.ts +22 -0
- package/dist/apps/signstack-cli/src/commands/run.js +126 -0
- package/dist/apps/signstack-cli/src/commands/run.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/test.d.ts +6 -0
- package/dist/apps/signstack-cli/src/commands/test.js +25 -0
- package/dist/apps/signstack-cli/src/commands/test.js.map +1 -0
- package/dist/apps/signstack-cli/src/commands/validate.d.ts +59 -0
- package/dist/apps/signstack-cli/src/commands/validate.js +558 -0
- package/dist/apps/signstack-cli/src/commands/validate.js.map +1 -0
- package/dist/apps/signstack-cli/src/index.d.ts +1 -0
- package/dist/apps/signstack-cli/src/index.js +2 -0
- package/dist/apps/signstack-cli/src/index.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/api-client.d.ts +77 -0
- package/dist/apps/signstack-cli/src/lib/api-client.js +269 -0
- package/dist/apps/signstack-cli/src/lib/api-client.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/base-command.d.ts +38 -0
- package/dist/apps/signstack-cli/src/lib/base-command.js +135 -0
- package/dist/apps/signstack-cli/src/lib/base-command.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/config.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/config.js +106 -0
- package/dist/apps/signstack-cli/src/lib/config.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.d.ts +31 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js +107 -0
- package/dist/apps/signstack-cli/src/lib/entity-data-resolver.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.d.ts +72 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.js +238 -0
- package/dist/apps/signstack-cli/src/lib/local-resource-loader.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.d.ts +4 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.js +7 -0
- package/dist/apps/signstack-cli/src/lib/path-utils.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.d.ts +127 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.js +545 -0
- package/dist/apps/signstack-cli/src/lib/payload-builder.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.d.ts +95 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.js +611 -0
- package/dist/apps/signstack-cli/src/lib/preview-handler.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.d.ts +63 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js +198 -0
- package/dist/apps/signstack-cli/src/lib/preview-output-formatter.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.d.ts +13 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.js +39 -0
- package/dist/apps/signstack-cli/src/lib/public-api-client.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.d.ts +131 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.js +800 -0
- package/dist/apps/signstack-cli/src/lib/resource-puller.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.d.ts +87 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.js +361 -0
- package/dist/apps/signstack-cli/src/lib/resource-pusher.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.d.ts +29 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.js +101 -0
- package/dist/apps/signstack-cli/src/lib/resource-scanner.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.d.ts +44 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.js +158 -0
- package/dist/apps/signstack-cli/src/lib/resource-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.js +266 -0
- package/dist/apps/signstack-cli/src/lib/run-handler.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.d.ts +28 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.js +44 -0
- package/dist/apps/signstack-cli/src/lib/safe-path.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.d.ts +35 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.js +80 -0
- package/dist/apps/signstack-cli/src/lib/scenario-file.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.d.ts +8 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.js +39 -0
- package/dist/apps/signstack-cli/src/lib/schema-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.d.ts +17 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.js +61 -0
- package/dist/apps/signstack-cli/src/lib/url-validator.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.d.ts +25 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js +133 -0
- package/dist/apps/signstack-cli/src/lib/yaml-document-parser.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.d.ts +3 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.js +32 -0
- package/dist/apps/signstack-cli/src/lib/yaml-transforms.js.map +1 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.d.ts +47 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.js +160 -0
- package/dist/apps/signstack-cli/src/lib/yaml-writer.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/auth.types.d.ts +48 -0
- package/dist/apps/signstack-cli/src/types/auth.types.js +31 -0
- package/dist/apps/signstack-cli/src/types/auth.types.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/schema.types.d.ts +14 -0
- package/dist/apps/signstack-cli/src/types/schema.types.js +16 -0
- package/dist/apps/signstack-cli/src/types/schema.types.js.map +1 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.d.ts +144 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.js +2 -0
- package/dist/apps/signstack-cli/src/types/yaml.types.js.map +1 -0
- package/dist/libs/common/base/src/index.d.ts +14 -0
- package/dist/libs/common/base/src/index.js +44 -0
- package/dist/libs/common/base/src/index.js.map +1 -0
- package/dist/libs/common/base/src/lib/address.util.d.ts +12 -0
- package/dist/libs/common/base/src/lib/address.util.js +55 -0
- package/dist/libs/common/base/src/lib/address.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/country-code-data.d.ts +5 -0
- package/dist/libs/common/base/src/lib/country-code-data.js +1256 -0
- package/dist/libs/common/base/src/lib/country-code-data.js.map +1 -0
- package/dist/libs/common/base/src/lib/date.util.d.ts +13 -0
- package/dist/libs/common/base/src/lib/date.util.js +135 -0
- package/dist/libs/common/base/src/lib/date.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/headers.d.ts +1 -0
- package/dist/libs/common/base/src/lib/headers.js +5 -0
- package/dist/libs/common/base/src/lib/headers.js.map +1 -0
- package/dist/libs/common/base/src/lib/jsonata.service.d.ts +32 -0
- package/dist/libs/common/base/src/lib/jsonata.service.js +207 -0
- package/dist/libs/common/base/src/lib/jsonata.service.js.map +1 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.d.ts +37 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.js +144 -0
- package/dist/libs/common/base/src/lib/key-validation.constants.js.map +1 -0
- package/dist/libs/common/base/src/lib/phone-util.d.ts +16 -0
- package/dist/libs/common/base/src/lib/phone-util.js +61 -0
- package/dist/libs/common/base/src/lib/phone-util.js.map +1 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.d.ts +24 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.js +155 -0
- package/dist/libs/common/base/src/lib/schema-validation.util.js.map +1 -0
- package/dist/libs/common/base/src/lib/string-builder.d.ts +48 -0
- package/dist/libs/common/base/src/lib/string-builder.js +90 -0
- package/dist/libs/common/base/src/lib/string-builder.js.map +1 -0
- package/dist/libs/common/base/src/lib/util.d.ts +20 -0
- package/dist/libs/common/base/src/lib/util.js +110 -0
- package/dist/libs/common/base/src/lib/util.js.map +1 -0
- package/dist/libs/signstack/base/schemas/asset.schema.json +220 -0
- package/dist/libs/signstack/base/schemas/blueprint.schema.json +485 -0
- package/dist/libs/signstack/base/schemas/jsonata-function.schema.json +185 -0
- package/dist/libs/signstack/base/schemas/schema.schema.json +97 -0
- package/dist/libs/signstack/base/schemas/template.schema.json +295 -0
- package/dist/libs/signstack/base/src/index.d.ts +28 -0
- package/dist/libs/signstack/base/src/index.js +32 -0
- package/dist/libs/signstack/base/src/index.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/constants.d.ts +123 -0
- package/dist/libs/signstack/base/src/lib/constants.js +131 -0
- package/dist/libs/signstack/base/src/lib/constants.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/hash.util.d.ts +58 -0
- package/dist/libs/signstack/base/src/lib/hash.util.js +90 -0
- package/dist/libs/signstack/base/src/lib/hash.util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.d.ts +29 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js +93 -0
- package/dist/libs/signstack/base/src/lib/is-schema-renderable.util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.d.ts +41 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/ai-chat.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.d.ts +54 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.js +18 -0
- package/dist/libs/signstack/base/src/lib/models/api-key.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/asset.d.ts +101 -0
- package/dist/libs/signstack/base/src/lib/models/asset.js +11 -0
- package/dist/libs/signstack/base/src/lib/models/asset.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/auth.d.ts +142 -0
- package/dist/libs/signstack/base/src/lib/models/auth.js +35 -0
- package/dist/libs/signstack/base/src/lib/models/auth.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/base.d.ts +134 -0
- package/dist/libs/signstack/base/src/lib/models/base.js +71 -0
- package/dist/libs/signstack/base/src/lib/models/base.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.d.ts +311 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.js +9 -0
- package/dist/libs/signstack/base/src/lib/models/blueprint.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/file.d.ts +75 -0
- package/dist/libs/signstack/base/src/lib/models/file.js +9 -0
- package/dist/libs/signstack/base/src/lib/models/file.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.d.ts +111 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.js +19 -0
- package/dist/libs/signstack/base/src/lib/models/jsonata-function.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.d.ts +132 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js +22 -0
- package/dist/libs/signstack/base/src/lib/models/marketplace-listing.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/membership.d.ts +127 -0
- package/dist/libs/signstack/base/src/lib/models/membership.js +22 -0
- package/dist/libs/signstack/base/src/lib/models/membership.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.d.ts +87 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.js +57 -0
- package/dist/libs/signstack/base/src/lib/models/namespace.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/organization.d.ts +79 -0
- package/dist/libs/signstack/base/src/lib/models/organization.js +41 -0
- package/dist/libs/signstack/base/src/lib/models/organization.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.d.ts +88 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/render-job.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.d.ts +60 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.js +202 -0
- package/dist/libs/signstack/base/src/lib/models/resource-edge.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.d.ts +138 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.js +14 -0
- package/dist/libs/signstack/base/src/lib/models/scenario.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/schema.d.ts +131 -0
- package/dist/libs/signstack/base/src/lib/models/schema.js +44 -0
- package/dist/libs/signstack/base/src/lib/models/schema.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.d.ts +215 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.js +27 -0
- package/dist/libs/signstack/base/src/lib/models/shareable-link.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.d.ts +279 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.js +105 -0
- package/dist/libs/signstack/base/src/lib/models/subscription.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/template.d.ts +248 -0
- package/dist/libs/signstack/base/src/lib/models/template.js +32 -0
- package/dist/libs/signstack/base/src/lib/models/template.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/user.d.ts +30 -0
- package/dist/libs/signstack/base/src/lib/models/user.js +3 -0
- package/dist/libs/signstack/base/src/lib/models/user.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.d.ts +223 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.js +62 -0
- package/dist/libs/signstack/base/src/lib/models/webhook.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.d.ts +917 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.js +152 -0
- package/dist/libs/signstack/base/src/lib/models/workflow.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/util.d.ts +92 -0
- package/dist/libs/signstack/base/src/lib/util.js +406 -0
- package/dist/libs/signstack/base/src/lib/util.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.d.ts +94 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js +446 -0
- package/dist/libs/signstack/base/src/lib/validation/dependency-graph.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.d.ts +57 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.js +8 -0
- package/dist/libs/signstack/base/src/lib/validation/graph.types.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/index.d.ts +9 -0
- package/dist/libs/signstack/base/src/lib/validation/index.js +23 -0
- package/dist/libs/signstack/base/src/lib/validation/index.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.d.ts +3 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js +27 -0
- package/dist/libs/signstack/base/src/lib/validation/resource-schemas.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.d.ts +57 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js +57 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validation.types.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.d.ts +38 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.js +146 -0
- package/dist/libs/signstack/base/src/lib/validation/schema-validator.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.d.ts +22 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js +69 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-dependencies.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.d.ts +37 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js +250 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-resource-tree.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.d.ts +24 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js +98 -0
- package/dist/libs/signstack/base/src/lib/validation/validate-template-inputs.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.d.ts +12 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js +50 -0
- package/dist/libs/signstack/base/src/lib/validation/yaml-document-utils.js.map +1 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.d.ts +101 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js +998 -0
- package/dist/libs/signstack/base/src/lib/yaml-spec-converter.js.map +1 -0
- package/oclif.manifest.json +822 -0
- package/package.json +101 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { type BlueprintResource, type ScenarioEntity, type RenderTemplateReq, type RenderBlueprintReq, type TemplateResource, type AssetResource, type SchemaResource, type JsonataFunctionResource, type CreateWorkflowReq, type CreateWorkflowMode, type ParsedDocument } from '@signstack/base';
|
|
2
|
+
/** Asset file ready for upload */
|
|
3
|
+
export interface AssetFilePayload {
|
|
4
|
+
assetKey: string;
|
|
5
|
+
assetVersion: string;
|
|
6
|
+
fileName: string;
|
|
7
|
+
contentType: string;
|
|
8
|
+
content: Buffer;
|
|
9
|
+
fileHash: string;
|
|
10
|
+
sizeBytes: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* PayloadBuilder - Converts YAML documents to typed API payload format
|
|
14
|
+
*
|
|
15
|
+
* Transforms parsed YAML documents into the format expected by the
|
|
16
|
+
* render-inline API endpoint (matching BlueprintResp / TemplateResp).
|
|
17
|
+
*/
|
|
18
|
+
export declare class PayloadBuilder {
|
|
19
|
+
/**
|
|
20
|
+
* Build Blueprint payload from YAML
|
|
21
|
+
* Returns a BlueprintResource matching the unified RenderBlueprintReq shape
|
|
22
|
+
*/
|
|
23
|
+
buildBlueprintPayload(doc: ParsedDocument): BlueprintResource;
|
|
24
|
+
/**
|
|
25
|
+
* Transform YAML participants to BlueprintParticipant[] (API shape).
|
|
26
|
+
*/
|
|
27
|
+
private transformBlueprintParticipants;
|
|
28
|
+
/**
|
|
29
|
+
* Transform YAML orchestration tree to BlueprintStep tree (API shape).
|
|
30
|
+
* Normalizes action: YAML uses envelope/document/role → API uses envelopeKey/documentKey/roleKey.
|
|
31
|
+
*/
|
|
32
|
+
private transformOrchestrationToTree;
|
|
33
|
+
/**
|
|
34
|
+
* Build RenderTemplateReq with inline resources from YAML documents.
|
|
35
|
+
* Ships resources as structured documents — no tree flattening.
|
|
36
|
+
*/
|
|
37
|
+
buildRenderTemplateReq(params: {
|
|
38
|
+
templateDoc: ParsedDocument;
|
|
39
|
+
assetDocs: ParsedDocument[];
|
|
40
|
+
functionDocs?: ParsedDocument[];
|
|
41
|
+
schemaDocs?: ParsedDocument[];
|
|
42
|
+
fileIdMap?: Map<string, string>;
|
|
43
|
+
entities?: ScenarioEntity[];
|
|
44
|
+
inlineOnly?: boolean;
|
|
45
|
+
skipSignatureFields?: boolean;
|
|
46
|
+
}): RenderTemplateReq;
|
|
47
|
+
/**
|
|
48
|
+
* Build RenderBlueprintReq with inline resources from YAML documents.
|
|
49
|
+
*/
|
|
50
|
+
buildRenderBlueprintReq(params: {
|
|
51
|
+
blueprintDoc: ParsedDocument;
|
|
52
|
+
templateDocs: ParsedDocument[];
|
|
53
|
+
assetDocs: ParsedDocument[];
|
|
54
|
+
functionDocs?: ParsedDocument[];
|
|
55
|
+
schemaDocs?: ParsedDocument[];
|
|
56
|
+
fileIdMap?: Map<string, string>;
|
|
57
|
+
entities?: ScenarioEntity[];
|
|
58
|
+
inlineOnly?: boolean;
|
|
59
|
+
skipSignatureFields?: boolean;
|
|
60
|
+
combinePdfs?: boolean;
|
|
61
|
+
}): RenderBlueprintReq;
|
|
62
|
+
/**
|
|
63
|
+
* Build CreateWorkflowReq with inline resources from YAML documents.
|
|
64
|
+
*/
|
|
65
|
+
buildCreateWorkflowReq(params: {
|
|
66
|
+
blueprintDoc: ParsedDocument;
|
|
67
|
+
templateDocs: ParsedDocument[];
|
|
68
|
+
assetDocs: ParsedDocument[];
|
|
69
|
+
functionDocs?: ParsedDocument[];
|
|
70
|
+
schemaDocs?: ParsedDocument[];
|
|
71
|
+
fileIdMap?: Map<string, string>;
|
|
72
|
+
entities?: {
|
|
73
|
+
key: string;
|
|
74
|
+
data: Record<string, any>;
|
|
75
|
+
}[];
|
|
76
|
+
inlineOnly?: boolean;
|
|
77
|
+
mode?: CreateWorkflowMode;
|
|
78
|
+
}): CreateWorkflowReq;
|
|
79
|
+
/**
|
|
80
|
+
* Build a TemplateResource from a YAML template document.
|
|
81
|
+
*/
|
|
82
|
+
buildTemplateResource(doc: ParsedDocument): TemplateResource;
|
|
83
|
+
/**
|
|
84
|
+
* Build an AssetResource from a YAML asset document.
|
|
85
|
+
* For text assets: reads file content. For binary assets: uses fileIdMap.
|
|
86
|
+
*/
|
|
87
|
+
buildAssetResource(doc: ParsedDocument, fileIdMap?: Map<string, string>): AssetResource | null;
|
|
88
|
+
/**
|
|
89
|
+
* Build AssetHtmlConfigRefs from YAML spec.
|
|
90
|
+
* Maps YAML format (name→ref) to API format ({ key, version, name? }).
|
|
91
|
+
*/
|
|
92
|
+
private buildAssetHtmlConfigRefs;
|
|
93
|
+
/**
|
|
94
|
+
* Build a JsonataFunctionResource from a YAML function document.
|
|
95
|
+
*/
|
|
96
|
+
buildFunctionResource(doc: ParsedDocument): JsonataFunctionResource | null;
|
|
97
|
+
/**
|
|
98
|
+
* Build a SchemaResource from a YAML schema document.
|
|
99
|
+
*/
|
|
100
|
+
buildSchemaResource(doc: ParsedDocument): SchemaResource | null;
|
|
101
|
+
/**
|
|
102
|
+
* Resolve a file path reference from a YAML document, with path-traversal protection.
|
|
103
|
+
*
|
|
104
|
+
* The resolved path must stay within the project root, defined as the parent of
|
|
105
|
+
* the directory containing the YAML file. This allows cross-subdirectory references
|
|
106
|
+
* (e.g., `schemas/foo.yaml` referencing `../definitions/foo.json`) while still
|
|
107
|
+
* preventing traversal outside the project.
|
|
108
|
+
*
|
|
109
|
+
* Returns null if the path resolves outside the project root.
|
|
110
|
+
*/
|
|
111
|
+
private resolveFileRef;
|
|
112
|
+
/**
|
|
113
|
+
* Read asset file content as text (for HTML/CSS assets)
|
|
114
|
+
* Returns null if file not found or can't be read
|
|
115
|
+
*/
|
|
116
|
+
readAssetFileContent(doc: ParsedDocument): string | null;
|
|
117
|
+
/**
|
|
118
|
+
* Build Asset file payload from YAML
|
|
119
|
+
* Returns file content ready for upload, or null if no file
|
|
120
|
+
*/
|
|
121
|
+
buildAssetPayload(doc: ParsedDocument): AssetFilePayload | null;
|
|
122
|
+
/**
|
|
123
|
+
* Build Schema payload - reads the JSON definition file
|
|
124
|
+
* Returns the parsed document with definition loaded (for entity data generation)
|
|
125
|
+
*/
|
|
126
|
+
buildSchemaPayload(doc: ParsedDocument): ParsedDocument;
|
|
127
|
+
}
|
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve, basename, sep } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { JsonataFunctionParamType, JsonataFunctionItemType, JsonSchemaDraft, } from '@signstack/base';
|
|
5
|
+
import { extractBlueprintInputKey, getContentType, transformField, transformInputs, transformRole, normalizeExpression, normalizeYamlFunctions, } from './yaml-transforms.js';
|
|
6
|
+
/**
|
|
7
|
+
* PayloadBuilder - Converts YAML documents to typed API payload format
|
|
8
|
+
*
|
|
9
|
+
* Transforms parsed YAML documents into the format expected by the
|
|
10
|
+
* render-inline API endpoint (matching BlueprintResp / TemplateResp).
|
|
11
|
+
*/
|
|
12
|
+
export class PayloadBuilder {
|
|
13
|
+
/**
|
|
14
|
+
* Build Blueprint payload from YAML
|
|
15
|
+
* Returns a BlueprintResource matching the unified RenderBlueprintReq shape
|
|
16
|
+
*/
|
|
17
|
+
buildBlueprintPayload(doc) {
|
|
18
|
+
const spec = doc.content['spec'];
|
|
19
|
+
const meta = doc.content['metadata'];
|
|
20
|
+
const inputs = transformInputs(spec?.inputs ?? []);
|
|
21
|
+
const participants = this.transformBlueprintParticipants(spec?.participants ?? []);
|
|
22
|
+
const orchestration = spec?.orchestration
|
|
23
|
+
? this.transformOrchestrationToTree(spec.orchestration)
|
|
24
|
+
: undefined;
|
|
25
|
+
const envelopes = (spec?.envelopes ?? []).map((env) => ({
|
|
26
|
+
key: env.key,
|
|
27
|
+
subject: env.subject ?? env.name ?? env.key,
|
|
28
|
+
documents: (env.documents ?? []).map((d) => {
|
|
29
|
+
const [templateKey, templateVersion] = (d.template ?? '').split('@');
|
|
30
|
+
const yamlInputMap = d.inputMap;
|
|
31
|
+
// Only send inputMap when explicitly specified in YAML.
|
|
32
|
+
// undefined → auto-map by matching keys; [] or populated → explicit mapping.
|
|
33
|
+
const inputMap = yamlInputMap
|
|
34
|
+
? Object.entries(yamlInputMap).map(([k, v]) => ({
|
|
35
|
+
templateInputKey: k,
|
|
36
|
+
blueprintInputKey: typeof v === 'string' ? extractBlueprintInputKey(v) : '',
|
|
37
|
+
}))
|
|
38
|
+
: undefined;
|
|
39
|
+
return {
|
|
40
|
+
key: d.key,
|
|
41
|
+
name: d.name ?? d.key,
|
|
42
|
+
templateKey,
|
|
43
|
+
templateVersion,
|
|
44
|
+
inputMap,
|
|
45
|
+
includeIf: d.includeIf,
|
|
46
|
+
iterator: d.iterator,
|
|
47
|
+
fileId: normalizeExpression(d.fileId),
|
|
48
|
+
};
|
|
49
|
+
}),
|
|
50
|
+
}));
|
|
51
|
+
const functions = normalizeYamlFunctions(spec?.functions);
|
|
52
|
+
return {
|
|
53
|
+
metadata: {
|
|
54
|
+
key: doc.key,
|
|
55
|
+
version: doc.version,
|
|
56
|
+
name: meta?.name ?? doc.key,
|
|
57
|
+
description: meta?.description,
|
|
58
|
+
},
|
|
59
|
+
spec: { envelopes, inputs, participants, orchestration, functions },
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Transform YAML participants to BlueprintParticipant[] (API shape).
|
|
64
|
+
*/
|
|
65
|
+
transformBlueprintParticipants(yamlParticipants) {
|
|
66
|
+
if (yamlParticipants.length === 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
return yamlParticipants.map((p) => ({
|
|
69
|
+
key: p.key,
|
|
70
|
+
name: typeof p.name === 'string' ? p.name : p.key,
|
|
71
|
+
roleCategory: p.roleCategory,
|
|
72
|
+
participantName: p.name,
|
|
73
|
+
participantEmail: p.email,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Transform YAML orchestration tree to BlueprintStep tree (API shape).
|
|
78
|
+
* Normalizes action: YAML uses envelope/document/role → API uses envelopeKey/documentKey/roleKey.
|
|
79
|
+
*/
|
|
80
|
+
transformOrchestrationToTree(node) {
|
|
81
|
+
const rawAction = node.action;
|
|
82
|
+
if (node.type === 'group') {
|
|
83
|
+
const step = {
|
|
84
|
+
key: node.key,
|
|
85
|
+
type: node.type,
|
|
86
|
+
execution: node.execution === 'parallel' ? 'parallel' : 'sequential',
|
|
87
|
+
completion: node.completion === 'any'
|
|
88
|
+
? 'any'
|
|
89
|
+
: node.completion === 'quorum'
|
|
90
|
+
? 'quorum'
|
|
91
|
+
: 'all',
|
|
92
|
+
children: (node.children ?? []).map((c) => this.transformOrchestrationToTree(c)),
|
|
93
|
+
};
|
|
94
|
+
if (node.name)
|
|
95
|
+
step.name = node.name;
|
|
96
|
+
if (node.includeIf)
|
|
97
|
+
step.includeIf = node.includeIf;
|
|
98
|
+
if (node.quorum != null)
|
|
99
|
+
step.quorum = node.quorum;
|
|
100
|
+
if (node.onComplete)
|
|
101
|
+
step.onComplete = node.onComplete;
|
|
102
|
+
return step;
|
|
103
|
+
}
|
|
104
|
+
const step = {
|
|
105
|
+
key: node.key,
|
|
106
|
+
type: node.type,
|
|
107
|
+
participantKey: node.participant,
|
|
108
|
+
};
|
|
109
|
+
if (node.name)
|
|
110
|
+
step.name = node.name;
|
|
111
|
+
if (node.includeIf)
|
|
112
|
+
step.includeIf = node.includeIf;
|
|
113
|
+
if (node.onComplete)
|
|
114
|
+
step.onComplete = node.onComplete;
|
|
115
|
+
if (rawAction) {
|
|
116
|
+
step.action = {
|
|
117
|
+
type: (rawAction.type === 'sign' ? 'sign' : rawAction.type),
|
|
118
|
+
envelopeKey: rawAction.envelopeKey ?? rawAction.envelope ?? '',
|
|
119
|
+
assignments: (rawAction.assignments ?? []).map((a) => ({
|
|
120
|
+
documentKey: a.documentKey ?? a.document ?? '',
|
|
121
|
+
roleKey: a.roleKey ?? a.role ?? '',
|
|
122
|
+
})),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return step;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build RenderTemplateReq with inline resources from YAML documents.
|
|
129
|
+
* Ships resources as structured documents — no tree flattening.
|
|
130
|
+
*/
|
|
131
|
+
buildRenderTemplateReq(params) {
|
|
132
|
+
const { templateDoc, assetDocs, functionDocs, schemaDocs, fileIdMap, entities, inlineOnly, skipSignatureFields, } = params;
|
|
133
|
+
// Build template resource
|
|
134
|
+
const template = this.buildTemplateResource(templateDoc);
|
|
135
|
+
// Build asset resources
|
|
136
|
+
const assets = assetDocs
|
|
137
|
+
.map((doc) => this.buildAssetResource(doc, fileIdMap))
|
|
138
|
+
.filter((a) => a !== null);
|
|
139
|
+
// Build function resources
|
|
140
|
+
const functions = (functionDocs ?? [])
|
|
141
|
+
.map((doc) => this.buildFunctionResource(doc))
|
|
142
|
+
.filter((f) => f !== null);
|
|
143
|
+
// Build schema resources
|
|
144
|
+
const schemas = (schemaDocs ?? [])
|
|
145
|
+
.map((doc) => this.buildSchemaResource(doc))
|
|
146
|
+
.filter((s) => s !== null);
|
|
147
|
+
return {
|
|
148
|
+
inlineResources: {
|
|
149
|
+
template,
|
|
150
|
+
assets: assets.length > 0 ? assets : undefined,
|
|
151
|
+
functions: functions.length > 0 ? functions : undefined,
|
|
152
|
+
schemas: schemas.length > 0 ? schemas : undefined,
|
|
153
|
+
inlineOnly,
|
|
154
|
+
},
|
|
155
|
+
entities: entities?.length
|
|
156
|
+
? entities.map((e) => ({
|
|
157
|
+
inputKey: e.key,
|
|
158
|
+
data: e.data,
|
|
159
|
+
}))
|
|
160
|
+
: undefined,
|
|
161
|
+
options: { skipSignatureFields },
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Build RenderBlueprintReq with inline resources from YAML documents.
|
|
166
|
+
*/
|
|
167
|
+
buildRenderBlueprintReq(params) {
|
|
168
|
+
const { blueprintDoc, templateDocs, assetDocs, functionDocs, schemaDocs, fileIdMap, entities, inlineOnly, skipSignatureFields, combinePdfs, } = params;
|
|
169
|
+
// Build blueprint resource
|
|
170
|
+
const blueprint = this.buildBlueprintPayload(blueprintDoc);
|
|
171
|
+
// Build template resources
|
|
172
|
+
const templates = templateDocs.map((doc) => this.buildTemplateResource(doc));
|
|
173
|
+
// Build asset resources
|
|
174
|
+
const assets = assetDocs
|
|
175
|
+
.map((doc) => this.buildAssetResource(doc, fileIdMap))
|
|
176
|
+
.filter((a) => a !== null);
|
|
177
|
+
// Build function resources
|
|
178
|
+
const functions = (functionDocs ?? [])
|
|
179
|
+
.map((doc) => this.buildFunctionResource(doc))
|
|
180
|
+
.filter((f) => f !== null);
|
|
181
|
+
// Build schema resources
|
|
182
|
+
const schemas = (schemaDocs ?? [])
|
|
183
|
+
.map((doc) => this.buildSchemaResource(doc))
|
|
184
|
+
.filter((s) => s !== null);
|
|
185
|
+
return {
|
|
186
|
+
inlineResources: {
|
|
187
|
+
blueprint,
|
|
188
|
+
templates: templates.length > 0 ? templates : undefined,
|
|
189
|
+
assets: assets.length > 0 ? assets : undefined,
|
|
190
|
+
functions: functions.length > 0 ? functions : undefined,
|
|
191
|
+
schemas: schemas.length > 0 ? schemas : undefined,
|
|
192
|
+
},
|
|
193
|
+
entities: entities?.length
|
|
194
|
+
? entities.map((e) => ({
|
|
195
|
+
inputKey: e.key,
|
|
196
|
+
data: e.data,
|
|
197
|
+
}))
|
|
198
|
+
: undefined,
|
|
199
|
+
options: {
|
|
200
|
+
inlineOnly,
|
|
201
|
+
skipSignatureFields,
|
|
202
|
+
combinePdfs,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Build CreateWorkflowReq with inline resources from YAML documents.
|
|
208
|
+
*/
|
|
209
|
+
buildCreateWorkflowReq(params) {
|
|
210
|
+
const { blueprintDoc, templateDocs, assetDocs, functionDocs, schemaDocs, fileIdMap, entities, inlineOnly, mode, } = params;
|
|
211
|
+
// Build blueprint resource
|
|
212
|
+
const blueprint = this.buildBlueprintPayload(blueprintDoc);
|
|
213
|
+
// Build template resources
|
|
214
|
+
const templates = templateDocs.map((doc) => this.buildTemplateResource(doc));
|
|
215
|
+
// Build asset resources
|
|
216
|
+
const assets = assetDocs
|
|
217
|
+
.map((doc) => this.buildAssetResource(doc, fileIdMap))
|
|
218
|
+
.filter((a) => a !== null);
|
|
219
|
+
// Build function resources
|
|
220
|
+
const functions = (functionDocs ?? [])
|
|
221
|
+
.map((doc) => this.buildFunctionResource(doc))
|
|
222
|
+
.filter((f) => f !== null);
|
|
223
|
+
// Build schema resources
|
|
224
|
+
const schemas = (schemaDocs ?? [])
|
|
225
|
+
.map((doc) => this.buildSchemaResource(doc))
|
|
226
|
+
.filter((s) => s !== null);
|
|
227
|
+
// Convert entities array to flat data map
|
|
228
|
+
const data = entities?.length
|
|
229
|
+
? Object.fromEntries(entities.map((e) => [e.key, e.data]))
|
|
230
|
+
: undefined;
|
|
231
|
+
return {
|
|
232
|
+
inlineResources: {
|
|
233
|
+
blueprint,
|
|
234
|
+
templates: templates.length > 0 ? templates : undefined,
|
|
235
|
+
assets: assets.length > 0 ? assets : undefined,
|
|
236
|
+
functions: functions.length > 0 ? functions : undefined,
|
|
237
|
+
schemas: schemas.length > 0 ? schemas : undefined,
|
|
238
|
+
},
|
|
239
|
+
data,
|
|
240
|
+
options: mode || inlineOnly ? { mode, inlineOnly } : undefined,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Build a TemplateResource from a YAML template document.
|
|
245
|
+
*/
|
|
246
|
+
buildTemplateResource(doc) {
|
|
247
|
+
const spec = doc.content['spec'];
|
|
248
|
+
const meta = doc.content['metadata'];
|
|
249
|
+
const [contentKey, contentVersion] = (spec?.content ?? '').split('@');
|
|
250
|
+
const fields = (spec?.fields ?? []).map((f) => transformField(f));
|
|
251
|
+
const inputs = transformInputs(spec?.inputs ?? []);
|
|
252
|
+
const roles = (spec?.roles ?? []).map((r) => transformRole(r));
|
|
253
|
+
const data = spec?.data?.transform
|
|
254
|
+
? { transform: spec.data.transform }
|
|
255
|
+
: undefined;
|
|
256
|
+
const functions = normalizeYamlFunctions(spec?.functions);
|
|
257
|
+
return {
|
|
258
|
+
metadata: {
|
|
259
|
+
key: doc.key,
|
|
260
|
+
version: doc.version,
|
|
261
|
+
name: meta?.name ?? doc.key,
|
|
262
|
+
description: meta?.description,
|
|
263
|
+
},
|
|
264
|
+
spec: {
|
|
265
|
+
type: (spec?.type ?? 'pdf'),
|
|
266
|
+
contentKey,
|
|
267
|
+
contentVersion,
|
|
268
|
+
fields,
|
|
269
|
+
inputs,
|
|
270
|
+
roles,
|
|
271
|
+
data,
|
|
272
|
+
functions,
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Build an AssetResource from a YAML asset document.
|
|
278
|
+
* For text assets: reads file content. For binary assets: uses fileIdMap.
|
|
279
|
+
*/
|
|
280
|
+
buildAssetResource(doc, fileIdMap) {
|
|
281
|
+
const spec = doc.content['spec'];
|
|
282
|
+
const meta = doc.content['metadata'];
|
|
283
|
+
const assetType = spec?.['type'] ?? '';
|
|
284
|
+
// Text assets: read content from file
|
|
285
|
+
const isTextAsset = ['html', 'css', 'markdown'].includes(assetType);
|
|
286
|
+
let content;
|
|
287
|
+
let fileId;
|
|
288
|
+
if (isTextAsset) {
|
|
289
|
+
content = this.readAssetFileContent(doc) ?? undefined;
|
|
290
|
+
// Also check inline content from synthetic docs
|
|
291
|
+
if (!content &&
|
|
292
|
+
spec?.['content'] &&
|
|
293
|
+
typeof spec['content'] === 'string') {
|
|
294
|
+
content = spec['content'];
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// Binary assets: look up fileId
|
|
299
|
+
fileId = fileIdMap?.get(`${doc.key}@${doc.version}`);
|
|
300
|
+
}
|
|
301
|
+
// Build htmlConfig refs from YAML spec
|
|
302
|
+
const htmlConfig = this.buildAssetHtmlConfigRefs(spec);
|
|
303
|
+
return {
|
|
304
|
+
metadata: {
|
|
305
|
+
key: doc.key,
|
|
306
|
+
version: doc.version,
|
|
307
|
+
name: meta?.name ?? doc.key,
|
|
308
|
+
description: meta?.description,
|
|
309
|
+
},
|
|
310
|
+
spec: {
|
|
311
|
+
type: assetType,
|
|
312
|
+
content,
|
|
313
|
+
fileId,
|
|
314
|
+
htmlConfig: htmlConfig ?? undefined,
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Build AssetHtmlConfigRefs from YAML spec.
|
|
320
|
+
* Maps YAML format (name→ref) to API format ({ key, version, name? }).
|
|
321
|
+
*/
|
|
322
|
+
buildAssetHtmlConfigRefs(spec) {
|
|
323
|
+
if (!spec)
|
|
324
|
+
return null;
|
|
325
|
+
const yamlPartials = spec['partials'];
|
|
326
|
+
const yamlStyles = spec['styles'];
|
|
327
|
+
const yamlImages = spec['images'];
|
|
328
|
+
const dataSpec = spec['data'];
|
|
329
|
+
const schemaRef = dataSpec?.['schema'];
|
|
330
|
+
if (!yamlPartials && !yamlStyles && !yamlImages && !schemaRef) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const partials = yamlPartials
|
|
334
|
+
? Object.entries(yamlPartials).map(([alias, ref]) => {
|
|
335
|
+
const assetRef = typeof ref === 'string'
|
|
336
|
+
? ref
|
|
337
|
+
: ref?.['asset'];
|
|
338
|
+
const [key, version] = (assetRef ?? '').split('@');
|
|
339
|
+
const roleMap = typeof ref === 'object'
|
|
340
|
+
? ref?.['roleMap']
|
|
341
|
+
: undefined;
|
|
342
|
+
return { key, version, alias, ...(roleMap ? { roleMap } : {}) };
|
|
343
|
+
})
|
|
344
|
+
: undefined;
|
|
345
|
+
const styles = yamlStyles
|
|
346
|
+
? yamlStyles.map((ref) => {
|
|
347
|
+
const [key, version] = ref.split('@');
|
|
348
|
+
return { key, version };
|
|
349
|
+
})
|
|
350
|
+
: undefined;
|
|
351
|
+
const images = yamlImages
|
|
352
|
+
? Object.entries(yamlImages).map(([alias, ref]) => {
|
|
353
|
+
const [key, version] = ref.split('@');
|
|
354
|
+
return { key, version, alias };
|
|
355
|
+
})
|
|
356
|
+
: undefined;
|
|
357
|
+
let schemaKey;
|
|
358
|
+
let schemaVersion;
|
|
359
|
+
if (schemaRef) {
|
|
360
|
+
[schemaKey, schemaVersion] = schemaRef.split('@');
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
partials: partials?.length ? partials : undefined,
|
|
364
|
+
styles: styles?.length ? styles : undefined,
|
|
365
|
+
images: images?.length ? images : undefined,
|
|
366
|
+
data: schemaKey ? { schemaKey, schemaVersion } : undefined,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Build a JsonataFunctionResource from a YAML function document.
|
|
371
|
+
*/
|
|
372
|
+
buildFunctionResource(doc) {
|
|
373
|
+
const spec = doc.content['spec'];
|
|
374
|
+
const meta = doc.content['metadata'];
|
|
375
|
+
if (!spec?.['body'])
|
|
376
|
+
return null;
|
|
377
|
+
const yamlParams = spec['params'];
|
|
378
|
+
const params = yamlParams?.map((p) => {
|
|
379
|
+
const type = p.type;
|
|
380
|
+
const itemType = type === JsonataFunctionParamType.Array && p.itemType
|
|
381
|
+
? p.itemType
|
|
382
|
+
: undefined;
|
|
383
|
+
const allowsSchema = type === JsonataFunctionParamType.Object ||
|
|
384
|
+
(type === JsonataFunctionParamType.Array &&
|
|
385
|
+
itemType === JsonataFunctionItemType.Object);
|
|
386
|
+
const [schemaKey, schemaVersion] = (p.schema ?? '').split('@');
|
|
387
|
+
return {
|
|
388
|
+
name: p.name,
|
|
389
|
+
type,
|
|
390
|
+
...(itemType ? { itemType } : {}),
|
|
391
|
+
...(allowsSchema && schemaKey ? { schemaKey, schemaVersion } : {}),
|
|
392
|
+
};
|
|
393
|
+
});
|
|
394
|
+
const yamlReturn = spec['returnType'];
|
|
395
|
+
const returnTypeVal = (yamlReturn?.type ??
|
|
396
|
+
'string');
|
|
397
|
+
const returnItemType = returnTypeVal === JsonataFunctionParamType.Array && yamlReturn?.itemType
|
|
398
|
+
? yamlReturn.itemType
|
|
399
|
+
: undefined;
|
|
400
|
+
const returnAllowsSchema = returnTypeVal === JsonataFunctionParamType.Object ||
|
|
401
|
+
(returnTypeVal === JsonataFunctionParamType.Array &&
|
|
402
|
+
returnItemType === JsonataFunctionItemType.Object);
|
|
403
|
+
const [returnSchemaKey, returnSchemaVersion] = (yamlReturn?.schema ?? '').split('@');
|
|
404
|
+
return {
|
|
405
|
+
metadata: {
|
|
406
|
+
key: doc.key,
|
|
407
|
+
version: doc.version,
|
|
408
|
+
name: meta?.name ?? doc.key,
|
|
409
|
+
description: meta?.description,
|
|
410
|
+
},
|
|
411
|
+
spec: {
|
|
412
|
+
params,
|
|
413
|
+
returnType: {
|
|
414
|
+
type: returnTypeVal,
|
|
415
|
+
...(returnItemType ? { itemType: returnItemType } : {}),
|
|
416
|
+
...(returnAllowsSchema && returnSchemaKey
|
|
417
|
+
? { schemaKey: returnSchemaKey, schemaVersion: returnSchemaVersion }
|
|
418
|
+
: {}),
|
|
419
|
+
},
|
|
420
|
+
body: spec['body'],
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Build a SchemaResource from a YAML schema document.
|
|
426
|
+
*/
|
|
427
|
+
buildSchemaResource(doc) {
|
|
428
|
+
const spec = doc.content['spec'];
|
|
429
|
+
const meta = doc.content['metadata'];
|
|
430
|
+
// The schema definition may have been loaded by buildSchemaPayload
|
|
431
|
+
const definition = spec?.['definition'];
|
|
432
|
+
if (!definition)
|
|
433
|
+
return null;
|
|
434
|
+
return {
|
|
435
|
+
metadata: {
|
|
436
|
+
key: doc.key,
|
|
437
|
+
version: doc.version,
|
|
438
|
+
name: meta?.name ?? doc.key,
|
|
439
|
+
description: meta?.description,
|
|
440
|
+
},
|
|
441
|
+
spec: {
|
|
442
|
+
jsonSchemaDraft: spec?.['jsonSchemaDraft'] ??
|
|
443
|
+
JsonSchemaDraft.DRAFT_2020_12,
|
|
444
|
+
schemaDefinition: definition,
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Resolve a file path reference from a YAML document, with path-traversal protection.
|
|
450
|
+
*
|
|
451
|
+
* The resolved path must stay within the project root, defined as the parent of
|
|
452
|
+
* the directory containing the YAML file. This allows cross-subdirectory references
|
|
453
|
+
* (e.g., `schemas/foo.yaml` referencing `../definitions/foo.json`) while still
|
|
454
|
+
* preventing traversal outside the project.
|
|
455
|
+
*
|
|
456
|
+
* Returns null if the path resolves outside the project root.
|
|
457
|
+
*/
|
|
458
|
+
resolveFileRef(docFilePath, filePath) {
|
|
459
|
+
const yamlDir = resolve(dirname(docFilePath));
|
|
460
|
+
// Allow up to one level above the YAML's directory (the project root)
|
|
461
|
+
const projectRoot = resolve(yamlDir, '..') + sep;
|
|
462
|
+
const resolvedFilePath = resolve(yamlDir, filePath);
|
|
463
|
+
if (!resolvedFilePath.startsWith(projectRoot)) {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
return resolvedFilePath;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Read asset file content as text (for HTML/CSS assets)
|
|
470
|
+
* Returns null if file not found or can't be read
|
|
471
|
+
*/
|
|
472
|
+
readAssetFileContent(doc) {
|
|
473
|
+
const spec = doc.content['spec'];
|
|
474
|
+
const filePath = spec?.['file'];
|
|
475
|
+
// Handle synthetic documents with inline content from remote assets.
|
|
476
|
+
// These are created in `preview-handler.ts` for remote partials/styles in hybrid mode.
|
|
477
|
+
if (!filePath && spec?.content && typeof spec.content === 'string') {
|
|
478
|
+
return spec.content;
|
|
479
|
+
}
|
|
480
|
+
if (!filePath) {
|
|
481
|
+
return null;
|
|
482
|
+
}
|
|
483
|
+
const resolvedFilePath = this.resolveFileRef(doc.filePath, filePath);
|
|
484
|
+
if (!resolvedFilePath)
|
|
485
|
+
return null;
|
|
486
|
+
if (!existsSync(resolvedFilePath)) {
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
try {
|
|
490
|
+
return readFileSync(resolvedFilePath, 'utf-8');
|
|
491
|
+
}
|
|
492
|
+
catch {
|
|
493
|
+
return null;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Build Asset file payload from YAML
|
|
498
|
+
* Returns file content ready for upload, or null if no file
|
|
499
|
+
*/
|
|
500
|
+
buildAssetPayload(doc) {
|
|
501
|
+
const spec = doc.content['spec'];
|
|
502
|
+
const filePath = spec?.['file'];
|
|
503
|
+
if (!filePath)
|
|
504
|
+
return null;
|
|
505
|
+
const resolvedFilePath = this.resolveFileRef(doc.filePath, filePath);
|
|
506
|
+
if (!resolvedFilePath)
|
|
507
|
+
return null;
|
|
508
|
+
if (!existsSync(resolvedFilePath))
|
|
509
|
+
return null;
|
|
510
|
+
const fileName = basename(resolvedFilePath);
|
|
511
|
+
const fileContent = readFileSync(resolvedFilePath);
|
|
512
|
+
return {
|
|
513
|
+
assetKey: doc.key,
|
|
514
|
+
assetVersion: doc.version,
|
|
515
|
+
fileName,
|
|
516
|
+
contentType: getContentType(resolvedFilePath),
|
|
517
|
+
content: fileContent,
|
|
518
|
+
fileHash: createHash('sha256').update(fileContent).digest('hex'),
|
|
519
|
+
sizeBytes: fileContent.length,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Build Schema payload - reads the JSON definition file
|
|
524
|
+
* Returns the parsed document with definition loaded (for entity data generation)
|
|
525
|
+
*/
|
|
526
|
+
buildSchemaPayload(doc) {
|
|
527
|
+
const content = { ...doc.content };
|
|
528
|
+
const spec = content['spec'];
|
|
529
|
+
if (spec?.['file']) {
|
|
530
|
+
const filePath = spec['file'];
|
|
531
|
+
const resolvedFilePath = this.resolveFileRef(doc.filePath, filePath);
|
|
532
|
+
if (resolvedFilePath && existsSync(resolvedFilePath)) {
|
|
533
|
+
try {
|
|
534
|
+
const fileContent = readFileSync(resolvedFilePath, 'utf-8');
|
|
535
|
+
spec['definition'] = JSON.parse(fileContent);
|
|
536
|
+
}
|
|
537
|
+
catch {
|
|
538
|
+
// If file can't be read/parsed, continue without it
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
return { ...doc, content };
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=payload-builder.js.map
|