gagen 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +161 -8
  2. package/esm/cli.d.ts.map +1 -1
  3. package/esm/cli.js +40 -0
  4. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/build_message.d.ts.map +1 -1
  5. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/diff.d.ts.map +1 -1
  6. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/diff_str.d.ts.map +1 -1
  7. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/format.d.ts.map +1 -1
  8. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/styles.d.ts.map +1 -1
  9. package/esm/deps/jsr.io/@std/internal/{1.0.12 → 1.0.14}/types.d.ts.map +1 -1
  10. package/esm/deps/jsr.io/@std/yaml/1.1.1/_chars.d.ts.map +1 -0
  11. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_dumper_state.d.ts +2 -2
  12. package/esm/deps/jsr.io/@std/yaml/1.1.1/_dumper_state.d.ts.map +1 -0
  13. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_dumper_state.js +2 -1
  14. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_loader_state.d.ts +2 -2
  15. package/esm/deps/jsr.io/@std/yaml/1.1.1/_loader_state.d.ts.map +1 -0
  16. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_loader_state.js +41 -24
  17. package/esm/deps/jsr.io/@std/yaml/1.1.1/_schema.d.ts.map +1 -0
  18. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/binary.d.ts.map +1 -0
  19. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/bool.d.ts.map +1 -0
  20. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/float.d.ts.map +1 -0
  21. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/float.js +4 -4
  22. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/int.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/map.d.ts.map +1 -0
  24. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/merge.d.ts.map +1 -0
  25. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/nil.d.ts.map +1 -0
  26. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/omap.d.ts.map +1 -0
  27. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/pairs.d.ts.map +1 -0
  28. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/regexp.d.ts.map +1 -0
  29. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/seq.d.ts.map +1 -0
  30. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/set.d.ts.map +1 -0
  31. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/str.d.ts.map +1 -0
  32. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/timestamp.d.ts.map +1 -0
  33. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type/undefined.d.ts.map +1 -0
  34. package/esm/deps/jsr.io/@std/yaml/1.1.1/_type.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@std/yaml/1.1.1/_utils.d.ts.map +1 -0
  36. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/parse.d.ts +7 -5
  37. package/esm/deps/jsr.io/@std/yaml/1.1.1/parse.d.ts.map +1 -0
  38. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/parse.js +3 -1
  39. package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/stringify.d.ts +1 -1
  40. package/esm/deps/jsr.io/@std/yaml/1.1.1/stringify.d.ts.map +1 -0
  41. package/esm/job.d.ts.map +1 -1
  42. package/esm/job.js +201 -62
  43. package/esm/mod.d.ts +3 -3
  44. package/esm/mod.d.ts.map +1 -1
  45. package/esm/mod.js +1 -1
  46. package/esm/pin.d.ts +34 -4
  47. package/esm/pin.d.ts.map +1 -1
  48. package/esm/pin.js +124 -40
  49. package/esm/step.d.ts +48 -1
  50. package/esm/step.d.ts.map +1 -1
  51. package/esm/step.js +117 -3
  52. package/esm/workflow.d.ts.map +1 -1
  53. package/esm/workflow.js +4 -4
  54. package/package.json +1 -1
  55. package/esm/deps/jsr.io/@std/yaml/1.0.12/_chars.d.ts.map +0 -1
  56. package/esm/deps/jsr.io/@std/yaml/1.0.12/_dumper_state.d.ts.map +0 -1
  57. package/esm/deps/jsr.io/@std/yaml/1.0.12/_loader_state.d.ts.map +0 -1
  58. package/esm/deps/jsr.io/@std/yaml/1.0.12/_schema.d.ts.map +0 -1
  59. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/binary.d.ts.map +0 -1
  60. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/bool.d.ts.map +0 -1
  61. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/float.d.ts.map +0 -1
  62. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/int.d.ts.map +0 -1
  63. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/map.d.ts.map +0 -1
  64. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/merge.d.ts.map +0 -1
  65. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/nil.d.ts.map +0 -1
  66. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/omap.d.ts.map +0 -1
  67. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/pairs.d.ts.map +0 -1
  68. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/regexp.d.ts.map +0 -1
  69. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/seq.d.ts.map +0 -1
  70. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/set.d.ts.map +0 -1
  71. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/str.d.ts.map +0 -1
  72. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/timestamp.d.ts.map +0 -1
  73. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type/undefined.d.ts.map +0 -1
  74. package/esm/deps/jsr.io/@std/yaml/1.0.12/_type.d.ts.map +0 -1
  75. package/esm/deps/jsr.io/@std/yaml/1.0.12/_utils.d.ts.map +0 -1
  76. package/esm/deps/jsr.io/@std/yaml/1.0.12/parse.d.ts.map +0 -1
  77. package/esm/deps/jsr.io/@std/yaml/1.0.12/stringify.d.ts.map +0 -1
  78. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_chars.d.ts +0 -0
  79. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_chars.js +0 -0
  80. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_schema.d.ts +0 -0
  81. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_schema.js +0 -0
  82. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/binary.d.ts +0 -0
  83. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/binary.js +0 -0
  84. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/bool.d.ts +0 -0
  85. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/bool.js +0 -0
  86. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/float.d.ts +0 -0
  87. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/int.d.ts +0 -0
  88. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/int.js +0 -0
  89. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/map.d.ts +0 -0
  90. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/map.js +0 -0
  91. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/merge.d.ts +0 -0
  92. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/merge.js +0 -0
  93. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/nil.d.ts +0 -0
  94. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/nil.js +0 -0
  95. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/omap.d.ts +0 -0
  96. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/omap.js +0 -0
  97. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/pairs.d.ts +0 -0
  98. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/pairs.js +0 -0
  99. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/regexp.d.ts +0 -0
  100. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/regexp.js +0 -0
  101. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/seq.d.ts +0 -0
  102. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/seq.js +0 -0
  103. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/set.d.ts +0 -0
  104. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/set.js +0 -0
  105. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/str.d.ts +0 -0
  106. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/str.js +0 -0
  107. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/timestamp.d.ts +0 -0
  108. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/timestamp.js +0 -0
  109. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/undefined.d.ts +0 -0
  110. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type/undefined.js +0 -0
  111. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type.d.ts +0 -0
  112. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_type.js +0 -0
  113. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_utils.d.ts +0 -0
  114. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/_utils.js +0 -0
  115. /package/esm/deps/jsr.io/@std/yaml/{1.0.12 → 1.1.1}/stringify.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_type.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/yaml/1.1.1/_type.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzD;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,GACT,QAAQ,GACR,OAAO,GACP,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC;AAEvE;;GAEG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,GAAG,GAAG;IAC/C,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB;IACnB,IAAI,EAAE,CAAC,CAAC;IACR,uCAAuC;IACvC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC;IACzC,oDAAoD;IACpD,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,oDAAoD;IACpD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gFAAgF;IAEhF,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;IAChC,4DAA4D;IAE5D,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;CAC7B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/yaml/1.1.1/_utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,MAAM,CAE/D"}
