Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
import {Project} from '@yarnpkg/core';
import {PortablePath} from '@yarnpkg/fslib';
import getPath from 'lodash/get';
import pl from 'tau-prolog';
// eslint-disable-next-line @typescript-eslint/camelcase
const {is_atom: isAtom} = pl.type;
function prependGoals(thread: pl.type.Thread, point: pl.type.State, goals: pl.type.Term[]): void {
thread.prepend(goals.map(
goal => new pl.type.State(
point.goal.replace(goal),
point.substitution,
point,
),
));
}
const projects = new WeakMap();
function getProject(thread: pl.type.Thread): Project {
const project = projects.get(thread.session);
[`workspace_field/3`]: (thread, point, atom) => {
const [workspaceCwd, fieldName, fieldValue] = atom.args;
if (!isAtom(workspaceCwd) || !isAtom(fieldName)) {
thread.throwError(pl.error.instantiation(atom.indicator));
return;
}
const project = getProject(thread);
const workspace = project.tryWorkspaceByCwd(workspaceCwd.id as PortablePath);
// Workspace not found => this predicate can never match
// We might want to throw here? We can be pretty sure the user did
// something wrong at this point
if (workspace == null)
return;
const value = getPath(workspace.manifest.raw!, fieldName.id);
// Field is not present => this predicate can never match
if (typeof value === `undefined`)
function extractErrorImpl(value: any): any {
if (value instanceof pl.type.Num)
return value.value;
if (value instanceof pl.type.Term) {
if (value.args.length === 0)
return value.id;
switch (value.indicator) {
case `throw/1`:
return extractErrorImpl(value.args[0]);
case `error/1`:
return extractErrorImpl(value.args[0]);
case `error/2`:
return Object.assign(extractErrorImpl(value.args[0]), ...extractErrorImpl(value.args[1]));
case `syntax_error/1`:
return new ReportError(MessageName.PROLOG_SYNTAX_ERROR, `Syntax error: ${extractErrorImpl(value.args[0])}`);
case `existence_error/2`:
return new ReportError(MessageName.PROLOG_EXISTENCE_ERROR, `Existence error: ${extractErrorImpl(value.args[0])} ${extractErrorImpl(value.args[1])} not found`);
case `line/1`:
return {line: extractErrorImpl(value.args[0])};
function extractErrorImpl(value: any): any {
if (value instanceof pl.type.Num)
return value.value;
if (value instanceof pl.type.Term) {
if (value.args.length === 0)
return value.id;
switch (value.indicator) {
case `throw/1`:
return extractErrorImpl(value.args[0]);
case `error/1`:
return extractErrorImpl(value.args[0]);
case `error/2`:
return Object.assign(extractErrorImpl(value.args[0]), ...extractErrorImpl(value.args[1]));
case `syntax_error/1`:
return new ReportError(MessageName.PROLOG_SYNTAX_ERROR, `Syntax error: ${extractErrorImpl(value.args[0])}`);
case `existence_error/2`:
goal => new pl.type.State(
point.goal.replace(goal),
point.substitution,
point,
),
));
public constructor(project: Project, source: string) {
this.session = pl.create();
linkProjectToSession(this.session, project);
this.session.consult(source);
}