greybel-interpreter 1.7.2 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cps.js CHANGED
@@ -36,6 +36,7 @@ const not_1 = require("./operations/not");
36
36
  const resolve_1 = require("./operations/resolve");
37
37
  const return_1 = require("./operations/return");
38
38
  const while_1 = require("./operations/while");
39
+ const error_1 = require("./utils/error");
39
40
  class CPSContext {
40
41
  constructor(target, handler) {
41
42
  this.target = target;
@@ -87,11 +88,22 @@ const visit = (context, stack, item) => __awaiter(void 0, void 0, void 0, functi
87
88
  }
88
89
  const code = yield context.handler.resourceHandler.get(target);
89
90
  if (code == null) {
90
- throw new Error(`Cannot find import ${currentTarget}.`);
91
+ throw new error_1.PrepareError(`Cannot find import ${currentTarget}.`, {
92
+ target: currentTarget,
93
+ item
94
+ });
95
+ }
96
+ try {
97
+ const subVisit = visit.bind(null, context, [...stack, target]);
98
+ const importStatement = yield new import_1.Import(importExpr, target, code).build(subVisit);
99
+ return importStatement;
100
+ }
101
+ catch (err) {
102
+ throw new error_1.PrepareError(err.message, {
103
+ target: currentTarget,
104
+ item
105
+ });
91
106
  }
92
- const subVisit = visit.bind(null, context, [...stack, target]);
93
- const importStatement = yield new import_1.Import(importExpr, target, code).build(subVisit);
94
- return importStatement;
95
107
  }
96
108
  case greybel_core_1.ASTType.FeatureIncludeExpression: {
97
109
  const includeExpr = item;
@@ -102,26 +114,52 @@ const visit = (context, stack, item) => __awaiter(void 0, void 0, void 0, functi
102
114
  }
103
115
  const code = yield context.handler.resourceHandler.get(target);
104
116
  if (code == null) {
105
- throw new Error(`Cannot find include ${currentTarget}.`);
117
+ throw new error_1.PrepareError(`Cannot find include ${currentTarget}.`, {
118
+ target: currentTarget,
119
+ item
120
+ });
121
+ }
122
+ try {
123
+ const subVisit = visit.bind(null, context, [...stack, target]);
124
+ const importStatement = yield new include_1.Include(includeExpr, target, code).build(subVisit);
125
+ return importStatement;
126
+ }
127
+ catch (err) {
128
+ throw new error_1.PrepareError(err.message, {
129
+ target: currentTarget,
130
+ item
131
+ });
106
132
  }
107
- const subVisit = visit.bind(null, context, [...stack, target]);
108
- const importStatement = yield new include_1.Include(includeExpr, target, code).build(subVisit);
109
- return importStatement;
110
133
  }
111
134
  case greyscript_core_1.ASTType.ImportCodeExpression: {
112
135
  const importExpr = item;
136
+ if (importExpr.fileSystemDirectory === null) {
137
+ console.warn(`Ignoring dependency in ${currentTarget}. Using noop operation.`);
138
+ return new noop_1.Noop(item, currentTarget);
139
+ }
113
140
  const target = yield context.handler.resourceHandler.getTargetRelativeTo(currentTarget, importExpr.fileSystemDirectory);
114
141
  if (stack.includes(target)) {
115
- console.warn('Found circluar dependency. Using noop operation.');
142
+ console.warn(`Found circluar dependency in ${currentTarget}. Using noop operation.`);
116
143
  return new noop_1.Noop(item, target);
117
144
  }
118
145
  const code = yield context.handler.resourceHandler.get(target);
119
146
  if (code == null) {
120
- throw new Error(`Cannot find native import ${currentTarget}.`);
147
+ throw new error_1.PrepareError(`Cannot find native import ${currentTarget}.`, {
148
+ target: currentTarget,
149
+ item
150
+ });
151
+ }
152
+ try {
153
+ const subVisit = visit.bind(null, context, [...stack, target]);
154
+ const importStatement = yield new include_1.Include(importExpr, target, code).build(subVisit);
155
+ return importStatement;
156
+ }
157
+ catch (err) {
158
+ throw new error_1.PrepareError(err.message, {
159
+ target: currentTarget,
160
+ item
161
+ });
121
162
  }
122
- const subVisit = visit.bind(null, context, [...stack, target]);
123
- const importStatement = yield new include_1.Include(importExpr, target, code).build(subVisit);
124
- return importStatement;
125
163
  }
126
164
  case greybel_core_1.ASTType.FeatureDebuggerExpression:
127
165
  return new debugger_statement_1.DebuggerStatement(item, currentTarget);
@@ -150,7 +188,9 @@ const visit = (context, stack, item) => __awaiter(void 0, void 0, void 0, functi
150
188
  else if (unaryExpr.operator === '@') {
151
189
  return new function_reference_1.FunctionReference(unaryExpr).build(defaultVisit);
152
190
  }
153
- throw new Error('Unknown unary expression.');
191
+ throw new error_1.RuntimeError('Unknown unary expression.', {
192
+ target: currentTarget
193
+ });
154
194
  }
155
195
  case greyscript_core_1.ASTType.Chunk:
156
196
  return new chunk_1.Chunk(item, currentTarget).build(defaultVisit);
@@ -159,7 +199,9 @@ const visit = (context, stack, item) => __awaiter(void 0, void 0, void 0, functi
159
199
  case greyscript_core_1.ASTType.ParenthesisExpression:
160
200
  return defaultVisit(item.expression);
161
201
  default:
162
- throw new Error(`Unexpected AST type ${item.type}.`);
202
+ throw new error_1.RuntimeError(`Unexpected AST type ${item.type}.`, {
203
+ target: currentTarget
204
+ });
163
205
  }
164
206
  });