@@ -16,10 +16,10 @@ export interface ParseOptions {
16
16
  */
17
17
  allowDuplicateKeys?: boolean;
18
18
  /**
19
- * If defined, a function to call on warning messages taking an
20
- * {@linkcode Error} as its only argument.
19
+ * If defined, a function to call on warning messages taking a
20
+ * {@linkcode SyntaxError} as its only argument.
21
21
  */
22
- onWarning?(error: Error): void;
22
+ onWarning?(error: SyntaxError): void;
23
23
  }
24
24
  /**
25
25
  * Parse and return a YAML string as a parsed YAML document object.
@@ -39,7 +39,8 @@ export interface ParseOptions {
39
39
  * assertEquals(data, { id: 1, name: "Alice" });
40
40
  * ```
41
41
  *
42
- * @throws {SyntaxError} Throws error on invalid YAML.
42
+ * @throws {SyntaxError} Throws if the YAML is invalid or contains more than
43
+ * one document.
43
44
  * @param content YAML string to parse.
44
45
  * @param options Parsing options.
45
46
  * @returns Parsed document.
@@ -68,9 +69,10 @@ export declare function parse(content: string, options?: ParseOptions): unknown;
68
69
  * assertEquals(data, [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Eve" }]);
69
70
  * ```
70
71
  *
72
+ * @throws {SyntaxError} Throws if the YAML is invalid.
71
73
  * @param content YAML string to parse.
72
74
  * @param options Parsing options.
73
75
  * @returns Array of parsed documents.
74
76
  */
75
- export declare function parseAll(content: string, options?: ParseOptions): unknown;
77
+ export declare function parseAll(content: string, options?: ParseOptions): unknown[];
76
78
  //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/yaml/1.1.1/parse.ts"],"names":[],"mappings":"AAQA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAgBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAcT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,EAAE,CAOX"}
