greybel-js
Version:
Transpiler/Interpreter for GreyScript. (GreyHack)
47 lines (46 loc) • 1.97 kB
JavaScript
import { DefaultResourceHandler as DefaultInterpreterResourceHandler } from 'greybel-interpreter';
import { ResourceProvider as TranspilerResourceProviderBase } from 'greybel-transpiler';
import path from 'path';
import { DocumentURIBuilder } from './document-uri-builder.js';
import { FileSystemManagerWithCache } from './fs.js';
const createDocumentUriBuilder = (source, fileSystemManager) => {
return new DocumentURIBuilder(path.resolve(source, '..'), fileSystemManager);
};
export class TranspilerResourceProvider extends TranspilerResourceProviderBase {
getHandler() {
const handler = super.getHandler();
const fileSystemManager = new FileSystemManagerWithCache();
return {
...handler,
getTargetRelativeTo: async (source, target) => {
const documentUriBuilder = createDocumentUriBuilder(source, fileSystemManager);
const result = await documentUriBuilder.getPathUseReturnOriginal(target);
return result;
},
has: async (target) => {
return await fileSystemManager.checkFileExists(target);
},
get: async (target) => {
return await fileSystemManager.tryToDecode(target);
}
};
}
}
export class InterpreterResourceProvider extends DefaultInterpreterResourceHandler {
fileSystemManager;
constructor() {
super();
this.fileSystemManager = new FileSystemManagerWithCache();
}
async getTargetRelativeTo(source, target) {
const documentUriBuilder = createDocumentUriBuilder(source, this.fileSystemManager);
const result = await documentUriBuilder.getPathUseReturnOriginal(target);
return result.toString();
}
async has(target) {
return await this.fileSystemManager.checkFileExists(target);
}
async get(target) {
return await this.fileSystemManager.tryToDecode(target);
}
}