165
207
  class CPS {
package/dist/index.d.ts CHANGED
@@ -42,5 +42,6 @@ export { CustomNumber } from './types/number';
42
42
  export { CustomString, CustomStringIterator } from './types/string';
43
43
  export { CustomObject, CustomValueWithIntrinsics } from './types/with-intrinsics';
44
44
  export { deepEqual } from './utils/deep-equal';
45
+ export { PrepareError, RuntimeError } from './utils/error';
45
46
  export { ObjectValue } from './utils/object-value';
46
47
  export { Path } from './utils/path';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Not = exports.Noop = exports.NewInstance = exports.NegatedBinary = exports.MapOperation = exports.Literal = exports.List = exports.Include = exports.Import = exports.IfStatement = exports.Clause = exports.FunctionOperation = exports.For = exports.StringProcessorHandler = exports.NumberProcessorHandler = exports.MapProcessorHandler = exports.ListProcessorHandler = exports.handleString = exports.handleNumber = exports.handleMap = exports.handleList = exports.handleInterface = exports.handle = exports.GenericProcessorHandler = exports.Evaluate = exports.DebuggerStatement = exports.Continue = exports.Chunk = exports.Call = exports.Break = exports.Block = exports.Assign = exports.Interpreter = exports.HandlerContainer = exports.ResourceHandler = exports.DefaultResourceHandler = exports.OutputHandler = exports.DefaultOutputHandler = exports.ErrorHandler = exports.DefaultErrorHandler = exports.CPSContext = exports.CPS = exports.Scope = exports.ProcessState = exports.OperationContext = exports.LoopState = exports.FunctionState = exports.Debugger = exports.ContextType = exports.ContextState = void 0;
4
- exports.Path = exports.ObjectValue = exports.deepEqual = exports.CustomValueWithIntrinsics = exports.CustomObject = exports.CustomStringIterator = exports.CustomString = exports.CustomNumber = exports.CustomNil = exports.CustomMapIterator = exports.CustomMap = exports.CustomListIterator = exports.CustomList = exports.CustomInterfaceIterator = exports.CustomInterface = exports.CustomFunction = exports.Argument = exports.DefaultType = exports.CustomBoolean = exports.CustomValue = exports.While = exports.Return = exports.ResolveResult = exports.Resolve = exports.OperationSegment = exports.IndexSegment = exports.IdentifierSegment = exports.Reference = exports.Operation = void 0;
4
+ exports.Path = exports.ObjectValue = exports.RuntimeError = exports.PrepareError = exports.deepEqual = exports.CustomValueWithIntrinsics = exports.CustomObject = exports.CustomStringIterator = exports.CustomString = exports.CustomNumber = exports.CustomNil = exports.CustomMapIterator = exports.CustomMap = exports.CustomListIterator = exports.CustomList = exports.CustomInterfaceIterator = exports.CustomInterface = exports.CustomFunction = exports.Argument = exports.DefaultType = exports.CustomBoolean = exports.CustomValue = exports.While = exports.Return = exports.ResolveResult = exports.Resolve = exports.OperationSegment = exports.IndexSegment = exports.IdentifierSegment = exports.Reference = exports.Operation = void 0;
5
5
  var context_1 = require("./context");
6
6
  Object.defineProperty(exports, "ContextState", { enumerable: true, get: function () { return context_1.ContextState; } });
7
7
  Object.defineProperty(exports, "ContextType", { enumerable: true, get: function () { return context_1.ContextType; } });
@@ -123,6 +123,9 @@ Object.defineProperty(exports, "CustomObject", { enumerable: true, get: function
123
123
  Object.defineProperty(exports, "CustomValueWithIntrinsics", { enumerable: true, get: function () { return with_intrinsics_1.CustomValueWithIntrinsics; } });
124
124
  var deep_equal_1 = require("./utils/deep-equal");
125
125
  Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return deep_equal_1.deepEqual; } });
