@intersystems-community/ascot 0.3.1 → 0.4.1

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/README.md CHANGED
@@ -40,13 +40,13 @@ await ws.hover("file:///T.cls", { line: 5, character: 7 }); // the `x` being wri
40
40
  // "```objectscript\n%DataType = 1\n```"
41
41
  ````
42
42
 
43
- To provide declarations for documents that aren't in the workspace, extend `IrisConnection`,
43
+ To provide declarations for documents that aren't in the workspace, extend `IrisContext`,
44
44
  override the lookups you can answer, and pass an instance:
45
45
 
46
46
  ```ts
47
- import { IrisConnection, type ClassInfo } from "@intersystems-community/ascot";
47
+ import { IrisContext, type ClassInfo } from "@intersystems-community/ascot";
48
48
 
49
- class MyIris extends IrisConnection {
49
+ class MyIris extends IrisContext {
50
50
  override async getCls(cls: string): Promise<ClassInfo | undefined> {
51
51
  return undefined; // look `cls` up, e.g. over IRIS's REST API
52
52
  }
@@ -55,6 +55,22 @@ class MyIris extends IrisConnection {
55
55
  const connected = await createWorkspace(new MyIris());
56
56
  ```
57
57
 
58
+ Or extend `Atelier` with the two Atelier REST API requests, `query` (the rows of
59
+ `/action/query` as a JSON array) and `getDoc` (the text of `/doc/{name}`), and let ascot make
60
+ the lookups itself:
61
+
62
+ ```ts
63
+ import { Atelier } from "@intersystems-community/ascot";
64
+
65
+ class MyAtelier extends Atelier {
66
+ override async getDoc(name: string): Promise<string | undefined> {
67
+ return undefined; // GET /doc/{name}, e.g. with your own credentials and session
68
+ }
69
+ }
70
+
71
+ const connected = await createWorkspace(new MyAtelier());
72
+ ```
73
+
58
74
  `createWorkspace` takes an optional second argument, a `Style` applied to every document:
59
75
 
