@loopstack/core 0.15.0 → 0.15.2

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 (32) hide show
  1. package/.github/workflows/ci-test.yml +31 -0
  2. package/.github/workflows/pr-main.yaml +16 -0
  3. package/.github/workflows/publish-npm.yml +86 -0
  4. package/.github/workflows/push-main.yaml +16 -0
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/utils/create-document-mock.d.ts +2 -0
  9. package/dist/utils/create-document-mock.js +11 -0
  10. package/dist/utils/create-document-mock.js.map +1 -0
  11. package/dist/utils/create-testing-module.d.ts +5 -0
  12. package/dist/utils/create-testing-module.js +32 -0
  13. package/dist/utils/create-testing-module.js.map +1 -0
  14. package/dist/utils/get-tool-result.d.ts +2 -0
  15. package/dist/utils/get-tool-result.js +7 -0
  16. package/dist/utils/get-tool-result.js.map +1 -0
  17. package/dist/utils/index.d.ts +5 -0
  18. package/dist/utils/index.js +22 -0
  19. package/dist/utils/index.js.map +1 -0
  20. package/dist/utils/tool-test-builder.d.ts +24 -0
  21. package/dist/utils/tool-test-builder.js +92 -0
  22. package/dist/utils/tool-test-builder.js.map +1 -0
  23. package/dist/utils/workflow-test-builder.d.ts +30 -0
  24. package/dist/utils/workflow-test-builder.js +130 -0
  25. package/dist/utils/workflow-test-builder.js.map +1 -0
  26. package/package.json +8 -3
  27. package/dist/persistence/services/__backup__/document.service.d.ts +0 -0
  28. package/dist/persistence/services/__backup__/document.service.js +0 -1
  29. package/dist/persistence/services/__backup__/document.service.js.map +0 -1
  30. package/dist/persistence/services/__backup__/dynamic-repository.service.d.ts +0 -0
  31. package/dist/persistence/services/__backup__/dynamic-repository.service.js +0 -1
  32. package/dist/persistence/services/__backup__/dynamic-repository.service.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ name: "CI Test Workflow"
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ node-version:
7
+ required: false
8
+ type: string
9
+ default: '20'
10
+ description: "Node.js version to use"
11
+
12
+ jobs:
13
+ test:
14
+ name: "Install & Test"
15
+ runs-on: ubuntu-latest
16
+ timeout-minutes: 15
17
+ steps:
18
+ - name: Checkout Code
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Setup Node.js ${{ inputs.node-version }}
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: ${{ inputs.node-version }}
25
+ cache: 'npm'
26
+
27
+ - name: Install Dependencies
28
+ run: npm ci
29
+
30
+ - name: Run Tests
31
+ run: npm test
@@ -0,0 +1,16 @@
1
+ name: "PR Main Workflow"
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ "main" ]
6
+
7
+ concurrency:
8
+ group: ${{ github.workflow }}-${{ github.ref }}
9
+ cancel-in-progress: true
10
+
11
+ jobs:
12
+ call-test-workflow:
13
+ name: "Run CI"
14
+ uses: ./.github/workflows/ci-test.yml
15
+ with:
16
+ node-version: '20'
@@ -0,0 +1,86 @@
1
+ name: 'Publish to NPM Workflow'
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*.*.*'
7
+
8
+ jobs:
9
+ publish:
10
+ name: 'Build & Publish to NPM'
11
+ runs-on: ubuntu-latest
12
+ timeout-minutes: 15
13
+ permissions:
14
+ contents: write
15
+ id-token: write
16
+ steps:
17
+ - name: Checkout Code
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Check if tag is on main branch
23
+ run: |
24
+ git fetch origin main
25
+ if ! git branch -r --contains ${{ github.ref }} | grep -q 'origin/main'; then
26
+ echo "❌ Tag is not on main branch"
27
+ exit 1
28
+ fi
29
+ echo "✅ Tag is on main branch"
30
+
31
+ - name: Setup Node.js
32
+ uses: actions/setup-node@v4
33
+ with:
34
+ node-version: '20'
35
+ cache: 'npm'
36
+ registry-url: 'https://registry.npmjs.org'
37
+
38
+ - name: Extract Package Version
39
+ id: package
40
+ run: |
41
+ echo "name=$(node -p "require('./package.json').name")" >> $GITHUB_OUTPUT
42
+ echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
43
+
44
+ - name: Validate Version Matches Tag
45
+ run: |
46
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
47
+ PKG_VERSION=${{ steps.package.outputs.version }}
48
+ if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
49
+ echo "❌ Tag version ($TAG_VERSION) does not match package.json version ($PKG_VERSION)"
50
+ exit 1
51
+ fi
52
+ echo "✅ Versions match"
53
+
54
+ - name: Install Dependencies
55
+ run: npm ci
56
+
57
+ - name: Run Tests
58
+ run: npm test
59
+
60
+ - name: Build Package
61
+ run: npm run build --if-present
62
+
63
+ - name: Publish to NPM
64
+ run: npm publish --access public
65
+ env:
66
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
67
+
68
+ - name: Create GitHub Release
69
+ uses: softprops/action-gh-release@v2
70
+ if: success()
71
+ with:
72
+ tag_name: ${{ github.ref_name }}
73
+ body: |
74
+ ## 📦 NPM Package
75
+
76
+ **Package:** [${{ steps.package.outputs.name }}](https://www.npmjs.com/package/${{ steps.package.outputs.name }}/v/${{ steps.package.outputs.version }})
77
+ **Version:** ${{ steps.package.outputs.version }}
78
+
79
+ Install with:
80
+ ```bash
81
+ npm install ${{ steps.package.outputs.name }}@${{ steps.package.outputs.version }}
82
+ ```
83
+ draft: false
84
+ prerelease: false
85
+ env:
86
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,16 @@
1
+ name: 'Push Main Workflow'
2
+
3
+ on:
4
+ push:
5
+ branches: ['main']
6
+
7
+ concurrency:
8
+ group: ${{ github.workflow }}-${{ github.ref }}
9
+ cancel-in-progress: true
10
+
11
+ jobs:
12
+ call-test-workflow:
13
+ name: 'Run CI'
14
+ uses: ./.github/workflows/ci-test.yml
15
+ with:
16
+ node-version: '20'
package/dist/index.d.ts CHANGED
@@ -5,4 +5,4 @@ export * from './scheduler';
5
5
  export * from './workflow-processor';
6
6
  export * from './loop-core.module';
7
7
  export * from './loop-core.module-definition';
8
- export * from './test';
8
+ export * from './utils';
package/dist/index.js CHANGED
@@ -21,5 +21,5 @@ __exportStar(require("./scheduler"), exports);
21
21
  __exportStar(require("./workflow-processor"), exports);
22
22
  __exportStar(require("./loop-core.module"), exports);
23
23
  __exportStar(require("./loop-core.module-definition"), exports);
24
- __exportStar(require("./test"), exports);
24
+ __exportStar(require("./utils"), exports);
25
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,2CAAyB;AACzB,gDAA8B;AAC9B,8CAA4B;AAC5B,uDAAqC;AAErC,qDAAmC;AACnC,gEAA8C;AAE9C,yCAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,2CAAyB;AACzB,gDAA8B;AAC9B,8CAA4B;AAC5B,uDAAqC;AAErC,qDAAmC;AACnC,gEAA8C;AAE9C,0CAAwB"}
@@ -0,0 +1,2 @@
1
+ import { DocumentEntity } from '@loopstack/common';
2
+ export declare function createDocumentMock<T>(source: new (...args: any[]) => any, content: T, documentProps?: Partial<DocumentEntity>): DocumentEntity;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDocumentMock = createDocumentMock;
4
+ function createDocumentMock(source, content, documentProps = {}) {
5
+ return {
6
+ ...documentProps,
7
+ blockName: source.name,
8
+ content: content,
9
+ };
10
+ }
11
+ //# sourceMappingURL=create-document-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-document-mock.js","sourceRoot":"","sources":["../../src/utils/create-document-mock.ts"],"names":[],"mappings":";;AAEA,gDAUC;AAVD,SAAgB,kBAAkB,CAChC,MAAmC,EACnC,OAAU,EACV,gBAAyC,EAAE;IAE3C,OAAO;QACL,GAAG,aAAa;QAChB,SAAS,EAAE,MAAM,CAAC,IAAI;QACtB,OAAO,EAAE,OAAO;KACI,CAAC;AACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { TestingModuleBuilder } from '@nestjs/testing';
2
+ export declare function createTestingModule(options: {
3
+ imports: any[];
4
+ providers: any[];
5
+ }): TestingModuleBuilder;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestingModule = createTestingModule;
4
+ const testing_1 = require("@nestjs/testing");
5
+ const typeorm_1 = require("@nestjs/typeorm");
6
+ const config_1 = require("@nestjs/config");
7
+ function createTestingModule(options) {
8
+ return testing_1.Test.createTestingModule({
9
+ imports: [
10
+ config_1.ConfigModule.forRoot({
11
+ isGlobal: true,
12
+ }),
13
+ typeorm_1.TypeOrmModule.forRoot({
14
+ type: 'postgres',
15
+ host: process.env.DB_HOST || 'localhost',
16
+ port: parseInt(process.env.DB_PORT || '5432'),
17
+ username: process.env.DB_USERNAME || 'postgres',
18
+ password: process.env.DB_PASSWORD || 'admin',
19
+ database: 'e2e_test',
20
+ autoLoadEntities: true,
21
+ synchronize: true,
22
+ dropSchema: true,
23
+ logging: false,
24
+ }),
25
+ ...options.imports,
26
+ ],
27
+ providers: [
28
+ ...options.providers,
29
+ ]
30
+ });
31
+ }
32
+ //# sourceMappingURL=create-testing-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-testing-module.js","sourceRoot":"","sources":["../../src/utils/create-testing-module.ts"],"names":[],"mappings":";;AAIA,kDAwBC;AA5BD,6CAA6D;AAC7D,6CAAgD;AAChD,2CAA8C;AAE9C,SAAgB,mBAAmB,CAAC,OAA4C;IAC9E,OAAO,cAAI,CAAC,mBAAmB,CAAC;QAC9B,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,uBAAa,CAAC,OAAO,CAAC;gBACpB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;gBACxC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;gBAC7C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU;gBAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO;gBAC5C,QAAQ,EAAE,UAAU;gBACpB,gBAAgB,EAAE,IAAI;gBACtB,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,KAAK;aACf,CAAC;YACF,GAAG,OAAO,CAAC,OAAO;SACnB;QACD,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;SACrB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { WorkflowExecutionContextDto } from '../common';
2
+ export declare function getToolResult(ctx: WorkflowExecutionContextDto, transitionId: string | number, toolId: string | number): any;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getToolResult = getToolResult;
4
+ function getToolResult(ctx, transitionId, toolId) {
5
+ return ctx.state.transitionResults?.[transitionId]?.toolResults?.[toolId];
6
+ }
7
+ //# sourceMappingURL=get-tool-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-tool-result.js","sourceRoot":"","sources":["../../src/utils/get-tool-result.ts"],"names":[],"mappings":";;AAEA,sCAMC;AAND,SAAgB,aAAa,CAC3B,GAAgC,EAChC,YAA6B,EAC7B,MAAuB;IAEvB,OAAO,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './create-document-mock';
2
+ export * from './get-tool-result';
3
+ export * from './tool-test-builder';
4
+ export * from './workflow-test-builder';
5
+ export * from './create-testing-module';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./create-document-mock"), exports);
18
+ __exportStar(require("./get-tool-result"), exports);
19
+ __exportStar(require("./tool-test-builder"), exports);
20
+ __exportStar(require("./workflow-test-builder"), exports);
21
+ __exportStar(require("./create-testing-module"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,oDAAkC;AAClC,sDAAoC;AACpC,0DAAwC;AACxC,0DAAwC"}
@@ -0,0 +1,24 @@
1
+ import { TestingModule } from '@nestjs/testing';
2
+ import { Type } from '@nestjs/common';
3
+ import { ToolBase } from '../workflow-processor';
4
+ import { WorkflowExecution } from '../workflow-processor/interfaces/workflow-execution.interface';
5
+ export interface ToolMock {
6
+ validate: jest.Mock;
7
+ execute: jest.Mock;
8
+ }
9
+ export declare function createToolMock(): ToolMock;
10
+ export declare function createExecutionContext(overrides?: any): WorkflowExecution;
11
+ export declare class ToolTestBuilder<TTool extends ToolBase<any> = ToolBase<any>> {
12
+ private toolClass?;
13
+ private providers;
14
+ private overrides;
15
+ forTool<T extends ToolBase<any>>(toolClass: Type<T>): ToolTestBuilder<T>;
16
+ withProvider(...providers: Type<any>[]): this;
17
+ withProviders(...providers: any[]): this;
18
+ withMock<T>(token: Type<T> | string | symbol, mock: Partial<T> | any): this;
19
+ withOverride<T>(token: Type<T> | string | symbol, mock: Partial<T> | any): this;
20
+ withToolMock<T>(toolClass: Type<T>): this;
21
+ compile(): Promise<TestingModule>;
22
+ private verifyToolDecorators;
23
+ }
24
+ export declare function createToolTest(): ToolTestBuilder;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ToolTestBuilder = void 0;
4
+ exports.createToolMock = createToolMock;
5
+ exports.createExecutionContext = createExecutionContext;
6
+ exports.createToolTest = createToolTest;
7
+ const testing_1 = require("@nestjs/testing");
8
+ const common_1 = require("@loopstack/common");
9
+ const lodash_1 = require("lodash");
10
+ function createToolMock() {
11
+ return {
12
+ validate: jest.fn().mockImplementation((v) => v),
13
+ execute: jest.fn().mockResolvedValue({ data: undefined }),
14
+ };
15
+ }
16
+ function createExecutionContext(overrides) {
17
+ return (0, lodash_1.merge)({
18
+ runtime: {
19
+ error: false,
20
+ stop: false,
21
+ availableTransitions: [],
22
+ transition: {
23
+ id: 'test-transition',
24
+ from: 'start',
25
+ to: 'end',
26
+ },
27
+ persistenceState: { documentsUpdated: false },
28
+ },
29
+ }, overrides);
30
+ }
31
+ class ToolTestBuilder {
32
+ toolClass;
33
+ providers = [];
34
+ overrides = new Map();
35
+ forTool(toolClass) {
36
+ this.verifyToolDecorators(toolClass);
37
+ this.toolClass = toolClass;
38
+ this.providers.push(toolClass);
39
+ return this;
40
+ }
41
+ withProvider(...providers) {
42
+ this.providers.push(...providers);
43
+ return this;
44
+ }
45
+ withProviders(...providers) {
46
+ this.providers.push(...providers);
47
+ return this;
48
+ }
49
+ withMock(token, mock) {
50
+ this.providers.push({
51
+ provide: token,
52
+ useValue: mock,
53
+ });
54
+ return this;
55
+ }
56
+ withOverride(token, mock) {
57
+ this.overrides.set(token, mock);
58
+ return this;
59
+ }
60
+ withToolMock(toolClass) {
61
+ const mock = createToolMock();
62
+ this.providers.push({
63
+ provide: toolClass,
64
+ useValue: mock,
65
+ });
66
+ return this;
67
+ }
68
+ async compile() {
69
+ if (!this.toolClass) {
70
+ throw new Error('Tool class not set. Call forTool() first.');
71
+ }
72
+ let builder = testing_1.Test.createTestingModule({
73
+ providers: this.providers,
74
+ });
75
+ for (const [token, mock] of this.overrides) {
76
+ builder = builder.overrideProvider(token).useValue(mock);
77
+ }
78
+ const module = await builder.compile();
79
+ return module;
80
+ }
81
+ verifyToolDecorators(toolClass) {
82
+ const blockConfig = Reflect.getMetadata(common_1.BLOCK_METADATA_KEY, toolClass);
83
+ if (!blockConfig) {
84
+ throw new Error(`Tool ${toolClass.name} is not decorated with @BlockConfig`);
85
+ }
86
+ }
87
+ }
88
+ exports.ToolTestBuilder = ToolTestBuilder;
89
+ function createToolTest() {
90
+ return new ToolTestBuilder();
91
+ }
92
+ //# sourceMappingURL=tool-test-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-test-builder.js","sourceRoot":"","sources":["../../src/utils/tool-test-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { TestingModule } from '@nestjs/testing';
2
+ import { Type } from '@nestjs/common';
3
+ import { WorkflowEntity } from '@loopstack/common';
4
+ export declare const DEFAULT_WORKFLOW_ENTITY: Omit<WorkflowEntity, 'namespace'>;
5
+ export interface WorkflowServiceMock {
6
+ save: jest.Mock;
7
+ create: jest.Mock;
8
+ findOneByQuery: jest.Mock;
9
+ }
10
+ export declare function createWorkflowServiceMock(): WorkflowServiceMock;
11
+ export declare class WorkflowTestBuilder<TWorkflow = any> {
12
+ private imports;
13
+ private providers;
14
+ private overrides;
15
+ private workflowClass?;
16
+ private workflowServiceMock;
17
+ private existingWorkflowEntity?;
18
+ constructor();
19
+ forWorkflow<T>(workflowClass: Type<T>): WorkflowTestBuilder<T>;
20
+ withImports(...imports: any[]): this;
21
+ withProvider(...providers: Type<any>[]): this;
22
+ withProviders(...providers: any[]): this;
23
+ withMock<T>(token: Type<T> | string | symbol, mock: Partial<T> | any): this;
24
+ withOverride<T>(token: Type<T> | string | symbol, mock: Partial<T> | any): this;
25
+ withToolMock<T>(toolClass: Type<T>): this;
26
+ withToolOverride<T>(toolClass: Type<T>): this;
27
+ withExistingWorkflow(entity: Partial<WorkflowEntity>): this;
28
+ compile(): Promise<TestingModule>;
29
+ }
30
+ export declare function createWorkflowTest(): WorkflowTestBuilder;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkflowTestBuilder = exports.DEFAULT_WORKFLOW_ENTITY = void 0;
4
+ exports.createWorkflowServiceMock = createWorkflowServiceMock;
5
+ exports.createWorkflowTest = createWorkflowTest;
6
+ const common_1 = require("@loopstack/common");
7
+ const create_testing_module_1 = require("./create-testing-module");
8
+ const persistence_1 = require("../persistence");
9
+ const tool_test_builder_1 = require("./tool-test-builder");
10
+ exports.DEFAULT_WORKFLOW_ENTITY = {
11
+ id: '00000000-0000-0000-0000-000000000000',
12
+ blockName: '',
13
+ title: '',
14
+ index: '1',
15
+ progress: 0,
16
+ status: common_1.WorkflowState.Pending,
17
+ hasError: false,
18
+ errorMessage: null,
19
+ createdAt: new Date(),
20
+ updatedAt: new Date(),
21
+ place: 'start',
22
+ transitionResults: null,
23
+ inputData: {},
24
+ availableTransitions: null,
25
+ history: null,
26
+ schema: null,
27
+ error: null,
28
+ ui: null,
29
+ namespaceId: '',
30
+ pipelineId: '',
31
+ labels: [],
32
+ hashRecord: null,
33
+ createdBy: '',
34
+ documents: [],
35
+ dependencies: [],
36
+ };
37
+ function createWorkflowServiceMock() {
38
+ return {
39
+ save: jest.fn(),
40
+ create: jest.fn().mockImplementation((input) => Promise.resolve({
41
+ ...exports.DEFAULT_WORKFLOW_ENTITY,
42
+ ...input,
43
+ id: crypto.randomUUID(),
44
+ })),
45
+ findOneByQuery: jest.fn().mockResolvedValue(undefined),
46
+ };
47
+ }
48
+ class WorkflowTestBuilder {
49
+ imports = [];
50
+ providers = [];
51
+ overrides = new Map();
52
+ workflowClass;
53
+ workflowServiceMock;
54
+ existingWorkflowEntity;
55
+ constructor() {
56
+ this.workflowServiceMock = createWorkflowServiceMock();
57
+ }
58
+ forWorkflow(workflowClass) {
59
+ this.workflowClass = workflowClass;
60
+ this.providers.push(workflowClass);
61
+ return this;
62
+ }
63
+ withImports(...imports) {
64
+ this.imports.push(...imports);
65
+ return this;
66
+ }
67
+ withProvider(...providers) {
68
+ this.providers.push(...providers);
69
+ return this;
70
+ }
71
+ withProviders(...providers) {
72
+ this.providers.push(...providers);
73
+ return this;
74
+ }
75
+ withMock(token, mock) {
76
+ this.providers.push({
77
+ provide: token,
78
+ useValue: mock,
79
+ });
80
+ return this;
81
+ }
82
+ withOverride(token, mock) {
83
+ this.overrides.set(token, mock);
84
+ return this;
85
+ }
86
+ withToolMock(toolClass) {
87
+ const mock = (0, tool_test_builder_1.createToolMock)();
88
+ this.providers.push({
89
+ provide: toolClass,
90
+ useValue: mock,
91
+ });
92
+ return this;
93
+ }
94
+ withToolOverride(toolClass) {
95
+ const mock = (0, tool_test_builder_1.createToolMock)();
96
+ this.overrides.set(toolClass, mock);
97
+ return this;
98
+ }
99
+ withExistingWorkflow(entity) {
100
+ this.existingWorkflowEntity = entity;
101
+ return this;
102
+ }
103
+ async compile() {
104
+ if (this.existingWorkflowEntity) {
105
+ this.workflowServiceMock.findOneByQuery.mockResolvedValue({
106
+ ...exports.DEFAULT_WORKFLOW_ENTITY,
107
+ id: crypto.randomUUID(),
108
+ ...this.existingWorkflowEntity,
109
+ });
110
+ }
111
+ let builder = (0, create_testing_module_1.createTestingModule)({
112
+ imports: this.imports,
113
+ providers: this.providers,
114
+ });
115
+ builder = builder
116
+ .overrideProvider(persistence_1.WorkflowService)
117
+ .useValue(this.workflowServiceMock);
118
+ for (const [token, mock] of this.overrides) {
119
+ builder = builder.overrideProvider(token).useValue(mock);
120
+ }
121
+ const module = await builder.compile();
122
+ await module.init();
123
+ return module;
124
+ }
125
+ }
126
+ exports.WorkflowTestBuilder = WorkflowTestBuilder;
127
+ function createWorkflowTest() {
128
+ return new WorkflowTestBuilder();
129
+ }
130
+ //# sourceMappingURL=workflow-test-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-test-builder.js","sourceRoot":"","sources":["../../src/utils/workflow-test-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@loopstack/core",
3
3
  "displayName": "Loopstack Core Module",
4
4
  "description": "The core module of the loopstack automation framework",
5
- "version": "0.15.0",
5
+ "version": "0.15.2",
6
6
  "author": {
7
7
  "name": "Jakob Klippel",
8
8
  "url": "https://www.linkedin.com/in/jakob-klippel//"
@@ -10,6 +10,10 @@
10
10
  "license": "BSL",
11
11
  "main": "dist/index.js",
12
12
  "types": "dist/index.d.ts",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/loopstack-ai/core"
16
+ },
13
17
  "scripts": {
14
18
  "build": "nest build",
15
19
  "watch": "nest build --watch",
@@ -17,7 +21,7 @@
17
21
  "compile": "tsc --noEmit",
18
22
  "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
19
23
  "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
20
- "test": "jest",
24
+ "test": "jest --passWithNoTests",
21
25
  "test:watch": "jest --watch",
22
26
  "test:cov": "jest --coverage",
23
27
  "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
@@ -50,7 +54,8 @@
50
54
  "lodash": "^4.17.21",
51
55
  "openai": "^4.86.2",
52
56
  "yaml": "^2.8.1",
53
- "zod": "^3.25.76"
57
+ "zod": "^3.25.76",
58
+ "zod-to-json-schema": "^3.25.0"
54
59
  },
55
60
  "devDependencies": {
56
61
  "@eslint/eslintrc": "^3.2.0",
@@ -1 +0,0 @@
1
- //# sourceMappingURL=document.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document.service.js","sourceRoot":"","sources":["../../../../src/persistence/services/__backup__/document.service.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=dynamic-repository.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dynamic-repository.service.js","sourceRoot":"","sources":["../../../../src/persistence/services/__backup__/dynamic-repository.service.ts"],"names":[],"mappings":""}