primitive-admin 1.0.60 → 1.0.62
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 +125 -69
- package/assets/skill/skills/primitive-platform/SKILL.md +336 -37
- package/dist/bin/primitive.js +29 -14
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.js +22 -8
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.js +96 -16
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.js +49 -188
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/blob-buckets.js +50 -155
- package/dist/src/commands/blob-buckets.js.map +1 -1
- package/dist/src/commands/collection-type-configs.js +14 -100
- package/dist/src/commands/collection-type-configs.js.map +1 -1
- package/dist/src/commands/collections.js +47 -8
- package/dist/src/commands/collections.js.map +1 -1
- package/dist/src/commands/config.d.ts +46 -0
- package/dist/src/commands/config.js +479 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/connections.d.ts +2 -0
- package/dist/src/commands/connections.js +100 -0
- package/dist/src/commands/connections.js.map +1 -0
- package/dist/src/commands/cron-triggers.js +84 -176
- package/dist/src/commands/cron-triggers.js.map +1 -1
- package/dist/src/commands/database-type-configs.d.ts +2 -0
- package/dist/src/commands/database-type-configs.js +171 -0
- package/dist/src/commands/database-type-configs.js.map +1 -0
- package/dist/src/commands/database-types.js +4 -4
- package/dist/src/commands/database-types.js.map +1 -1
- package/dist/src/commands/databases.d.ts +63 -0
- package/dist/src/commands/databases.js +649 -87
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.js +869 -12
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.js +18 -125
- package/dist/src/commands/email-templates.js.map +1 -1
- package/dist/src/commands/env.d.ts +12 -1
- package/dist/src/commands/env.js +98 -25
- package/dist/src/commands/env.js.map +1 -1
- package/dist/src/commands/feature-flags.d.ts +14 -0
- package/dist/src/commands/feature-flags.js +116 -0
- package/dist/src/commands/feature-flags.js.map +1 -0
- package/dist/src/commands/group-type-configs.js +14 -109
- package/dist/src/commands/group-type-configs.js.map +1 -1
- package/dist/src/commands/init.d.ts +9 -1
- package/dist/src/commands/init.js +1058 -279
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.js +136 -421
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/metadata-category-configs.d.ts +12 -0
- package/dist/src/commands/metadata-category-configs.js +112 -0
- package/dist/src/commands/metadata-category-configs.js.map +1 -0
- package/dist/src/commands/metadata.js +33 -141
- package/dist/src/commands/metadata.js.map +1 -1
- package/dist/src/commands/prompts.js +206 -563
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +1 -1
- package/dist/src/commands/rule-sets.js +16 -132
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.js +67 -234
- package/dist/src/commands/scripts.js.map +1 -1
- package/dist/src/commands/sessions.d.ts +2 -0
- package/dist/src/commands/sessions.js +75 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/skill.js +2 -2
- package/dist/src/commands/skill.js.map +1 -1
- package/dist/src/commands/sync-app-settings.d.ts +113 -70
- package/dist/src/commands/sync-app-settings.js +193 -242
- package/dist/src/commands/sync-app-settings.js.map +1 -1
- package/dist/src/commands/sync.d.ts +1932 -49
- package/dist/src/commands/sync.js +9584 -1725
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.js +8 -2
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.js +92 -1
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/vars.js +44 -58
- package/dist/src/commands/vars.js.map +1 -1
- package/dist/src/commands/webhooks.js +318 -156
- package/dist/src/commands/webhooks.js.map +1 -1
- package/dist/src/commands/workflows.d.ts +49 -12
- package/dist/src/commands/workflows.js +652 -1043
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/access-rule-display.d.ts +21 -0
- package/dist/src/lib/access-rule-display.js +34 -0
- package/dist/src/lib/access-rule-display.js.map +1 -0
- package/dist/src/lib/api-client.d.ts +630 -61
- package/dist/src/lib/api-client.js +676 -116
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +180 -25
- package/dist/src/lib/app-settings-descriptor.js +403 -82
- package/dist/src/lib/app-settings-descriptor.js.map +1 -1
- package/dist/src/lib/canonical-json.d.ts +12 -0
- package/dist/src/lib/canonical-json.js +35 -0
- package/dist/src/lib/canonical-json.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +8 -0
- package/dist/src/lib/cli-manifest.js +1 -0
- package/dist/src/lib/cli-manifest.js.map +1 -1
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +6 -2
- package/dist/src/lib/codegen-shared/generatedFiles.js +9 -2
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +6 -6
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +8 -8
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
- package/dist/src/lib/config-object-descriptor.d.ts +127 -0
- package/dist/src/lib/config-object-descriptor.js +658 -0
- package/dist/src/lib/config-object-descriptor.js.map +1 -0
- package/dist/src/lib/config-payload.d.ts +85 -0
- package/dist/src/lib/config-payload.js +116 -0
- package/dist/src/lib/config-payload.js.map +1 -0
- package/dist/src/lib/config-surface.d.ts +130 -0
- package/dist/src/lib/config-surface.js +300 -0
- package/dist/src/lib/config-surface.js.map +1 -0
- package/dist/src/lib/credentials-store.d.ts +10 -0
- package/dist/src/lib/credentials-store.js +23 -0
- package/dist/src/lib/credentials-store.js.map +1 -1
- package/dist/src/lib/data-input.d.ts +23 -0
- package/dist/src/lib/data-input.js +50 -0
- package/dist/src/lib/data-input.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTemplates.js +1 -1
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +1 -1
- package/dist/src/lib/env-resolver-core.d.ts +147 -0
- package/dist/src/lib/env-resolver-core.js +265 -0
- package/dist/src/lib/env-resolver-core.js.map +1 -0
- package/dist/src/lib/env-resolver.d.ts +28 -6
- package/dist/src/lib/env-resolver.js +44 -32
- package/dist/src/lib/env-resolver.js.map +1 -1
- package/dist/src/lib/generated-allowlist.js +13 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -1
- package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
- package/dist/src/lib/generated-config-surfaces.js +4058 -0
- package/dist/src/lib/generated-config-surfaces.js.map +1 -0
- package/dist/src/lib/generated-template-lint.d.ts +212 -0
- package/dist/src/lib/generated-template-lint.js +624 -0
- package/dist/src/lib/generated-template-lint.js.map +1 -0
- package/dist/src/lib/init-adopt.d.ts +16 -0
- package/dist/src/lib/init-adopt.js +34 -0
- package/dist/src/lib/init-adopt.js.map +1 -0
- package/dist/src/lib/init-assets.d.ts +39 -0
- package/dist/src/lib/init-assets.js +97 -0
- package/dist/src/lib/init-assets.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +44 -5
- package/dist/src/lib/init-config.js +80 -7
- package/dist/src/lib/init-config.js.map +1 -1
- package/dist/src/lib/init-ios-links.d.ts +50 -0
- package/dist/src/lib/init-ios-links.js +153 -0
- package/dist/src/lib/init-ios-links.js.map +1 -0
- package/dist/src/lib/init-plan.d.ts +80 -0
- package/dist/src/lib/init-plan.js +95 -0
- package/dist/src/lib/init-plan.js.map +1 -0
- package/dist/src/lib/init-production-env.d.ts +48 -0
- package/dist/src/lib/init-production-env.js +59 -0
- package/dist/src/lib/init-production-env.js.map +1 -0
- package/dist/src/lib/init-schema.d.ts +74 -0
- package/dist/src/lib/init-schema.js +358 -0
- package/dist/src/lib/init-schema.js.map +1 -0
- package/dist/src/lib/init-xcode.d.ts +33 -0
- package/dist/src/lib/init-xcode.js +114 -0
- package/dist/src/lib/init-xcode.js.map +1 -0
- package/dist/src/lib/integration-request-config.d.ts +30 -0
- package/dist/src/lib/integration-request-config.js +145 -0
- package/dist/src/lib/integration-request-config.js.map +1 -0
- package/dist/src/lib/local-state.d.ts +55 -0
- package/dist/src/lib/local-state.js +167 -0
- package/dist/src/lib/local-state.js.map +1 -0
- package/dist/src/lib/log-inspection.d.ts +568 -0
- package/dist/src/lib/log-inspection.js +639 -0
- package/dist/src/lib/log-inspection.js.map +1 -0
- package/dist/src/lib/migration-nag.d.ts +2 -2
- package/dist/src/lib/migration-nag.js +3 -3
- package/dist/src/lib/object-status-filter.d.ts +22 -0
- package/dist/src/lib/object-status-filter.js +45 -0
- package/dist/src/lib/object-status-filter.js.map +1 -0
- package/dist/src/lib/output.d.ts +24 -1
- package/dist/src/lib/output.js +42 -1
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/package-manager.d.ts +140 -0
- package/dist/src/lib/package-manager.js +305 -0
- package/dist/src/lib/package-manager.js.map +1 -0
- package/dist/src/lib/paginate.d.ts +50 -0
- package/dist/src/lib/paginate.js +53 -0
- package/dist/src/lib/paginate.js.map +1 -1
- package/dist/src/lib/platform-owned.d.ts +29 -3
- package/dist/src/lib/platform-owned.js +42 -3
- package/dist/src/lib/platform-owned.js.map +1 -1
- package/dist/src/lib/project-config.js +13 -5
- package/dist/src/lib/project-config.js.map +1 -1
- package/dist/src/lib/query-operators.d.ts +1 -1
- package/dist/src/lib/query-operators.js +1 -1
- package/dist/src/lib/record-filter.d.ts +18 -0
- package/dist/src/lib/record-filter.js +55 -0
- package/dist/src/lib/record-filter.js.map +1 -0
- package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
- package/dist/src/lib/resolve-init-dev-port.js +55 -0
- package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
- package/dist/src/lib/resolve-init-server.d.ts +64 -0
- package/dist/src/lib/resolve-init-server.js +77 -0
- package/dist/src/lib/resolve-init-server.js.map +1 -0
- package/dist/src/lib/resolve-platform.d.ts +43 -14
- package/dist/src/lib/resolve-platform.js +74 -12
- package/dist/src/lib/resolve-platform.js.map +1 -1
- package/dist/src/lib/run-status.d.ts +19 -0
- package/dist/src/lib/run-status.generated.d.ts +39 -0
- package/dist/src/lib/run-status.generated.js +66 -0
- package/dist/src/lib/run-status.generated.js.map +1 -0
- package/dist/src/lib/run-status.js +19 -0
- package/dist/src/lib/run-status.js.map +1 -0
- package/dist/src/lib/server-text-normalization.d.ts +51 -0
- package/dist/src/lib/server-text-normalization.js +90 -0
- package/dist/src/lib/server-text-normalization.js.map +1 -0
- package/dist/src/lib/server-url.d.ts +22 -0
- package/dist/src/lib/server-url.js +33 -0
- package/dist/src/lib/server-url.js.map +1 -0
- package/dist/src/lib/signing-secret-status.d.ts +81 -0
- package/dist/src/lib/signing-secret-status.js +116 -0
- package/dist/src/lib/signing-secret-status.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +4 -2
- package/dist/src/lib/skill-installer.js +143 -12
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/snapshots.d.ts +2 -2
- package/dist/src/lib/snapshots.js +2 -2
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +15 -2
- package/dist/src/lib/swift-codegen/dbGenerator.js +250 -18
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
- package/dist/src/lib/swift-codegen/generator.d.ts +11 -2
- package/dist/src/lib/swift-codegen/generator.js +181 -7
- package/dist/src/lib/swift-codegen/generator.js.map +1 -1
- package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +7 -3
- package/dist/src/lib/swift-codegen/siblingSymbols.js +4 -1
- package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -1
- package/dist/src/lib/sync-dir-selector.d.ts +21 -0
- package/dist/src/lib/sync-dir-selector.js +30 -0
- package/dist/src/lib/sync-dir-selector.js.map +1 -0
- package/dist/src/lib/sync-paths.d.ts +39 -0
- package/dist/src/lib/sync-paths.js +70 -2
- package/dist/src/lib/sync-paths.js.map +1 -1
- package/dist/src/lib/sync-resource-types.d.ts +138 -31
- package/dist/src/lib/sync-resource-types.js +241 -47
- package/dist/src/lib/sync-resource-types.js.map +1 -1
- package/dist/src/lib/sync-selectors.d.ts +95 -0
- package/dist/src/lib/sync-selectors.js +228 -0
- package/dist/src/lib/sync-selectors.js.map +1 -0
- package/dist/src/lib/template.d.ts +62 -4
- package/dist/src/lib/template.js +147 -39
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/test-case-keys.d.ts +29 -0
- package/dist/src/lib/test-case-keys.js +55 -0
- package/dist/src/lib/test-case-keys.js.map +1 -0
- package/dist/src/lib/test-case-variables.d.ts +15 -0
- package/dist/src/lib/test-case-variables.js +29 -0
- package/dist/src/lib/test-case-variables.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +4 -4
- package/dist/src/lib/toml-database-config.js +27 -34
- package/dist/src/lib/toml-database-config.js.map +1 -1
- package/dist/src/lib/toml-metadata-config.d.ts +9 -5
- package/dist/src/lib/toml-metadata-config.js +40 -45
- package/dist/src/lib/toml-metadata-config.js.map +1 -1
- package/dist/src/lib/toml-native-form.d.ts +1 -1
- package/dist/src/lib/toml-native-form.js +1 -1
- package/dist/src/lib/toml-params-validator.d.ts +1 -1
- package/dist/src/lib/toml-params-validator.js +1 -1
- package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
- package/dist/src/lib/toml-scalar-edit.js +283 -0
- package/dist/src/lib/toml-scalar-edit.js.map +1 -0
- package/dist/src/lib/user-selector.d.ts +24 -0
- package/dist/src/lib/user-selector.js +33 -0
- package/dist/src/lib/user-selector.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +25 -0
- package/dist/src/lib/version-check.js +77 -8
- package/dist/src/lib/version-check.js.map +1 -1
- package/dist/src/lib/watch.d.ts +121 -0
- package/dist/src/lib/watch.js +169 -0
- package/dist/src/lib/watch.js.map +1 -0
- package/dist/src/lib/workflow-apply.d.ts +69 -45
- package/dist/src/lib/workflow-apply.js +99 -72
- package/dist/src/lib/workflow-apply.js.map +1 -1
- package/dist/src/lib/workflow-codegen/generator.js +4 -4
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -1
- package/dist/src/lib/workflow-codegen/invokerIR.d.ts +11 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js +5 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -1
- package/dist/src/lib/workflow-config-apply.d.ts +70 -0
- package/dist/src/lib/workflow-config-apply.js +137 -0
- package/dist/src/lib/workflow-config-apply.js.map +1 -0
- package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
- package/dist/src/lib/workflow-config-sidecar.js +96 -0
- package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
- package/dist/src/lib/workflow-defaults.d.ts +29 -0
- package/dist/src/lib/workflow-defaults.js +41 -0
- package/dist/src/lib/workflow-defaults.js.map +1 -0
- package/dist/src/lib/workflow-fragments.d.ts +23 -0
- package/dist/src/lib/workflow-fragments.js +229 -8
- package/dist/src/lib/workflow-fragments.js.map +1 -1
- package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
- package/dist/src/lib/workflow-include-preserve.js +286 -0
- package/dist/src/lib/workflow-include-preserve.js.map +1 -0
- package/dist/src/lib/workflow-payload.d.ts +31 -20
- package/dist/src/lib/workflow-payload.js +100 -93
- package/dist/src/lib/workflow-payload.js.map +1 -1
- package/dist/src/lib/workflow-toml-validator.d.ts +80 -3
- package/dist/src/lib/workflow-toml-validator.js +231 -3
- package/dist/src/lib/workflow-toml-validator.js.map +1 -1
- package/dist/src/types/index.d.ts +78 -22
- package/dist/src/validators.d.ts +7 -7
- package/dist/src/validators.js +6 -6
- package/package.json +11 -6
- package/dist/src/commands/settings.d.ts +0 -15
- package/dist/src/commands/settings.js +0 -102
- package/dist/src/commands/settings.js.map +0 -1
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED FILE — DO NOT EDIT BY HAND.
|
|
3
|
+
*
|
|
4
|
+
* Verbatim copy of the server module
|
|
5
|
+
* `src/workflows/runner/template-static-lint.ts` — the single source of truth
|
|
6
|
+
* for the static `{{ }}` template lint the CLI runs at `config push` time and
|
|
7
|
+
* the server runs at save time (issue #2689).
|
|
8
|
+
*
|
|
9
|
+
* Regenerate with:
|
|
10
|
+
* node cli/scripts/gen-template-lint.mjs (runs automatically at CLI prebuild)
|
|
11
|
+
*
|
|
12
|
+
* A freshness guard (`cli/scripts/gen-template-lint.mjs --check`, also asserted
|
|
13
|
+
* by `cli/tests/unit/template-lint-drift-guard.test.ts`) fails if this committed
|
|
14
|
+
* copy does not match the server module.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Parse filter chain from expression.
|
|
18
|
+
* Supports: path | filter | filter: 'arg' | filter: 'arg1', 'arg2'
|
|
19
|
+
* Respects || (fallback operator) and quoted strings containing |.
|
|
20
|
+
*
|
|
21
|
+
* Moved here from `templates.ts` (#2689) so the lint and the renderer parse
|
|
22
|
+
* expressions with ONE implementation; `templates.ts` imports it back.
|
|
23
|
+
*/
|
|
24
|
+
export function parseFilterChain(expr) {
|
|
25
|
+
// Split on single | that is NOT inside quotes and NOT part of ||
|
|
26
|
+
// Strategy: scan character by character, tracking quote state
|
|
27
|
+
const segments = [];
|
|
28
|
+
let current = "";
|
|
29
|
+
let inSingleQuote = false;
|
|
30
|
+
let inDoubleQuote = false;
|
|
31
|
+
for (let i = 0; i < expr.length; i++) {
|
|
32
|
+
const ch = expr[i];
|
|
33
|
+
if (ch === "'" && !inDoubleQuote) {
|
|
34
|
+
inSingleQuote = !inSingleQuote;
|
|
35
|
+
current += ch;
|
|
36
|
+
}
|
|
37
|
+
else if (ch === '"' && !inSingleQuote) {
|
|
38
|
+
inDoubleQuote = !inDoubleQuote;
|
|
39
|
+
current += ch;
|
|
40
|
+
}
|
|
41
|
+
else if (ch === "|" && !inSingleQuote && !inDoubleQuote) {
|
|
42
|
+
// Check for || (fallback operator)
|
|
43
|
+
if (expr[i + 1] === "|") {
|
|
44
|
+
current += "||";
|
|
45
|
+
i++; // Skip next |
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
segments.push(current.trim());
|
|
49
|
+
current = "";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
current += ch;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (current.trim())
|
|
57
|
+
segments.push(current.trim());
|
|
58
|
+
const path = segments[0] || "";
|
|
59
|
+
const filterList = [];
|
|
60
|
+
for (let i = 1; i < segments.length; i++) {
|
|
61
|
+
const part = segments[i].trim();
|
|
62
|
+
if (!part)
|
|
63
|
+
continue;
|
|
64
|
+
const colonIdx = part.indexOf(":");
|
|
65
|
+
if (colonIdx === -1) {
|
|
66
|
+
filterList.push({ name: part, args: [] });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const name = part.slice(0, colonIdx).trim();
|
|
70
|
+
const argsStr = part.slice(colonIdx + 1).trim();
|
|
71
|
+
const args = [];
|
|
72
|
+
const argMatches = argsStr.matchAll(/["']([^"']*)["']|([^,\s]+)/g);
|
|
73
|
+
for (const m of argMatches) {
|
|
74
|
+
args.push(m[1] ?? m[2] ?? "");
|
|
75
|
+
}
|
|
76
|
+
filterList.push({ name, args });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { path, filters: filterList };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Tokenize a path expression into segments. Handles:
|
|
83
|
+
* - dot navigation: `a.b.c` → idents
|
|
84
|
+
* - optional chain: `a?.b` → treated as `a.b` (existing behavior)
|
|
85
|
+
* - quoted bracket keys: `a['key']`, `a["key"]` → keys (preserve dots/dashes)
|
|
86
|
+
* - numeric literal brackets: `a[5]` → ident "5" (numeric coercion happens
|
|
87
|
+
* in walker)
|
|
88
|
+
* - **identifier-path brackets**: `a[iteration.index]`, `a[steps.x.id]` →
|
|
89
|
+
* bracket tokens whose `inner` is recursively resolved
|
|
90
|
+
*
|
|
91
|
+
* Bracket contents may themselves contain quoted strings or nested brackets;
|
|
92
|
+
* we track quote state and bracket depth so we don't confuse them with the
|
|
93
|
+
* outermost `]`.
|
|
94
|
+
*
|
|
95
|
+
* Moved here from `templates.ts` (#2689); see `parseFilterChain`.
|
|
96
|
+
*/
|
|
97
|
+
export function tokenizePath(expr) {
|
|
98
|
+
// Pre-collapse optional chaining and whitespace, matching prior behavior.
|
|
99
|
+
const cleaned = expr.replace(/\?\./g, ".").replace(/\s+/g, " ").trim();
|
|
100
|
+
const tokens = [];
|
|
101
|
+
let buf = "";
|
|
102
|
+
const flushIdent = () => {
|
|
103
|
+
const trimmed = buf.trim();
|
|
104
|
+
if (trimmed)
|
|
105
|
+
tokens.push({ kind: "ident", value: trimmed });
|
|
106
|
+
buf = "";
|
|
107
|
+
};
|
|
108
|
+
let i = 0;
|
|
109
|
+
while (i < cleaned.length) {
|
|
110
|
+
const ch = cleaned[i];
|
|
111
|
+
if (ch === ".") {
|
|
112
|
+
flushIdent();
|
|
113
|
+
i++;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (ch === "[") {
|
|
117
|
+
flushIdent();
|
|
118
|
+
// Find the matching `]`, tracking quotes and nested brackets.
|
|
119
|
+
let depth = 1;
|
|
120
|
+
let j = i + 1;
|
|
121
|
+
let inSingle = false;
|
|
122
|
+
let inDouble = false;
|
|
123
|
+
while (j < cleaned.length && depth > 0) {
|
|
124
|
+
const c = cleaned[j];
|
|
125
|
+
if (c === "'" && !inDouble) {
|
|
126
|
+
inSingle = !inSingle;
|
|
127
|
+
}
|
|
128
|
+
else if (c === '"' && !inSingle) {
|
|
129
|
+
inDouble = !inDouble;
|
|
130
|
+
}
|
|
131
|
+
else if (!inSingle && !inDouble) {
|
|
132
|
+
if (c === "[")
|
|
133
|
+
depth++;
|
|
134
|
+
else if (c === "]")
|
|
135
|
+
depth--;
|
|
136
|
+
}
|
|
137
|
+
if (depth === 0)
|
|
138
|
+
break;
|
|
139
|
+
j++;
|
|
140
|
+
}
|
|
141
|
+
// Unmatched `[` — fall back to treating the rest as a raw ident so we
|
|
142
|
+
// don't crash. The walker will return `found: false` for nonsense paths.
|
|
143
|
+
if (depth !== 0) {
|
|
144
|
+
buf += cleaned.slice(i);
|
|
145
|
+
i = cleaned.length;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const inner = cleaned.slice(i + 1, j).trim();
|
|
149
|
+
// Classify the bracket contents.
|
|
150
|
+
const isSingleQuoted = inner.startsWith("'") && inner.endsWith("'");
|
|
151
|
+
const isDoubleQuoted = inner.startsWith('"') && inner.endsWith('"');
|
|
152
|
+
if (isSingleQuoted || isDoubleQuoted) {
|
|
153
|
+
tokens.push({ kind: "key", value: inner.slice(1, -1) });
|
|
154
|
+
}
|
|
155
|
+
else if (/^\d+$/.test(inner)) {
|
|
156
|
+
tokens.push({ kind: "ident", value: inner });
|
|
157
|
+
}
|
|
158
|
+
else if (inner.length > 0) {
|
|
159
|
+
// Identifier path — resolved against the template context at walk time.
|
|
160
|
+
tokens.push({ kind: "bracket", inner });
|
|
161
|
+
}
|
|
162
|
+
// Empty brackets `[]` are silently skipped.
|
|
163
|
+
i = j + 1;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
buf += ch;
|
|
167
|
+
i++;
|
|
168
|
+
}
|
|
169
|
+
flushIdent();
|
|
170
|
+
return tokens;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The valid top-level template roots (#1296 Fork 3; `vars` added by #1423).
|
|
174
|
+
* Named in the unresolved-reference error when the reference's root is not
|
|
175
|
+
* one of them (`{{ inputs.userId }}` — a common typo for `input`), and the
|
|
176
|
+
* baseline tolerated set for the static lint.
|
|
177
|
+
*
|
|
178
|
+
* Re-exported from `templates.ts` so existing importers are unaffected.
|
|
179
|
+
*/
|
|
180
|
+
export const KNOWN_TEMPLATE_ROOTS = [
|
|
181
|
+
"input",
|
|
182
|
+
"steps",
|
|
183
|
+
"outputs",
|
|
184
|
+
"meta",
|
|
185
|
+
"secrets",
|
|
186
|
+
"vars",
|
|
187
|
+
];
|
|
188
|
+
/**
|
|
189
|
+
* The built-in zero-arg roots every template context carries.
|
|
190
|
+
*
|
|
191
|
+
* `buildTemplateContext` (`templates.ts`) DERIVES its lazy-getter map from
|
|
192
|
+
* this list, so the runtime's built-ins and the lint's tolerated built-ins are
|
|
193
|
+
* one declaration rather than two lists to keep in sync (#2689 criterion 8b).
|
|
194
|
+
* Adding a built-in means adding it here and giving it a getter there — the
|
|
195
|
+
* derivation test in `tests/unit/workflows/template-static-lint.test.ts` fails
|
|
196
|
+
* if the two disagree.
|
|
197
|
+
*/
|
|
198
|
+
export const TEMPLATE_BUILTIN_ROOTS = ["now", "today", "uuid", "ulid"];
|
|
199
|
+
/**
|
|
200
|
+
* Contextual roots tolerated in EVERY scanned expression.
|
|
201
|
+
*
|
|
202
|
+
* Binding sites:
|
|
203
|
+
* - `selected` / `user` / `md` — bound directly as context object literals by
|
|
204
|
+
* the engine (sequential step context, compensation context, forEach
|
|
205
|
+
* iteration contexts) and, for `user`, by the `iterate-users` runner's
|
|
206
|
+
* `utils.template(template, { user })` extra scope. These three are the
|
|
207
|
+
* only HAND-listed entries: they have no single declaration point, and
|
|
208
|
+
* they are deliberately tolerated GLOBALLY (their binding sites are
|
|
209
|
+
* broader and less uniform than the forEach roots below — a miss here is a
|
|
210
|
+
* harmless false negative the run-time check still catches, while a false
|
|
211
|
+
* rejection would break a working push).
|
|
212
|
+
* - built-ins — derived from {@link TEMPLATE_BUILTIN_ROOTS}.
|
|
213
|
+
*
|
|
214
|
+
* Roots bound by a step runner through `utils.template(value, extraScope)` are
|
|
215
|
+
* validated against these sets at run time by `contextWithExtraScope`
|
|
216
|
+
* (`engine.ts`), which throws under the test runner — so a new runner-bound
|
|
217
|
+
* root cannot silently become a push-time false rejection (#2689 criterion 8c).
|
|
218
|
+
*/
|
|
219
|
+
export const GLOBAL_CONTEXTUAL_ROOTS = [
|
|
220
|
+
"selected",
|
|
221
|
+
"user",
|
|
222
|
+
"md",
|
|
223
|
+
...TEMPLATE_BUILTIN_ROOTS,
|
|
224
|
+
];
|
|
225
|
+
/**
|
|
226
|
+
* Roots bound ONLY inside a forEach step's body.
|
|
227
|
+
*
|
|
228
|
+
* The engine binds `loop`/`iteration` at exactly two sites — the in-process
|
|
229
|
+
* forEach iteration context and the durable batch's (`engine.ts`) — and NOT in
|
|
230
|
+
* the sequential step context, the compensation context, or the context a
|
|
231
|
+
* forEach SOURCE resolves against (`baseCtx`, `engine.ts`). So a
|
|
232
|
+
* `{{ iteration.index }}` on a non-forEach step, or in a forEach source, is a
|
|
233
|
+
* guaranteed run-time miss.
|
|
234
|
+
*/
|
|
235
|
+
export const ITERATION_ROOTS = ["iteration", "loop"];
|
|
236
|
+
/**
|
|
237
|
+
* The step fields `templateStep` (`engine.ts`) destructures OUT before
|
|
238
|
+
* rendering — control fields that are never run through the template renderer
|
|
239
|
+
* (`runIf` / `successWhen` are CEL; `forEach` / `runs` / `selector.path` are
|
|
240
|
+
* bare paths). Keep in sync with that destructuring.
|
|
241
|
+
*
|
|
242
|
+
* `forEach` is excluded from the body walk here and linted separately against
|
|
243
|
+
* the source-scoped root set (see `lintWorkflowStepTemplates`).
|
|
244
|
+
*/
|
|
245
|
+
export const NON_TEMPLATED_STEP_FIELDS = [
|
|
246
|
+
"id",
|
|
247
|
+
"kind",
|
|
248
|
+
"runIf",
|
|
249
|
+
"selector",
|
|
250
|
+
"saveAs",
|
|
251
|
+
"forEach",
|
|
252
|
+
"as",
|
|
253
|
+
"maxItems",
|
|
254
|
+
"_testSteps",
|
|
255
|
+
"runs",
|
|
256
|
+
"continueOnError",
|
|
257
|
+
"strict",
|
|
258
|
+
"strictParams",
|
|
259
|
+
"expects",
|
|
260
|
+
// #2735 — the `prompt.execute` / `block.call` output-type declaration. A
|
|
261
|
+
// static control field: the engine never renders it.
|
|
262
|
+
"expect",
|
|
263
|
+
"successWhen",
|
|
264
|
+
];
|
|
265
|
+
/** Matches the renderer's interpolation pattern (`renderString`, templates.ts). */
|
|
266
|
+
const EXPRESSION_RE = /{{\s*([^}]+)\s*}}/g;
|
|
267
|
+
function isQuoted(value) {
|
|
268
|
+
return ((value.startsWith('"') && value.endsWith('"') && value.length >= 2) ||
|
|
269
|
+
(value.startsWith("'") && value.endsWith("'") && value.length >= 2));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* A variant the engine evaluates as a literal rather than a path
|
|
273
|
+
* (`evaluateExpression`, templates.ts): a quoted string, a boolean, or a plain
|
|
274
|
+
* number. Returns `null` for anything else.
|
|
275
|
+
*/
|
|
276
|
+
function literalValue(variant) {
|
|
277
|
+
if (isQuoted(variant))
|
|
278
|
+
return { falsy: variant.slice(1, -1) === "" };
|
|
279
|
+
// #2753 — `true` / `false` are literals, not paths. A terminal `false` is the
|
|
280
|
+
// typed-false default (`{{ steps.maybe.output.flag || false }}`), so it
|
|
281
|
+
// rescues the expression the way a terminal `''` does.
|
|
282
|
+
if (variant === "true")
|
|
283
|
+
return { falsy: false };
|
|
284
|
+
if (variant === "false")
|
|
285
|
+
return { falsy: true };
|
|
286
|
+
const asNumber = Number(variant);
|
|
287
|
+
if (!Number.isNaN(asNumber) && variant === String(asNumber)) {
|
|
288
|
+
return { falsy: !asNumber };
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
const LIVE = { live: true };
|
|
293
|
+
function classifyVariant(variant, scope) {
|
|
294
|
+
const literal = literalValue(variant);
|
|
295
|
+
if (literal) {
|
|
296
|
+
// A truthy literal short-circuits the chain; a falsy one falls through
|
|
297
|
+
// silently (it is dead, but it is not a mistake worth naming).
|
|
298
|
+
return literal.falsy ? { live: false } : { live: true, shortCircuits: true };
|
|
299
|
+
}
|
|
300
|
+
return classifyPath(variant, scope);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Classify one PATH — an expression variant, or a whole forEach source, which
|
|
304
|
+
* the engine resolves as a single path with no filter/fallback grammar at all.
|
|
305
|
+
*/
|
|
306
|
+
function classifyPath(variant, scope) {
|
|
307
|
+
const tokens = tokenizePath(variant);
|
|
308
|
+
const first = tokens[0];
|
|
309
|
+
if (!first || first.kind !== "ident")
|
|
310
|
+
return LIVE; // undecidable
|
|
311
|
+
const root = first.value;
|
|
312
|
+
// A forEach binding name is spread LAST into the iteration context
|
|
313
|
+
// (engine.ts), so it shadows every other root — including `steps` /
|
|
314
|
+
// `outputs`. Check it before anything else and never apply membership
|
|
315
|
+
// checks to a shadowed root.
|
|
316
|
+
if (scope.bindings.has(root))
|
|
317
|
+
return LIVE;
|
|
318
|
+
if (!scope.roots.has(root)) {
|
|
319
|
+
return { live: false, problem: { variant, reason: "unknown-root", name: root } };
|
|
320
|
+
}
|
|
321
|
+
if (root === "steps" || root === "outputs") {
|
|
322
|
+
const second = tokens[1];
|
|
323
|
+
// No second segment, or a dynamic bracket key — undecidable.
|
|
324
|
+
if (!second || second.kind === "bracket")
|
|
325
|
+
return LIVE;
|
|
326
|
+
const name = second.value;
|
|
327
|
+
const declared = root === "steps" ? scope.declaredIds : scope.declaredSaveAs;
|
|
328
|
+
if (!declared.has(name)) {
|
|
329
|
+
return {
|
|
330
|
+
live: false,
|
|
331
|
+
problem: {
|
|
332
|
+
variant,
|
|
333
|
+
reason: root === "steps" ? "undeclared-step-id" : "undeclared-output-name",
|
|
334
|
+
name,
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return LIVE;
|
|
340
|
+
}
|
|
341
|
+
function nameList(names) {
|
|
342
|
+
return names.size === 0 ? "(none)" : [...names].join(", ");
|
|
343
|
+
}
|
|
344
|
+
function buildMessage(expression, problems, scope,
|
|
345
|
+
/**
|
|
346
|
+
* `"expression"` — every way the expression could resolve is dead.
|
|
347
|
+
* `"fallback"` — an earlier variant can resolve, but the terminal `||`
|
|
348
|
+
* fallback cannot (#2753), so the expression fails exactly when the fallback
|
|
349
|
+
* is the thing that has to work.
|
|
350
|
+
*/
|
|
351
|
+
kind = "expression") {
|
|
352
|
+
const parts = problems.map((p) => {
|
|
353
|
+
if (p.reason === "unknown-root") {
|
|
354
|
+
return (`unknown root "${p.name}" — valid roots: ${KNOWN_TEMPLATE_ROOTS.join(", ")} ` +
|
|
355
|
+
`(also available here: ${scope.contextualLabel})`);
|
|
356
|
+
}
|
|
357
|
+
if (p.reason === "undeclared-step-id") {
|
|
358
|
+
return (`step "${p.name}" is not declared in this workflow ` +
|
|
359
|
+
`(declared step ids: ${nameList(scope.declaredIds)})`);
|
|
360
|
+
}
|
|
361
|
+
return (`no step saves output "${p.name}" ` +
|
|
362
|
+
`(declared saveAs names: ${nameList(scope.declaredSaveAs)})`);
|
|
363
|
+
});
|
|
364
|
+
const lead = kind === "fallback"
|
|
365
|
+
? `template expression {{ ${expression} }} has a fallback that can never resolve`
|
|
366
|
+
: `template expression {{ ${expression} }} can never resolve`;
|
|
367
|
+
return (`${lead}: ${parts.join("; ")}. ` +
|
|
368
|
+
`Mark the reference optional with \`| default: ''\` (or a trailing \`|| ''\`, ` +
|
|
369
|
+
`\`|| 0\`, \`|| false\`) if it is meant to be absent.`);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Lint one expression's inner text. Returns the problems that make it
|
|
373
|
+
* guaranteed-dead, or `null` when the expression can resolve.
|
|
374
|
+
*/
|
|
375
|
+
function lintExpression(expression, scope) {
|
|
376
|
+
const { path, filters } = parseFilterChain(expression);
|
|
377
|
+
// A `default` / `now` filter anywhere in the chain rescues a miss at run
|
|
378
|
+
// time (`findRescueFilterIndex`, templates.ts) — the author's documented way
|
|
379
|
+
// of saying "this reference is optional".
|
|
380
|
+
if (filters.some((f) => f.name === "default" || f.name === "now"))
|
|
381
|
+
return null;
|
|
382
|
+
const variants = path
|
|
383
|
+
.split("||")
|
|
384
|
+
.map((v) => v.trim())
|
|
385
|
+
.filter((v) => v !== "");
|
|
386
|
+
if (variants.length === 0)
|
|
387
|
+
return null;
|
|
388
|
+
// A TERMINAL falsy literal resolves the whole expression without a warning
|
|
389
|
+
// (templates.ts) — the "optional, default to empty / to false" idiom. A
|
|
390
|
+
// non-terminal one just falls through, so it rescues nothing.
|
|
391
|
+
const lastLiteral = literalValue(variants[variants.length - 1]);
|
|
392
|
+
if (lastLiteral?.falsy)
|
|
393
|
+
return null;
|
|
394
|
+
const verdicts = variants.map((variant) => classifyVariant(variant, scope));
|
|
395
|
+
// A truthy literal anywhere in the chain resolves the expression and RETURNS
|
|
396
|
+
// (templates.ts), so every variant after it is unreachable and the expression
|
|
397
|
+
// can never fail: `{{ true || inputs.typo }}` is odd, not broken. Judging its
|
|
398
|
+
// terminal variant below would be a false rejection.
|
|
399
|
+
if (verdicts.some((v) => v.shortCircuits))
|
|
400
|
+
return null;
|
|
401
|
+
const problems = verdicts.flatMap((v) => (v.problem ? [v.problem] : []));
|
|
402
|
+
// #2753 — the TERMINAL variant is the expression's rescue: the engine reaches
|
|
403
|
+
// it precisely when everything before it missed. A dead one (an unknown root,
|
|
404
|
+
// an undeclared step — `|| false` used to land here too, before it became a
|
|
405
|
+
// literal) means the expression fails exactly when the fallback was supposed
|
|
406
|
+
// to save it, so it is rejected even though an earlier variant is live.
|
|
407
|
+
const lastVerdict = verdicts[verdicts.length - 1];
|
|
408
|
+
const anyLive = verdicts.some((v) => v.live);
|
|
409
|
+
if (!lastVerdict.live && lastVerdict.problem) {
|
|
410
|
+
// With an earlier live variant, only the dead fallback is worth naming.
|
|
411
|
+
return anyLive
|
|
412
|
+
? { problems: [lastVerdict.problem], kind: "fallback" }
|
|
413
|
+
: { problems, kind: "expression" };
|
|
414
|
+
}
|
|
415
|
+
if (anyLive)
|
|
416
|
+
return null;
|
|
417
|
+
return problems.length > 0 ? { problems, kind: "expression" } : null;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Lint a forEach SOURCE, which is not an expression: `resolveForEachList`
|
|
421
|
+
* (`engine.ts`) resolves the whole string — or the inner text of a single
|
|
422
|
+
* `{{ }}` wrapper — as ONE bare path. Filters, `||` fallbacks and literals are
|
|
423
|
+
* never evaluated here (#2169 rejects those shapes outright), so applying the
|
|
424
|
+
* expression grammar would both miss dead sources (`"inputs.rows | default"`
|
|
425
|
+
* has no run-time rescue) and split a legitimate quoted key that contains
|
|
426
|
+
* `||` (`steps["a||b"].items`) into nonsense.
|
|
427
|
+
*/
|
|
428
|
+
function lintSourcePath(path, scope) {
|
|
429
|
+
const verdict = classifyPath(path, scope);
|
|
430
|
+
if (verdict.live || !verdict.problem)
|
|
431
|
+
return null;
|
|
432
|
+
return [verdict.problem];
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Lint every `{{ }}` expression in a string value, appending findings.
|
|
436
|
+
*/
|
|
437
|
+
function lintString(value, location, stepIndex, stepId, scope, findings) {
|
|
438
|
+
if (!value.includes("{{"))
|
|
439
|
+
return;
|
|
440
|
+
EXPRESSION_RE.lastIndex = 0;
|
|
441
|
+
let match;
|
|
442
|
+
while ((match = EXPRESSION_RE.exec(value)) !== null) {
|
|
443
|
+
const expression = match[1].trim();
|
|
444
|
+
if (!expression)
|
|
445
|
+
continue;
|
|
446
|
+
const verdict = lintExpression(expression, scope);
|
|
447
|
+
if (!verdict)
|
|
448
|
+
continue;
|
|
449
|
+
findings.push({
|
|
450
|
+
stepIndex,
|
|
451
|
+
stepId,
|
|
452
|
+
location,
|
|
453
|
+
expression,
|
|
454
|
+
problems: verdict.problems,
|
|
455
|
+
message: buildMessage(expression, verdict.problems, scope, verdict.kind),
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Recursively walk a templated step field. Mirrors what
|
|
461
|
+
* `renderTemplatesWithWarnings` renders: strings, arrays, plain objects —
|
|
462
|
+
* including a `collect` step's nested inner `step`, which the OUTER step's
|
|
463
|
+
* render covers (so it is scanned with the outer step's tolerated roots).
|
|
464
|
+
*/
|
|
465
|
+
function walkValue(value, location, stepIndex, stepId, scope, findings, skipKey) {
|
|
466
|
+
if (typeof value === "string") {
|
|
467
|
+
lintString(value, location, stepIndex, stepId, scope, findings);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
if (Array.isArray(value)) {
|
|
471
|
+
value.forEach((entry, i) => walkValue(entry, `${location}[${i}]`, stepIndex, stepId, scope, findings, skipKey));
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (value && typeof value === "object") {
|
|
475
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
476
|
+
if (skipKey?.(location, key))
|
|
477
|
+
continue;
|
|
478
|
+
walkValue(entry, `${location}.${key}`, stepIndex, stepId, scope, findings, skipKey);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* The forEach binding names bound into the iteration context for a step.
|
|
484
|
+
*
|
|
485
|
+
* String form: the explicit non-empty `as`, else the engine's default `item`
|
|
486
|
+
* (`resolveForEachItems`, engine.ts) — an explicit `as` REPLACES `item` rather
|
|
487
|
+
* than adding to it. Zip form: the string entries of `as[]`.
|
|
488
|
+
*/
|
|
489
|
+
function forEachBindingNames(step) {
|
|
490
|
+
const names = new Set();
|
|
491
|
+
const forEachDef = step.forEach;
|
|
492
|
+
if (forEachDef === undefined || forEachDef === null)
|
|
493
|
+
return names;
|
|
494
|
+
if (typeof forEachDef === "string") {
|
|
495
|
+
const as = step.as;
|
|
496
|
+
names.add(typeof as === "string" && as ? as : "item");
|
|
497
|
+
return names;
|
|
498
|
+
}
|
|
499
|
+
// The zip form's names live on `forEach.as` and nowhere else
|
|
500
|
+
// (`resolveForEachItems`, engine.ts, which REQUIRES that array and never
|
|
501
|
+
// reads the step-level `as`): a name written at the step level is not bound
|
|
502
|
+
// at run time, so tolerating it would accept a root that misses every
|
|
503
|
+
// iteration.
|
|
504
|
+
const as = forEachDef.as;
|
|
505
|
+
if (Array.isArray(as)) {
|
|
506
|
+
for (const entry of as)
|
|
507
|
+
if (typeof entry === "string" && entry)
|
|
508
|
+
names.add(entry);
|
|
509
|
+
}
|
|
510
|
+
return names;
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* A forEach source is a bare path, or a single `{{ }}` expression wrapping one
|
|
514
|
+
* (#2169). Return the path to lint, or `null` when the value is neither (that
|
|
515
|
+
* shape is `validateForEachSource`'s error to report, not ours).
|
|
516
|
+
*/
|
|
517
|
+
function forEachSourcePath(value) {
|
|
518
|
+
if (typeof value !== "string" || !value.trim())
|
|
519
|
+
return null;
|
|
520
|
+
if (!value.includes("{{"))
|
|
521
|
+
return value.trim();
|
|
522
|
+
const m = value.match(/^\s*{{\s*([^}]+)\s*}}\s*$/);
|
|
523
|
+
const inner = m ? m[1].trim() : "";
|
|
524
|
+
return inner || null;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Statically lint every `{{ }}` expression in a workflow's steps.
|
|
528
|
+
*
|
|
529
|
+
* Returns one finding per guaranteed-dead expression; an empty array for
|
|
530
|
+
* anything it cannot decide (including a non-array `steps`, whose shape errors
|
|
531
|
+
* belong to the surrounding validator).
|
|
532
|
+
*/
|
|
533
|
+
export function lintWorkflowStepTemplates(steps, opts) {
|
|
534
|
+
const findings = [];
|
|
535
|
+
if (!Array.isArray(steps))
|
|
536
|
+
return findings;
|
|
537
|
+
const declaredIds = new Set();
|
|
538
|
+
const declaredSaveAs = new Set();
|
|
539
|
+
for (const step of steps) {
|
|
540
|
+
if (!step || typeof step !== "object" || Array.isArray(step))
|
|
541
|
+
continue;
|
|
542
|
+
const s = step;
|
|
543
|
+
if (typeof s.id === "string" && s.id)
|
|
544
|
+
declaredIds.add(s.id);
|
|
545
|
+
if (typeof s.saveAs === "string" && s.saveAs)
|
|
546
|
+
declaredSaveAs.add(s.saveAs);
|
|
547
|
+
}
|
|
548
|
+
const knownKinds = opts?.knownKinds ?? null;
|
|
549
|
+
steps.forEach((rawStep, stepIndex) => {
|
|
550
|
+
if (!rawStep || typeof rawStep !== "object" || Array.isArray(rawStep))
|
|
551
|
+
return;
|
|
552
|
+
const step = rawStep;
|
|
553
|
+
const kind = typeof step.kind === "string" ? step.kind : null;
|
|
554
|
+
// #998 skew posture — see `TemplateLintOptions.knownKinds`.
|
|
555
|
+
if (knownKinds && kind !== null && !knownKinds.has(kind))
|
|
556
|
+
return;
|
|
557
|
+
const stepId = typeof step.id === "string" ? step.id : null;
|
|
558
|
+
const hasForEach = step.forEach !== undefined && step.forEach !== null;
|
|
559
|
+
const bindings = forEachBindingNames(step);
|
|
560
|
+
const bodyRoots = new Set([
|
|
561
|
+
...KNOWN_TEMPLATE_ROOTS,
|
|
562
|
+
...GLOBAL_CONTEXTUAL_ROOTS,
|
|
563
|
+
...(hasForEach ? ITERATION_ROOTS : []),
|
|
564
|
+
...bindings,
|
|
565
|
+
]);
|
|
566
|
+
const bodyScope = {
|
|
567
|
+
roots: bodyRoots,
|
|
568
|
+
bindings,
|
|
569
|
+
declaredIds,
|
|
570
|
+
declaredSaveAs,
|
|
571
|
+
contextualLabel: [
|
|
572
|
+
...GLOBAL_CONTEXTUAL_ROOTS,
|
|
573
|
+
...(hasForEach ? [...ITERATION_ROOTS, ...bindings] : []),
|
|
574
|
+
].join(", "),
|
|
575
|
+
};
|
|
576
|
+
// `switch` renders only the chosen `cases[*].output` / `default.output`;
|
|
577
|
+
// `cases[*].when` is CEL and never goes through the template renderer.
|
|
578
|
+
const skipKey = kind === "switch"
|
|
579
|
+
? (loc, key) => key === "when" && new RegExp(`^steps\\[${stepIndex}\\]\\.cases\\[\\d+\\]$`).test(loc)
|
|
580
|
+
: undefined;
|
|
581
|
+
for (const [key, value] of Object.entries(step)) {
|
|
582
|
+
if (NON_TEMPLATED_STEP_FIELDS.includes(key))
|
|
583
|
+
continue;
|
|
584
|
+
walkValue(value, `steps[${stepIndex}].${key}`, stepIndex, stepId, bodyScope, findings, skipKey);
|
|
585
|
+
}
|
|
586
|
+
if (!hasForEach)
|
|
587
|
+
return;
|
|
588
|
+
// The forEach SOURCE resolves against a context without the iteration
|
|
589
|
+
// roots and without the item bindings (`baseCtx`, engine.ts) — so it gets
|
|
590
|
+
// the narrower set even on a forEach step.
|
|
591
|
+
const sourceScope = {
|
|
592
|
+
roots: new Set([...KNOWN_TEMPLATE_ROOTS, ...GLOBAL_CONTEXTUAL_ROOTS]),
|
|
593
|
+
bindings: new Set(),
|
|
594
|
+
declaredIds,
|
|
595
|
+
declaredSaveAs,
|
|
596
|
+
contextualLabel: GLOBAL_CONTEXTUAL_ROOTS.join(", "),
|
|
597
|
+
};
|
|
598
|
+
const lintSource = (value, location) => {
|
|
599
|
+
const path = forEachSourcePath(value);
|
|
600
|
+
if (path === null)
|
|
601
|
+
return;
|
|
602
|
+
const problems = lintSourcePath(path, sourceScope);
|
|
603
|
+
if (!problems)
|
|
604
|
+
return;
|
|
605
|
+
findings.push({
|
|
606
|
+
stepIndex,
|
|
607
|
+
stepId,
|
|
608
|
+
location,
|
|
609
|
+
expression: path,
|
|
610
|
+
problems,
|
|
611
|
+
message: buildMessage(path, problems, sourceScope),
|
|
612
|
+
});
|
|
613
|
+
};
|
|
614
|
+
const forEachDef = step.forEach;
|
|
615
|
+
if (typeof forEachDef === "string") {
|
|
616
|
+
lintSource(forEachDef, `steps[${stepIndex}].forEach`);
|
|
617
|
+
}
|
|
618
|
+
else if (forEachDef && Array.isArray(forEachDef.zip)) {
|
|
619
|
+
forEachDef.zip.forEach((entry, k) => lintSource(entry, `steps[${stepIndex}].forEach.zip[${k}]`));
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
return findings;
|
|
623
|
+
}
|
|
624
|
+
//# sourceMappingURL=generated-template-lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-template-lint.js","sourceRoot":"","sources":["../../../src/lib/generated-template-lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ProjectConfig, type ProjectEnvironment } from "./project-config.js";
|
|
2
|
+
export interface AdoptedEnvironment {
|
|
3
|
+
name: string;
|
|
4
|
+
config: ProjectEnvironment;
|
|
5
|
+
projectConfig: ProjectConfig;
|
|
6
|
+
projectConfigPath: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolves the environment `init` adopts from the project rooted at `root`.
|
|
10
|
+
* Throws whatever the loader or the selector throws — a broken or ambiguous
|
|
11
|
+
* project config must stop the run, not be guessed around.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveAdoptedEnvironment(root: string, options?: {
|
|
14
|
+
explicitEnvName?: string | null;
|
|
15
|
+
envVarName?: string | null;
|
|
16
|
+
}): AdoptedEnvironment;
|