@pipeline-builder/api-core 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +51 -0
  3. package/lib/constants/ai-providers.d.ts +41 -0
  4. package/lib/constants/ai-providers.js +88 -0
  5. package/lib/constants/http-status.d.ts +24 -0
  6. package/lib/constants/http-status.js +29 -0
  7. package/lib/constants/index.d.ts +3 -0
  8. package/lib/constants/index.js +22 -0
  9. package/lib/constants/time.d.ts +10 -0
  10. package/lib/constants/time.js +16 -0
  11. package/lib/errors/app-errors.d.ts +30 -0
  12. package/lib/errors/app-errors.js +62 -0
  13. package/lib/errors/index.d.ts +1 -0
  14. package/lib/errors/index.js +20 -0
  15. package/lib/helpers/access-helpers.d.ts +40 -0
  16. package/lib/helpers/access-helpers.js +56 -0
  17. package/lib/helpers/crud-helpers.d.ts +16 -0
  18. package/lib/helpers/crud-helpers.js +34 -0
  19. package/lib/helpers/index.d.ts +4 -0
  20. package/lib/helpers/index.js +23 -0
  21. package/lib/helpers/mask-helpers.d.ts +33 -0
  22. package/lib/helpers/mask-helpers.js +54 -0
  23. package/lib/helpers/sse-helpers.d.ts +13 -0
  24. package/lib/helpers/sse-helpers.js +40 -0
  25. package/lib/index.d.ts +57 -0
  26. package/lib/index.js +86 -0
  27. package/lib/middleware/auth.d.ts +50 -0
  28. package/lib/middleware/auth.js +171 -0
  29. package/lib/middleware/index.d.ts +1 -0
  30. package/lib/middleware/index.js +20 -0
  31. package/lib/openapi/extend-zod.d.ts +1 -0
  32. package/lib/openapi/extend-zod.js +8 -0
  33. package/lib/openapi/index.d.ts +2 -0
  34. package/lib/openapi/index.js +10 -0
  35. package/lib/openapi/registry.d.ts +17 -0
  36. package/lib/openapi/registry.js +42 -0
  37. package/lib/openapi/routes/billing-routes.d.ts +1 -0
  38. package/lib/openapi/routes/billing-routes.js +69 -0
  39. package/lib/openapi/routes/index.d.ts +5 -0
  40. package/lib/openapi/routes/index.js +22 -0
  41. package/lib/openapi/routes/message-routes.d.ts +1 -0
  42. package/lib/openapi/routes/message-routes.js +108 -0
  43. package/lib/openapi/routes/pipeline-routes.d.ts +1 -0
  44. package/lib/openapi/routes/pipeline-routes.js +90 -0
  45. package/lib/openapi/routes/plugin-routes.d.ts +1 -0
  46. package/lib/openapi/routes/plugin-routes.js +99 -0
  47. package/lib/openapi/routes/quota-routes.d.ts +1 -0
  48. package/lib/openapi/routes/quota-routes.js +65 -0
  49. package/lib/openapi/schema-registry.d.ts +25 -0
  50. package/lib/openapi/schema-registry.js +95 -0
  51. package/lib/routes/health.d.ts +47 -0
  52. package/lib/routes/health.js +81 -0
  53. package/lib/routes/index.d.ts +1 -0
  54. package/lib/routes/index.js +20 -0
  55. package/lib/services/admin-audit.d.ts +13 -0
  56. package/lib/services/admin-audit.js +31 -0
  57. package/lib/services/cache-service.d.ts +108 -0
  58. package/lib/services/cache-service.js +212 -0
  59. package/lib/services/compliance-client.d.ts +46 -0
  60. package/lib/services/compliance-client.js +102 -0
  61. package/lib/services/compliance-event-subscriber.d.ts +11 -0
  62. package/lib/services/compliance-event-subscriber.js +60 -0
  63. package/lib/services/compliance-queue.d.ts +11 -0
  64. package/lib/services/compliance-queue.js +38 -0
  65. package/lib/services/entity-events.d.ts +44 -0
  66. package/lib/services/entity-events.js +63 -0
  67. package/lib/services/http-client.d.ts +108 -0
  68. package/lib/services/http-client.js +285 -0
  69. package/lib/services/index.d.ts +10 -0
  70. package/lib/services/index.js +40 -0
  71. package/lib/services/quota.d.ts +59 -0
  72. package/lib/services/quota.js +137 -0
  73. package/lib/services/retry-strategy.d.ts +74 -0
  74. package/lib/services/retry-strategy.js +127 -0
  75. package/lib/types/billing.d.ts +47 -0
  76. package/lib/types/billing.js +5 -0
  77. package/lib/types/common.d.ts +161 -0
  78. package/lib/types/common.js +53 -0
  79. package/lib/types/error-codes.d.ts +38 -0
  80. package/lib/types/error-codes.js +77 -0
  81. package/lib/types/feature-flags.d.ts +38 -0
  82. package/lib/types/feature-flags.js +107 -0
  83. package/lib/types/http.d.ts +37 -0
  84. package/lib/types/http.js +5 -0
  85. package/lib/types/index.d.ts +7 -0
  86. package/lib/types/index.js +26 -0
  87. package/lib/types/pipeline.d.ts +70 -0
  88. package/lib/types/pipeline.js +44 -0
  89. package/lib/types/quota-tiers.d.ts +23 -0
  90. package/lib/types/quota-tiers.js +26 -0
  91. package/lib/utils/alias-resolver.d.ts +16 -0
  92. package/lib/utils/alias-resolver.js +49 -0
  93. package/lib/utils/headers.d.ts +18 -0
  94. package/lib/utils/headers.js +24 -0
  95. package/lib/utils/identity.d.ts +61 -0
  96. package/lib/utils/identity.js +75 -0
  97. package/lib/utils/index.d.ts +7 -0
  98. package/lib/utils/index.js +26 -0
  99. package/lib/utils/logger.d.ts +28 -0
  100. package/lib/utils/logger.js +77 -0
  101. package/lib/utils/object.d.ts +13 -0
  102. package/lib/utils/object.js +21 -0
  103. package/lib/utils/params.d.ts +89 -0
  104. package/lib/utils/params.js +148 -0
  105. package/lib/utils/response.d.ts +142 -0
  106. package/lib/utils/response.js +237 -0
  107. package/lib/validation/ai-schemas.d.ts +61 -0
  108. package/lib/validation/ai-schemas.js +81 -0
  109. package/lib/validation/common-schemas.d.ts +72 -0
  110. package/lib/validation/common-schemas.js +58 -0
  111. package/lib/validation/index.d.ts +6 -0
  112. package/lib/validation/index.js +25 -0
  113. package/lib/validation/message-schemas.d.ts +79 -0
  114. package/lib/validation/message-schemas.js +42 -0
  115. package/lib/validation/middleware.d.ts +60 -0
  116. package/lib/validation/middleware.js +77 -0
  117. package/lib/validation/pipeline-schemas.d.ts +135 -0
  118. package/lib/validation/pipeline-schemas.js +85 -0
  119. package/lib/validation/plugin-schemas.d.ts +127 -0
  120. package/lib/validation/plugin-schemas.js +84 -0
  121. package/openapi.yaml +292 -0
  122. package/package.json +127 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.AIGenerateFromUrlBodySchema = exports.PluginDeployGeneratedSchema = exports.AIGenerateBodySchema = void 0;
