ts2workflows 0.11.0 → 0.13.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 (50) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +17 -7
  3. package/dist/ast/expressions.d.ts +37 -41
  4. package/dist/ast/expressions.d.ts.map +1 -1
  5. package/dist/ast/expressions.js +124 -255
  6. package/dist/ast/statements.d.ts +132 -0
  7. package/dist/ast/statements.d.ts.map +1 -0
  8. package/dist/ast/statements.js +197 -0
  9. package/dist/ast/steps.d.ts +82 -194
  10. package/dist/ast/steps.d.ts.map +1 -1
  11. package/dist/ast/steps.js +862 -523
  12. package/dist/ast/workflows.d.ts +14 -7
  13. package/dist/ast/workflows.d.ts.map +1 -1
  14. package/dist/ast/workflows.js +19 -10
  15. package/dist/cli.js +45 -32
  16. package/dist/errors.d.ts +4 -0
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/errors.js +7 -0
  19. package/dist/transpiler/index.d.ts +14 -1
  20. package/dist/transpiler/index.d.ts.map +1 -1
  21. package/dist/transpiler/index.js +150 -31
  22. package/dist/transpiler/linker.d.ts +3 -0
  23. package/dist/transpiler/linker.d.ts.map +1 -0
  24. package/dist/transpiler/linker.js +45 -0
  25. package/dist/transpiler/parseexpressions.d.ts +11 -0
  26. package/dist/transpiler/parseexpressions.d.ts.map +1 -0
  27. package/dist/transpiler/{expressions.js → parseexpressions.js} +90 -103
  28. package/dist/transpiler/parsestatement.d.ts +7 -0
  29. package/dist/transpiler/parsestatement.d.ts.map +1 -0
  30. package/dist/transpiler/parsestatement.js +862 -0
  31. package/dist/transpiler/stepnames.d.ts +3 -0
  32. package/dist/transpiler/stepnames.d.ts.map +1 -0
  33. package/dist/transpiler/stepnames.js +17 -0
  34. package/dist/transpiler/transformations.d.ts +3 -19
  35. package/dist/transpiler/transformations.d.ts.map +1 -1
  36. package/dist/transpiler/transformations.js +267 -322
  37. package/language_reference.md +8 -2
  38. package/package.json +13 -7
  39. package/types/workflowslib.d.ts +26 -13
  40. package/dist/ast/stepnames.d.ts +0 -9
  41. package/dist/ast/stepnames.d.ts.map +0 -1
  42. package/dist/ast/stepnames.js +0 -280
  43. package/dist/transpiler/expressions.d.ts +0 -11
  44. package/dist/transpiler/expressions.d.ts.map +0 -1
  45. package/dist/transpiler/statements.d.ts +0 -10
  46. package/dist/transpiler/statements.d.ts.map +0 -1
  47. package/dist/transpiler/statements.js +0 -1098
  48. package/dist/utils.d.ts +0 -2
  49. package/dist/utils.d.ts.map +0 -1
  50. package/dist/utils.js +0 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1,117 @@