@@ -36,7 +36,8 @@ function sanitizeInput(input) {
36
36
  * assertEquals(data, { id: 1, name: "Alice" });
37
37
  * ```
38
38
  *
39
- * @throws {SyntaxError} Throws error on invalid YAML.
39
+ * @throws {SyntaxError} Throws if the YAML is invalid or contains more than
40
+ * one document.
40
41
  * @param content YAML string to parse.
41
42
  * @param options Parsing options.
42
43
  * @returns Parsed document.
@@ -77,6 +78,7 @@ export function parse(content, options = {}) {
77
78
  * assertEquals(data, [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Eve" }]);
78
79
  * ```
79
80
  *
81
+ * @throws {SyntaxError} Throws if the YAML is invalid.
80
82
  * @param content YAML string to parse.
81
83
  * @param options Parsing options.
82
84
  * @returns Array of parsed documents.
@@ -46,7 +46,7 @@ export type StringifyOptions = {
46
46
  *
47
47
  * @default {false}
48
48
  */
49
- sortKeys?: boolean | ((a: string, b: string) => number);
49
+ sortKeys?: boolean | ((a: string, b: string, depth: number) => number);
50
50
  /**
51
51
  * Set max line width.
52
52
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/yaml/1.1.1/stringify.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAEzC,yCAAyC;AACzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvE;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAMR"}
package/esm/job.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../src/job.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../src/job.ts"],"names":[],"mappings":"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"}
package/esm/job.js CHANGED
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _Job_instances, _Job_id, _Job_config, _Job_leafItems, _Job_outputDefs, _Job_cachedGraph, _Job_cachedLeafSteps, _Job_buildGraph;
12
+ var _Job_instances, _Job_id, _Job_config, _Job_leafItems, _Job_outputDefs, _Job_cachedGraph, _Job_cachedLeafSteps, _Job_cachedMembership, _Job_buildGraph, _Job_resolveUnits;
13
13
  import { Condition, ExpressionValue, isAlwaysFalse, isAlwaysTrue, } from "./expression.js";
14
14
  import { Matrix } from "./matrix.js";
15
15
  import { normalizeStepLike, serializeConditionLike, serializeConfigValues, Step, StepRef, toCondition, unwrapSteps, } from "./step.js";
@@ -59,27 +59,61 @@ function combineAndConditions(a, b) {
59
59
  return a ?? b;
60
60
  }
61
61
  /**
62
- * Returns a step's config.if as a ConditionLike suitable for passing down
63
- * to dependencies, or undefined if it references step outputs (which would
64
- * create circular condition dependencies).
62
+ * Returns a condition suitable for passing down to dependencies, or undefined
63
+ * if it references step outputs (which would create circular condition
64
+ * dependencies a dependency cannot be gated on an output produced by a step
65
+ * that runs after it).
65
66
  */
66
- function propagatableConfigIf(step) {
67
- const configIf = step.config.if;
68
- if (configIf == null)
67
+ function propagatableCondition(condition) {
68
+ if (condition == null)
69
69
  return undefined;
70
- if (configIf instanceof Condition) {
71
- for (const source of configIf.sources) {
70
+ if (condition instanceof Condition) {
71
+ for (const source of condition.sources) {
72
72
  if (source instanceof Step)
73
73
  return undefined;
74
74
  }
75
75
  }
76
- if (configIf instanceof ExpressionValue) {
77
- for (const source of configIf.allSources) {
76
+ if (condition instanceof ExpressionValue) {
77
+ for (const source of condition.allSources) {
78
78
  if (source instanceof Step)
79
79
  return undefined;
80
80
  }
81
81
  }
82
- return configIf;
82
+ return condition;
83
+ }
84
+ /** Returns a step's config.if if it is safe to propagate to dependencies. */
85
+ function propagatableConfigIf(step) {
86
+ return propagatableCondition(step.config.if);
87
+ }
88
+ function recordMember(membership, group, step) {
89
+ const c = step.config;
90
+ if (c.background || c.wait != null || c.waitAll || c.cancel != null) {
91
+ // a parallel block already runs each member as a background step with an
92
+ // implicit wait-all, so background/wait/wait-all/cancel members make no sense
93
+ throw new Error("A parallel group member cannot be a background, wait, wait-all, or " +
94
+ "cancel step.");
95
+ }
96
+ if (membership.memberToGroup.has(step))
97
+ return;
98
+ membership.memberToGroup.set(step, group);
99
+ let members = membership.groupMembers.get(group);
100
+ if (!members) {
101
+ members = [];
102
+ membership.groupMembers.set(group, members);
103
+ }
104
+ members.push(step);
105
+ }
106
+ /**
107
+ * Rejects a composite step used directly as a parallel group member. Members
108
+ * run concurrently with no ordering, so a member cannot itself be a nested
109
+ * parallel group or a sequential group of steps.
110
+ */
111
+ function throwInvalidParallelMember(composite) {
112
+ if (composite.kind === "parallel") {
113
+ throw new Error("Parallel groups cannot be nested.");
114
+ }
115
+ throw new Error("A parallel group member cannot itself be a group of steps — " +
116
+ "each member must be a single step.");
83
117
  }
84
118
  /**
85
119
  * Recursively flattens a StepLike tree into a flat graph of Steps with
@@ -93,22 +127,28 @@ function propagatableConfigIf(step) {
93
127
  * collected in `deferredAfterDeps` and resolved later, so that comesAfter
94
128
  * only adds ordering edges for steps already present in the graph.
95
129
  */
96
- function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, contextCondition) {
130
+ function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, membership, contextCondition, parallelGroup) {
97
131
  const item = normalizeStepLike(rawItem);
98
132
  if (item instanceof StepRef) {
99
133
  const step = item.step;
100
134
  // AND this StepRef's condition with the parent context
101
135
  const newContext = combineAndConditions(contextCondition, item.condition);
102
136
  if (step.children.length > 0) {
103
- // StepRef wrapping composite step: recurse with combined context
137
+ // StepRef wrapping composite step: recurse with combined context.
138
+ // a parallel composite makes its children concurrent members.
139
+ if (parallelGroup != null)
140
+ throwInvalidParallelMember(step);
141
+ const childGroup = step.kind === "parallel" ? step : parallelGroup;
104
142
  const contributed = [];
105
143
  for (const child of step.children) {
106
- contributed.push(...flattenStepLike(child, graph, isLeaf, leafSteps, deferredAfterDeps, newContext));
144
+ contributed.push(...flattenStepLike(child, graph, isLeaf, leafSteps, deferredAfterDeps, membership, newContext, childGroup));
107
145
  }
108
- // compute aggregate dep context: newContext AND (OR of children's
146
+ // compute aggregate dep context: context AND (OR of children's
109
147
  // config.ifs). If any child is unconditional, or the OR is a tautology,
110
- // just use newContext.
111
- let compositeDepsCtx = newContext;
148
+ // just use the context. The context is filtered so an output-referencing
149
+ // condition doesn't propagate to dependencies (circular dependency).
150
+ const depBaseCtx = propagatableCondition(newContext);
151
+ let compositeDepsCtx = depBaseCtx;
112
152
  if (item.dependencies.length > 0) {
113
153
  const childIfs = [];
114
154
  let allConditional = true;
@@ -123,13 +163,14 @@ function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, c
123
163
  if (allConditional && childIfs.length > 0) {
124
164
  const orCond = simplifyOrConditions(childIfs.map((c) => toCondition(c)));
125
165
  if (orCond != null) {
126
- compositeDepsCtx = combineAndConditions(newContext, orCond);
166
+ compositeDepsCtx = combineAndConditions(depBaseCtx, orCond);
127
167
  }
128
168
  }
129
169
  }
130
- // apply deps once with aggregate context, add to all children's dep sets
170
+ // apply deps once with aggregate context, add to all children's dep sets.
171
+ // deps are not group members — they are hoisted to run before the group.
131
172
  for (const dep of item.dependencies) {
132
- const depSteps = flattenStepLike(dep, graph, false, [], deferredAfterDeps, compositeDepsCtx);
173
+ const depSteps = flattenStepLike(dep, graph, false, [], deferredAfterDeps, membership, compositeDepsCtx);
133
174
  for (const s of contributed) {
134
175
  const entry = graph.get(s);
135
176
  for (const ds of depSteps)
@@ -147,11 +188,15 @@ function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, c
147
188
  const entry = ensureEntry(graph, step);
148
189
  if (isLeaf)
149
190
  leafSteps.push(step);
191
+ if (parallelGroup)
192
+ recordMember(membership, parallelGroup, step);
150
193
  applyContextCondition(entry, newContext);
151
- // include step's config.if in the dep context
152
- const depContext = combineAndConditions(newContext, propagatableConfigIf(step));
194
+ // include step's config.if in the dep context. both the context and the
195
+ // config.if are filtered so output-referencing conditions don't propagate
196
+ // to dependencies (which would create a circular condition dependency).
197
+ const depContext = combineAndConditions(propagatableCondition(newContext), propagatableConfigIf(step));
153
198
  for (const dep of item.dependencies) {
154
- flattenDep(dep, entry.deps, graph, deferredAfterDeps, depContext);
199
+ flattenDep(dep, entry.deps, graph, deferredAfterDeps, membership, depContext);
155
200
  }
156
201
  for (const dep of item.afterDependencies) {
157
202
  deferredAfterDeps.push({ step, target: dep });
@@ -160,10 +205,14 @@ function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, c
160
205
  }
161
206
  // Step (leaf or composite)
162
207
  if (item.children.length > 0) {
163
- // composite step: recurse into children with same context
208
+ // composite step: recurse into children with same context.
209
+ // a parallel composite makes its children concurrent members.
210
+ if (parallelGroup != null)
211
+ throwInvalidParallelMember(item);
212
+ const childGroup = item.kind === "parallel" ? item : parallelGroup;
164
213
  const contributed = [];
165
214
  for (const child of item.children) {
166
- contributed.push(...flattenStepLike(child, graph, isLeaf, leafSteps, deferredAfterDeps, contextCondition));
215
+ contributed.push(...flattenStepLike(child, graph, isLeaf, leafSteps, deferredAfterDeps, membership, contextCondition, childGroup));
167
216
  }
168
217
  return contributed;
169
218
  }
@@ -171,12 +220,14 @@ function flattenStepLike(rawItem, graph, isLeaf, leafSteps, deferredAfterDeps, c
171
220
  const entry = ensureEntry(graph, item);
172
221
  if (isLeaf)
173
222
  leafSteps.push(item);
223
+ if (parallelGroup)
224
+ recordMember(membership, parallelGroup, item);
174
225
  applyContextCondition(entry, contextCondition);
175
226
  return [item];
176
227
  }
177
228
  /** Flattens a dependency target into the graph and adds it to a dep set. */
178
- function flattenDep(dep, targetSet, graph, deferredAfterDeps, contextCondition) {
179
- const steps = flattenStepLike(dep, graph, false, [], deferredAfterDeps, contextCondition);
229
+ function flattenDep(dep, targetSet, graph, deferredAfterDeps, membership, contextCondition) {
230
+ const steps = flattenStepLike(dep, graph, false, [], deferredAfterDeps, membership, contextCondition);
180
231
  for (const s of steps) {
181
232
  targetSet.add(s);
182
233
  }
@@ -225,6 +276,7 @@ export class Job {
225
276
  // cached graph — built lazily
226
277
  _Job_cachedGraph.set(this, void 0);
227
278
  _Job_cachedLeafSteps.set(this, void 0);
279
+ _Job_cachedMembership.set(this, void 0);
228
280
  __classPrivateFieldSet(this, _Job_id, id, "f");
229
281
  __classPrivateFieldSet(this, _Job_config, config, "f");
230
282
  if (init?.steps) {
@@ -245,29 +297,8 @@ export class Job {
245
297
  }
246
298
  resolveSteps() {
247
299
  const { graph, leafSteps } = __classPrivateFieldGet(this, _Job_instances, "m", _Job_buildGraph).call(this);
248
- const allSteps = new Set(graph.keys());
249
- // compute priority: each step gets the minimum leaf index of any
250
- // leaf step that transitively depends on it (directly or via
251
- // condition sources). This makes the topo sort respect steps order.
252
- const priority = new Map();
253
- const assignPriority = (s, p) => {
254
- const current = priority.get(s);
255
- if (current !== undefined && current <= p)
256
- return;
257
- priority.set(s, p);
258
- const entry = graph.get(s);
259
- if (!entry)
260
- return;
261
- for (const dep of entry.deps) {
262
- if (allSteps.has(dep)) {
263
- assignPriority(dep, p);
264
- }
265
- }
266
- };
267
- for (let i = 0; i < leafSteps.length; i++) {
268
- assignPriority(leafSteps[i], i);
269
- }
270
- return topoSort(allSteps, priority, graph);
300
+ const priority = computePriorities(graph, leafSteps);
301
+ return topoSort(new Set(graph.keys()), priority, graph);
271
302
  }
272
303
  inferNeeds(stepOwners) {
273
304
  const config = __classPrivateFieldGet(this, _Job_config, "f");
@@ -438,26 +469,49 @@ export class Job {
438
469
  }
439
470
  // steps
440
471
  const { graph } = __classPrivateFieldGet(this, _Job_instances, "m", _Job_buildGraph).call(this);
441
- const resolvedSteps = this.resolveSteps();
442
- const effectiveConditions = computeEffectiveConditions(resolvedSteps, graph);
443
- result.steps = resolvedSteps
444
- .filter((s) => {
472
+ const units = __classPrivateFieldGet(this, _Job_instances, "m", _Job_resolveUnits).call(this);
473
+ const effectiveConditions = computeEffectiveConditions(units.flatMap((u) => u.steps), graph);
474
+ const isVisible = (s) => {
445
475
  const cond = effectiveConditions.get(s);
446
476
  return cond == null || !isAlwaysFalse(cond);
447
- })
448
- .map((s) => s.toYaml(effectiveConditions.get(s)));
477
+ };
478
+ const serialize = (s) => s.toYaml(effectiveConditions.get(s));
479
+ const steps = [];
480
+ for (const unit of units) {
481
+ const visible = unit.steps.filter(isVisible);
482
+ if (visible.length === 0)
483
+ continue;
484
+ // a parallel block only makes sense with more than one step; collapse a
485
+ // single remaining step back to a normal sequential step
486
+ if (unit.parallel && visible.length > 1) {
487
+ steps.push({ parallel: visible.map(serialize) });
488
+ }
489
+ else {
490
+ for (const s of visible)
491
+ steps.push(serialize(s));
492
+ }
493
+ }
494
+ result.steps = steps;
449
495
  return result;
450
496
  }
451
497
  }
452
- _Job_id = new WeakMap(), _Job_config = new WeakMap(), _Job_leafItems = new WeakMap(), _Job_outputDefs = new WeakMap(), _Job_cachedGraph = new WeakMap(), _Job_cachedLeafSteps = new WeakMap(), _Job_instances = new WeakSet(), _Job_buildGraph = function _Job_buildGraph() {
453
- if (__classPrivateFieldGet(this, _Job_cachedGraph, "f") && __classPrivateFieldGet(this, _Job_cachedLeafSteps, "f")) {
454
- return { graph: __classPrivateFieldGet(this, _Job_cachedGraph, "f"), leafSteps: __classPrivateFieldGet(this, _Job_cachedLeafSteps, "f") };
498
+ _Job_id = new WeakMap(), _Job_config = new WeakMap(), _Job_leafItems = new WeakMap(), _Job_outputDefs = new WeakMap(), _Job_cachedGraph = new WeakMap(), _Job_cachedLeafSteps = new WeakMap(), _Job_cachedMembership = new WeakMap(), _Job_instances = new WeakSet(), _Job_buildGraph = function _Job_buildGraph() {
499
+ if (__classPrivateFieldGet(this, _Job_cachedGraph, "f") && __classPrivateFieldGet(this, _Job_cachedLeafSteps, "f") && __classPrivateFieldGet(this, _Job_cachedMembership, "f")) {
500
+ return {
501
+ graph: __classPrivateFieldGet(this, _Job_cachedGraph, "f"),
502
+ leafSteps: __classPrivateFieldGet(this, _Job_cachedLeafSteps, "f"),
503
+ membership: __classPrivateFieldGet(this, _Job_cachedMembership, "f"),
504
+ };
455
505
  }
456
506
  const graph = new Map();
457
507
  const leafSteps = [];
458
508
  const deferredAfterDeps = [];
509
+ const membership = {
510
+ memberToGroup: new Map(),
511
+ groupMembers: new Map(),
512
+ };
459
513
  for (const item of __classPrivateFieldGet(this, _Job_leafItems, "f")) {
460
- flattenStepLike(item, graph, true, leafSteps, deferredAfterDeps);
514
+ flattenStepLike(item, graph, true, leafSteps, deferredAfterDeps, membership);
461
515
  }
462
516
  addConditionSourceDeps(graph);
463
517
  // resolve deferred after-deps: only add ordering edges for steps
@@ -471,7 +525,65 @@ _Job_id = new WeakMap(), _Job_config = new WeakMap(), _Job_leafItems = new WeakM
471
525
  }
472
526
  __classPrivateFieldSet(this, _Job_cachedGraph, graph, "f");
473
527
  __classPrivateFieldSet(this, _Job_cachedLeafSteps, leafSteps, "f");
474
- return { graph, leafSteps };
528
+ __classPrivateFieldSet(this, _Job_cachedMembership, membership, "f");
529
+ return { graph, leafSteps, membership };
530
+ }, _Job_resolveUnits = function _Job_resolveUnits() {
531
+ const { graph, leafSteps, membership } = __classPrivateFieldGet(this, _Job_instances, "m", _Job_buildGraph).call(this);
532
+ const { memberToGroup, groupMembers } = membership;
533
+ const priority = computePriorities(graph, leafSteps);
534
+ // representative node of a step: its parallel group, or the step itself
535
+ const repOf = (s) => memberToGroup.get(s) ?? s;
536
+ // build a contracted graph with one node per group + each free step
537
+ const nodes = new Set();
538
+ for (const s of graph.keys())
539
+ nodes.add(repOf(s));
540
+ const contracted = new Map();
541
+ for (const node of nodes) {
542
+ contracted.set(node, {
543
+ deps: new Set(),
544
+ afterDeps: new Set(),
545
+ contexts: [],
546
+ });
547
+ }
548
+ for (const [s, entry] of graph) {
549
+ const from = repOf(s);
550
+ const cEntry = contracted.get(from);
551
+ for (const dep of entry.deps) {
552
+ const to = repOf(dep);
553
+ if (to === from) {
554
+ if (s !== dep) {
555
+ throw new Error(`Steps in a parallel group cannot depend on each other: ${stepLabel(dep)} → ${stepLabel(s)}`);
556
+ }
557
+ continue;
558
+ }
559
+ cEntry.deps.add(to);
560
+ }
561
+ for (const dep of entry.afterDeps) {
562
+ const to = repOf(dep);
563
+ if (to === from) {
564
+ if (s !== dep) {
565
+ throw new Error(`Steps in a parallel group cannot be ordered after each other: ${stepLabel(dep)} → ${stepLabel(s)}`);
566
+ }
567
+ continue;
568
+ }
569
+ cEntry.afterDeps.add(to);
570
+ }
571
+ }
572
+ // contracted priority = best (minimum) priority among the node's members
573
+ const contractedPriority = new Map();
574
+ for (const [s, p] of priority) {
575
+ const node = repOf(s);
576
+ const current = contractedPriority.get(node);
577
+ if (current === undefined || p < current) {
578
+ contractedPriority.set(node, p);
579
+ }
580
+ }
581
+ return topoSort(nodes, contractedPriority, contracted).map((node) => {
582
+ const members = groupMembers.get(node);
583
+ return members
584
+ ? { parallel: true, steps: members }
585
+ : { parallel: false, steps: [node] };
586
+ });
475
587
  };
476
588
  // --- effective conditions ---
477
589
  /**
@@ -751,6 +863,33 @@ function extractCommonFactors(terms) {
751
863
  return result;
752
864
  }
753
865
  // --- topological sort ---
866
+ /**
867
+ * Computes step priorities: each step gets the minimum leaf index of any leaf
868
+ * step that transitively depends on it (directly or via condition sources).
869
+ * This makes the topological sort respect the declared `steps` order.
870
+ */
871
+ function computePriorities(graph, leafSteps) {
872
+ const allSteps = new Set(graph.keys());
873
+ const priority = new Map();
874
+ const assignPriority = (s, p) => {
875
+ const current = priority.get(s);
876
+ if (current !== undefined && current <= p)
877
+ return;
878
+ priority.set(s, p);
879
+ const entry = graph.get(s);
880
+ if (!entry)
881
+ return;
882
+ for (const dep of entry.deps) {
883
+ if (allSteps.has(dep)) {
884
+ assignPriority(dep, p);
885
+ }
886
+ }
887
+ };
888
+ for (let i = 0; i < leafSteps.length; i++) {
889
+ assignPriority(leafSteps[i], i);
890
+ }
891
+ return priority;
892
+ }
754
893
  function topoSort(steps, priority, graph) {
755
894
  // build in-degree map (only counting unique predecessors within our set)
756
895
  const inDegree = new Map();
package/esm/mod.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import "./_dnt.polyfills.js";
2
2
  export { Step, step, StepRef } from "./step.js";
3
- export type { ConditionLike, ConfigValue, StepBuilder, StepConfig, StepFunction, StepLike, } from "./step.js";
3
+ export type { CompositeKind, ConditionLike, ConfigValue, StepBuilder, StepConfig, StepFunction, StepLike, } from "./step.js";
4
4
  export { Job, job } from "./job.js";
5
5
  export type { JobConfig, JobDef, ReusableJobConfig, ReusableJobDef, RunsOn, ServiceContainer, StepsJobConfig, StepsJobDef, } from "./job.js";
6
6
  export { isLinting, Workflow, workflow } from "./workflow.js";
7
7
  export type { WorkflowCallInput, WorkflowCallOutput, WorkflowCallSecret, WorkflowCallTrigger, WorkflowConfig, WorkflowTriggers, } from "./workflow.js";
8
8
  export { concat, Condition, conditions, defineExprObj, ElseIfBuilder, expr, ExpressionValue, fromJSON, hashFiles, join, literal, ThenBuilder, toJSON, } from "./expression.js";
9
9
  export type { ComparisonOp, ConcatPart, ExpressionSource, ExprMap, ExprOf, TernaryValue, } from "./expression.js";
10
- export { formatPinComments, parsePinComments, pinYamlContent, resolveRef, unpinParsedYaml, } from "./pin.js";
11
- export type { PinEntry, RefResolver } from "./pin.js";
10
+ export { collectActionVersions, parsePinComments, pinYamlContent, pullVersionsInSource, resolveRef, unpinParsedYaml, } from "./pin.js";
11
+ export type { PinEntry, RefResolver, VersionChange } from "./pin.js";
12
12
  export { defineMatrix, Matrix } from "./matrix.js";
13
13
  export type { PermissionLevel, Permissions, PermissionScope, } from "./permissions.js";
14
14
  export { Artifact, artifact } from "./artifact.js";
package/esm/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,YAAY,EACV,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,MAAM,EACN,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,IAAI,EACJ,eAAe,EACf,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,WAAW,EACX,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,MAAM,EACN,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACV,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,0CAA0C;AAC1C,eAAO,MAAM,cAAc,EAAE,OAAO,SAAqB,CAAC;AAC1D,0CAA0C;AAC1C,eAAO,MAAM,cAAc,EAAE,OAAO,SAAqB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,YAAY,EACV,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,MAAM,EACN,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,IAAI,EACJ,eAAe,EACf,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,WAAW,EACX,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,MAAM,EACN,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACV,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,0CAA0C;AAC1C,eAAO,MAAM,cAAc,EAAE,OAAO,SAAqB,CAAC;AAC1D,0CAA0C;AAC1C,eAAO,MAAM,cAAc,EAAE,OAAO,SAAqB,CAAC"}
package/esm/mod.js CHANGED
@@ -3,7 +3,7 @@ export { Step, step, StepRef } from "./step.js";
3
3
  export { Job, job } from "./job.js";
4
4
  export { isLinting, Workflow, workflow } from "./workflow.js";
5
5
  export { concat, Condition, conditions, defineExprObj, ElseIfBuilder, expr, ExpressionValue, fromJSON, hashFiles, join, literal, ThenBuilder, toJSON, } from "./expression.js";
6
- export { formatPinComments, parsePinComments, pinYamlContent, resolveRef, unpinParsedYaml, } from "./pin.js";
6
+ export { collectActionVersions, parsePinComments, pinYamlContent, pullVersionsInSource, resolveRef, unpinParsedYaml, } from "./pin.js";
7
7
  export { defineMatrix, Matrix } from "./matrix.js";
8
8
  export { Artifact, artifact } from "./artifact.js";
9
9
  // deprecated re-exports
package/esm/pin.d.ts CHANGED
@@ -13,15 +13,45 @@ export declare function parseActionUses(uses: string): {
13
13
  } | undefined;
14
14
  export declare function resolveRef(owner: string, repo: string, ref: string): string;
15
15
  export type RefResolver = (owner: string, repo: string, ref: string) => string;
16
- /** Resolves non-SHA refs in YAML content to commit hashes. */
16
+ /**
17
+ * Resolves non-SHA refs in YAML content to commit hashes, writing the
18
+ * original ref as an inline comment after the pinned `uses:` value.
19
+ */
17
20
  export declare function pinYamlContent(yamlStr: string, resolve?: RefResolver, cache?: readonly PinEntry[]): {
18
21
  content: string;
19
22
  pins: PinEntry[];
20
23
  };
21
- /** Formats pin entries as comments to append to the file. */
22
- export declare function formatPinComments(pins: PinEntry[]): string;
23
- /** Extracts pin entries from file content. */
24
+ /**
25
+ * Extracts pin entries from file content. Reads the current inline format
26
+ * (`uses: owner/repo@HASH # ref`) and, for backwards compatibility, the
27
+ * legacy footer format (`# gagen:pin owner/repo@ref = HASH`).
28
+ */
24
29
  export declare function parsePinComments(content: string): PinEntry[];
30
+ /**
31
+ * Collects the pinned version for each action across a set of generated
32
+ * YAML files. If an action appears in multiple files with different
33
+ * versions, it is returned as a conflict instead — conflicts must be
34
+ * resolved manually since there is no single correct target version.
35
+ */
36
+ export declare function collectActionVersions(yamlContents: readonly string[]): {
37
+ versions: Map<string, string>;
38
+ conflicts: Map<string, string[]>;
39
+ };
40
+ export interface VersionChange {
41
+ action: string;
42
+ from: string;
43
+ to: string;
44
+ }
45
+ /**
46
+ * Rewrites literal `"owner/repo@<ref>"` (or single-quoted) strings in
47
+ * source code to use the target version from the given map. Only matches
48
+ * literals with a single owner/repo[/path]@ref shape; variables, template
49
+ * substitutions, and non-string forms are left alone.
50
+ */
51
+ export declare function pullVersionsInSource(source: string, versions: ReadonlyMap<string, string>): {
52
+ content: string;
53
+ changes: VersionChange[];
54
+ };
25
55
  /**
26
56
  * Replaces pinned hashes in a parsed YAML object with their original
27
57
  * tag/branch refs using the provided pin mapping.
package/esm/pin.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcxE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,CA2BR;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,KACR,MAAM,CAAC;AAEZ,8DAA8D;AAC9D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAwB,EACjC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC1B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,CAkDvC;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAO1D;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,QAAQ,EAAE,GACf,OAAO,CA8CT"}
1
+ {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcxE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,CA2BR;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,KACR,MAAM,CAAC;AAEZ;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAwB,EACjC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC1B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,CA+DvC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAqB5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B;IACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC,CA2BA;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAY/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,QAAQ,EAAE,GACf,OAAO,CAsCT"}