Skip to content

Commit 03bc63c

Browse files
committed
Read schema from file
1 parent 916b840 commit 03bc63c

File tree

6 files changed

+47
-72
lines changed

6 files changed

+47
-72
lines changed

extensions/ql-vscode/src/databases/db-config-store.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,25 @@ import * as path from 'path';
33
import { cloneDbConfig, DbConfig } from './db-config';
44
import * as chokidar from 'chokidar';
55
import { DisposableObject } from '../pure/disposable-object';
6-
import { validateDbConfig } from './db-config-validation';
6+
import { DbConfigValidator } from './db-config-validator';
77

88
export class DbConfigStore extends DisposableObject {
99
private readonly configPath: string;
10+
private readonly configValidator: DbConfigValidator;
1011

1112
private config: DbConfig;
1213
private configWatcher: chokidar.FSWatcher | undefined;
1314

14-
public constructor(workspaceStoragePath: string) {
15+
public constructor(
16+
workspaceStoragePath: string,
17+
extensionPath: string) {
1518
super();
1619

1720
this.configPath = path.join(workspaceStoragePath, 'workspace-databases.json');
1821

1922
this.config = this.createEmptyConfig();
2023
this.configWatcher = undefined;
24+
this.configValidator = new DbConfigValidator(extensionPath);
2125
}
2226

2327
public async initialize(): Promise<void> {
@@ -34,8 +38,12 @@ export class DbConfigStore extends DisposableObject {
3438
return cloneDbConfig(this.config);
3539
}
3640

41+
public getConfigPath(): string {
42+
return this.configPath;
43+
}
44+
3745
public validateConfig(): string[] {
38-
return validateDbConfig(this.config);
46+
return this.configValidator.validate(this.config);
3947
}
4048

4149
private async loadConfig(): Promise<void> {

extensions/ql-vscode/src/databases/db-config-validation.ts

Lines changed: 0 additions & 63 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as fs from 'fs-extra';
2+
import * as path from 'path';
3+
import Ajv from 'ajv';
4+
import { DbConfig } from './db-config';
5+
6+
export class DbConfigValidator {
7+
private readonly schema: any;
8+
9+
constructor(extensionPath: string) {
10+
const schemaPath = path.resolve(extensionPath, 'workspace-databases-schema.json');
11+
this.schema = fs.readJsonSync(schemaPath);
12+
}
13+
14+
public validate(dbConfig: DbConfig): string[] {
15+
const ajv = new Ajv({ allErrors: true });
16+
ajv.validate(this.schema, dbConfig);
17+
18+
if (ajv.errors) {
19+
return ajv.errors.map((error) => `${error.instancePath} ${error.message}`);
20+
}
21+
22+
return [];
23+
}
24+
}

extensions/ql-vscode/src/databases/db-module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export class DbModule extends DisposableObject {
2222
void logger.log('Initializing database module');
2323

2424
const storagePath = extensionContext.storageUri?.fsPath || extensionContext.globalStorageUri.fsPath;
25-
const dbConfigStore = new DbConfigStore(storagePath);
25+
const extensionPath = extensionContext.extensionPath;
26+
const dbConfigStore = new DbConfigStore(storagePath, extensionPath);
2627
await dbConfigStore.initialize();
2728

2829
const dbManager = new DbManager(dbConfigStore);

extensions/ql-vscode/test/pure-tests/databases/db-config-store.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DbConfigStore } from '../../../src/databases/db-config-store';
44
import { expect } from 'chai';
55

66
describe('db config store', async () => {
7+
const extensionPath = path.join(__dirname, '../../..');
78
const tempWorkspaceStoragePath = path.join(__dirname, 'test-workspace');
89
const testDataStoragePath = path.join(__dirname, 'data');
910

@@ -18,7 +19,7 @@ describe('db config store', async () => {
1819
it('should create a new config if one does not exist', async () => {
1920
const configPath = path.join(tempWorkspaceStoragePath, 'workspace-databases.json');
2021

21-
const configStore = new DbConfigStore(tempWorkspaceStoragePath);
22+
const configStore = new DbConfigStore(tempWorkspaceStoragePath, extensionPath);
2223
await configStore.initialize();
2324

2425
expect(await fs.pathExists(configPath)).to.be.true;
@@ -29,7 +30,7 @@ describe('db config store', async () => {
2930
});
3031

3132
it('should load an existing config', async () => {
32-
const configStore = new DbConfigStore(testDataStoragePath);
33+
const configStore = new DbConfigStore(testDataStoragePath, extensionPath);
3334
await configStore.initialize();
3435

3536
const config = configStore.getConfig();
@@ -44,7 +45,7 @@ describe('db config store', async () => {
4445
});
4546

4647
it('should not allow modification of the config', async () => {
47-
const configStore = new DbConfigStore(testDataStoragePath);
48+
const configStore = new DbConfigStore(testDataStoragePath, extensionPath);
4849
await configStore.initialize();
4950

5051
const config = configStore.getConfig();

extensions/ql-vscode/test/pure-tests/databases/db-config-validation.test.ts renamed to extensions/ql-vscode/test/pure-tests/databases/db-config-validator.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { expect } from 'chai';
2-
import { validateDbConfig } from '../../../src/databases/db-config-validation';
2+
import * as path from 'path';
33
import { DbConfig } from '../../../src/databases/db-config';
4+
import { DbConfigValidator } from '../../../src/databases/db-config-validator';
45

56
describe('db config validation', async () => {
7+
const extensionPath = path.join(__dirname, '../../..');
8+
const configValidator = new DbConfigValidator(extensionPath);
9+
610
it('should return error when file is not valid', async () => {
711
// We're intentionally bypassing the type check because we'd
812
// like to make sure validation errors are highlighted.
@@ -19,7 +23,7 @@ describe('db config validation', async () => {
1923
}
2024
} as any as DbConfig;
2125

22-
const validationOutput = validateDbConfig(dbConfig);
26+
const validationOutput = configValidator.validate(dbConfig);
2327

2428
expect(validationOutput).to.have.length(2);
2529

0 commit comments

Comments
 (0)