Skip to content

Commit 2ce4fb8

Browse files
authored
Merge pull request #1150 from objectstack-ai/claude/fix-ci-build-test-errors-one-more-time
fix: resolve CI build and test failures
2 parents 790ed7c + 2695fb9 commit 2ce4fb8

File tree

6 files changed

+103
-6
lines changed

6 files changed

+103
-6
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2+
3+
import { defineConfig } from 'vitest/config';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
test: {
8+
globals: true,
9+
environment: 'node',
10+
},
11+
resolve: {
12+
alias: {
13+
'@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'),
14+
'@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'),
15+
'@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'),
16+
'@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'),
17+
'@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'),
18+
'@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'),
19+
'@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'),
20+
},
21+
},
22+
});

packages/plugins/plugin-auth/src/auth-plugin.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ describe('AuthPlugin', () => {
137137
it('should register routes with HTTP server on kernel:ready', async () => {
138138
const mockRawApp = {
139139
all: vi.fn(),
140+
get: vi.fn(),
140141
};
141142

142143
const mockHttpServer = {
@@ -173,6 +174,7 @@ describe('AuthPlugin', () => {
173174
it('should log via ctx.logger when better-auth returns a 500 response', async () => {
174175
const mockRawApp = {
175176
all: vi.fn(),
177+
get: vi.fn(),
176178
};
177179

178180
const mockHttpServer = {
@@ -270,7 +272,7 @@ describe('AuthPlugin', () => {
270272
});
271273

272274
it('should auto-detect baseUrl from http-server port when port differs', async () => {
273-
const mockRawApp = { all: vi.fn() };
275+
const mockRawApp = { all: vi.fn(), get: vi.fn() };
274276
const mockHttpServer = {
275277
post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(),
276278
patch: vi.fn(), use: vi.fn(),
@@ -306,7 +308,7 @@ describe('AuthPlugin', () => {
306308
(mockContext.registerService as any).mockClear();
307309
await localPlugin.init(mockContext);
308310

309-
const mockRawApp = { all: vi.fn() };
311+
const mockRawApp = { all: vi.fn(), get: vi.fn() };
310312
const mockHttpServer = {
311313
post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(),
312314
patch: vi.fn(), use: vi.fn(),
@@ -338,7 +340,7 @@ describe('AuthPlugin', () => {
338340
(mockContext.registerService as any).mockClear();
339341
await localPlugin.init(mockContext);
340342

341-
const mockRawApp = { all: vi.fn() };
343+
const mockRawApp = { all: vi.fn(), get: vi.fn() };
342344
const mockHttpServer = {
343345
post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(),
344346
patch: vi.fn(), use: vi.fn(),
@@ -400,6 +402,7 @@ describe('AuthPlugin', () => {
400402

401403
const mockRawApp = {
402404
all: vi.fn(),
405+
get: vi.fn(),
403406
};
404407

405408
const mockHttpServer = {

packages/plugins/plugin-hono-server/src/hono-plugin.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ vi.mock('./adapter', () => ({
2727
close: vi.fn(),
2828
getRawApp: vi.fn().mockReturnValue({
2929
get: vi.fn(),
30+
use: vi.fn(),
3031
})
3132
};
3233
})
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2+
3+
import { defineConfig } from 'vitest/config';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
test: {
8+
globals: true,
9+
environment: 'node',
10+
},
11+
resolve: {
12+
alias: {
13+
'@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'),
14+
'@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'),
15+
'@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'),
16+
'@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'),
17+
'@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'),
18+
'@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'),
19+
'@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'),
20+
},
21+
},
22+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2+
3+
import { defineConfig } from 'vitest/config';
4+
import path from 'path';
5+
6+
export default defineConfig({
7+
test: {
8+
globals: true,
9+
environment: 'node',
10+
},
11+
resolve: {
12+
alias: {
13+
'@objectstack/core': path.resolve(__dirname, '../../core/src/index.ts'),
14+
'@objectstack/spec/ai': path.resolve(__dirname, '../../spec/src/ai/index.ts'),
15+
'@objectstack/spec/api': path.resolve(__dirname, '../../spec/src/api/index.ts'),
16+
'@objectstack/spec/contracts': path.resolve(__dirname, '../../spec/src/contracts/index.ts'),
17+
'@objectstack/spec/data': path.resolve(__dirname, '../../spec/src/data/index.ts'),
18+
'@objectstack/spec/kernel': path.resolve(__dirname, '../../spec/src/kernel/index.ts'),
19+
'@objectstack/spec/system': path.resolve(__dirname, '../../spec/src/system/index.ts'),
20+
'@objectstack/spec': path.resolve(__dirname, '../../spec/src/index.ts'),
21+
},
22+
},
23+
});

packages/spec/scripts/build-schemas.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,36 @@ function writeFileWithRetry(filePath: string, content: string, retries = MAX_RET
8080
// Clean output directory ensures no stale files remain
8181
if (fs.existsSync(OUT_DIR)) {
8282
console.log(`Cleaning output directory: ${OUT_DIR}`);
83-
fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: MAX_RETRIES, retryDelay: RETRY_DELAY_BASE_MS });
84-
83+
84+
// Use a more robust cleanup with multiple retries and longer delays
85+
// to handle filesystem race conditions in CI environments
86+
for (let attempt = 0; attempt < MAX_RETRIES * 2; attempt++) {
87+
try {
88+
// Try removing with native Node.js rmSync
89+
if (fs.existsSync(OUT_DIR)) {
90+
fs.rmSync(OUT_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: RETRY_DELAY_BASE_MS * 2 });
91+
}
92+
93+
// Verify the directory is actually gone
94+
if (!fs.existsSync(OUT_DIR)) {
95+
break;
96+
}
97+
98+
// If still exists, wait before retrying with exponential backoff
99+
sleepSync(RETRY_DELAY_BASE_MS * (attempt + 1));
100+
} catch (error) {
101+
// If this is the last attempt, log but continue (we'll try to work with what's there)
102+
if (attempt === (MAX_RETRIES * 2 - 1)) {
103+
console.warn(`Warning: Failed to fully clean directory after ${attempt + 1} attempts:`, error);
104+
// Try to continue anyway - ensureDir will create missing parts
105+
break;
106+
}
107+
// Wait before retry with exponential backoff
108+
sleepSync(RETRY_DELAY_BASE_MS * (attempt + 1));
109+
}
110+
}
111+
85112
// Wait a bit to ensure file system has synced
86-
// This prevents ENOENT errors on some file systems, particularly in CI environments
87113
sleepSync(FS_SYNC_DELAY_MS);
88114
}
89115

0 commit comments

Comments
 (0)