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.
- package/CHANGELOG.md +117 -0
- package/README.md +17 -7
- package/dist/ast/expressions.d.ts +37 -41
- package/dist/ast/expressions.d.ts.map +1 -1
- package/dist/ast/expressions.js +124 -255
- package/dist/ast/statements.d.ts +132 -0
- package/dist/ast/statements.d.ts.map +1 -0
- package/dist/ast/statements.js +197 -0
- package/dist/ast/steps.d.ts +82 -194
- package/dist/ast/steps.d.ts.map +1 -1
- package/dist/ast/steps.js +862 -523
- package/dist/ast/workflows.d.ts +14 -7
- package/dist/ast/workflows.d.ts.map +1 -1
- package/dist/ast/workflows.js +19 -10
- package/dist/cli.js +45 -32
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/transpiler/index.d.ts +14 -1
- package/dist/transpiler/index.d.ts.map +1 -1
- package/dist/transpiler/index.js +150 -31
- package/dist/transpiler/linker.d.ts +3 -0
- package/dist/transpiler/linker.d.ts.map +1 -0
- package/dist/transpiler/linker.js +45 -0
- package/dist/transpiler/parseexpressions.d.ts +11 -0
- package/dist/transpiler/parseexpressions.d.ts.map +1 -0
- package/dist/transpiler/{expressions.js → parseexpressions.js} +90 -103
- package/dist/transpiler/parsestatement.d.ts +7 -0
- package/dist/transpiler/parsestatement.d.ts.map +1 -0
- package/dist/transpiler/parsestatement.js +862 -0
- package/dist/transpiler/stepnames.d.ts +3 -0
- package/dist/transpiler/stepnames.d.ts.map +1 -0
- package/dist/transpiler/stepnames.js +17 -0
- package/dist/transpiler/transformations.d.ts +3 -19
- package/dist/transpiler/transformations.d.ts.map +1 -1
- package/dist/transpiler/transformations.js +267 -322
- package/language_reference.md +8 -2
- package/package.json +13 -7
- package/types/workflowslib.d.ts +26 -13
- package/dist/ast/stepnames.d.ts +0 -9
- package/dist/ast/stepnames.d.ts.map +0 -1
- package/dist/ast/stepnames.js +0 -280
- package/dist/transpiler/expressions.d.ts +0 -11
- package/dist/transpiler/expressions.d.ts.map +0 -1
- package/dist/transpiler/statements.d.ts +0 -10
- package/dist/transpiler/statements.d.ts.map +0 -1
- package/dist/transpiler/statements.js +0 -1098
- package/dist/utils.d.ts +0 -2
- package/dist/utils.d.ts.map +0 -1
- 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/
|
|
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 =
|
|
11
|
-
|
|
12
|
-
readonly
|
|
13
|
-
readonly value:
|
|
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
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
export
|
|
21
|
-
|
|
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
|
|
29
|
-
|
|
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
|
|
35
|
-
|
|
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
|
|
42
|
-
|
|
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
|
|
50
|
-
|
|
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
|
|
57
|
-
export declare function
|
|
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
|
|
61
|
-
export declare function
|
|
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":"
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/ast/expressions.ts"],"names":[],"mappings":"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"}
|