126
+ var error_2 = require("./utils/error");
127
+ Object.defineProperty(exports, "PrepareError", { enumerable: true, get: function () { return error_2.PrepareError; } });
128
+ Object.defineProperty(exports, "RuntimeError", { enumerable: true, get: function () { return error_2.RuntimeError; } });
126
129
  var object_value_1 = require("./utils/object-value");
127
130
  Object.defineProperty(exports, "ObjectValue", { enumerable: true, get: function () { return object_value_1.ObjectValue; } });
128
131
  var path_1 = require("./utils/path");
@@ -21,6 +21,7 @@ const list_1 = require("./types/list");
21
21
  const map_1 = require("./types/map");
22
22
  const number_1 = require("./types/number");
23
23
  const string_1 = require("./types/string");
24
+ const error_1 = require("./utils/error");
24
25
  const object_value_1 = require("./utils/object-value");
25
26
  exports.PARAMS_PROPERTY = new string_1.CustomString('params');
26
27
  class Interpreter extends events_1.EventEmitter {
@@ -88,7 +89,15 @@ class Interpreter extends events_1.EventEmitter {
88
89
  return this.cps.visit(chunk);
89
90
  }
90
91
  catch (err) {
91
- this.handler.errorHandler.raise(err);
92
+ if (err instanceof error_1.PrepareError) {
93
+ this.handler.errorHandler.raise(err);
94
+ }
95
+ else {
96
+ this.handler.errorHandler.raise(new error_1.PrepareError(err.message, {
97
+ item: null,
98
+ target: this.target
99
+ }));
100
+ }
92
101
  }
93
102
  return Promise.resolve(new noop_1.Noop(null));
94
103
  }
@@ -104,7 +113,12 @@ class Interpreter extends events_1.EventEmitter {
104
113
  yield top.handle(injectionCtx);
105
114
  }
106
115
  catch (err) {
107
- this.handler.errorHandler.raise(err);
116
+ if (err instanceof error_1.PrepareError) {
117
+ this.handler.errorHandler.raise(err);
118
+ }
119
+ else {
120
+ this.handler.errorHandler.raise(new error_1.RuntimeError(err.message, this.apiContext.getLastActive()));
121
+ }
108
122
  }
109
123
  return this;
110
124
  });
@@ -149,7 +163,12 @@ class Interpreter extends events_1.EventEmitter {
149
163
  yield process;
150
164
  }
151
165
  catch (err) {
152
- this.handler.errorHandler.raise(err);
166
+ if (err instanceof error_1.PrepareError) {
167
+ this.handler.errorHandler.raise(err);
168
+ }
169
+ else {
170
+ this.handler.errorHandler.raise(new error_1.RuntimeError(err.message, this.apiContext.getLastActive()));
171
+ }
153
172
  }
154
173
  finally {
155
174
  this.apiContext.setPending(false);
@@ -0,0 +1,23 @@
1
+ import { ASTBase } from 'greyscript-core';
2
+ interface RuntimeContext {
3
+ previous?: RuntimeContext;
4
+ stackItem?: ASTBase;
5
+ target: string;
6
+ }
7
+ export declare class RuntimeError extends Error {
8
+ relatedItem: ASTBase | null;
9
+ relatedTarget: string;
10
+ stackTrace: Set<ASTBase>;
11
+ constructor(message: string, context: RuntimeContext);
12
+ private createTrace;
13
+ }
14
+ interface PrepareContext {
15
+ item: ASTBase;
16
+ target: string;
17
+ }
18
+ export declare class PrepareError extends Error {
19
+ relatedItem: ASTBase | null;
20
+ relatedTarget: string;
21
+ constructor(message: string, context: PrepareContext);
22
+ }
23
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PrepareError = exports.RuntimeError = void 0;
4
+ class RuntimeError extends Error {
5
+ constructor(message, context) {
6
+ super(message);
7
+ this.relatedItem = context.stackItem || null;
8
+ this.relatedTarget = context.target;
9
+ this.stackTrace = this.createTrace(context);
10
+ }
11
+ createTrace(context) {
12
+ const result = new Set();
13
+ let item = context;
14
+ while (item) {
15
+ result.add(item.stackItem);
16
+ item = item.previous;
17
+ }
18
+ return result;
19
+ }
20
+ }
21
+ exports.RuntimeError = RuntimeError;
22
+ class PrepareError extends Error {
23
+ constructor(message, context) {
24
+ super(message);
25
+ this.relatedItem = context.item;
26
+ this.relatedTarget = context.target;
27
+ }
28
+ }
29
+ exports.PrepareError = PrepareError;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "greybel-interpreter",
3
- "version": "1.7.2",
3
+ "version": "1.7.3",
4
4
  "description": "Interpreter",
5
5
  "main": "dist/index",
6
6
  "typings": "dist/index",