1
+ # ts2workflows changelog
2
+
3
+ ## Version 0.13.0 - 2025-10-12
4
+
5
+ Fixes:
6
+
7
+ - function identifiers (e.g. in call_step and parallel) are included in the `--link` output
8
+ - Improve type annotations of map.\* functions
9
+
10
+ ## Version 0.12.0 - 2025-08-30
11
+
12
+ New features:
13
+
14
+ - New command line option `--link` generates self-contained YAML files (all needed subworkflows in one file)
15
+ - Accepts Typescript's `satisfies` expression and `debugger` statement. They do not affect the YAML output.
16
+
17
+ Fixes:
18
+
19
+ - Empty body in an `if` statements generated invalid code
20
+ - In certain cases nested map literals generated invalid code
21
+ - Some expressions with many extractable sub-expressions (map literals, blocking calls) generated invalid code because a temporary variable was re-used incorrectly
22
+ - Empty statements are accepted at the top level
23
+ - Ignore extra arguments in blocking function calls in all cases. Previously, extra arguments were ignored in some cases but threw errors in other cases.
24
+ - Call expressions in optional chaining (`data?.getPerson()?.name`) now result in error. Previously, they were incorrectly treated as non-optional in the generated code.
25
+ - Fixed code generation for an object rest element nested in an array pattern: `const [{...rest}] = data`
26
+
27
+ ## Version 0.11.0 - 2025-06-28
28
+
29
+ Breaking changes:
30
+
31
+ - Requires Node 20 or newer and Typescript 5.4.0 or newer
32
+ - retry_policy() must be called inside a try block, not after
33
+ - Variable declarations with `var` are not supported, only `let` and `const`
34
+ - Step name numbering starts from 1 at the start of each subworkflow
35
+
36
+ Fixes:
37
+
38
+ - Type annotation fixes in workflowslib
39
+
40
+ ## Version 0.10.0 - 2025-04-28
41
+
42
+ - Accept binary expressions as properties in assignments: `a[i + 4] = 1` (regression in 0.9.0)
43
+ - Evaluate side-effects only once on the left-hand side in compound assignments: `x[f()] += 1`
44
+ - Fix calling `call_step()` on the right-hand side of a compound assignment: `x += call_step(sum, {a: 10, b: 11})`
45
+ - Output an error if a subworkflow is empty because empty body is not allowed on GCP
46
+
47
+ ## Version 0.9.0 - 2025-04-23
48
+
49
+ Breaking changes:
50
+
51
+ - `True`, `TRUE`, `False` and `FALSE` no longer are synonyms for `true` and `false`
52
+
53
+ New features:
54
+
55
+ - Array and object destructuring: `const [a, b] = getArray()`
56
+
57
+ Fixes:
58
+
59
+ - Fix a deployment error caused by the same temp variable name being used inside and outside of a parallel branch
60
+
61
+ ## Version 0.8.0 - 2025-03-03
62
+
63
+ - Multiple input files can be given on the command line
64
+ - Argument `--outdir` sets the output directory
65
+ - Argument `--project` defines the TSConfig location for the source files
66
+ - `--(no-)generated-file-comment`: optionally include a comment about the output file being generated
67
+ - `--version` prints the correct version number
68
+ - Accept instantiation expressions `func<TYPE>`
69
+
70
+ ## Version 0.7.0 - 2025-02-02
71
+
72
+ - `typeof` operator
73
+ - `null` is allowed as interpolated value in template literal `${null}`
74
+ - Accept `undefined` as a function argument default argument: `func(a: number | undefined = undefined)`
75
+ - Optional function arguments: `func(a?: number)`
76
+
77
+ ## Version 0.6.0 - 2025-01-09
78
+
79
+ Breaking changes:
80
+
81
+ - retry_policy() takes a plain policy function name instead of a {policy: ...} object
82
+
83
+ Fixes:
84
+
85
+ - The try statement supports a finally block
86
+ - Support empty body in a catch block
87
+ - retry_policy() parameter values can now be expressions in addition to number literals
88
+ - 0, "", false and null can now be used as subworkflow parameter default values
89
+ - Type annotation fixes
90
+
91
+ ## Version 0.5.0 - 2024-11-09
92
+
93
+ - Move nested map expressions to assign steps where necessary
94
+ - Array.isArray() is transformed correcly in nested expressions
95
+
96
+ ## Version 0.4.0 - 2024-11-05
97
+
98
+ - Optional chaining a?.b is converted to map.get(a, "b")
99
+ - Non-null assertions person!.name is accepted but ignored to the transpiler
100
+ - Merge a next step to a preceeding assign step
101
+ - Accept a single-statement body (body without braces {}) in if, while, etc
102
+ - Assign the result of call_step() to a member variable: obj.property = call_step()
103
+ - parallel() and retry_policy() special functions can only be used as statements
104
+ - Better error messages on RegExp, BigInt, spread syntax and other non-supported Javascript features
105
+
106
+ ## Version 0.3.0 - 2024-10-19
107
+
108
+ - Function invocations no longer generate invalid empty variable names
109
+ - Include more utility types: ReturnType, Partial, Required, etc.
110
+ - Type annotation fixes
111
+
112
+ ## Version 0.2.0 - 2024-10-09
113
+
114
+ - Reduce cases where maps are needlessly split off into assign statements
115
+ - Accept (but ignore) "declare function"
116
+ - Implemented Array.isArray()
117
+ - Fixes to type annotations
package/README.md CHANGED
@@ -9,11 +9,9 @@ Only a subset of Typescript features are supported. The [language reference](lan
9
9
 
10
10
  See the [samples](samples) directory for code examples.
11
11
 
12
- Project status: It's possible to write Workflows programs, but the transpiler has not been extensively tested. Expect some rough edges!
13
-
14
12
  ## Installation
15
13
 
16
- ```
14
+ ```sh
17
15
  npm install ts2workflows
18
16
  ```
19
17
 
@@ -31,12 +29,24 @@ Compile multiple files and write result to an output directory `workflowsfiles`.
31
29
  npx ts2workflows --project samples/tsconfig.json --outdir workflowsfiles samples/*.ts
32
30
  ```
33
31
 
32
+ The `--link` argument generates YAML output that includes all necessary subworkflows (i.e. imported Typescript functions) in a single file. It will generate one output file for each input file.
33
+
34
+ ```sh
35
+ npx ts2workflows --link --project samples/tsconfig.json --outdir workflowsfiles samples/sample*.ts
36
+ ```
37
+
34
38
  When developing ts2workflows, you can run the transpiler directly from the source directory:
35
39
 
36
40
  ```sh
37
41
  npx tsx src/cli.ts samples/sample1.ts
38
42
  ```
39
43
 
44
+ ### Command arguments
45
+
46
+ - `--project`: Path to TSConfig for the Typescript sources files
47
+ - `--link`: Emit a self-contained YAML. That is, the output includes code from the main input file and all subworkflows imported from the main file. Without this, emits only subworkflows in the input file. Requires --project.
48
+ - `--[no-]generated-file-comment`: Start the output with a comment mentioning that the file has been generated by ts2workflows.
49
+
40
50
  ## Type checking workflow sources
41
51
 
42
52
  One benefit of writing the workflow programs in Typescript is that the sources can be type checked.
@@ -61,20 +71,20 @@ Type checking step is completely separate from the transpiling. The ts2workflows
61
71
 
62
72
  ### Build
63
73
 
64
- ```
74
+ ```sh
65
75
  npm install
66
76
  npm run build
67
77
  ```
68
78
 
69
79
  ### Run unit tests
70
80
 
71
- ```
81
+ ```sh
72
82
  npm run test
73
83
  ```
74
84
 
75
85
  Run tests and print the test coverage:
76
86
 
77
- ```
87
+ ```sh
78
88
  npm run test-coverage
79
89
  ```
80
90
 
@@ -92,7 +102,7 @@ The main function implementing these phases is `transpile()` in [src/transpiler/
92
102
 
93
103
  The transpiler parses a Typescript source file using [@typescript-eslint/typescript-estree](https://www.npmjs.com/package/@typescript-eslint/typescript-estree) module by the [typescript-eslint](https://typescript-eslint.io/) project. The result of the parsing is an [ESTree](https://github.com/estree/estree/blob/master/README.md)-compatible abstract syntax tree (AST) of the source code. [typescript-eslint playgroud](https://typescript-eslint.io/play/) is an useful tool for exploring the Typescript parsing.
94
104
 
95
- Next, ts2workflows converts the AST to a custom intermediate representation (IR). The IR format brings the representation of the program closer the GCP Workflows language than Typescript code. The types for IR are defined in the [src/ast](src/ast) directory. Particularly, see [src/ast/steps.ts](src/ast/steps.ts) for Workflow step types and [src/ast/expressions.ts](src/ast/expressions.ts) for expression types.
105
+ Next, ts2workflows converts the AST to a custom intermediate representation (IR). The IR format brings the representation of the program closer the GCP Workflows language than Typescript code. The types for IR are defined in the [src/ast](src/ast) directory. Particularly, see [src/ast/statements.ts](src/ast/statements.ts) for statement types and [src/ast/expressions.ts](src/ast/expressions.ts) for expression types.
96
106
 
97
107
  The transpiler applies a few transformations to the IR to make it a valid and optimized Workflows program. These transformations, for example, merge consecutive assignments into a single assign step and ensure that blocking function are invoked by call steps (as required by Workflows). The transformations are implemented in [src/transpiler/transformations.ts](src/transpiler/transformations.ts).
98
108
 
@@ -1,66 +1,62 @@
1
1
  export type VariableName = string;
2
2
  export type BinaryOperator = '+' | '-' | '*' | '/' | '//' | '%' | '==' | '!=' | '>' | '>=' | '<' | '<=' | 'in' | 'and' | 'or';
3
3
  export type UnaryOperator = '-' | '+' | 'not';
4
- export type Primitive = null | string | number | boolean | (Primitive | Expression)[] | {
5
- [key: string]: Primitive | Expression;
6
- };
7
4
  export type LiteralValueOrLiteralExpression = null | string | number | boolean | LiteralValueOrLiteralExpression[] | {
8
5
  [key: string]: LiteralValueOrLiteralExpression;
9
6
  };
10
- export type Expression = PrimitiveExpression | BinaryExpression | VariableReferenceExpression | FunctionInvocationExpression | MemberExpression | UnaryExpression;
11
- export declare class PrimitiveExpression {
12
- readonly expressionType = "primitive";
13
- readonly value: Primitive;
14
- constructor(value: Primitive);
15
- toString(): string;
7
+ export type Expression = NullExpression | StringExpression | NumberExpression | BooleanExpression | ListExpression | MapExpression | BinaryExpression | VariableReferenceExpression | FunctionInvocationExpression | MemberExpression | UnaryExpression;
8
+ interface ExpressionLiteral<V, Tag> {
9
+ readonly tag: Tag;
10
+ readonly value: V;
16
11
  }
17
- export declare const nullEx: PrimitiveExpression;
18
- export declare const trueEx: PrimitiveExpression;
19
- export declare const falseEx: PrimitiveExpression;
20
- export declare class BinaryExpression {
21
- readonly expressionType = "binary";
12
+ export type NullExpression = ExpressionLiteral<null, 'null'>;
13
+ export type StringExpression = ExpressionLiteral<string, 'string'>;
14
+ export type NumberExpression = ExpressionLiteral<number, 'number'>;
15
+ export type BooleanExpression = ExpressionLiteral<boolean, 'boolean'>;
16
+ export type ListExpression = ExpressionLiteral<Expression[], 'list'>;
17
+ export type MapExpression = ExpressionLiteral<Record<string, Expression>, 'map'>;
18
+ export declare const nullEx: NullExpression;
19
+ export declare function stringEx(value: string): StringExpression;
20
+ export declare function numberEx(value: number): NumberExpression;
21
+ export declare function booleanEx(value: boolean): BooleanExpression;
22
+ export declare const trueEx: BooleanExpression;
23
+ export declare const falseEx: BooleanExpression;
24
+ export declare function listEx(value: Expression[]): ListExpression;
25
+ export declare function mapEx(value: Record<string, Expression>): MapExpression;
26
+ export interface BinaryExpression {
27
+ readonly tag: 'binary';
22
28
  readonly binaryOperator: BinaryOperator;
23
29
  readonly left: Expression;
24
30
  readonly right: Expression;
25
- constructor(left: Expression, binaryOperator: BinaryOperator, right: Expression);
26
- toString(): string;
27
31
  }
28
- export declare class VariableReferenceExpression {
29
- readonly expressionType = "variableReference";
32
+ export declare function binaryEx(left: Expression, binaryOperator: BinaryOperator, right: Expression): BinaryExpression;
33
+ export interface VariableReferenceExpression {
34
+ readonly tag: 'variableReference';
30
35
  readonly variableName: VariableName;
31
- constructor(variableName: VariableName);
32
- toString(): string;
33
36
  }
34
- export declare class FunctionInvocationExpression {
35
- readonly expressionType = "functionInvocation";
37
+ export declare function variableReferenceEx(variableName: VariableName): VariableReferenceExpression;
38
+ export interface FunctionInvocationExpression {
39
+ readonly tag: 'functionInvocation';
36
40
  readonly functionName: string;
37
41
  readonly arguments: Expression[];
38
- constructor(functionName: string, argumentExpressions: Expression[]);
39
- toString(): string;
40
42
  }
41
- export declare class MemberExpression {
42
- readonly expressionType = "member";
43
+ export declare function functionInvocationEx(functionName: string, argumentExpressions: Expression[]): FunctionInvocationExpression;
44
+ export interface MemberExpression {
45
+ readonly tag: 'member';
43
46
  readonly object: Expression;
44
47
  readonly property: Expression;
45
48
  readonly computed: boolean;
46
- constructor(object: Expression, property: Expression, computed: boolean);
47
- toString(): string;
48
49
  }
49
- export declare class UnaryExpression {
50
- readonly expressionType = "unary";
50
+ export declare function memberEx(object: Expression, property: Expression, computed: boolean): MemberExpression;
51
+ export interface UnaryExpression {
52
+ readonly tag: 'unary';
51
53
  readonly operator: UnaryOperator;
52
54
  readonly value: Expression;
53
- constructor(operator: UnaryOperator, value: Expression);
54
- toString(): string;
55
55
  }
56
- export declare function isExpression(val: Primitive | Expression): val is Expression;
57
- export declare function asExpression(x: Primitive | Expression): Expression;
58
- export declare function safeAsExpression(x: Primitive | Expression | undefined): Expression | undefined;
56
+ export declare function unaryEx(operator: UnaryOperator, value: Expression): UnaryExpression;
57
+ export declare function expressionToString(ex: Expression): string;
59
58
  export declare function expressionToLiteralValueOrLiteralExpression(ex: Expression): LiteralValueOrLiteralExpression;
60
- export declare function isLiteral(ex: Expression): boolean;
61
- export declare function isFullyQualifiedName(ex: Expression): boolean;
62
- /**
63
- * Returns true if ex is pure expression (can't have side-effects)
64
- */
65
- export declare function isPure(ex: Expression): boolean;
59
+ export declare function isQualifiedName(ex: Expression): boolean;
60
+ export declare function isPrimitive(ex: Expression): ex is StringExpression | NumberExpression | BooleanExpression | NullExpression;
61
+ export {};
66
62
  //# sourceMappingURL=expressions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/ast/expressions.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AACjC,MAAM,MAAM,cAAc,GACtB,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,CAAA;AACR,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;AA2B7C,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,GAC1B;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;CAAE,CAAA;AAE7C,MAAM,MAAM,+BAA+B,GACvC,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,+BAA+B,EAAE,GACjC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,+BAA+B,CAAA;CAAE,CAAA;AAEtD,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,gBAAgB,GAChB,2BAA2B,GAC3B,4BAA4B,GAC5B,gBAAgB,GAChB,eAAe,CAAA;AAGnB,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,cAAc,eAAc;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;gBAEb,KAAK,EAAE,SAAS;IAM5B,QAAQ,IAAI,MAAM;CAgBnB;AAED,eAAO,MAAM,MAAM,qBAAgC,CAAA;AACnD,eAAO,MAAM,MAAM,qBAAgC,CAAA;AACnD,eAAO,MAAM,OAAO,qBAAiC,CAAA;AAGrD,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,cAAc,YAAW;IAClC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;gBAGxB,IAAI,EAAE,UAAU,EAChB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,UAAU;IAOnB,QAAQ,IAAI,MAAM;CAwBnB;AAID,qBAAa,2BAA2B;IACtC,QAAQ,CAAC,cAAc,uBAAsB;IAC7C,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;gBAEvB,YAAY,EAAE,YAAY;IAItC,QAAQ,IAAI,MAAM;CAGnB;AAGD,qBAAa,4BAA4B;IACvC,QAAQ,CAAC,cAAc,wBAAuB;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAA;gBAEpB,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE;IAKnE,QAAQ,IAAI,MAAM;CAInB;AAGD,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,cAAc,YAAW;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;gBAEd,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO;IAMvE,QAAQ,IAAI,MAAM;CAOnB;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,cAAc,WAAU;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;gBAEd,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU;IAKtD,QAAQ,IAAI,MAAM;CAQnB;AAyBD,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,GAAG,IAAI,UAAU,CAE3E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAElE;AAED,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GACpC,UAAU,GAAG,SAAS,CAExB;AAGD,wBAAgB,2CAA2C,CACzD,EAAE,EAAE,UAAU,GACb,+BAA+B,CA2BjC;AA4DD,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAcjD;AAoBD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAkB5D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAoB9C"}
1
+ {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/ast/expressions.ts"],"names":[],"mappings":"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"}