@outputai/core 0.14.0 → 0.14.1-next.51e8690.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/dist/credentials/credentials.d.ts +6 -0
- package/dist/credentials/credentials.js +87 -0
- package/dist/credentials/encrypted_yaml_provider.d.ts +2 -0
- package/dist/credentials/encrypted_yaml_provider.js +77 -0
- package/dist/credentials/encryption.d.ts +3 -0
- package/dist/credentials/encryption.js +6 -0
- package/dist/credentials/errors.d.ts +13 -0
- package/dist/credentials/errors.js +39 -0
- package/dist/credentials/index.d.ts +6 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/init.d.ts +1 -0
- package/dist/credentials/init.js +7 -0
- package/dist/credentials/paths.d.ts +7 -0
- package/dist/credentials/paths.js +14 -0
- package/dist/credentials/provider_registry.d.ts +3 -0
- package/dist/credentials/provider_registry.js +6 -0
- package/dist/credentials/types.d.ts +12 -0
- package/dist/credentials/types.js +1 -0
- package/package.json +14 -3
- package/src/async_storage.d.ts +4 -0
- package/src/consts.js +0 -2
- package/src/helpers/object.d.ts +2 -0
- package/src/hooks/index.d.ts +0 -8
- package/src/hooks/index.js +0 -3
- package/src/logger/index.d.ts +4 -0
- package/src/worker/index.js +3 -1
- package/bin/healthcheck.spec.js +0 -90
- package/src/bus.spec.js +0 -196
- package/src/errors.spec.js +0 -19
- package/src/helpers/activity_options.spec.js +0 -55
- package/src/helpers/component.spec.js +0 -54
- package/src/helpers/error_serializer.spec.js +0 -479
- package/src/helpers/errors.spec.js +0 -189
- package/src/helpers/fetch.spec.js +0 -292
- package/src/helpers/function.spec.js +0 -24
- package/src/helpers/object.spec.js +0 -425
- package/src/helpers/promise.spec.js +0 -62
- package/src/helpers/redact.spec.js +0 -66
- package/src/helpers/string.spec.js +0 -99
- package/src/helpers/temporal_context.spec.ts +0 -83
- package/src/helpers/trace_info.spec.js +0 -45
- package/src/helpers/workflow_context.spec.js +0 -46
- package/src/hooks/index.spec.js +0 -265
- package/src/hooks/pending_hooks.spec.js +0 -62
- package/src/interface/evaluator.spec.js +0 -685
- package/src/interface/logger.spec.js +0 -172
- package/src/interface/step.spec.js +0 -128
- package/src/interface/validations/index.spec.js +0 -197
- package/src/interface/validations/schemas.spec.js +0 -229
- package/src/interface/webhook.spec.js +0 -170
- package/src/interface/workflow.spec.js +0 -710
- package/src/interface/workflow_utils.spec.js +0 -271
- package/src/interface/zod_integration.spec.js +0 -646
- package/src/internal_activities/index.spec.js +0 -186
- package/src/logger/development.spec.js +0 -87
- package/src/logger/index.spec.js +0 -27
- package/src/logger/production.spec.js +0 -71
- package/src/sdk/helpers/component_metadata.spec.js +0 -30
- package/src/sdk/helpers/objects.spec.js +0 -16
- package/src/sdk/helpers/path.spec.js +0 -102
- package/src/sdk/runtime/context.spec.js +0 -37
- package/src/sdk/runtime/events.spec.js +0 -40
- package/src/temporal/client.spec.js +0 -124
- package/src/tracing/processors/local/index.spec.js +0 -204
- package/src/tracing/processors/s3/configs.spec.js +0 -64
- package/src/tracing/processors/s3/index.spec.js +0 -185
- package/src/tracing/processors/s3/redis_client.spec.js +0 -179
- package/src/tracing/processors/s3/s3_client.spec.js +0 -68
- package/src/tracing/tools/build_trace_tree.spec.js +0 -216
- package/src/tracing/trace_engine.spec.js +0 -299
- package/src/worker/bundle.spec.js +0 -53
- package/src/worker/bundler_options.spec.js +0 -62
- package/src/worker/catalog_workflow/catalog_publisher.spec.js +0 -317
- package/src/worker/catalog_workflow/index.spec.js +0 -222
- package/src/worker/configs.spec.js +0 -213
- package/src/worker/configs_tuner_schema.spec.js +0 -127
- package/src/worker/connection_monitor.spec.js +0 -328
- package/src/worker/global_functions.spec.js +0 -55
- package/src/worker/index.spec.js +0 -526
- package/src/worker/interceptors/activity.spec.js +0 -369
- package/src/worker/interceptors/headers.spec.js +0 -73
- package/src/worker/interceptors/workflow.spec.js +0 -357
- package/src/worker/interruption.spec.js +0 -177
- package/src/worker/loader/activities.spec.js +0 -212
- package/src/worker/loader/hooks.spec.js +0 -64
- package/src/worker/loader/matchers.spec.js +0 -140
- package/src/worker/loader/tools.spec.js +0 -595
- package/src/worker/loader/workflows.spec.js +0 -287
- package/src/worker/log_hooks.spec.js +0 -303
- package/src/worker/shutdown.spec.js +0 -197
- package/src/worker/sinks.spec.js +0 -220
- package/src/worker/telemetry.spec.js +0 -80
- package/src/worker/temporal_logger.spec.js +0 -90
- package/src/worker/webpack_loaders/tools.spec.js +0 -314
- package/src/worker/webpack_loaders/workflow_rewriter/collect_target_imports.spec.js +0 -134
- package/src/worker/webpack_loaders/workflow_rewriter/index.spec.js +0 -154
- package/src/worker/webpack_loaders/workflow_rewriter/rewrite_activity_calls.spec.js +0 -165
- package/src/worker/webpack_loaders/workflow_validator/index.spec.js +0 -202
- package/src/worker/webpack_loaders/workflow_validator/npm_workflow_export_resolve.spec.js +0 -374
- package/src/worker/worker_runner.spec.js +0 -220
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { mkdtempSync, writeFileSync, rmSync, mkdirSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join, resolve as resolvePath } from 'node:path';
|
|
5
|
-
import * as t from '@babel/types';
|
|
6
|
-
import {
|
|
7
|
-
toAbsolutePath,
|
|
8
|
-
parse,
|
|
9
|
-
extractTopLevelStringConsts,
|
|
10
|
-
getObjectKeyName,
|
|
11
|
-
getLocalNameFromDestructuredProperty,
|
|
12
|
-
isStepsPath,
|
|
13
|
-
isSharedStepsPath,
|
|
14
|
-
isAnyStepsPath,
|
|
15
|
-
isEvaluatorsPath,
|
|
16
|
-
isSharedEvaluatorsPath,
|
|
17
|
-
isWorkflowPath,
|
|
18
|
-
isAbsoluteWorkflowJsResource,
|
|
19
|
-
resolveNameFromArg,
|
|
20
|
-
resolveNameFromOptions,
|
|
21
|
-
buildStepsNameMap,
|
|
22
|
-
buildSharedStepsNameMap,
|
|
23
|
-
buildWorkflowNameMap,
|
|
24
|
-
buildEvaluatorsNameMap,
|
|
25
|
-
getFileKind
|
|
26
|
-
} from './tools.js';
|
|
27
|
-
|
|
28
|
-
describe( 'workflow_rewriter tools', () => {
|
|
29
|
-
it( 'parse: parses JS with JSX plugin enabled', () => {
|
|
30
|
-
const ast = parse( 'const A = 1; const C = () => <div />', 'file.js' );
|
|
31
|
-
expect( ast?.type ).toBe( 'File' );
|
|
32
|
-
expect( ast.program.body.length ).toBeGreaterThan( 0 );
|
|
33
|
-
} );
|
|
34
|
-
|
|
35
|
-
it( 'toAbsolutePath: resolves relative path against base directory', () => {
|
|
36
|
-
expect( toAbsolutePath( '/base/dir', './file.js' ) ).toBe( resolvePath( '/base/dir', './file.js' ) );
|
|
37
|
-
} );
|
|
38
|
-
|
|
39
|
-
it( 'extractTopLevelStringConsts: returns only const string bindings', () => {
|
|
40
|
-
const ast = parse( [
|
|
41
|
-
'const A = \"a\"; let B = \"b\"; const C = 3;',
|
|
42
|
-
'const D = `d`; const E = \"e\"'
|
|
43
|
-
].join( '\n' ), 'file.js' );
|
|
44
|
-
const map = extractTopLevelStringConsts( ast );
|
|
45
|
-
expect( map.get( 'A' ) ).toBe( 'a' );
|
|
46
|
-
expect( map.has( 'B' ) ).toBe( false );
|
|
47
|
-
expect( map.has( 'C' ) ).toBe( false );
|
|
48
|
-
// Template literal is not a StringLiteral
|
|
49
|
-
expect( map.has( 'D' ) ).toBe( false );
|
|
50
|
-
expect( map.get( 'E' ) ).toBe( 'e' );
|
|
51
|
-
} );
|
|
52
|
-
|
|
53
|
-
it( 'resolveNameFromOptions: returns literal name from options object', () => {
|
|
54
|
-
const opts = t.objectExpression( [ t.objectProperty( t.identifier( 'name' ), t.stringLiteral( 'literal.name' ) ) ] );
|
|
55
|
-
const out = resolveNameFromOptions( opts, new Map(), 'X' );
|
|
56
|
-
expect( out ).toBe( 'literal.name' );
|
|
57
|
-
} );
|
|
58
|
-
|
|
59
|
-
it( 'getObjectKeyName: resolves from Identifier and StringLiteral', () => {
|
|
60
|
-
expect( getObjectKeyName( t.identifier( 'name' ) ) ).toBe( 'name' );
|
|
61
|
-
expect( getObjectKeyName( t.stringLiteral( 'x' ) ) ).toBe( 'x' );
|
|
62
|
-
expect( getObjectKeyName( t.numericLiteral( 1 ) ) ).toBeNull();
|
|
63
|
-
} );
|
|
64
|
-
|
|
65
|
-
it( 'buildStepsNameMap: reads names from steps module and caches result', () => {
|
|
66
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-steps-' ) );
|
|
67
|
-
const stepsPath = join( dir, 'steps.js' );
|
|
68
|
-
writeFileSync( stepsPath, [
|
|
69
|
-
'export const StepA = step({ name: "step.a" })',
|
|
70
|
-
'export const StepB = step({ name: "step.b" })'
|
|
71
|
-
].join( '\n' ) );
|
|
72
|
-
const cache = new Map();
|
|
73
|
-
const map1 = buildStepsNameMap( stepsPath, cache );
|
|
74
|
-
expect( map1.get( 'StepA' ) ).toBe( 'step.a' );
|
|
75
|
-
expect( map1.get( 'StepB' ) ).toBe( 'step.b' );
|
|
76
|
-
expect( cache.get( stepsPath ) ).toBe( map1 );
|
|
77
|
-
const map2 = buildStepsNameMap( stepsPath, cache );
|
|
78
|
-
expect( map2 ).toBe( map1 );
|
|
79
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
80
|
-
} );
|
|
81
|
-
|
|
82
|
-
it( 'buildEvaluatorsNameMap: reads names from evaluators module and caches result', () => {
|
|
83
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-evals-' ) );
|
|
84
|
-
const evalsPath = join( dir, 'evaluators.js' );
|
|
85
|
-
writeFileSync( evalsPath, [
|
|
86
|
-
'export const EvalA = evaluator({ name: "eval.a" })',
|
|
87
|
-
'export const EvalB = evaluator({ name: "eval.b" })'
|
|
88
|
-
].join( '\n' ) );
|
|
89
|
-
const cache = new Map();
|
|
90
|
-
const map1 = buildEvaluatorsNameMap( evalsPath, cache );
|
|
91
|
-
expect( map1.get( 'EvalA' ) ).toBe( 'eval.a' );
|
|
92
|
-
expect( map1.get( 'EvalB' ) ).toBe( 'eval.b' );
|
|
93
|
-
expect( cache.get( evalsPath ) ).toBe( map1 );
|
|
94
|
-
const map2 = buildEvaluatorsNameMap( evalsPath, cache );
|
|
95
|
-
expect( map2 ).toBe( map1 );
|
|
96
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
97
|
-
} );
|
|
98
|
-
|
|
99
|
-
it( 'getLocalNameFromDestructuredProperty: handles { a }, { a: b }, { a: b = 1 }', () => {
|
|
100
|
-
// { a }
|
|
101
|
-
const p1 = t.objectProperty( t.identifier( 'a' ), t.identifier( 'a' ), false, true );
|
|
102
|
-
expect( getLocalNameFromDestructuredProperty( p1 ) ).toBe( 'a' );
|
|
103
|
-
// { a: b }
|
|
104
|
-
const p2 = t.objectProperty( t.identifier( 'a' ), t.identifier( 'b' ) );
|
|
105
|
-
expect( getLocalNameFromDestructuredProperty( p2 ) ).toBe( 'b' );
|
|
106
|
-
// { a: b = 1 }
|
|
107
|
-
const p3 = t.objectProperty( t.identifier( 'a' ), t.assignmentPattern( t.identifier( 'b' ), t.numericLiteral( 1 ) ) );
|
|
108
|
-
expect( getLocalNameFromDestructuredProperty( p3 ) ).toBe( 'b' );
|
|
109
|
-
// Unsupported shape
|
|
110
|
-
const p4 = t.objectProperty( t.identifier( 'a' ), t.arrayExpression( [] ) );
|
|
111
|
-
expect( getLocalNameFromDestructuredProperty( p4 ) ).toBeNull();
|
|
112
|
-
} );
|
|
113
|
-
|
|
114
|
-
it( 'buildWorkflowNameMap: reads named and default workflow names and caches', () => {
|
|
115
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-output-' ) );
|
|
116
|
-
const wfPath = join( dir, 'workflow.js' );
|
|
117
|
-
writeFileSync( wfPath, [
|
|
118
|
-
'export const FlowA = workflow({ name: "flow.a" })',
|
|
119
|
-
'export default workflow({ name: "flow.def" })'
|
|
120
|
-
].join( '\n' ) );
|
|
121
|
-
const cache = new Map();
|
|
122
|
-
const res1 = buildWorkflowNameMap( wfPath, cache );
|
|
123
|
-
expect( res1.named.get( 'FlowA' ) ).toBe( 'flow.a' );
|
|
124
|
-
expect( res1.default ).toBe( 'flow.def' );
|
|
125
|
-
expect( cache.get( wfPath ) ).toBe( res1 );
|
|
126
|
-
const res2 = buildWorkflowNameMap( wfPath, cache );
|
|
127
|
-
expect( res2 ).toBe( res1 );
|
|
128
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
129
|
-
} );
|
|
130
|
-
|
|
131
|
-
it( 'isStepsPath: matches LOCAL steps.js (no path traversal)', () => {
|
|
132
|
-
// Local steps (without ../ or /shared/)
|
|
133
|
-
expect( isStepsPath( 'steps.js' ) ).toBe( true );
|
|
134
|
-
expect( isStepsPath( './steps.js' ) ).toBe( true );
|
|
135
|
-
expect( isStepsPath( '/a/b/steps.js' ) ).toBe( true );
|
|
136
|
-
expect( isStepsPath( './steps/fetch.js' ) ).toBe( true );
|
|
137
|
-
// Shared steps (with ../ or /shared/) should NOT match isStepsPath
|
|
138
|
-
expect( isStepsPath( '../steps.js' ) ).toBe( false );
|
|
139
|
-
expect( isStepsPath( '../../shared/steps/common.js' ) ).toBe( false );
|
|
140
|
-
// Non-steps
|
|
141
|
-
expect( isStepsPath( 'steps.ts' ) ).toBe( false );
|
|
142
|
-
expect( isStepsPath( 'workflow.js' ) ).toBe( false );
|
|
143
|
-
} );
|
|
144
|
-
|
|
145
|
-
it( 'isSharedStepsPath: matches steps imported from outside workflow directory', () => {
|
|
146
|
-
// Shared steps: must have steps pattern AND have path traversal or /shared/
|
|
147
|
-
expect( isSharedStepsPath( '../steps.js' ) ).toBe( true );
|
|
148
|
-
expect( isSharedStepsPath( '../../steps.js' ) ).toBe( true );
|
|
149
|
-
expect( isSharedStepsPath( '../../shared/steps/common.js' ) ).toBe( true );
|
|
150
|
-
expect( isSharedStepsPath( '../other_workflow/steps.js' ) ).toBe( true );
|
|
151
|
-
expect( isSharedStepsPath( '/src/shared/steps/common.js' ) ).toBe( true );
|
|
152
|
-
// Local steps (no traversal, no /shared/) should NOT match
|
|
153
|
-
expect( isSharedStepsPath( './steps.js' ) ).toBe( false );
|
|
154
|
-
expect( isSharedStepsPath( 'steps.js' ) ).toBe( false );
|
|
155
|
-
expect( isSharedStepsPath( './steps/fetch.js' ) ).toBe( false );
|
|
156
|
-
// Non-steps should NOT match
|
|
157
|
-
expect( isSharedStepsPath( '../utils.js' ) ).toBe( false );
|
|
158
|
-
expect( isSharedStepsPath( 'evaluators.js' ) ).toBe( false );
|
|
159
|
-
} );
|
|
160
|
-
|
|
161
|
-
it( 'isAnyStepsPath: matches any steps pattern (local or shared)', () => {
|
|
162
|
-
// Local steps
|
|
163
|
-
expect( isAnyStepsPath( 'steps.js' ) ).toBe( true );
|
|
164
|
-
expect( isAnyStepsPath( './steps.js' ) ).toBe( true );
|
|
165
|
-
expect( isAnyStepsPath( './steps/fetch.js' ) ).toBe( true );
|
|
166
|
-
// Shared steps
|
|
167
|
-
expect( isAnyStepsPath( '../steps.js' ) ).toBe( true );
|
|
168
|
-
expect( isAnyStepsPath( '../../shared/steps/common.js' ) ).toBe( true );
|
|
169
|
-
// Non-steps
|
|
170
|
-
expect( isAnyStepsPath( 'workflow.js' ) ).toBe( false );
|
|
171
|
-
expect( isAnyStepsPath( 'utils.js' ) ).toBe( false );
|
|
172
|
-
} );
|
|
173
|
-
|
|
174
|
-
it( 'isWorkflowPath: matches workflow.js at root or subpath', () => {
|
|
175
|
-
expect( isWorkflowPath( 'workflow.js' ) ).toBe( true );
|
|
176
|
-
expect( isWorkflowPath( './workflow.js' ) ).toBe( true );
|
|
177
|
-
expect( isWorkflowPath( '/a/b/workflow.js' ) ).toBe( true );
|
|
178
|
-
expect( isWorkflowPath( 'workflow.ts' ) ).toBe( false );
|
|
179
|
-
expect( isWorkflowPath( 'steps.js' ) ).toBe( false );
|
|
180
|
-
} );
|
|
181
|
-
|
|
182
|
-
it( 'isAbsoluteWorkflowJsResource: normalizes slashes', () => {
|
|
183
|
-
expect( isAbsoluteWorkflowJsResource( '/a/b/workflow.js' ) ).toBe( true );
|
|
184
|
-
expect( isAbsoluteWorkflowJsResource( 'C:\\\\a\\\\workflow.js' ) ).toBe( true );
|
|
185
|
-
expect( isAbsoluteWorkflowJsResource( '/a/b/steps.js' ) ).toBe( false );
|
|
186
|
-
} );
|
|
187
|
-
|
|
188
|
-
it( 'isEvaluatorsPath: matches local evaluators.js but excludes shared', () => {
|
|
189
|
-
expect( isEvaluatorsPath( 'evaluators.js' ) ).toBe( true );
|
|
190
|
-
expect( isEvaluatorsPath( './evaluators.js' ) ).toBe( true );
|
|
191
|
-
expect( isEvaluatorsPath( '/a/b/evaluators.js' ) ).toBe( true );
|
|
192
|
-
expect( isEvaluatorsPath( './evaluators/quality.js' ) ).toBe( true );
|
|
193
|
-
// Shared evaluators should NOT match (path traversal or /shared/)
|
|
194
|
-
expect( isEvaluatorsPath( '../evaluators.js' ) ).toBe( false );
|
|
195
|
-
expect( isEvaluatorsPath( '../../shared/evaluators/common.js' ) ).toBe( false );
|
|
196
|
-
expect( isEvaluatorsPath( 'evaluators.ts' ) ).toBe( false );
|
|
197
|
-
expect( isEvaluatorsPath( 'steps.js' ) ).toBe( false );
|
|
198
|
-
} );
|
|
199
|
-
|
|
200
|
-
it( 'isSharedEvaluatorsPath: matches evaluators imported from outside workflow directory', () => {
|
|
201
|
-
// Shared evaluators: must have evaluators pattern AND have path traversal or /shared/
|
|
202
|
-
expect( isSharedEvaluatorsPath( '../evaluators.js' ) ).toBe( true );
|
|
203
|
-
expect( isSharedEvaluatorsPath( '../../evaluators.js' ) ).toBe( true );
|
|
204
|
-
expect( isSharedEvaluatorsPath( '../../shared/evaluators/quality.js' ) ).toBe( true );
|
|
205
|
-
expect( isSharedEvaluatorsPath( '../other_workflow/evaluators.js' ) ).toBe( true );
|
|
206
|
-
expect( isSharedEvaluatorsPath( '/src/shared/evaluators/quality.js' ) ).toBe( true );
|
|
207
|
-
// Local evaluators (no traversal, no /shared/) should NOT match
|
|
208
|
-
expect( isSharedEvaluatorsPath( './evaluators.js' ) ).toBe( false );
|
|
209
|
-
expect( isSharedEvaluatorsPath( 'evaluators.js' ) ).toBe( false );
|
|
210
|
-
expect( isSharedEvaluatorsPath( './evaluators/quality.js' ) ).toBe( false );
|
|
211
|
-
// Non-evaluators should NOT match
|
|
212
|
-
expect( isSharedEvaluatorsPath( '../utils.js' ) ).toBe( false );
|
|
213
|
-
expect( isSharedEvaluatorsPath( 'steps.js' ) ).toBe( false );
|
|
214
|
-
} );
|
|
215
|
-
|
|
216
|
-
it( 'buildSharedStepsNameMap: reads names from shared steps module and caches result', () => {
|
|
217
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-shared-steps-' ) );
|
|
218
|
-
mkdirSync( join( dir, 'shared', 'steps' ), { recursive: true } );
|
|
219
|
-
const stepsPath = join( dir, 'shared', 'steps', 'common.js' );
|
|
220
|
-
writeFileSync( stepsPath, [
|
|
221
|
-
'export const StepA = step({ name: "shared.step.a" })',
|
|
222
|
-
'export const StepB = step({ name: "shared.step.b" })'
|
|
223
|
-
].join( '\n' ) );
|
|
224
|
-
const cache = new Map();
|
|
225
|
-
const map1 = buildSharedStepsNameMap( stepsPath, cache );
|
|
226
|
-
expect( map1.get( 'StepA' ) ).toBe( 'shared.step.a' );
|
|
227
|
-
expect( map1.get( 'StepB' ) ).toBe( 'shared.step.b' );
|
|
228
|
-
expect( cache.get( stepsPath ) ).toBe( map1 );
|
|
229
|
-
const map2 = buildSharedStepsNameMap( stepsPath, cache );
|
|
230
|
-
expect( map2 ).toBe( map1 );
|
|
231
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
232
|
-
} );
|
|
233
|
-
|
|
234
|
-
it( 'getFileKind: classifies file by its path', () => {
|
|
235
|
-
expect( getFileKind( '/p/workflow.js' ) ).toBe( 'workflow' );
|
|
236
|
-
expect( getFileKind( '/p/steps.js' ) ).toBe( 'steps' );
|
|
237
|
-
// Files in steps folder are steps
|
|
238
|
-
expect( getFileKind( '/p/steps/fetch.js' ) ).toBe( 'steps' );
|
|
239
|
-
expect( getFileKind( '/p/shared/steps/common.js' ) ).toBe( 'steps' );
|
|
240
|
-
expect( getFileKind( '/p/evaluators.js' ) ).toBe( 'evaluators' );
|
|
241
|
-
expect( getFileKind( '/p/evaluators/quality.js' ) ).toBe( 'evaluators' );
|
|
242
|
-
expect( getFileKind( '/p/other.js' ) ).toBe( null );
|
|
243
|
-
expect( getFileKind( '/p/utils.js' ) ).toBe( null );
|
|
244
|
-
expect( getFileKind( '/p/clients/api.js' ) ).toBe( null );
|
|
245
|
-
} );
|
|
246
|
-
|
|
247
|
-
it( 'resolveNameFromArg: resolves string literal directly', () => {
|
|
248
|
-
expect( resolveNameFromArg( t.stringLiteral( 'my_name' ), new Map(), 'X' ) ).toBe( 'my_name' );
|
|
249
|
-
} );
|
|
250
|
-
|
|
251
|
-
it( 'resolveNameFromArg: resolves identifier from consts', () => {
|
|
252
|
-
const consts = new Map( [ [ 'MY_NAME', 'resolved_name' ] ] );
|
|
253
|
-
expect( resolveNameFromArg( t.identifier( 'MY_NAME' ), consts, 'X' ) ).toBe( 'resolved_name' );
|
|
254
|
-
} );
|
|
255
|
-
|
|
256
|
-
it( 'resolveNameFromArg: falls back to resolveNameFromOptions for objects', () => {
|
|
257
|
-
const opts = t.objectExpression( [ t.objectProperty( t.identifier( 'name' ), t.stringLiteral( 'obj_name' ) ) ] );
|
|
258
|
-
expect( resolveNameFromArg( opts, new Map(), 'X' ) ).toBe( 'obj_name' );
|
|
259
|
-
} );
|
|
260
|
-
|
|
261
|
-
it( 'buildEvaluatorsNameMap: reads names from string-arg factory pattern', () => {
|
|
262
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-verify-evals-' ) );
|
|
263
|
-
const evalsPath = join( dir, 'evaluators.js' );
|
|
264
|
-
writeFileSync( evalsPath, 'export const EvalA = verify( \'eval_a\', async () => {} )' );
|
|
265
|
-
const cache = new Map();
|
|
266
|
-
const map = buildEvaluatorsNameMap( evalsPath, cache );
|
|
267
|
-
expect( map.get( 'EvalA' ) ).toBe( 'eval_a' );
|
|
268
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
269
|
-
} );
|
|
270
|
-
|
|
271
|
-
it( 'buildEvaluatorsNameMap: reads names from object-arg verify pattern', () => {
|
|
272
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-verify-obj-evals-' ) );
|
|
273
|
-
const evalsPath = join( dir, 'evaluators.js' );
|
|
274
|
-
writeFileSync( evalsPath, 'export const EvalA = verify( { name: \'eval_a\' }, async () => {} )' );
|
|
275
|
-
const cache = new Map();
|
|
276
|
-
const map = buildEvaluatorsNameMap( evalsPath, cache );
|
|
277
|
-
expect( map.get( 'EvalA' ) ).toBe( 'eval_a' );
|
|
278
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
279
|
-
} );
|
|
280
|
-
|
|
281
|
-
it( 'buildEvaluatorsNameMap: reads names from mixed factory patterns', () => {
|
|
282
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-mixed-evals-' ) );
|
|
283
|
-
const evalsPath = join( dir, 'evaluators.js' );
|
|
284
|
-
writeFileSync( evalsPath, [
|
|
285
|
-
'export const EvalA = verify( { name: \'eval_a\' }, async () => {} )',
|
|
286
|
-
'export const EvalB = evaluator( { name: \'eval_b\' } )'
|
|
287
|
-
].join( '\n' ) );
|
|
288
|
-
const cache = new Map();
|
|
289
|
-
const map = buildEvaluatorsNameMap( evalsPath, cache );
|
|
290
|
-
expect( map.get( 'EvalA' ) ).toBe( 'eval_a' );
|
|
291
|
-
expect( map.get( 'EvalB' ) ).toBe( 'eval_b' );
|
|
292
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
293
|
-
} );
|
|
294
|
-
|
|
295
|
-
it( 'buildStepsNameMap: reads names from string-arg factory pattern', () => {
|
|
296
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-verify-steps-' ) );
|
|
297
|
-
const stepsPath = join( dir, 'steps.js' );
|
|
298
|
-
writeFileSync( stepsPath, 'export const StepA = myStepHelper( \'step_a\', async () => {} )' );
|
|
299
|
-
const cache = new Map();
|
|
300
|
-
const map = buildStepsNameMap( stepsPath, cache );
|
|
301
|
-
expect( map.get( 'StepA' ) ).toBe( 'step_a' );
|
|
302
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
303
|
-
} );
|
|
304
|
-
|
|
305
|
-
it( 'buildWorkflowNameMap: reads names from string-arg factory pattern', () => {
|
|
306
|
-
const dir = mkdtempSync( join( tmpdir(), 'tools-verify-workflow-' ) );
|
|
307
|
-
const wfPath = join( dir, 'workflow.js' );
|
|
308
|
-
writeFileSync( wfPath, 'export default myWorkflowHelper( { name: \'my_flow\' } )' );
|
|
309
|
-
const cache = new Map();
|
|
310
|
-
const res = buildWorkflowNameMap( wfPath, cache );
|
|
311
|
-
expect( res.default ).toBe( 'my_flow' );
|
|
312
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
313
|
-
} );
|
|
314
|
-
} );
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { parse } from '../tools.js';
|
|
6
|
-
import collectTargetImports from './collect_target_imports.js';
|
|
7
|
-
|
|
8
|
-
const caches = () => ( {
|
|
9
|
-
stepsNameCache: new Map(),
|
|
10
|
-
evaluatorsNameCache: new Map(),
|
|
11
|
-
sharedStepsNameCache: new Map(),
|
|
12
|
-
sharedEvaluatorsNameCache: new Map()
|
|
13
|
-
} );
|
|
14
|
-
|
|
15
|
-
const makeAst = ( source, filename ) => parse( source, filename );
|
|
16
|
-
|
|
17
|
-
describe( 'collect_target_imports', () => {
|
|
18
|
-
it( 'collects ESM activity imports and leaves workflow imports intact', () => {
|
|
19
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-esm-' ) );
|
|
20
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepA = step({ name: \'step.a\' });' );
|
|
21
|
-
writeFileSync( join( dir, 'evaluators.js' ), 'export const EvalA = evaluator({ name: \'eval.a\' });' );
|
|
22
|
-
writeFileSync( join( dir, 'workflow.js' ), 'export const FlowA = workflow({ name: \'flow.a\' });' );
|
|
23
|
-
|
|
24
|
-
const ast = makeAst( `
|
|
25
|
-
import { StepA } from './steps.js';
|
|
26
|
-
import { EvalA } from './evaluators.js';
|
|
27
|
-
import { FlowA } from './workflow.js';`, join( dir, 'file.js' ) );
|
|
28
|
-
|
|
29
|
-
const { activityImports } = collectTargetImports( ast, dir, caches() );
|
|
30
|
-
|
|
31
|
-
expect( activityImports ).toEqual( [
|
|
32
|
-
{ localName: 'StepA', activityName: 'step.a' },
|
|
33
|
-
{ localName: 'EvalA', activityName: 'eval.a' }
|
|
34
|
-
] );
|
|
35
|
-
expect( ast.program.body.find( n => n.type === 'ImportDeclaration' )?.source.value ).toBe( './workflow.js' );
|
|
36
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
37
|
-
} );
|
|
38
|
-
|
|
39
|
-
it( 'collects CJS activity requires and leaves workflow requires intact', () => {
|
|
40
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-cjs-' ) );
|
|
41
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepB = step({ name: \'step.b\' });' );
|
|
42
|
-
writeFileSync( join( dir, 'evaluators.js' ), 'export const EvalB = evaluator({ name: \'eval.b\' });' );
|
|
43
|
-
writeFileSync( join( dir, 'workflow.js' ), 'export const helper = () => 42;' );
|
|
44
|
-
|
|
45
|
-
const ast = makeAst( `
|
|
46
|
-
const { StepB } = require('./steps.js');
|
|
47
|
-
const { EvalB } = require('./evaluators.js');
|
|
48
|
-
const { helper } = require('./workflow.js');`, join( dir, 'file.js' ) );
|
|
49
|
-
|
|
50
|
-
const { activityImports } = collectTargetImports( ast, dir, caches() );
|
|
51
|
-
|
|
52
|
-
expect( activityImports ).toEqual( [
|
|
53
|
-
{ localName: 'StepB', activityName: 'step.b' },
|
|
54
|
-
{ localName: 'EvalB', activityName: 'eval.b' }
|
|
55
|
-
] );
|
|
56
|
-
expect( ast.program.body.some( n => n.type === 'VariableDeclaration' ) ).toBe( true );
|
|
57
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
58
|
-
} );
|
|
59
|
-
|
|
60
|
-
it( 'uses file path to choose component type instead of factory callee name', () => {
|
|
61
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-path-scoped-' ) );
|
|
62
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepExport = evaluator({ name: \'from.steps\' });' );
|
|
63
|
-
writeFileSync( join( dir, 'evaluators.js' ), 'export const EvalExport = step({ name: \'from.evaluators\' });' );
|
|
64
|
-
|
|
65
|
-
const esmAst = makeAst( `
|
|
66
|
-
import { StepExport } from './steps.js';
|
|
67
|
-
import { EvalExport } from './evaluators.js';`, join( dir, 'esm.js' ) );
|
|
68
|
-
const cjsAst = makeAst( `
|
|
69
|
-
const { StepExport } = require('./steps.js');
|
|
70
|
-
const { EvalExport } = require('./evaluators.js');`, join( dir, 'cjs.js' ) );
|
|
71
|
-
|
|
72
|
-
expect( collectTargetImports( esmAst, dir, caches() ).activityImports ).toEqual( [
|
|
73
|
-
{ localName: 'StepExport', activityName: 'from.steps' },
|
|
74
|
-
{ localName: 'EvalExport', activityName: 'from.evaluators' }
|
|
75
|
-
] );
|
|
76
|
-
expect( collectTargetImports( cjsAst, dir, caches() ).activityImports ).toEqual( [
|
|
77
|
-
{ localName: 'StepExport', activityName: 'from.steps' },
|
|
78
|
-
{ localName: 'EvalExport', activityName: 'from.evaluators' }
|
|
79
|
-
] );
|
|
80
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
81
|
-
} );
|
|
82
|
-
|
|
83
|
-
it( 'collects shared steps and evaluators from ESM and CJS imports', () => {
|
|
84
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-shared-' ) );
|
|
85
|
-
mkdirSync( join( dir, 'shared', 'steps' ), { recursive: true } );
|
|
86
|
-
mkdirSync( join( dir, 'shared', 'evaluators' ), { recursive: true } );
|
|
87
|
-
mkdirSync( join( dir, 'workflows', 'my_workflow' ), { recursive: true } );
|
|
88
|
-
writeFileSync( join( dir, 'shared', 'steps', 'common.js' ), 'export const SharedStep = step({ name: \'shared.step\' });' );
|
|
89
|
-
writeFileSync(
|
|
90
|
-
join( dir, 'shared', 'evaluators', 'common.js' ),
|
|
91
|
-
'export const SharedEval = evaluator({ name: \'shared.eval\' });'
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
const fileDir = join( dir, 'workflows', 'my_workflow' );
|
|
95
|
-
const esmAst = makeAst( `
|
|
96
|
-
import { SharedStep } from '../../shared/steps/common.js';
|
|
97
|
-
import { SharedEval } from '../../shared/evaluators/common.js';`, join( fileDir, 'workflow.js' ) );
|
|
98
|
-
const cjsAst = makeAst( `
|
|
99
|
-
const { SharedStep } = require('../../shared/steps/common.js');
|
|
100
|
-
const { SharedEval } = require('../../shared/evaluators/common.js');`, join( fileDir, 'helper.js' ) );
|
|
101
|
-
|
|
102
|
-
expect( collectTargetImports( esmAst, fileDir, caches() ).activityImports ).toEqual( [
|
|
103
|
-
{ localName: 'SharedStep', activityName: 'shared.step' },
|
|
104
|
-
{ localName: 'SharedEval', activityName: 'shared.eval' }
|
|
105
|
-
] );
|
|
106
|
-
expect( collectTargetImports( cjsAst, fileDir, caches() ).activityImports ).toEqual( [
|
|
107
|
-
{ localName: 'SharedStep', activityName: 'shared.step' },
|
|
108
|
-
{ localName: 'SharedEval', activityName: 'shared.eval' }
|
|
109
|
-
] );
|
|
110
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
111
|
-
} );
|
|
112
|
-
|
|
113
|
-
it( 'leaves destructured workflow requires untouched', () => {
|
|
114
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-workflow-require-' ) );
|
|
115
|
-
writeFileSync( join( dir, 'workflow.js' ), 'export const FlowX = workflow({ name: \'flow.x\' });' );
|
|
116
|
-
|
|
117
|
-
const ast = makeAst( 'const { FlowX } = require(\'./workflow.js\');', join( dir, 'file.js' ) );
|
|
118
|
-
const { activityImports } = collectTargetImports( ast, dir, caches() );
|
|
119
|
-
|
|
120
|
-
expect( activityImports ).toEqual( [] );
|
|
121
|
-
expect( ast.program.body.some( n => n.type === 'VariableDeclaration' ) ).toBe( true );
|
|
122
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
123
|
-
} );
|
|
124
|
-
|
|
125
|
-
it( 'throws when a named activity import cannot be resolved from the target file', () => {
|
|
126
|
-
const dir = mkdtempSync( join( tmpdir(), 'collect-unresolved-' ) );
|
|
127
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepA = step({ name: \'step.a\' });' );
|
|
128
|
-
|
|
129
|
-
const ast = makeAst( 'import { MissingStep } from \'./steps.js\';', join( dir, 'file.js' ) );
|
|
130
|
-
|
|
131
|
-
expect( () => collectTargetImports( ast, dir, caches() ) ).toThrow( /Unresolved import 'MissingStep'/ );
|
|
132
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
133
|
-
} );
|
|
134
|
-
} );
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { mkdtempSync, writeFileSync, rmSync, mkdirSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import loader from './index.mjs';
|
|
6
|
-
|
|
7
|
-
const { invokeActivitySymbolKey } = vi.hoisted( () => ( {
|
|
8
|
-
invokeActivitySymbolKey: 'test:invoke_activity'
|
|
9
|
-
} ) );
|
|
10
|
-
|
|
11
|
-
vi.mock( '#consts', async importOriginal => ( {
|
|
12
|
-
...await importOriginal(),
|
|
13
|
-
INVOKE_ACTIVITY_SYMBOL: Symbol.for( invokeActivitySymbolKey )
|
|
14
|
-
} ) );
|
|
15
|
-
|
|
16
|
-
function runLoader( source, resourcePath ) {
|
|
17
|
-
return new Promise( ( resolve, reject ) => {
|
|
18
|
-
const ctx = {
|
|
19
|
-
resourcePath,
|
|
20
|
-
cacheable: () => {},
|
|
21
|
-
async: () => ( err, code, map ) => ( err ? reject( err ) : resolve( { code, map } ) ),
|
|
22
|
-
callback: ( err, code, map ) => ( err ? reject( err ) : resolve( { code, map } ) )
|
|
23
|
-
};
|
|
24
|
-
loader.call( ctx, source, null );
|
|
25
|
-
} );
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const escapeRegExp = value => value.replace( /[.*+?^${}()|[\]\\]/g, '\\$&' );
|
|
29
|
-
const invokeActivityPattern = activityName =>
|
|
30
|
-
new RegExp( `globalThis\\[globalThis\\.Symbol\\.for\\(([\"'])${escapeRegExp( invokeActivitySymbolKey )}\\1\\)\\]\\('${activityName}'` );
|
|
31
|
-
|
|
32
|
-
describe( 'workflows_rewriter Webpack loader spec', () => {
|
|
33
|
-
it( 'rewrites ESM activity imports and leaves workflow imports intact', async () => {
|
|
34
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-esm-' ) );
|
|
35
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepA = step({ name: \'step.a\' });' );
|
|
36
|
-
writeFileSync( join( dir, 'workflow.js' ), `
|
|
37
|
-
export const FlowA = workflow({ name: 'flow.a' });
|
|
38
|
-
export default workflow({ name: 'flow.def' });` );
|
|
39
|
-
|
|
40
|
-
const source = `
|
|
41
|
-
import { StepA } from './steps.js';
|
|
42
|
-
import FlowDef, { FlowA } from './workflow.js';
|
|
43
|
-
|
|
44
|
-
const obj = {
|
|
45
|
-
fn: async x => {
|
|
46
|
-
StepA(1);
|
|
47
|
-
FlowA(2);
|
|
48
|
-
FlowDef(3);
|
|
49
|
-
}
|
|
50
|
-
}`;
|
|
51
|
-
|
|
52
|
-
const { code } = await runLoader( source, join( dir, 'file.js' ) );
|
|
53
|
-
|
|
54
|
-
expect( code ).not.toMatch( /from '\.\/steps\.js'/ );
|
|
55
|
-
expect( code ).toMatch( /from '\.\/workflow\.js'/ );
|
|
56
|
-
expect( code ).toMatch( invokeActivityPattern( 'step\\.a' ) );
|
|
57
|
-
expect( code ).toMatch( /,\s*1\)/ );
|
|
58
|
-
expect( code ).toMatch( /FlowA\(2\)/ );
|
|
59
|
-
expect( code ).toMatch( /FlowDef\(3\)/ );
|
|
60
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
61
|
-
} );
|
|
62
|
-
|
|
63
|
-
it( 'rewrites CJS activity requires and leaves workflow requires intact', async () => {
|
|
64
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-cjs-' ) );
|
|
65
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepB = step({ name: \'step.b\' });' );
|
|
66
|
-
writeFileSync( join( dir, 'workflow.js' ), 'export default workflow({ name: \'flow.c\' });' );
|
|
67
|
-
|
|
68
|
-
const source = `
|
|
69
|
-
const { StepB } = require( './steps.js' );
|
|
70
|
-
const FlowDefault = require( './workflow.js' );
|
|
71
|
-
|
|
72
|
-
const obj = {
|
|
73
|
-
fn: async y => {
|
|
74
|
-
StepB(y);
|
|
75
|
-
FlowDefault();
|
|
76
|
-
}
|
|
77
|
-
}`;
|
|
78
|
-
|
|
79
|
-
const { code } = await runLoader( source, join( dir, 'file.js' ) );
|
|
80
|
-
|
|
81
|
-
expect( code ).not.toMatch( /require\('\.\/steps\.js'\)/ );
|
|
82
|
-
expect( code ).toMatch( /require\('\.\/workflow\.js'\)/ );
|
|
83
|
-
expect( code ).toMatch( invokeActivityPattern( 'step\\.b' ) );
|
|
84
|
-
expect( code ).toMatch( /,\s*y\)/ );
|
|
85
|
-
expect( code ).toMatch( /FlowDefault\(\)/ );
|
|
86
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
87
|
-
} );
|
|
88
|
-
|
|
89
|
-
it( 'rewrites shared activity imports from helper modules', async () => {
|
|
90
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-shared-helper-' ) );
|
|
91
|
-
mkdirSync( join( dir, 'shared', 'evaluators' ), { recursive: true } );
|
|
92
|
-
mkdirSync( join( dir, 'workflows', 'my_workflow' ), { recursive: true } );
|
|
93
|
-
writeFileSync(
|
|
94
|
-
join( dir, 'shared', 'evaluators', 'common.js' ),
|
|
95
|
-
'export const SharedEval = evaluator({ name: \'shared.eval\' });'
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
const source = `
|
|
99
|
-
import { SharedEval } from '../../shared/evaluators/common.js';
|
|
100
|
-
|
|
101
|
-
export const helper = async value => SharedEval(value);`;
|
|
102
|
-
|
|
103
|
-
const { code } = await runLoader( source, join( dir, 'workflows', 'my_workflow', 'helper.js' ) );
|
|
104
|
-
|
|
105
|
-
expect( code ).not.toMatch( /shared\/evaluators\/common\.js/ );
|
|
106
|
-
expect( code ).toMatch( invokeActivityPattern( 'shared\\.eval' ) );
|
|
107
|
-
expect( code ).toMatch( /,\s*value\)/ );
|
|
108
|
-
expect( code ).toMatch( /export const helper = async value =>/ );
|
|
109
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
110
|
-
} );
|
|
111
|
-
|
|
112
|
-
it( 'resolves top-level const activity names', async () => {
|
|
113
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-const-' ) );
|
|
114
|
-
writeFileSync( join( dir, 'steps.js' ), `
|
|
115
|
-
const NAME = 'step.const';
|
|
116
|
-
export const StepC = step({ name: NAME });` );
|
|
117
|
-
|
|
118
|
-
const source = `
|
|
119
|
-
import { StepC } from './steps.js';
|
|
120
|
-
const obj = { fn: async () => StepC() };`;
|
|
121
|
-
|
|
122
|
-
const { code } = await runLoader( source, join( dir, 'file.js' ) );
|
|
123
|
-
expect( code ).toMatch( invokeActivityPattern( 'step\\.const' ) );
|
|
124
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
125
|
-
} );
|
|
126
|
-
|
|
127
|
-
it( 'throws when globalThis is shadowed at a rewritten call site', async () => {
|
|
128
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-globalthis-shadow-' ) );
|
|
129
|
-
writeFileSync( join( dir, 'steps.js' ), 'export const StepA = step({ name: \'step.shadow\' });' );
|
|
130
|
-
|
|
131
|
-
const source = `
|
|
132
|
-
import { StepA } from './steps.js';
|
|
133
|
-
export function helper(globalThis) {
|
|
134
|
-
return StepA();
|
|
135
|
-
}`;
|
|
136
|
-
|
|
137
|
-
await expect( runLoader( source, join( dir, 'helper.js' ) ) ).rejects.toThrow( /globalThis.*shadowed/ );
|
|
138
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
139
|
-
} );
|
|
140
|
-
|
|
141
|
-
it( 'propagates errors for non-static activity names', async () => {
|
|
142
|
-
const dir = mkdtempSync( join( tmpdir(), 'ast-loader-error-' ) );
|
|
143
|
-
writeFileSync( join( dir, 'steps.js' ), `
|
|
144
|
-
function n() { return 'x'; }
|
|
145
|
-
export const StepX = step({ name: n() });` );
|
|
146
|
-
|
|
147
|
-
const source = `
|
|
148
|
-
import { StepX } from './steps.js';
|
|
149
|
-
const obj = { fn: async () => StepX() };`;
|
|
150
|
-
|
|
151
|
-
await expect( runLoader( source, join( dir, 'file.js' ) ) ).rejects.toThrow( /Invalid step name/ );
|
|
152
|
-
rmSync( dir, { recursive: true, force: true } );
|
|
153
|
-
} );
|
|
154
|
-
} );
|