60
76
  ```ts
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Root } from "../generated/ascot.js" with { "resolution-mode": "import" };
2
- import type { ClassInfo, RoutineSource, Style } from "../generated/interfaces/iris-ascot-common.js" with { "resolution-mode": "import"
2
+ import type { ClassInfo, RoutineInfo, Source, Style } from "../generated/interfaces/iris-ascot-common.js" with { "resolution-mode": "import"
3
3
  };
4
4
  export type * from "../generated/interfaces/iris-ascot-common.js";
5
5
  type RawWorkspace = InstanceType<Root["exported"]["Workspace"]>;
@@ -8,19 +8,23 @@ type RawWorkspace = InstanceType<Root["exported"]["Workspace"]>;
8
8
  export type Workspace = {
9
9
  [K in keyof RawWorkspace]: RawWorkspace[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<Awaited<R>> : RawWorkspace[K];
10
10
  };
11
- export declare class IrisConnection {
11
+ /** What ascot asks about code outside the workspace. A failed lookup throws; ascot then takes
12
+ * what it looked for on trust and says why. */
13
+ export declare class IrisContext {
12
14
  /** A class's own members and metadata. */
13
15
  getCls(_cls: string): Promise<ClassInfo | undefined>;
14
16
  /** The text of `name.inc`. */
15
- getInc(_name: string): Promise<RoutineSource | undefined>;
16
- /** The text of `name.int` or `name.mac`: `{ tag: "none" }` if there is no such routine,
17
- * `val: undefined` if its source isn't available. */
18
- getIntOrMac(_name: string): Promise<{
19
- tag: "none";
20
- } | {
21
- tag: "some";
22
- val: RoutineSource | undefined;
23
- }>;
17
+ getInc(_name: string): Promise<Source | undefined>;
18
+ /** The labels of routine `name`, `undefined` if there is no such routine. */
19
+ getRtn(_name: string): Promise<RoutineInfo | undefined>;
20
+ }
21
+ /** The two Atelier REST API requests, for ascot to make `IrisContext`'s lookups with. A failed
22
+ * request throws, like a failed lookup. */
23
+ export declare class Atelier {
24
+ /** The rows of `/action/query` as a JSON array, each an object keyed by column name. */
25
+ query(_sql: string, _params: string[]): Promise<string>;
26
+ /** The text of `/doc/{name}`, `undefined` if there is no such document. */
27
+ getDoc(_name: string): Promise<string | undefined>;
24
28
  }
25
29
  /** A workspace whose calls run one at a time, resolving what it doesn't contain through `iris`. */
26
- export declare function createWorkspace(iris?: IrisConnection, style?: Style): Promise<Workspace>;
30
+ export declare function createWorkspace(iris?: IrisContext | Atelier, style?: Style): Promise<Workspace>;
package/dist/index.js CHANGED
@@ -33,11 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.IrisConnection = void 0;
36
+ exports.Atelier = exports.IrisContext = void 0;
37
37
  exports.createWorkspace = createWorkspace;
38
38
  const fs = __importStar(require("node:fs"));
39
39
  const path = __importStar(require("node:path"));
40
- class IrisConnection {
40
+ /** What ascot asks about code outside the workspace. A failed lookup throws; ascot then takes
41
+ * what it looked for on trust and says why. */
42
+ class IrisContext {
41
43
  /** A class's own members and metadata. */
42
44
  async getCls(_cls) {
43
45
  return undefined;
@@ -46,16 +48,28 @@ class IrisConnection {
46
48
  async getInc(_name) {
47
49
  return undefined;
48
50
  }
49
- /** The text of `name.int` or `name.mac`: `{ tag: "none" }` if there is no such routine,
50
- * `val: undefined` if its source isn't available. */
51
- async getIntOrMac(_name) {
52
- return { tag: "some", val: undefined };
51
+ /** The labels of routine `name`, `undefined` if there is no such routine. */
52
+ async getRtn(_name) {
53
+ return { labels: undefined, uri: undefined };
53
54
  }
54
55
  }
55
- exports.IrisConnection = IrisConnection;
56
+ exports.IrisContext = IrisContext;
57
+ /** The two Atelier REST API requests, for ascot to make `IrisContext`'s lookups with. A failed
58
+ * request throws, like a failed lookup. */
59
+ class Atelier {
60
+ /** The rows of `/action/query` as a JSON array, each an object keyed by column name. */
61
+ async query(_sql, _params) {
62
+ throw new Error("no IRIS connection");
63
+ }
64
+ /** The text of `/doc/{name}`, `undefined` if there is no such document. */
65
+ async getDoc(_name) {
66
+ throw new Error("no IRIS connection");
67
+ }
68
+ }
69
+ exports.Atelier = Atelier;
56
70
  const wasm = import("../generated/ascot.js").then(({ instantiate }) => instantiate((name) => new WebAssembly.Module(fs.readFileSync(path.resolve(__dirname, "../lib", name))), {
57
71
  "iris:ascot/common": {},
58
- "iris:ascot/imported": { IrisConnection },
72
+ "iris:ascot/imported": { IrisContext, Atelier },
59
73
  }));
60
74
  wasm.catch(() => { }); // reported by createWorkspace instead
61
75
  // jco's jspi glue allows only one in-flight suspended call per component instance --
@@ -87,6 +101,48 @@ function serialize(instance) {
87
101
  /** A workspace whose calls run one at a time, resolving what it doesn't contain through `iris`. */
88
102
  async function createWorkspace(iris, style) {
89
103
  const root = await wasm;
90
- return serialize(new root.exported.Workspace(iris, style));
104
+ const env = iris instanceof Atelier
105
+ ? { tag: "atelier", val: new FailingAtelier(iris) }
106
+ : iris && { tag: "context", val: new FailingContext(iris) };
107
+ return serialize(new root.exported.Workspace(env, style));
108
+ }
109
+ // jco rethrows a thrown `Error` to the caller, and hands ascot only a thrown `{ payload }` as the
110
+ // failure; so what the host throws becomes one.
111
+ class FailingContext extends IrisContext {
112
+ inner;
113
+ constructor(inner) {
114
+ super();
115
+ this.inner = inner;
116
+ }
117
+ getCls(cls) {
118
+ return payload(() => this.inner.getCls(cls));
119
+ }
120
+ getInc(name) {
121
+ return payload(() => this.inner.getInc(name));
122
+ }
123
+ getRtn(name) {
124
+ return payload(() => this.inner.getRtn(name));
125
+ }
126
+ }
127
+ class FailingAtelier extends Atelier {
128
+ inner;
129
+ constructor(inner) {
130
+ super();
131
+ this.inner = inner;
132
+ }
133
+ query(sql, params) {
134
+ return payload(() => this.inner.query(sql, params));
135
+ }
136
+ getDoc(name) {
137
+ return payload(() => this.inner.getDoc(name));
138
+ }
139
+ }
140
+ async function payload(request) {
141
+ try {
142
+ return await request();
143
+ }
144
+ catch (e) {
145
+ throw { payload: e instanceof Error ? e.message : String(e) };
146
+ }
91
147
  }
92
148
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAY,EAAE,oCAAgB;AAC9B,MAAY,IAAI,sCAAkB;AA4BlC;IACC,0CAA0C;IAC1C,KAAK,CAAC,MAAM,CAAC,IAAY;QACxB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,8BAA8B;IAC9B,KAAK,CAAC,MAAM,CAAC,KAAa;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD;yDACqD;IACrD,KAAK,CAAC,WAAW,CAChB,KAAa;QAEb,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;CACD;;AAED,MAAM,IAAI,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CACpF,WAAW,CACV,CAAC,IAAY,EAAE,EAAE,CAChB,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EACjF;IACC,mBAAmB,EAAE,EAAE;IACvB,qBAAqB,EAAE,EAAE,cAAc,EAAE;CAChC,CACV,CACD,CAAC;AACF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,sCAAsC;AAE5D,qFAAqF;AACrF,qFAAqF;AACrF,wFAAwF;AACxF,kEAAkE;AAClE,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAE5C,SAAS,SAAS,CAAC,QAAsB;IACxC,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC1B,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,OAAO,KAAK,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC9C,OAAO,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC;gBAClB,IAAI,OAAoB,CAAC;gBACzB,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;gBAC3D,MAAM,IAAI,CAAC;gBACX,IAAI,CAAC;oBACJ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxC,CAAC;wBAAS,CAAC;oBACV,OAAO,EAAE,CAAC;gBACX,CAAC;YACF,CAAC,CAAC;QACH,CAAC;KACD,CAAyB,CAAC;AAC5B,CAAC;AAED,mGAAmG;AAC5F,KAAK,0BAA0B,IAAqB,EAAE,KAAa;IACzE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACxB,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}