Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/builder/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
"@typescript-eslint/eslint-plugin": "^8.58.0",
"@typescript-eslint/parser": "^8.58.0",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/coverage-v8": "^3.2.4",
"@vitest/coverage-v8": "^4.1.0",
"dexie": "4.4.2",
"eslint": "^9.39.4",
"eslint-config-prettier": "^10.1.8",
Expand All @@ -119,7 +119,7 @@
"vite": "7.3.2",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.6.0",
"vitest": "^3.2.4"
"vitest": "^4.1.0"
},
"repository": {
"type": "git",
Expand Down
38 changes: 20 additions & 18 deletions apps/builder/src/export/__tests__/PackageManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,24 +100,26 @@ const mockStellarAdapterConfig: AdapterConfig = {

// Mock AdapterConfigLoader to return test configs
vi.mock('../AdapterConfigLoader', () => ({
AdapterConfigLoader: vi.fn().mockImplementation(() => ({
loadConfig: vi.fn().mockImplementation(async (ecosystem: Ecosystem) => {
switch (ecosystem) {
case 'midnight':
return mockMidnightAdapterConfig;
case 'evm':
return mockEvmAdapterConfig;
case 'polkadot':
return mockPolkadotAdapterConfig;
case 'solana':
return mockSolanaAdapterConfig;
case 'stellar':
return mockStellarAdapterConfig;
default:
return null;
}
}),
})),
AdapterConfigLoader: vi.fn().mockImplementation(function () {
return {
loadConfig: vi.fn().mockImplementation(async (ecosystem: Ecosystem) => {
switch (ecosystem) {
case 'midnight':
return mockMidnightAdapterConfig;
case 'evm':
return mockEvmAdapterConfig;
case 'polkadot':
return mockPolkadotAdapterConfig;
case 'solana':
return mockSolanaAdapterConfig;
case 'stellar':
return mockStellarAdapterConfig;
default:
return null;
}
}),
};
}),
}));

// Mock RendererConfig since we can't import it directly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@ const mockAdapterConfig: AdapterConfig = {
};

vi.mock('../AdapterConfigLoader', () => ({
AdapterConfigLoader: vi.fn().mockImplementation(() => ({
loadConfig: vi.fn().mockResolvedValue(mockAdapterConfig),
})),
AdapterConfigLoader: vi.fn().mockImplementation(function () {
return {
loadConfig: vi.fn().mockResolvedValue(mockAdapterConfig),
};
}),
}));

const mockRendererConfig = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,11 +341,11 @@ export default function GeneratedForm({ adapter, isWalletConnected }: GeneratedF
exports[`Export Snapshot Tests > evm Export Snapshots > should match snapshot for package.json structure > package-json-evm 1`] = `
{
"dependencies": {
"@openzeppelin/adapter-evm": "^2.0.2",
"@openzeppelin/adapter-evm": "^2.1.0",
"@openzeppelin/ui-components": "^3.0.0",
"@openzeppelin/ui-react": "^3.0.0",
"@openzeppelin/ui-renderer": "^3.0.0",
"@openzeppelin/ui-types": "^3.0.0",
"@openzeppelin/ui-types": "^3.1.0",
"@openzeppelin/ui-utils": "^3.0.0",
"@tanstack/react-query": "^5.0.0",
"@wagmi/core": "^2.20.3",
Expand Down Expand Up @@ -708,11 +708,11 @@ export default function GeneratedForm({ adapter, isWalletConnected }: GeneratedF
exports[`Export Snapshot Tests > polkadot Export Snapshots > should match snapshot for package.json structure > package-json-polkadot 1`] = `
{
"dependencies": {
"@openzeppelin/adapter-polkadot": "^2.0.2",
"@openzeppelin/adapter-polkadot": "^2.1.0",
"@openzeppelin/ui-components": "^3.0.0",
"@openzeppelin/ui-react": "^3.0.0",
"@openzeppelin/ui-renderer": "^3.0.0",
"@openzeppelin/ui-types": "^3.0.0",
"@openzeppelin/ui-types": "^3.1.0",
"@openzeppelin/ui-utils": "^3.0.0",
"@tanstack/react-query": "^5.0.0",
"@wagmi/core": "^2.20.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,21 @@ const mockMidnightAdapterConfig: AdapterConfig = {

// Mock AdapterConfigLoader
vi.mock('../../AdapterConfigLoader', () => ({
AdapterConfigLoader: vi.fn().mockImplementation(() => ({
loadConfig: vi.fn().mockImplementation(async (ecosystem: Ecosystem) => {
if (ecosystem === 'midnight') {
return mockMidnightAdapterConfig;
}
// Return config without patchedDependencies for other ecosystems
return {
dependencies: {
runtime: { viem: '^2.0.0' },
},
};
}),
})),
AdapterConfigLoader: vi.fn().mockImplementation(function () {
return {
loadConfig: vi.fn().mockImplementation(async (ecosystem: Ecosystem) => {
if (ecosystem === 'midnight') {
return mockMidnightAdapterConfig;
}
// Return config without patchedDependencies for other ecosystems
return {
dependencies: {
runtime: { viem: '^2.0.0' },
},
};
}),
};
}),
}));

// Mock logger to avoid console output during tests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ describe('generateAndAddAppConfig', () => {
const formConfig = createFormConfig('stellar-wallets-kit');

const formatJsonSpy = vi.spyOn(mockTemplateProcessor, 'formatJson');
formatJsonSpy.mockClear();

await generateAndAddAppConfig(projectFiles, networkConfig, mockTemplateProcessor, formConfig);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,45 +26,47 @@ vi.mock('../../../core/adapterRegistry', () => {
// Mock the PackageManager module
vi.mock('../../PackageManager', () => {
// Mock implementation
const MockPackageManager = vi.fn().mockImplementation(() => ({
// Mock methods used by AppCodeGenerator -> generateTemplateProject
updatePackageJson: vi
.fn()
.mockImplementation(
async (
originalContent: string,
_formConfig: BuilderFormConfig,
ecosystem: Ecosystem,
_functionId: string,
options?: Partial<ExportOptions>
) => {
const packageJson = JSON.parse(originalContent);
packageJson.name = options?.projectName || 'default-test-name';
// Simulate adding dependencies based on ecosystem
packageJson.dependencies = {
...(packageJson.dependencies || {}),
const MockPackageManager = vi.fn().mockImplementation(function () {
return {
// Mock methods used by AppCodeGenerator -> generateTemplateProject
updatePackageJson: vi
.fn()
.mockImplementation(
async (
originalContent: string,
_formConfig: BuilderFormConfig,
ecosystem: Ecosystem,
_functionId: string,
options?: Partial<ExportOptions>
) => {
const packageJson = JSON.parse(originalContent);
packageJson.name = options?.projectName || 'default-test-name';
// Simulate adding dependencies based on ecosystem
packageJson.dependencies = {
...(packageJson.dependencies || {}),
'@openzeppelin/ui-renderer': '^1.0.0',
'@openzeppelin/ui-types': '^0.1.0',
[`@openzeppelin/adapter-${ecosystem}`]: '^0.0.1', // Add caret version
};
return JSON.stringify(packageJson, null, 2);
}
),
getDependencies: vi
.fn()
.mockImplementation(async (_formConfig: BuilderFormConfig, ecosystem: Ecosystem) => {
return {
'@openzeppelin/ui-renderer': '^1.0.0',
'@openzeppelin/ui-types': '^0.1.0',
[`@openzeppelin/adapter-${ecosystem}`]: '^0.0.1', // Add caret version
[`@openzeppelin/adapter-${ecosystem}`]: '^0.0.1',
};
return JSON.stringify(packageJson, null, 2);
}
),
getDependencies: vi
.fn()
.mockImplementation(async (_formConfig: BuilderFormConfig, ecosystem: Ecosystem) => {
return {
'@openzeppelin/ui-renderer': '^1.0.0',
'@openzeppelin/ui-types': '^0.1.0',
[`@openzeppelin/adapter-${ecosystem}`]: '^0.0.1',
};
}),
getDevDependencies: vi
.fn()
.mockImplementation(async (_formConfig: BuilderFormConfig, _ecosystem: Ecosystem) => {
return {};
}),
}));
}),
getDevDependencies: vi
.fn()
.mockImplementation(async (_formConfig: BuilderFormConfig, _ecosystem: Ecosystem) => {
return {};
}),
};
});
return { PackageManager: MockPackageManager };
});

Expand All @@ -73,50 +75,52 @@ vi.mock('../../TemplateManager', async (importOriginal) => {
const original = await importOriginal<typeof import('../../TemplateManager')>();
return {
...original,
TemplateManager: vi.fn().mockImplementation(() => ({
createProject: vi
.fn()
.mockImplementation(
async (
_templateName: string,
customFiles: Record<string, string>,
options: Partial<ExportOptions>
) => {
// Create a simple template structure reflecting the *new* base template
const baseTemplate: Record<string, string> = {
'src/App.tsx': '// Base App.tsx placeholder content',
// The base template now has GeneratedForm.tsx as the placeholder file
'src/components/GeneratedForm.tsx':
'export function GeneratedForm() { return <div>Placeholder Content</div>; }',
'src/main.tsx': '// Base main.tsx placeholder content',
'package.json': '{"name":"template","dependencies":{}}',
};

// Process the template - merge custom files, overwriting base placeholders
const result = { ...baseTemplate, ...customFiles };

// No explicit deletion needed anymore - overwriting handles it.

// Simulate PackageManager update for package.json (as before)
if (result['package.json']) {
const packageJson = JSON.parse(result['package.json']);
packageJson.name = options?.projectName || 'default-test-name';
packageJson.dependencies = {
...(packageJson.dependencies || {}),
'@openzeppelin/ui-renderer': '^1.0.0',
'@openzeppelin/ui-types': '^0.1.0',
[`@openzeppelin/adapter-${options.ecosystem || 'evm'}`]: '^0.0.1',
TemplateManager: vi.fn().mockImplementation(function () {
return {
createProject: vi
.fn()
.mockImplementation(
async (
_templateName: string,
customFiles: Record<string, string>,
options: Partial<ExportOptions>
) => {
// Create a simple template structure reflecting the *new* base template
const baseTemplate: Record<string, string> = {
'src/App.tsx': '// Base App.tsx placeholder content',
// The base template now has GeneratedForm.tsx as the placeholder file
'src/components/GeneratedForm.tsx':
'export function GeneratedForm() { return <div>Placeholder Content</div>; }',
'src/main.tsx': '// Base main.tsx placeholder content',
'package.json': '{"name":"template","dependencies":{}}',
};
result['package.json'] = JSON.stringify(packageJson, null, 2);
}

return result;
}
),
// Mock getAvailableTemplates and getTemplateFiles if needed by other tests
getAvailableTemplates: vi.fn().mockResolvedValue(['typescript-react-vite']),
getTemplateFiles: vi.fn().mockResolvedValue({}), // Simplified mock
})),
// Process the template - merge custom files, overwriting base placeholders
const result = { ...baseTemplate, ...customFiles };

// No explicit deletion needed anymore - overwriting handles it.

// Simulate PackageManager update for package.json (as before)
if (result['package.json']) {
const packageJson = JSON.parse(result['package.json']);
packageJson.name = options?.projectName || 'default-test-name';
packageJson.dependencies = {
...(packageJson.dependencies || {}),
'@openzeppelin/ui-renderer': '^1.0.0',
'@openzeppelin/ui-types': '^0.1.0',
[`@openzeppelin/adapter-${options.ecosystem || 'evm'}`]: '^0.0.1',
};
result['package.json'] = JSON.stringify(packageJson, null, 2);
}

return result;
}
),
// Mock getAvailableTemplates and getTemplateFiles if needed by other tests
getAvailableTemplates: vi.fn().mockResolvedValue(['typescript-react-vite']),
getTemplateFiles: vi.fn().mockResolvedValue({}), // Simplified mock
};
}),
};
});

Expand All @@ -129,7 +133,9 @@ const mockTemplateProcessor = {

// Mock the TemplateProcessor module to use the instance above
vi.mock('../TemplateProcessor', () => ({
TemplateProcessor: vi.fn(() => mockTemplateProcessor),
TemplateProcessor: vi.fn(function () {
return mockTemplateProcessor;
}),
}));

// Mock formSchemaFactory used internally by generator
Expand Down
6 changes: 3 additions & 3 deletions apps/builder/src/export/versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
*/

export const packageVersions = {
'@openzeppelin/adapter-evm': '2.0.2',
'@openzeppelin/adapter-evm': '2.1.0',
'@openzeppelin/adapter-midnight': '2.0.1',
'@openzeppelin/adapter-polkadot': '2.0.2',
'@openzeppelin/adapter-polkadot': '2.1.0',
'@openzeppelin/adapter-solana': '2.0.0',
'@openzeppelin/adapter-stellar': '2.0.2',
'@openzeppelin/ui-react': '3.0.0',
'@openzeppelin/ui-renderer': '3.0.0',
'@openzeppelin/ui-storage': '1.2.2',
'@openzeppelin/ui-types': '3.0.0',
'@openzeppelin/ui-types': '3.1.0',
'@openzeppelin/ui-components': '3.0.0',
'@openzeppelin/ui-utils': '3.0.0',
'@openzeppelin/ui-styles': '1.1.0',
Expand Down
14 changes: 7 additions & 7 deletions apps/builder/vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ const virtualModuleMocks: Record<string, string> = {
};

const adapterVitestConfig = await adapters.vitest({
server: {
fs: {
// Allow reading adapter patch files from sibling openzeppelin-adapters checkout
// (used by copyAdapterPatchFiles snapshot/integration tests).
allow: [path.resolve(__dirname, '../..'), path.resolve(__dirname, '../../../openzeppelin-adapters')],
},
},
plugins: [
// Include React plugin from shared config
react(),
Expand Down Expand Up @@ -117,13 +124,6 @@ const adapterVitestConfig = await adapters.vitest({
testTimeout: 30000,
hookTimeout: 30000,
teardownTimeout: 30000,
// Run export tests sequentially to avoid resource contention during
// heavy EVM adapter dynamic imports (which take ~12s each)
poolOptions: {
threads: {
singleThread: false,
},
},
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html', 'json-summary'],
Expand Down
Loading
Loading