6
+ const zod_1 = require("zod");
7
+ const common_schemas_1 = require("./common-schemas");
8
+ const MAX_PROMPT_LENGTH = parseInt(process.env.MAX_PROMPT_LENGTH || '5000', 10);
9
+ // AI Generation Request
10
+ /**
11
+ * Schema for AI generation request body.
12
+ * Used by both POST /pipelines/generate and POST /plugins/generate.
13
+ */
14
+ exports.AIGenerateBodySchema = zod_1.z.object({
15
+ /** Natural language description of what to generate. */
16
+ prompt: zod_1.z
17
+ .string()
18
+ .min(1, 'A prompt with a natural language description is required')
19
+ .max(MAX_PROMPT_LENGTH, `Prompt must be ${MAX_PROMPT_LENGTH} characters or fewer`),
20
+ /** AI provider identifier (e.g. "anthropic", "openai", "google"). */
21
+ provider: zod_1.z.string().min(1, 'A provider is required (e.g., "anthropic", "openai", "google")'),
22
+ /** AI model identifier (e.g. "claude-sonnet-4-20250514", "gpt-4o"). */
23
+ model: zod_1.z.string().min(1, 'A model is required (e.g., "claude-sonnet-4-20250514", "gpt-4o")'),
24
+ /** Optional custom API key to override the server/org key for this request. */
25
+ apiKey: zod_1.z.string().min(1).optional(),
26
+ /** Previous pipeline config for iterative refinement. */
27
+ previousConfig: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
28
+ /** Fallback AI providers if primary fails (e.g., ["openai", "google"]). */
29
+ fallbackProviders: zod_1.z.array(zod_1.z.string()).optional(),
30
+ });
31
+ // Plugin Deploy-Generated Request
32
+ /**
33
+ * Schema for POST /plugins/deploy-generated request body.
34
+ * Validates the AI-generated plugin configuration before Docker build.
35
+ */
36
+ exports.PluginDeployGeneratedSchema = zod_1.z.object({
37
+ /** Plugin name (lowercase, alphanumeric with hyphens). */
38
+ name: zod_1.z.string().min(1, 'Plugin name is required'),
39
+ /** Human-readable description. */
40
+ description: zod_1.z.string().optional(),
41
+ /** Semantic version (e.g. "1.0.0"). */
42
+ version: zod_1.z.string().min(1, 'Version is required'),
43
+ /** Plugin execution type. */
44
+ pluginType: zod_1.z.enum(['CodeBuildStep', 'ShellStep', 'ManualApprovalStep']).default('CodeBuildStep'),
45
+ /** AWS CodeBuild compute size. */
46
+ computeType: zod_1.z.enum(['SMALL', 'MEDIUM', 'LARGE', 'X2_LARGE']).default('MEDIUM'),
47
+ /** Keywords for categorization. */
48
+ keywords: zod_1.z.array(zod_1.z.string()).optional().default([]),
49
+ /** Primary output directory path. */
50
+ primaryOutputDirectory: zod_1.z.string().nullable().optional(),
51
+ /** Commands to install dependencies. */
52
+ installCommands: zod_1.z.array(zod_1.z.string()).optional().default([]),
53
+ /** Build/execution commands. */
54
+ commands: zod_1.z.array(zod_1.z.string()).min(1, 'At least one build command is required'),
55
+ /** Environment variables. */
56
+ env: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(),
57
+ /** Docker build arguments passed via --build-arg at image build time. */
58
+ buildArgs: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(),
59
+ /** Complete Dockerfile content for the build environment. */
60
+ dockerfile: zod_1.z.string().min(1, 'Dockerfile content is required'),
61
+ /** Access visibility. */
62
+ accessModifier: common_schemas_1.AccessModifierSchema.default('private'),
63
+ });
64
+ // AI Generate From URL Request
65
+ /**
66
+ * Schema for POST /pipelines/generate/from-url/stream request body.
67
+ * Validates Git URL + AI provider configuration for repo-based pipeline generation.
68
+ */
69
+ exports.AIGenerateFromUrlBodySchema = zod_1.z.object({
70
+ /** Git repository URL (HTTPS, SSH, or git@ format). */
71
+ gitUrl: zod_1.z.string().min(1, 'A Git repository URL is required').max(500, 'URL must be 500 characters or fewer'),
72
+ /** AI provider identifier (e.g. "anthropic", "openai", "google"). */
73
+ provider: zod_1.z.string().min(1, 'A provider is required'),
74
+ /** AI model identifier (e.g. "claude-sonnet-4-20250514", "gpt-4o"). */
75
+ model: zod_1.z.string().min(1, 'A model is required'),
76
+ /** Optional custom API key to override the server config. */
77
+ apiKey: zod_1.z.string().min(1).optional(),
78
+ /** Optional authentication token for accessing private repositories. */
79
+ repoToken: zod_1.z.string().min(1).optional(),
80
+ });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktc2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2FpLXNjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qyw2QkFBd0I7QUFDeEIscURBQXdEO0FBRXhELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWhGLHdCQUF3QjtBQUV4Qjs7O0dBR0c7QUFDVSxRQUFBLG9CQUFvQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0Msd0RBQXdEO0lBQ3hELE1BQU0sRUFBRSxPQUFDO1NBQ04sTUFBTSxFQUFFO1NBQ1IsR0FBRyxDQUFDLENBQUMsRUFBRSwwREFBMEQsQ0FBQztTQUNsRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLGlCQUFpQixzQkFBc0IsQ0FBQztJQUVwRixxRUFBcUU7SUFDckUsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGdFQUFnRSxDQUFDO0lBRTdGLHVFQUF1RTtJQUN2RSxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsa0VBQWtFLENBQUM7SUFFNUYsK0VBQStFO0lBQy9FLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUVwQyx5REFBeUQ7SUFDekQsY0FBYyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUU1RCwyRUFBMkU7SUFDM0UsaUJBQWlCLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FB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QUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFFcEMsd0VBQXdFO0lBQ3hFLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBBY2Nlc3NNb2RpZmllclNjaGVtYSB9IGZyb20gJy4vY29tbW9uLXNjaGVtYXMnO1xuXG5jb25zdCBNQVhfUFJPTVBUX0xFTkdUSCA9IHBhcnNlSW50KHByb2Nlc3MuZW52Lk1BWF9QUk9NUFRfTEVOR1RIIHx8ICc1MDAwJywgMTApO1xuXG4vLyBBSSBHZW5lcmF0aW9uIFJlcXVlc3RcblxuLyoqXG4gKiBTY2hlbWEgZm9yIEFJIGdlbmVyYXRpb24gcmVxdWVzdCBib2R5LlxuICogVXNlZCBieSBib3RoIFBPU1QgL3BpcGVsaW5lcy9nZW5lcmF0ZSBhbmQgUE9TVCAvcGx1Z2lucy9nZW5lcmF0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFJR2VuZXJhdGVCb2R5U2NoZW1hID0gei5vYmplY3Qoe1xuICAvKiogTmF0dXJhbCBsYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRvIGdlbmVyYXRlLiAqL1xuICBwcm9tcHQ6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubWluKDEsICdBIHByb21wdCB3aXRoIGEgbmF0dXJhbCBsYW5ndWFnZSBkZXNjcmlwdGlvbiBpcyByZXF1aXJlZCcpXG4gICAgLm1heChNQVhfUFJPTVBUX0xFTkdUSCwgYFByb21wdCBtdXN0IGJlICR7TUFYX1BST01QVF9MRU5HVEh9IGNoYXJhY3RlcnMgb3IgZmV3ZXJgKSxcblxuICAvKiogQUkgcHJvdmlkZXIgaWRlbnRpZmllciAoZS5nLiBcImFudGhyb3BpY1wiLCBcIm9wZW5haVwiLCBcImdvb2dsZVwiKS4gKi9cbiAgcHJvdmlkZXI6IHouc3RyaW5nKCkubWluKDEsICdBIHByb3ZpZGVyIGlzIHJlcXVpcmVkIChlLmcuLCBcImFudGhyb3BpY1wiLCBcIm9wZW5haVwiLCBcImdvb2dsZVwiKScpLFxuXG4gIC8qKiBBSSBtb2RlbCBpZGVudGlmaWVyIChlLmcuIFwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0XCIsIFwiZ3B0LTRvXCIpLiAqL1xuICBtb2RlbDogei5zdHJpbmcoKS5taW4oMSwgJ0EgbW9kZWwgaXMgcmVxdWlyZWQgKGUuZy4sIFwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0XCIsIFwiZ3B0LTRvXCIpJyksXG5cbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSBBUEkga2V5IHRvIG92ZXJyaWRlIHRoZSBzZXJ2ZXIvb3JnIGtleSBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBhcGlLZXk6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG5cbiAgLyoqIFByZXZpb3VzIHBpcGVsaW5lIGNvbmZpZyBmb3IgaXRlcmF0aXZlIHJlZmluZW1lbnQuICovXG4gIHByZXZpb3VzQ29uZmlnOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcblxuICAvKiogRmFsbGJhY2sgQUkgcHJvdmlkZXJzIGlmIHByaW1hcnkgZmFpbHMgKGUuZy4sIFtcIm9wZW5haVwiLCBcImdvb2dsZVwiXSkuICovXG4gIGZhbGxiYWNrUHJvdmlkZXJzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIFZhbGlkYXRlZCB0eXBlIGZvciBBSSBnZW5lcmF0aW9uIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRlZEFJR2VuZXJhdGVCb2R5ID0gei5pbmZlcjx0eXBlb2YgQUlHZW5lcmF0ZUJvZHlTY2hlbWE+O1xuXG4vLyBQbHVnaW4gRGVwbG95LUdlbmVyYXRlZCBSZXF1ZXN0XG5cbi8qKlxuICogU2NoZW1hIGZvciBQT1NUIC9wbHVnaW5zL2RlcGxveS1nZW5lcmF0ZWQgcmVxdWVzdCBib2R5LlxuICogVmFsaWRhdGVzIHRoZSBBSS1nZW5lcmF0ZWQgcGx1Z2luIGNvbmZpZ3VyYXRpb24gYmVmb3JlIERvY2tlciBidWlsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBsdWdpbkRlcGxveUdlbmVyYXRlZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLyoqIFBsdWdpbiBuYW1lIChsb3dlcmNhc2UsIGFscGhhbnVtZXJpYyB3aXRoIGh5cGhlbnMpLiAqL1xuICBuYW1lOiB6LnN0cmluZygpLm1pbigxLCAnUGx1Z2luIG5hbWUgaXMgcmVxdWlyZWQnKSxcblxuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG5cbiAgLyoqIFNlbWFudGljIHZlcnNpb24gKGUuZy4gXCIxLjAuMFwiKS4gKi9cbiAgdmVyc2lvbjogei5zdHJpbmcoKS5taW4oMSwgJ1ZlcnNpb24gaXMgcmVxdWlyZWQnKSxcblxuICAvKiogUGx1Z2luIGV4ZWN1dGlvbiB0eXBlLiAqL1xuICBwbHVnaW5UeXBlOiB6LmVudW0oWydDb2RlQnVpbGRTdGVwJywgJ1NoZWxsU3RlcCcsICdNYW51YWxBcHByb3ZhbFN0ZXAnXSkuZGVmYXVsdCgnQ29kZUJ1aWxkU3RlcCcpLFxuXG4gIC8qKiBBV1MgQ29kZUJ1aWxkIGNvbXB1dGUgc2l6ZS4gKi9cbiAgY29tcHV0ZVR5cGU6IHouZW51bShbJ1NNQUxMJywgJ01FRElVTScsICdMQVJHRScsICdYMl9MQVJHRSddKS5kZWZhdWx0KCdNRURJVU0nKSxcblxuICAvKiogS2V5d29yZHMgZm9yIGNhdGVnb3JpemF0aW9uLiAqL1xuICBrZXl3b3Jkczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLmRlZmF1bHQoW10pLFxuXG4gIC8qKiBQcmltYXJ5IG91dHB1dCBkaXJlY3RvcnkgcGF0aC4gKi9cbiAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogei5zdHJpbmcoKS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG5cbiAgLyoqIENvbW1hbmRzIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzLiAqL1xuICBpbnN0YWxsQ29tbWFuZHM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKS5kZWZhdWx0KFtdKSxcblxuICAvKiogQnVpbGQvZXhlY3V0aW9uIGNvbW1hbmRzLiAqL1xuICBjb21tYW5kczogei5hcnJheSh6LnN0cmluZygpKS5taW4oMSwgJ0F0IGxlYXN0IG9uZSBidWlsZCBjb21tYW5kIGlzIHJlcXVpcmVkJyksXG5cbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gKi9cbiAgZW52OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBEb2NrZXIgYnVpbGQgYXJndW1lbnRzIHBhc3NlZCB2aWEgLS1idWlsZC1hcmcgYXQgaW1hZ2UgYnVpbGQgdGltZS4gKi9cbiAgYnVpbGRBcmdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBDb21wbGV0ZSBEb2NrZXJmaWxlIGNvbnRlbnQgZm9yIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gKi9cbiAgZG9ja2VyZmlsZTogei5zdHJpbmcoKS5taW4oMSwgJ0RvY2tlcmZpbGUgY29udGVudCBpcyByZXF1aXJlZCcpLFxuXG4gIC8qKiBBY2Nlc3MgdmlzaWJpbGl0eS4gKi9cbiAgYWNjZXNzTW9kaWZpZXI6IEFjY2Vzc01vZGlmaWVyU2NoZW1hLmRlZmF1bHQoJ3ByaXZhdGUnKSxcbn0pO1xuXG4vKiogVmFsaWRhdGVkIHR5cGUgZm9yIHBsdWdpbiBkZXBsb3ktZ2VuZXJhdGVkIHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRlZFBsdWdpbkRlcGxveUdlbmVyYXRlZCA9IHouaW5mZXI8dHlwZW9mIFBsdWdpbkRlcGxveUdlbmVyYXRlZFNjaGVtYT47XG5cbi8vIEFJIEdlbmVyYXRlIEZyb20gVVJMIFJlcXVlc3RcblxuLyoqXG4gKiBTY2hlbWEgZm9yIFBPU1QgL3BpcGVsaW5lcy9nZW5lcmF0ZS9mcm9tLXVybC9zdHJlYW0gcmVxdWVzdCBib2R5LlxuICogVmFsaWRhdGVzIEdpdCBVUkwgKyBBSSBwcm92aWRlciBjb25maWd1cmF0aW9uIGZvciByZXBvLWJhc2VkIHBpcGVsaW5lIGdlbmVyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBBSUdlbmVyYXRlRnJvbVVybEJvZHlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8qKiBHaXQgcmVwb3NpdG9yeSBVUkwgKEhUVFBTLCBTU0gsIG9yIGdpdEAgZm9ybWF0KS4gKi9cbiAgZ2l0VXJsOiB6LnN0cmluZygpLm1pbigxLCAnQSBHaXQgcmVwb3NpdG9yeSBVUkwgaXMgcmVxdWlyZWQnKS5tYXgoNTAwLCAnVVJMIG11c3QgYmUgNTAwIGNoYXJhY3RlcnMgb3IgZmV3ZXInKSxcblxuICAvKiogQUkgcHJvdmlkZXIgaWRlbnRpZmllciAoZS5nLiBcImFudGhyb3BpY1wiLCBcIm9wZW5haVwiLCBcImdvb2dsZVwiKS4gKi9cbiAgcHJvdmlkZXI6IHouc3RyaW5nKCkubWluKDEsICdBIHByb3ZpZGVyIGlzIHJlcXVpcmVkJyksXG5cbiAgLyoqIEFJIG1vZGVsIGlkZW50aWZpZXIgKGUuZy4gXCJjbGF1ZGUtc29ubmV0LTQtMjAyNTA1MTRcIiwgXCJncHQtNG9cIikuICovXG4gIG1vZGVsOiB6LnN0cmluZygpLm1pbigxLCAnQSBtb2RlbCBpcyByZXF1aXJlZCcpLFxuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gQVBJIGtleSB0byBvdmVycmlkZSB0aGUgc2VydmVyIGNvbmZpZy4gKi9cbiAgYXBpS2V5OiB6LnN0cmluZygpLm1pbigxKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBPcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3IgYWNjZXNzaW5nIHByaXZhdGUgcmVwb3NpdG9yaWVzLiAqL1xuICByZXBvVG9rZW46IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIFZhbGlkYXRlZCB0eXBlIGZvciBBSSBnZW5lcmF0ZS1mcm9tLVVSTCByZXF1ZXN0IGJvZHkuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0ZWRBSUdlbmVyYXRlRnJvbVVybEJvZHkgPSB6LmluZmVyPHR5cGVvZiBBSUdlbmVyYXRlRnJvbVVybEJvZHlTY2hlbWE+O1xuIl19
@@ -0,0 +1,72 @@
1
+ import '../openapi/extend-zod';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Access modifier schema
5
+ * Defines visibility of resources (public or private)
6
+ */
7
+ export declare const AccessModifierSchema: z.ZodEnum<{
8
+ public: "public";
9
+ private: "private";
10
+ }>;
11
+ /**
12
+ * Sort order schema
13
+ */
14
+ export declare const SortOrderSchema: z.ZodEnum<{
15
+ asc: "asc";
16
+ desc: "desc";
17
+ }>;
18
+ /**
19
+ * Pagination parameters schema
20
+ */
21
+ export declare const MAX_PAGE_LIMIT: number;
22
+ export declare const PaginationSchema: z.ZodObject<{
23
+ limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
24
+ offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
25
+ sortBy: z.ZodOptional<z.ZodString>;
26
+ sortOrder: z.ZodOptional<z.ZodEnum<{
27
+ asc: "asc";
28
+ desc: "desc";
29
+ }>>;
30
+ }, z.core.$strip>;
31
+ /**
32
+ * Boolean query parameter schema
33
+ * Handles string "true"/"false" and boolean values
34
+ */
35
+ export declare const BooleanQuerySchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
36
+ true: "true";
37
+ false: "false";
38
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>;
39
+ /**
40
+ * UUID schema with validation
41
+ */
42
+ export declare const UUIDSchema: z.ZodString;
43
+ /**
44
+ * Optional UUID schema (for partial UUIDs or prefixes)
45
+ */
46
+ export declare const UUIDPrefixSchema: z.ZodString;
47
+ /**
48
+ * Base filter schema for entities with common fields
49
+ */
50
+ export declare const BaseFilterSchema: z.ZodObject<{
51
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodString]>>;
52
+ accessModifier: z.ZodOptional<z.ZodEnum<{
53
+ public: "public";
54
+ private: "private";
55
+ }>>;
56
+ isActive: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
57
+ true: "true";
58
+ false: "false";
59
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
60
+ isDefault: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
61
+ true: "true";
62
+ false: "false";
63
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
64
+ }, z.core.$strip>;
65
+ /**
66
+ * Infer TypeScript types from schemas
67
+ * Note: Prefixed with "Validated" to avoid conflicts with existing type definitions
68
+ */
69
+ export type ValidatedAccessModifier = z.infer<typeof AccessModifierSchema>;
70
+ export type ValidatedSortOrder = z.infer<typeof SortOrderSchema>;
71
+ export type ValidatedPaginationParams = z.infer<typeof PaginationSchema>;
72
+ export type ValidatedBaseFilter = z.infer<typeof BaseFilterSchema>;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.BaseFilterSchema = exports.UUIDPrefixSchema = exports.UUIDSchema = exports.BooleanQuerySchema = exports.PaginationSchema = exports.MAX_PAGE_LIMIT = exports.SortOrderSchema = exports.AccessModifierSchema = void 0;
6
+ // Must run before any z.* schema creation — Zod 4 requires eager extension
7
+ require("../openapi/extend-zod");
8
+ const zod_1 = require("zod");
9
+ /**
10
+ * Access modifier schema
11
+ * Defines visibility of resources (public or private)
12
+ */
13
+ exports.AccessModifierSchema = zod_1.z.enum(['public', 'private']);
14
+ /**
15
+ * Sort order schema
16
+ */
17
+ exports.SortOrderSchema = zod_1.z.enum(['asc', 'desc']);
18
+ /**
19
+ * Pagination parameters schema
20
+ */
21
+ exports.MAX_PAGE_LIMIT = parseInt(process.env.MAX_PAGE_LIMIT || '1000', 10);
22
+ exports.PaginationSchema = zod_1.z.object({
23
+ limit: zod_1.z.coerce.number().int().min(1).max(exports.MAX_PAGE_LIMIT).optional(),
24
+ offset: zod_1.z.coerce.number().int().min(0).optional(),
25
+ sortBy: zod_1.z.string().optional(),
26
+ sortOrder: exports.SortOrderSchema.optional(),
27
+ });
28
+ /**
29
+ * Boolean query parameter schema
30
+ * Handles string "true"/"false" and boolean values
31
+ */
32
+ exports.BooleanQuerySchema = zod_1.z.union([
33
+ zod_1.z.boolean(),
34
+ zod_1.z.enum(['true', 'false']).transform(val => val === 'true'),
35
+ zod_1.z.string().transform(val => val === 'true'),
36
+ ]);
37
+ /**
38
+ * UUID schema with validation
39
+ */
40
+ exports.UUIDSchema = zod_1.z.string().uuid({
41
+ message: 'Invalid UUID format',
42
+ });
43
+ /**
44
+ * Optional UUID schema (for partial UUIDs or prefixes)
45
+ */
46
+ exports.UUIDPrefixSchema = zod_1.z.string().regex(/^[0-9a-f-]+$/i, {
47
+ message: 'Invalid UUID prefix format',
48
+ });
49
+ /**
50
+ * Base filter schema for entities with common fields
51
+ */
52
+ exports.BaseFilterSchema = zod_1.z.object({
53
+ id: zod_1.z.union([exports.UUIDSchema, zod_1.z.array(exports.UUIDSchema), exports.UUIDPrefixSchema]).optional(),
54
+ accessModifier: exports.AccessModifierSchema.optional(),
55
+ isActive: exports.BooleanQuerySchema.optional(),
56
+ isDefault: exports.BooleanQuerySchema.optional(),
57
+ });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9jb21tb24tc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBRXRDLDJFQUEyRTtBQUMzRSxpQ0FBK0I7QUFDL0IsNkJBQXdCO0FBRXhCOzs7R0FHRztBQUNVLFFBQUEsb0JBQW9CLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRWxFOztHQUVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRXZEOztHQUVHO0FBQ1UsUUFBQSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVwRSxRQUFBLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBYyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3BFLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDakQsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsU0FBUyxFQUFFLHVCQUFlLENBQUMsUUFBUSxFQUFFO0NBQ3RDLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNVLFFBQUEsa0JBQWtCLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQztJQUN4QyxPQUFDLENBQUMsT0FBTyxFQUFFO0lBQ1gsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUM7SUFDMUQsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUM7Q0FDNUMsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDVSxRQUFBLFVBQVUsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxxQkFBcUI7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO0lBQ2hFLE9BQU8sRUFBRSw0QkFBNEI7Q0FDdEMsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsRUFBRSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBVSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsa0JBQVUsQ0FBQyxFQUFFLHdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0UsY0FBYyxFQUFFLDRCQUFvQixDQUFDLFFBQVEsRUFBRTtJQUMvQyxRQUFRLEVBQUUsMEJBQWtCLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFNBQVMsRUFBRSwwQkFBa0IsQ0FBQyxRQUFRLEVBQUU7Q0FDekMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIE11c3QgcnVuIGJlZm9yZSBhbnkgei4qIHNjaGVtYSBjcmVhdGlvbiDigJQgWm9kIDQgcmVxdWlyZXMgZWFnZXIgZXh0ZW5zaW9uXG5pbXBvcnQgJy4uL29wZW5hcGkvZXh0ZW5kLXpvZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBBY2Nlc3MgbW9kaWZpZXIgc2NoZW1hXG4gKiBEZWZpbmVzIHZpc2liaWxpdHkgb2YgcmVzb3VyY2VzIChwdWJsaWMgb3IgcHJpdmF0ZSlcbiAqL1xuZXhwb3J0IGNvbnN0IEFjY2Vzc01vZGlmaWVyU2NoZW1hID0gei5lbnVtKFsncHVibGljJywgJ3ByaXZhdGUnXSk7XG5cbi8qKlxuICogU29ydCBvcmRlciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFNvcnRPcmRlclNjaGVtYSA9IHouZW51bShbJ2FzYycsICdkZXNjJ10pO1xuXG4vKipcbiAqIFBhZ2luYXRpb24gcGFyYW1ldGVycyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9QQUdFX0xJTUlUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTUFYX1BBR0VfTElNSVQgfHwgJzEwMDAnLCAxMCk7XG5cbmV4cG9ydCBjb25zdCBQYWdpbmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBsaW1pdDogei5jb2VyY2UubnVtYmVyKCkuaW50KCkubWluKDEpLm1heChNQVhfUEFHRV9MSU1JVCkub3B0aW9uYWwoKSxcbiAgb2Zmc2V0OiB6LmNvZXJjZS5udW1iZXIoKS5pbnQoKS5taW4oMCkub3B0aW9uYWwoKSxcbiAgc29ydEJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHNvcnRPcmRlcjogU29ydE9yZGVyU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBCb29sZWFuIHF1ZXJ5IHBhcmFtZXRlciBzY2hlbWFcbiAqIEhhbmRsZXMgc3RyaW5nIFwidHJ1ZVwiL1wiZmFsc2VcIiBhbmQgYm9vbGVhbiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEJvb2xlYW5RdWVyeVNjaGVtYSA9IHoudW5pb24oW1xuICB6LmJvb2xlYW4oKSxcbiAgei5lbnVtKFsndHJ1ZScsICdmYWxzZSddKS50cmFuc2Zvcm0odmFsID0+IHZhbCA9PT0gJ3RydWUnKSxcbiAgei5zdHJpbmcoKS50cmFuc2Zvcm0odmFsID0+IHZhbCA9PT0gJ3RydWUnKSxcbl0pO1xuXG4vKipcbiAqIFVVSUQgc2NoZW1hIHdpdGggdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVVVJRFNjaGVtYSA9IHouc3RyaW5nKCkudXVpZCh7XG4gIG1lc3NhZ2U6ICdJbnZhbGlkIFVVSUQgZm9ybWF0Jyxcbn0pO1xuXG4vKipcbiAqIE9wdGlvbmFsIFVVSUQgc2NoZW1hIChmb3IgcGFydGlhbCBVVUlEcyBvciBwcmVmaXhlcylcbiAqL1xuZXhwb3J0IGNvbnN0IFVVSURQcmVmaXhTY2hlbWEgPSB6LnN0cmluZygpLnJlZ2V4KC9eWzAtOWEtZi1dKyQvaSwge1xuICBtZXNzYWdlOiAnSW52YWxpZCBVVUlEIHByZWZpeCBmb3JtYXQnLFxufSk7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgc2NoZW1hIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IEJhc2VGaWx0ZXJTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnVuaW9uKFtVVUlEU2NoZW1hLCB6LmFycmF5KFVVSURTY2hlbWEpLCBVVUlEUHJlZml4U2NoZW1hXSkub3B0aW9uYWwoKSxcbiAgYWNjZXNzTW9kaWZpZXI6IEFjY2Vzc01vZGlmaWVyU2NoZW1hLm9wdGlvbmFsKCksXG4gIGlzQWN0aXZlOiBCb29sZWFuUXVlcnlTY2hlbWEub3B0aW9uYWwoKSxcbiAgaXNEZWZhdWx0OiBCb29sZWFuUXVlcnlTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIEluZmVyIFR5cGVTY3JpcHQgdHlwZXMgZnJvbSBzY2hlbWFzXG4gKiBOb3RlOiBQcmVmaXhlZCB3aXRoIFwiVmFsaWRhdGVkXCIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgdHlwZSBkZWZpbml0aW9uc1xuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0ZWRBY2Nlc3NNb2RpZmllciA9IHouaW5mZXI8dHlwZW9mIEFjY2Vzc01vZGlmaWVyU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFZhbGlkYXRlZFNvcnRPcmRlciA9IHouaW5mZXI8dHlwZW9mIFNvcnRPcmRlclNjaGVtYT47XG5leHBvcnQgdHlwZSBWYWxpZGF0ZWRQYWdpbmF0aW9uUGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUGFnaW5hdGlvblNjaGVtYT47XG5leHBvcnQgdHlwZSBWYWxpZGF0ZWRCYXNlRmlsdGVyID0gei5pbmZlcjx0eXBlb2YgQmFzZUZpbHRlclNjaGVtYT47XG4iXX0=
@@ -0,0 +1,6 @@
1
+ export * from './common-schemas';
2
+ export * from './pipeline-schemas';
3
+ export * from './plugin-schemas';
4
+ export * from './message-schemas';
5
+ export * from './ai-schemas';
6
+ export * from './middleware';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ __exportStar(require("./common-schemas"), exports);
20
+ __exportStar(require("./pipeline-schemas"), exports);
21
+ __exportStar(require("./plugin-schemas"), exports);
22
+ __exportStar(require("./message-schemas"), exports);
23
+ __exportStar(require("./ai-schemas"), exports);
24
+ __exportStar(require("./middleware"), exports);
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUV0QyxtREFBaUM7QUFDakMscURBQW1DO0FBQ25DLG1EQUFpQztBQUNqQyxvREFBa0M7QUFDbEMsK0NBQTZCO0FBQzdCLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi1zY2hlbWFzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUtc2NoZW1hcyc7XG5leHBvcnQgKiBmcm9tICcuL3BsdWdpbi1zY2hlbWFzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZS1zY2hlbWFzJztcbmV4cG9ydCAqIGZyb20gJy4vYWktc2NoZW1hcyc7XG5leHBvcnQgKiBmcm9tICcuL21pZGRsZXdhcmUnO1xuIl19
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Message type schema
4
+ */
5
+ export declare const MessageTypeSchema: z.ZodEnum<{
6
+ announcement: "announcement";
7
+ conversation: "conversation";
8
+ }>;
9
+ /**
10
+ * Message priority schema
11
+ */
12
+ export declare const MessagePrioritySchema: z.ZodEnum<{
13
+ normal: "normal";
14
+ high: "high";
15
+ urgent: "urgent";
16
+ }>;
17
+ /**
18
+ * Message filter schema for query parameters
19
+ */
20
+ export declare const MessageFilterSchema: z.ZodObject<{
21
+ id: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>, z.ZodString]>>;
22
+ accessModifier: z.ZodOptional<z.ZodEnum<{
23
+ public: "public";
24
+ private: "private";
25
+ }>>;
26
+ isActive: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
27
+ true: "true";
28
+ false: "false";
29
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
30
+ isDefault: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
31
+ true: "true";
32
+ false: "false";
33
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
34
+ threadId: z.ZodOptional<z.ZodString>;
35
+ recipientOrgId: z.ZodOptional<z.ZodString>;
36
+ messageType: z.ZodOptional<z.ZodEnum<{
37
+ announcement: "announcement";
38
+ conversation: "conversation";
39
+ }>>;
40
+ isRead: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
41
+ true: "true";
42
+ false: "false";
43
+ }>, z.ZodTransform<boolean, "true" | "false">>, z.ZodPipe<z.ZodString, z.ZodTransform<boolean, string>>]>>;
44
+ priority: z.ZodOptional<z.ZodEnum<{
45
+ normal: "normal";
46
+ high: "high";
47
+ urgent: "urgent";
48
+ }>>;
49
+ }, z.core.$strip>;
50
+ /**
51
+ * Message creation schema
52
+ */
53
+ export declare const MessageCreateSchema: z.ZodObject<{
54
+ recipientOrgId: z.ZodString;
55
+ messageType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
56
+ announcement: "announcement";
57
+ conversation: "conversation";
58
+ }>>>;
59
+ subject: z.ZodString;
60
+ content: z.ZodString;
61
+ priority: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
62
+ normal: "normal";
63
+ high: "high";
64
+ urgent: "urgent";
65
+ }>>>;
66
+ }, z.core.$strip>;
67
+ /**
68
+ * Message reply schema
69
+ */
70
+ export declare const MessageReplySchema: z.ZodObject<{
71
+ content: z.ZodString;
72
+ }, z.core.$strip>;
73
+ /**
74
+ * Infer TypeScript types from schemas
75
+ * Note: Prefixed with "Validated" to avoid conflicts with existing type definitions
76
+ */
77
+ export type ValidatedMessageFilter = z.infer<typeof MessageFilterSchema>;
78
+ export type ValidatedMessageCreate = z.infer<typeof MessageCreateSchema>;
79
+ export type ValidatedMessageReply = z.infer<typeof MessageReplySchema>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.MessageReplySchema = exports.MessageCreateSchema = exports.MessageFilterSchema = exports.MessagePrioritySchema = exports.MessageTypeSchema = void 0;
6
+ const zod_1 = require("zod");
7
+ const common_schemas_1 = require("./common-schemas");
8
+ /**
9
+ * Message type schema
10
+ */
11
+ exports.MessageTypeSchema = zod_1.z.enum(['announcement', 'conversation']);
12
+ /**
13
+ * Message priority schema
14
+ */
15
+ exports.MessagePrioritySchema = zod_1.z.enum(['normal', 'high', 'urgent']);
16
+ /**
17
+ * Message filter schema for query parameters
18
+ */
19
+ exports.MessageFilterSchema = common_schemas_1.BaseFilterSchema.extend({
20
+ threadId: zod_1.z.string().uuid().optional(),
21
+ recipientOrgId: zod_1.z.string().min(1).optional(),
22
+ messageType: exports.MessageTypeSchema.optional(),
23
+ isRead: common_schemas_1.BooleanQuerySchema.optional(),
24
+ priority: exports.MessagePrioritySchema.optional(),
25
+ });
26
+ /**
27
+ * Message creation schema
28
+ */
29
+ exports.MessageCreateSchema = zod_1.z.object({
30
+ recipientOrgId: zod_1.z.string().min(1, 'Recipient organization ID is required'),
31
+ messageType: exports.MessageTypeSchema.optional().default('conversation'),
32
+ subject: zod_1.z.string().min(1, 'Subject is required'),
33
+ content: zod_1.z.string().min(1, 'Content is required'),
34
+ priority: exports.MessagePrioritySchema.optional().default('normal'),
35
+ });
36
+ /**
37
+ * Message reply schema
38
+ */
39
+ exports.MessageReplySchema = zod_1.z.object({
40
+ content: zod_1.z.string().min(1, 'Content is required'),
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1zY2hlbWFzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZhbGlkYXRpb24vbWVzc2FnZS1zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUFFdEMsNkJBQXdCO0FBQ3hCLHFEQUF3RTtBQUV4RTs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRTFFOztHQUVHO0FBQ1UsUUFBQSxxQkFBcUIsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBRTFFOztHQUVHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRyxpQ0FBZ0IsQ0FBQyxNQUFNLENBQUM7SUFDekQsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsY0FBYyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzVDLFdBQVcsRUFBRSx5QkFBaUIsQ0FBQyxRQUFRLEVBQUU7SUFDekMsTUFBTSxFQUFFLG1DQUFrQixDQUFDLFFBQVEsRUFBRTtJQUNyQyxRQUFRLEVBQUUsNkJBQXFCLENBQUMsUUFBUSxFQUFFO0NBQzNDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLGNBQWMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSx1Q0FBdUMsQ0FBQztJQUMxRSxXQUFXLEVBQUUseUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUNqRSxPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUM7SUFDakQsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDO0lBQ2pELFFBQVEsRUFBRSw2QkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0NBQzdELENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ1UsUUFBQSxrQkFBa0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQztDQUNsRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBCYXNlRmlsdGVyU2NoZW1hLCBCb29sZWFuUXVlcnlTY2hlbWEgfSBmcm9tICcuL2NvbW1vbi1zY2hlbWFzJztcblxuLyoqXG4gKiBNZXNzYWdlIHR5cGUgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlVHlwZVNjaGVtYSA9IHouZW51bShbJ2Fubm91bmNlbWVudCcsICdjb252ZXJzYXRpb24nXSk7XG5cbi8qKlxuICogTWVzc2FnZSBwcmlvcml0eSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2VQcmlvcml0eVNjaGVtYSA9IHouZW51bShbJ25vcm1hbCcsICdoaWdoJywgJ3VyZ2VudCddKTtcblxuLyoqXG4gKiBNZXNzYWdlIGZpbHRlciBzY2hlbWEgZm9yIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2VGaWx0ZXJTY2hlbWEgPSBCYXNlRmlsdGVyU2NoZW1hLmV4dGVuZCh7XG4gIHRocmVhZElkOiB6LnN0cmluZygpLnV1aWQoKS5vcHRpb25hbCgpLFxuICByZWNpcGllbnRPcmdJZDogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlU2NoZW1hLm9wdGlvbmFsKCksXG4gIGlzUmVhZDogQm9vbGVhblF1ZXJ5U2NoZW1hLm9wdGlvbmFsKCksXG4gIHByaW9yaXR5OiBNZXNzYWdlUHJpb3JpdHlTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIE1lc3NhZ2UgY3JlYXRpb24gc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlQ3JlYXRlU2NoZW1hID0gei5vYmplY3Qoe1xuICByZWNpcGllbnRPcmdJZDogei5zdHJpbmcoKS5taW4oMSwgJ1JlY2lwaWVudCBvcmdhbml6YXRpb24gSUQgaXMgcmVxdWlyZWQnKSxcbiAgbWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlU2NoZW1hLm9wdGlvbmFsKCkuZGVmYXVsdCgnY29udmVyc2F0aW9uJyksXG4gIHN1YmplY3Q6IHouc3RyaW5nKCkubWluKDEsICdTdWJqZWN0IGlzIHJlcXVpcmVkJyksXG4gIGNvbnRlbnQ6IHouc3RyaW5nKCkubWluKDEsICdDb250ZW50IGlzIHJlcXVpcmVkJyksXG4gIHByaW9yaXR5OiBNZXNzYWdlUHJpb3JpdHlTY2hlbWEub3B0aW9uYWwoKS5kZWZhdWx0KCdub3JtYWwnKSxcbn0pO1xuXG4vKipcbiAqIE1lc3NhZ2UgcmVwbHkgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlUmVwbHlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNvbnRlbnQ6IHouc3RyaW5nKCkubWluKDEsICdDb250ZW50IGlzIHJlcXVpcmVkJyksXG59KTtcblxuLyoqXG4gKiBJbmZlciBUeXBlU2NyaXB0IHR5cGVzIGZyb20gc2NoZW1hc1xuICogTm90ZTogUHJlZml4ZWQgd2l0aCBcIlZhbGlkYXRlZFwiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIHR5cGUgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdGVkTWVzc2FnZUZpbHRlciA9IHouaW5mZXI8dHlwZW9mIE1lc3NhZ2VGaWx0ZXJTY2hlbWE+O1xuZXhwb3J0IHR5cGUgVmFsaWRhdGVkTWVzc2FnZUNyZWF0ZSA9IHouaW5mZXI8dHlwZW9mIE1lc3NhZ2VDcmVhdGVTY2hlbWE+O1xuZXhwb3J0IHR5cGUgVmFsaWRhdGVkTWVzc2FnZVJlcGx5ID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVJlcGx5U2NoZW1hPjtcbiJdfQ==
@@ -0,0 +1,60 @@
1
+ import { Request } from 'express';
2
+ import { ZodSchema, ZodError } from 'zod';
3
+ /**
4
+ * Result type for validation operations
5
+ */
6
+ export type ValidationResult<T> = {
7
+ ok: true;
8
+ value: T;
9
+ } | {
10
+ ok: false;
11
+ error: string;
12
+ zodError?: ZodError;
13
+ };
14
+ /**
15
+ * Validate arbitrary data against a Zod schema.
16
+ *
17
+ * This is the core validation function used by the Express-specific helpers
18
+ * (`validateBody`, `validateQuery`, `validateParams`). It can also be called
19
+ * directly when validating data that doesn't come from a request object.
20
+ *
21
+ * @param data - Data to validate
22
+ * @param schema - Zod schema for validation
23
+ * @returns Validation result with parsed data or error
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const result = validate(someData, MySchema);
28
+ * if (!result.ok) {
29
+ * return sendBadRequest(res, result.error);
30
+ * }
31
+ * const parsed = result.value;
32
+ * ```
33
+ */
34
+ export declare function validate<T>(data: unknown, schema: ZodSchema<T>): ValidationResult<T>;
35
+ /**
36
+ * Validate request query parameters with a Zod schema.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const result = validateQuery(req, PipelineFilterSchema);
41
+ * if (!result.ok) return sendBadRequest(res, result.error);
42
+ * const filter = result.value;
43
+ * ```
44
+ */
45
+ export declare function validateQuery<T>(req: Request, schema: ZodSchema<T>): ValidationResult<T>;
46
+ /**
47
+ * Validate request body with a Zod schema.
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const result = validateBody(req, PipelineCreateSchema);
52
+ * if (!result.ok) return sendBadRequest(res, result.error);
53
+ * const data = result.value;
54
+ * ```
55
+ */
56
+ export declare function validateBody<T>(req: Request, schema: ZodSchema<T>): ValidationResult<T>;
57
+ /**
58
+ * Validate request path parameters with a Zod schema.
59
+ */
60
+ export declare function validateParams<T>(req: Request, schema: ZodSchema<T>): ValidationResult<T>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.validate = validate;
6
+ exports.validateQuery = validateQuery;
7
+ exports.validateBody = validateBody;
8
+ exports.validateParams = validateParams;
9
+ const zod_1 = require("zod");
10
+ /**
11
+ * Validate arbitrary data against a Zod schema.
12
+ *
13
+ * This is the core validation function used by the Express-specific helpers
14
+ * (`validateBody`, `validateQuery`, `validateParams`). It can also be called
15
+ * directly when validating data that doesn't come from a request object.
16
+ *
17
+ * @param data - Data to validate
18
+ * @param schema - Zod schema for validation
19
+ * @returns Validation result with parsed data or error
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const result = validate(someData, MySchema);
24
+ * if (!result.ok) {
25
+ * return sendBadRequest(res, result.error);
26
+ * }
27
+ * const parsed = result.value;
28
+ * ```
29
+ */
30
+ function validate(data, schema) {
31
+ try {
32
+ return { ok: true, value: schema.parse(data) };
33
+ }
34
+ catch (error) {
35
+ if (error instanceof zod_1.ZodError) {
36
+ const firstIssue = error.issues[0];
37
+ const message = firstIssue
38
+ ? `${firstIssue.path.join('.')}: ${firstIssue.message}`
39
+ : 'Validation failed';
40
+ return { ok: false, error: message, zodError: error };
41
+ }
42
+ return { ok: false, error: 'Validation failed' };
43
+ }
44
+ }
45
+ /**
46
+ * Validate request query parameters with a Zod schema.
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const result = validateQuery(req, PipelineFilterSchema);
51
+ * if (!result.ok) return sendBadRequest(res, result.error);
52
+ * const filter = result.value;
53
+ * ```
54
+ */
55
+ function validateQuery(req, schema) {
56
+ return validate(req.query, schema);
57
+ }
58
+ /**
59
+ * Validate request body with a Zod schema.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const result = validateBody(req, PipelineCreateSchema);
64
+ * if (!result.ok) return sendBadRequest(res, result.error);
65
+ * const data = result.value;
66
+ * ```
67
+ */
68
+ function validateBody(req, schema) {
69
+ return validate(req.body, schema);
70
+ }
71
+ /**
72
+ * Validate request path parameters with a Zod schema.
73
+ */
74
+ function validateParams(req, schema) {
75
+ return validate(req.params, schema);
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBZ0N0Qyw0QkFnQkM7QUFZRCxzQ0FFQztBQVlELG9DQUVDO0FBS0Qsd0NBRUM7QUFoRkQsNkJBQTBDO0FBUzFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBZ0IsUUFBUSxDQUN0QixJQUFhLEVBQ2IsTUFBb0I7SUFFcEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLGNBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsVUFBVTtnQkFDeEIsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDdkQsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO1lBQ3hCLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGFBQWEsQ0FBSSxHQUFZLEVBQUUsTUFBb0I7SUFDakUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFJLEdBQVksRUFBRSxNQUFvQjtJQUNoRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBSSxHQUFZLEVBQUUsTUFBb0I7SUFDbEUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFJlcXVlc3QgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFpvZFNjaGVtYSwgWm9kRXJyb3IgfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIFJlc3VsdCB0eXBlIGZvciB2YWxpZGF0aW9uIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdGlvblJlc3VsdDxUPiA9XG4gIHwgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfVxuICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nOyB6b2RFcnJvcj86IFpvZEVycm9yIH07XG5cbi8qKlxuICogVmFsaWRhdGUgYXJiaXRyYXJ5IGRhdGEgYWdhaW5zdCBhIFpvZCBzY2hlbWEuXG4gKlxuICogVGhpcyBpcyB0aGUgY29yZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIEV4cHJlc3Mtc3BlY2lmaWMgaGVscGVyc1xuICogKGB2YWxpZGF0ZUJvZHlgLCBgdmFsaWRhdGVRdWVyeWAsIGB2YWxpZGF0ZVBhcmFtc2ApLiBJdCBjYW4gYWxzbyBiZSBjYWxsZWRcbiAqIGRpcmVjdGx5IHdoZW4gdmFsaWRhdGluZyBkYXRhIHRoYXQgZG9lc24ndCBjb21lIGZyb20gYSByZXF1ZXN0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBzY2hlbWEgLSBab2Qgc2NoZW1hIGZvciB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHBhcnNlZCBkYXRhIG9yIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlKHNvbWVEYXRhLCBNeVNjaGVtYSk7XG4gKiBpZiAoIXJlc3VsdC5vaykge1xuICogICByZXR1cm4gc2VuZEJhZFJlcXVlc3QocmVzLCByZXN1bHQuZXJyb3IpO1xuICogfVxuICogY29uc3QgcGFyc2VkID0gcmVzdWx0LnZhbHVlO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxUPihcbiAgZGF0YTogdW5rbm93bixcbiAgc2NoZW1hOiBab2RTY2hlbWE8VD4sXG4pOiBWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHNjaGVtYS5wYXJzZShkYXRhKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICBjb25zdCBmaXJzdElzc3VlID0gZXJyb3IuaXNzdWVzWzBdO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGZpcnN0SXNzdWVcbiAgICAgICAgPyBgJHtmaXJzdElzc3VlLnBhdGguam9pbignLicpfTogJHtmaXJzdElzc3VlLm1lc3NhZ2V9YFxuICAgICAgICA6ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBtZXNzYWdlLCB6b2RFcnJvcjogZXJyb3IgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogJ1ZhbGlkYXRpb24gZmFpbGVkJyB9O1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgcmVxdWVzdCBxdWVyeSBwYXJhbWV0ZXJzIHdpdGggYSBab2Qgc2NoZW1hLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZVF1ZXJ5KHJlcSwgUGlwZWxpbmVGaWx0ZXJTY2hlbWEpO1xuICogaWYgKCFyZXN1bHQub2spIHJldHVybiBzZW5kQmFkUmVxdWVzdChyZXMsIHJlc3VsdC5lcnJvcik7XG4gKiBjb25zdCBmaWx0ZXIgPSByZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUXVlcnk8VD4ocmVxOiBSZXF1ZXN0LCBzY2hlbWE6IFpvZFNjaGVtYTxUPik6IFZhbGlkYXRpb25SZXN1bHQ8VD4ge1xuICByZXR1cm4gdmFsaWRhdGUocmVxLnF1ZXJ5LCBzY2hlbWEpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHJlcXVlc3QgYm9keSB3aXRoIGEgWm9kIHNjaGVtYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVCb2R5KHJlcSwgUGlwZWxpbmVDcmVhdGVTY2hlbWEpO1xuICogaWYgKCFyZXN1bHQub2spIHJldHVybiBzZW5kQmFkUmVxdWVzdChyZXMsIHJlc3VsdC5lcnJvcik7XG4gKiBjb25zdCBkYXRhID0gcmVzdWx0LnZhbHVlO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJvZHk8VD4ocmVxOiBSZXF1ZXN0LCBzY2hlbWE6IFpvZFNjaGVtYTxUPik6IFZhbGlkYXRpb25SZXN1bHQ8VD4ge1xuICByZXR1cm4gdmFsaWRhdGUocmVxLmJvZHksIHNjaGVtYSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgcmVxdWVzdCBwYXRoIHBhcmFtZXRlcnMgd2l0aCBhIFpvZCBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcmFtczxUPihyZXE6IFJlcXVlc3QsIHNjaGVtYTogWm9kU2NoZW1hPFQ+KTogVmFsaWRhdGlvblJlc3VsdDxUPiB7XG4gIHJldHVybiB2YWxpZGF0ZShyZXEucGFyYW1zLCBzY2hlbWEpO1xufVxuIl19