@wandelbots/nova-js 3.9.0-pr.280.2b62f3c → 3.9.0-pr.280.432dc39

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.
Files changed (56) hide show
  1. package/README.md +11 -12
  2. package/dist/{AutoReconnectingWebsocket-DEs8wlLZ.d.cts → AutoReconnectingWebsocket-DNOF9mpz.d.cts} +2 -1
  3. package/dist/AutoReconnectingWebsocket-DNOF9mpz.d.cts.map +1 -0
  4. package/dist/{AutoReconnectingWebsocket-DEs8wlLZ.d.mts → AutoReconnectingWebsocket-DNOF9mpz.d.mts} +2 -1
  5. package/dist/AutoReconnectingWebsocket-DNOF9mpz.d.mts.map +1 -0
  6. package/dist/index.cjs +1 -1
  7. package/dist/index.d.cts +2 -2
  8. package/dist/index.d.mts +2 -2
  9. package/dist/index.mjs +1 -1
  10. package/dist/lib/deprecated/v1/index.cjs +4 -1
  11. package/dist/lib/deprecated/v1/index.cjs.map +1 -1
  12. package/dist/lib/deprecated/v1/index.d.cts +7 -2
  13. package/dist/lib/deprecated/v1/index.d.cts.map +1 -1
  14. package/dist/lib/deprecated/v1/index.d.mts +7 -2
  15. package/dist/lib/deprecated/v1/index.d.mts.map +1 -1
  16. package/dist/lib/deprecated/v1/index.mjs +4 -1
  17. package/dist/lib/deprecated/v1/index.mjs.map +1 -1
  18. package/dist/lib/v2/index.cjs +38 -25
  19. package/dist/lib/v2/index.cjs.map +1 -1
  20. package/dist/lib/v2/index.d.cts +45 -39
  21. package/dist/lib/v2/index.d.cts.map +1 -1
  22. package/dist/lib/v2/index.d.mts +45 -39
  23. package/dist/lib/v2/index.d.mts.map +1 -1
  24. package/dist/lib/v2/index.mjs +38 -24
  25. package/dist/lib/v2/index.mjs.map +1 -1
  26. package/dist/{wandelscriptUtils-Cz-yQ2eJ.d.mts → wandelscriptUtils-1A9uFPV_.d.cts} +13 -3
  27. package/dist/wandelscriptUtils-1A9uFPV_.d.cts.map +1 -0
  28. package/dist/{wandelscriptUtils-CsQAUu_9.mjs → wandelscriptUtils-C7hQePlo.mjs} +12 -5
  29. package/dist/wandelscriptUtils-C7hQePlo.mjs.map +1 -0
  30. package/dist/{wandelscriptUtils-BvZ8hcul.cjs → wandelscriptUtils-P0WYSZww.cjs} +12 -6
  31. package/dist/wandelscriptUtils-P0WYSZww.cjs.map +1 -0
  32. package/dist/{wandelscriptUtils-_Si3ueEd.d.cts → wandelscriptUtils-pySXnBlX.d.mts} +13 -3
  33. package/dist/wandelscriptUtils-pySXnBlX.d.mts.map +1 -0
  34. package/package.json +2 -3
  35. package/src/lib/deprecated/v1/ConnectedMotionGroup.ts +2 -0
  36. package/src/lib/deprecated/v1/JoggerConnection.ts +2 -0
  37. package/src/lib/deprecated/v1/MotionStreamConnection.ts +1 -0
  38. package/src/lib/deprecated/v1/NovaCellAPIClient.ts +3 -0
  39. package/src/lib/deprecated/v1/NovaClient.ts +8 -8
  40. package/src/lib/deprecated/v1/ProgramStateConnection.ts +4 -0
  41. package/src/lib/deprecated/v1/getLatestTrajectories.ts +1 -0
  42. package/src/lib/deprecated/v1/mock/MockNovaInstance.ts +1 -0
  43. package/src/lib/deprecated/v1/motionStateUpdate.ts +2 -0
  44. package/src/lib/deprecated/v1/wandelscriptUtils.ts +1 -0
  45. package/src/lib/deprecated/v2/NovaCellAPIClient.ts +3 -0
  46. package/src/lib/deprecated/v2/NovaClient.ts +9 -9
  47. package/src/lib/deprecated/v2/wandelscriptUtils.ts +1 -0
  48. package/src/lib/v2/Nova.ts +10 -9
  49. package/src/lib/v2/NovaAPIClient.ts +83 -96
  50. package/src/lib/v2/index.ts +1 -1
  51. package/dist/AutoReconnectingWebsocket-DEs8wlLZ.d.cts.map +0 -1
  52. package/dist/AutoReconnectingWebsocket-DEs8wlLZ.d.mts.map +0 -1
  53. package/dist/wandelscriptUtils-BvZ8hcul.cjs.map +0 -1
  54. package/dist/wandelscriptUtils-CsQAUu_9.mjs.map +0 -1
  55. package/dist/wandelscriptUtils-Cz-yQ2eJ.d.mts.map +0 -1
  56. package/dist/wandelscriptUtils-_Si3ueEd.d.cts.map +0 -1
@@ -1,6 +1,5 @@
1
- import { n as MockNovaInstance, t as AutoReconnectingWebsocket } from "../../AutoReconnectingWebsocket-DEs8wlLZ.mjs";
1
+ import { n as MockNovaInstance, t as AutoReconnectingWebsocket } from "../../AutoReconnectingWebsocket-DNOF9mpz.mjs";
2
2
  import { AxiosInstance } from "axios";
3
- import * as novaApiV2 from "@wandelbots/nova-api/v2";
4
3
  import { ApplicationApi, BUSInputsOutputsApi, CellApi, Configuration, ControllerApi, ControllerInputsOutputsApi, JoggingApi, KinematicsApi, LicenseApi, MotionGroupApi, MotionGroupModelsApi, NOVACloudApi, Pose, ProgramApi, RobotConfigurationsApi, SessionApi, StoreCollisionComponentsApi, StoreCollisionSetupsApi, StoreObjectApi, SystemApi, TrajectoryCachingApi, TrajectoryExecutionApi, TrajectoryPlanningApi, VersionApi, VirtualControllerApi, VirtualControllerBehaviorApi, VirtualControllerInputsOutputsApi } from "@wandelbots/nova-api/v2";
5
4
  export * from "@wandelbots/nova-api/v2";
6
5
 
@@ -9,11 +8,14 @@ type OmitFirstArg<F> = F extends ((x: any, ...args: infer P) => infer R) ? (...a
9
8
  type UnwrapAxiosResponseReturn$1<T> = T extends ((...a: any) => any) ? (...a: Parameters<T>) => Promise<Awaited<ReturnType<T>> extends {
10
9
  data: infer D;
11
10
  } ? D : never> : never;
11
+ /** @deprecated Use `NovaAPIClient` instead. */
12
12
  type WithCellId<T> = { [P in keyof T]: UnwrapAxiosResponseReturn$1<OmitFirstArg<T[P]>> };
13
+ /** @deprecated Use `NovaAPIClient` instead. */
13
14
  type WithUnwrappedAxiosResponse<T> = { [P in keyof T]: UnwrapAxiosResponseReturn$1<T[P]> };
14
15
  /**
15
16
  * API client providing type-safe access to all the Nova API REST endpoints
16
17
  * associated with a specific cell id.
18
+ * @deprecated Use `NovaAPIClient` from `@wandelbots/nova-js/v2` instead.
17
19
  */
18
20
  declare class NovaCellAPIClient {
19
21
  readonly cellId: string;
@@ -64,7 +66,8 @@ declare class NovaCellAPIClient {
64
66
  }
65
67
  //#endregion
66
68
  //#region src/lib/deprecated/v2/NovaClient.d.ts
67
- type NovaClientConfig$1 = {
69
+ /** @deprecated Use `NovaClientConfig` from `Nova` instead. */
70
+ type NovaClientConfig = {
68
71
  /**
69
72
  * Url of the deployed Nova instance to connect to
70
73
  * e.g. https://saeattii.instance.wandelbots.io
@@ -90,12 +93,12 @@ type NovaClientConfig$1 = {
90
93
  */
91
94
  accessToken?: string;
92
95
  } & Omit<Configuration, "isJsonMime" | "basePath">;
93
- type NovaClientConfigWithDefaults = NovaClientConfig$1 & {
96
+ type NovaClientConfigWithDefaults = NovaClientConfig & {
94
97
  cellId: string;
95
98
  };
96
99
  /**
97
- *
98
100
  * Client for connecting to a Nova instance and controlling robots.
101
+ * @deprecated Use `Nova` from `@wandelbots/nova-js/v2` instead.
99
102
  */
100
103
  declare class NovaClient {
101
104
  readonly api: NovaCellAPIClient;
@@ -104,7 +107,7 @@ declare class NovaClient {
104
107
  readonly instanceUrl: URL;
105
108
  authPromise: Promise<string | null> | null;
106
109
  accessToken: string | null;
107
- constructor(config: NovaClientConfig$1);
110
+ constructor(config: NovaClientConfig);
108
111
  renewAuthentication(): Promise<void>;
109
112
  makeWebsocketURL(path: string): string;
110
113
  /**
@@ -119,52 +122,55 @@ declare class NovaClient {
119
122
  /**
120
123
  * Convert a Pose object representing a motion group position
121
124
  * into a string which represents that pose in Wandelscript.
125
+ * @deprecated Wandelscript usage is deprecated; switching to Python is recommended.
122
126
  */
123
127
  declare function poseToWandelscriptString(pose: Pick<Pose, "position" | "orientation">): string;
124
128
  //#endregion
125
129
  //#region src/lib/v2/NovaAPIClient.d.ts
126
- type UnwrapAxiosResponseReturn<T> = T extends ((...a: unknown[]) => unknown[]) ? (...a: Parameters<T>) => Promise<Awaited<ReturnType<T>> extends {
130
+ type UnwrapAxiosResponseReturn<T> = T extends ((...a: any[]) => any) ? (...a: Parameters<T>) => Promise<Awaited<ReturnType<T>> extends {
127
131
  data: infer D;
128
132
  } ? D : never> : never;
129
133
  type WithUnwrappedAxiosResponse$1<T> = { [P in keyof T]: UnwrapAxiosResponseReturn<T[P]> };
130
- /**
131
- * Filters nova-api/v2 exports to just the API class constructors,
132
- * excluding helper factories and param creators.
133
- */
134
- type ApiConstructors = { [K in keyof typeof novaApiV2 as K extends `${string}Api` ? K extends `${string}Factory${string}` | `${string}Fp${string}` | `${string}ParamCreator${string}` ? never : K : never]: (typeof novaApiV2)[K] };
135
- /**
136
- * Lowercases leading uppercase characters to produce a camelCase property name.
137
- * e.g. "BUSInputsOutputs" -> "busInputsOutputs", "NOVACloud" -> "novaCloud",
138
- * "Application" -> "application"
139
- */
140
- type CamelCase<S extends string> = S extends `${Uppercase<infer A>}${Uppercase<infer B>}${infer Rest}` ? Rest extends `${Lowercase<string>}${string}` ? `${Lowercase<A>}${CamelCase<`${Uppercase<B>}${Rest}`>}` : `${Lowercase<A>}${CamelCase<`${Uppercase<B>}${Rest}`>}` : Uncapitalize<S>;
141
- /**
142
- * Maps API class names to property names by stripping "Api" and converting
143
- * the leading acronym to lowercase camelCase.
144
- *
145
- * Properties are auto-discovered from the upstream package at runtime,
146
- * so new API sections are available immediately without code changes.
147
- */
148
- type ApiProperties = { readonly [K in keyof ApiConstructors as K extends `${infer P}Api` ? CamelCase<P> : never]: ApiConstructors[K] extends (new (...args: unknown[]) => infer I) ? WithUnwrappedAxiosResponse$1<I> : never };
149
134
  type NovaAPIClientOpts = Configuration & {
150
135
  axiosInstance?: AxiosInstance;
151
136
  mock?: boolean;
152
137
  };
153
138
  /**
154
139
  * API client providing type-safe access to all the endpoints of a NOVA
155
- * instance. API sections are auto-discovered from @wandelbots/nova-api/v2
156
- * at runtime, so new sections added upstream are exposed automatically.
140
+ * instance.
157
141
  */
158
- declare const NovaAPIClient: {
159
- new (opts: NovaAPIClientOpts): ApiProperties & {
160
- readonly cellId: string;
161
- readonly opts: NovaAPIClientOpts;
162
- };
163
- };
164
- type NovaAPIClient = InstanceType<typeof NovaAPIClient>;
142
+ declare class NovaAPIClient {
143
+ readonly opts: NovaAPIClientOpts;
144
+ readonly application: WithUnwrappedAxiosResponse$1<ApplicationApi>;
145
+ readonly busIOs: WithUnwrappedAxiosResponse$1<BUSInputsOutputsApi>;
146
+ readonly cell: WithUnwrappedAxiosResponse$1<CellApi>;
147
+ readonly controller: WithUnwrappedAxiosResponse$1<ControllerApi>;
148
+ readonly controllerIOs: WithUnwrappedAxiosResponse$1<ControllerInputsOutputsApi>;
149
+ readonly jogging: WithUnwrappedAxiosResponse$1<JoggingApi>;
150
+ readonly kinematics: WithUnwrappedAxiosResponse$1<KinematicsApi>;
151
+ readonly license: WithUnwrappedAxiosResponse$1<LicenseApi>;
152
+ readonly motionGroup: WithUnwrappedAxiosResponse$1<MotionGroupApi>;
153
+ readonly motionGroupModels: WithUnwrappedAxiosResponse$1<MotionGroupModelsApi>;
154
+ readonly novaCloud: WithUnwrappedAxiosResponse$1<NOVACloudApi>;
155
+ readonly program: WithUnwrappedAxiosResponse$1<ProgramApi>;
156
+ readonly robotConfigurations: WithUnwrappedAxiosResponse$1<RobotConfigurationsApi>;
157
+ readonly session: WithUnwrappedAxiosResponse$1<SessionApi>;
158
+ readonly storeCollisionComponents: WithUnwrappedAxiosResponse$1<StoreCollisionComponentsApi>;
159
+ readonly storeCollisionSetups: WithUnwrappedAxiosResponse$1<StoreCollisionSetupsApi>;
160
+ readonly storeObject: WithUnwrappedAxiosResponse$1<StoreObjectApi>;
161
+ readonly system: WithUnwrappedAxiosResponse$1<SystemApi>;
162
+ readonly trajectoryCaching: WithUnwrappedAxiosResponse$1<TrajectoryCachingApi>;
163
+ readonly trajectoryExecution: WithUnwrappedAxiosResponse$1<TrajectoryExecutionApi>;
164
+ readonly trajectoryPlanning: WithUnwrappedAxiosResponse$1<TrajectoryPlanningApi>;
165
+ readonly version: WithUnwrappedAxiosResponse$1<VersionApi>;
166
+ readonly virtualController: WithUnwrappedAxiosResponse$1<VirtualControllerApi>;
167
+ readonly virtualControllerBehavior: WithUnwrappedAxiosResponse$1<VirtualControllerBehaviorApi>;
168
+ readonly virtualControllerIOs: WithUnwrappedAxiosResponse$1<VirtualControllerInputsOutputsApi>;
169
+ constructor(opts: NovaAPIClientOpts);
170
+ }
165
171
  //#endregion
166
172
  //#region src/lib/v2/Nova.d.ts
167
- type NovaClientConfig = {
173
+ type NovaConfig = {
168
174
  /**
169
175
  * Url of the deployed NOVA instance to connect to
170
176
  * e.g. https://saeattii.instance.wandelbots.io
@@ -183,12 +189,12 @@ type NovaClientConfig = {
183
189
  */
184
190
  declare class Nova {
185
191
  readonly api: NovaAPIClient;
186
- readonly config: NovaClientConfig;
192
+ readonly config: NovaConfig;
187
193
  readonly mock?: MockNovaInstance;
188
194
  readonly instanceUrl: URL;
189
195
  authPromise: Promise<string | null> | null;
190
196
  accessToken: string | null;
191
- constructor(config: NovaClientConfig);
197
+ constructor(config: NovaConfig);
192
198
  renewAuthentication(): Promise<void>;
193
199
  makeWebsocketURL(path: string): string;
194
200
  /**
@@ -199,5 +205,5 @@ declare class Nova {
199
205
  openReconnectingWebsocket(path: string): AutoReconnectingWebsocket;
200
206
  }
201
207
  //#endregion
202
- export { Nova, NovaAPIClient, NovaCellAPIClient, NovaClient, NovaClientConfig, WithCellId, WithUnwrappedAxiosResponse, poseToWandelscriptString };
208
+ export { Nova, NovaAPIClient, NovaCellAPIClient, NovaClient, NovaClientConfig, type NovaConfig, WithCellId, WithUnwrappedAxiosResponse, poseToWandelscriptString };
203
209
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/deprecated/v2/NovaCellAPIClient.ts","../../../src/lib/deprecated/v2/NovaClient.ts","../../../src/lib/deprecated/v2/wandelscriptUtils.ts","../../../src/lib/v2/NovaAPIClient.ts","../../../src/lib/v2/Nova.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/deprecated/v2/NovaCellAPIClient.ts","../../../src/lib/deprecated/v2/NovaClient.ts","../../../src/lib/deprecated/v2/wandelscriptUtils.ts","../../../src/lib/v2/NovaAPIClient.ts","../../../src/lib/v2/Nova.ts"],"mappings":"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"}
@@ -1,14 +1,13 @@
1
1
  import { m as AutoReconnectingWebsocket, n as loginWithAuth0, p as availableStorage, s as parseNovaInstanceUrl } from "../../LoginWithAuth0-DeirP_w9.mjs";
2
2
  import axios, { AxiosError, isAxiosError } from "axios";
3
- import urlJoin from "url-join";
4
3
  import * as pathToRegexp from "path-to-regexp";
5
- import * as novaApiV2 from "@wandelbots/nova-api/v2";
6
4
  import { ApplicationApi, BUSInputsOutputsApi, CellApi, ControllerApi, ControllerInputsOutputsApi, JoggingApi, KinematicsApi, LicenseApi, MotionGroupApi, MotionGroupModelsApi, NOVACloudApi, ProgramApi, RobotConfigurationsApi, SessionApi, StoreCollisionComponentsApi, StoreCollisionSetupsApi, StoreObjectApi, SystemApi, TrajectoryCachingApi, TrajectoryExecutionApi, TrajectoryPlanningApi, VersionApi, VirtualControllerApi, VirtualControllerBehaviorApi, VirtualControllerInputsOutputsApi } from "@wandelbots/nova-api/v2";
7
5
  export * from "@wandelbots/nova-api/v2";
8
6
  //#region src/lib/deprecated/v2/NovaCellAPIClient.ts
9
7
  /**
10
8
  * API client providing type-safe access to all the Nova API REST endpoints
11
9
  * associated with a specific cell id.
10
+ * @deprecated Use `NovaAPIClient` from `@wandelbots/nova-js/v2` instead.
12
11
  */
13
12
  var NovaCellAPIClient = class {
14
13
  constructor(cellId, opts) {
@@ -692,8 +691,8 @@ const defaultMotionState = { result: {
692
691
  //#endregion
693
692
  //#region src/lib/deprecated/v2/NovaClient.ts
694
693
  /**
695
- *
696
694
  * Client for connecting to a Nova instance and controlling robots.
695
+ * @deprecated Use `Nova` from `@wandelbots/nova-js/v2` instead.
697
696
  */
698
697
  var NovaClient = class {
699
698
  constructor(config) {
@@ -708,7 +707,7 @@ var NovaClient = class {
708
707
  if (this.config.instanceUrl === "https://mock.example.com") this.mock = new MockNovaInstance();
709
708
  this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl);
710
709
  const axiosInstance = axios.create({
711
- baseURL: urlJoin(this.instanceUrl.href, "/api/v2"),
710
+ baseURL: new URL("/api/v2", this.instanceUrl).href,
712
711
  headers: typeof window !== "undefined" && window.location.origin.includes("localhost") ? {} : { "X-Wandelbots-Client": "Wandelbots-Nova-JS-SDK" }
713
712
  });
714
713
  axiosInstance.interceptors.request.use(async (request) => {
@@ -738,7 +737,7 @@ var NovaClient = class {
738
737
  });
739
738
  this.api = new NovaCellAPIClient(cellId, {
740
739
  ...config,
741
- basePath: urlJoin(this.instanceUrl.href, "/api/v2"),
740
+ basePath: new URL("/api/v2", this.instanceUrl).href,
742
741
  isJsonMime: (mime) => {
743
742
  return mime === "application/json";
744
743
  },
@@ -768,7 +767,7 @@ var NovaClient = class {
768
767
  }
769
768
  }
770
769
  makeWebsocketURL(path) {
771
- const url = new URL(urlJoin(this.instanceUrl.href, `/api/v2/cells/${this.config.cellId}`, path));
770
+ const url = new URL(new URL(`/api/v2/cells/${this.config.cellId}/${path.replace(/^\/+/, "")}`, this.instanceUrl).href);
772
771
  url.protocol = url.protocol.replace("http", "ws");
773
772
  url.protocol = url.protocol.replace("https", "wss");
774
773
  if (this.accessToken) url.searchParams.append("token", this.accessToken);
@@ -792,6 +791,7 @@ var NovaClient = class {
792
791
  /**
793
792
  * Convert a Pose object representing a motion group position
794
793
  * into a string which represents that pose in Wandelscript.
794
+ * @deprecated Wandelscript usage is deprecated; switching to Python is recommended.
795
795
  */
796
796
  function poseToWandelscriptString(pose) {
797
797
  const position = [
@@ -810,10 +810,7 @@ function poseToWandelscriptString(pose) {
810
810
  }
811
811
  //#endregion
812
812
  //#region src/lib/v2/NovaAPIClient.ts
813
- function isApiClass(name, value) {
814
- return name.endsWith("Api") && typeof value === "function" && !name.includes("Factory") && !name.includes("Fp") && !name.includes("ParamCreator");
815
- }
816
- function wrapApi(ApiConstructor, opts) {
813
+ function unwrap(ApiConstructor, opts) {
817
814
  const apiClient = new ApiConstructor({
818
815
  ...opts,
819
816
  isJsonMime: (mime) => mime === "application/json"
@@ -826,20 +823,36 @@ function wrapApi(ApiConstructor, opts) {
826
823
  }
827
824
  /**
828
825
  * API client providing type-safe access to all the endpoints of a NOVA
829
- * instance. API sections are auto-discovered from @wandelbots/nova-api/v2
830
- * at runtime, so new sections added upstream are exposed automatically.
826
+ * instance.
831
827
  */
832
- const NovaAPIClient = class NovaAPIClient {
828
+ var NovaAPIClient = class {
833
829
  constructor(opts) {
834
830
  this.opts = opts;
835
- for (const [name, value] of Object.entries(novaApiV2)) if (isApiClass(name, value)) {
836
- const stripped = name.slice(0, -3);
837
- let i = 0;
838
- while (i < stripped.length && stripped[i] === stripped[i].toUpperCase() && stripped[i] !== stripped[i].toLowerCase()) i++;
839
- const boundary = i > 1 ? i - 1 : i;
840
- const propName = stripped.slice(0, boundary).toLowerCase() + stripped.slice(boundary);
841
- this[propName] = wrapApi(value, opts);
842
- }
831
+ this.application = unwrap(ApplicationApi, opts);
832
+ this.busIOs = unwrap(BUSInputsOutputsApi, opts);
833
+ this.cell = unwrap(CellApi, opts);
834
+ this.controller = unwrap(ControllerApi, opts);
835
+ this.controllerIOs = unwrap(ControllerInputsOutputsApi, opts);
836
+ this.jogging = unwrap(JoggingApi, opts);
837
+ this.kinematics = unwrap(KinematicsApi, opts);
838
+ this.license = unwrap(LicenseApi, opts);
839
+ this.motionGroup = unwrap(MotionGroupApi, opts);
840
+ this.motionGroupModels = unwrap(MotionGroupModelsApi, opts);
841
+ this.novaCloud = unwrap(NOVACloudApi, opts);
842
+ this.program = unwrap(ProgramApi, opts);
843
+ this.robotConfigurations = unwrap(RobotConfigurationsApi, opts);
844
+ this.session = unwrap(SessionApi, opts);
845
+ this.storeCollisionComponents = unwrap(StoreCollisionComponentsApi, opts);
846
+ this.storeCollisionSetups = unwrap(StoreCollisionSetupsApi, opts);
847
+ this.storeObject = unwrap(StoreObjectApi, opts);
848
+ this.system = unwrap(SystemApi, opts);
849
+ this.trajectoryCaching = unwrap(TrajectoryCachingApi, opts);
850
+ this.trajectoryExecution = unwrap(TrajectoryExecutionApi, opts);
851
+ this.trajectoryPlanning = unwrap(TrajectoryPlanningApi, opts);
852
+ this.version = unwrap(VersionApi, opts);
853
+ this.virtualController = unwrap(VirtualControllerApi, opts);
854
+ this.virtualControllerBehavior = unwrap(VirtualControllerBehaviorApi, opts);
855
+ this.virtualControllerIOs = unwrap(VirtualControllerInputsOutputsApi, opts);
843
856
  }
844
857
  };
845
858
  //#endregion
@@ -857,7 +870,7 @@ var Nova = class {
857
870
  if (this.config.instanceUrl === "https://mock.example.com") this.mock = new MockNovaInstance();
858
871
  this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl);
859
872
  const axiosInstance = axios.create({
860
- baseURL: urlJoin(this.instanceUrl.href, "/api/v2"),
873
+ baseURL: new URL("/api/v2", this.instanceUrl).href,
861
874
  headers: typeof window !== "undefined" && window.location.origin.includes("localhost") ? {} : { "X-Wandelbots-Client": "Wandelbots-Nova-JS-SDK" }
862
875
  });
863
876
  axiosInstance.interceptors.request.use(async (request) => {
@@ -887,12 +900,13 @@ var Nova = class {
887
900
  });
888
901
  this.api = new NovaAPIClient({
889
902
  ...config,
890
- basePath: urlJoin(this.instanceUrl.href, "/api/v2"),
903
+ basePath: new URL("/api/v2", this.instanceUrl).href,
891
904
  isJsonMime: (mime) => {
892
905
  return mime === "application/json";
893
906
  },
894
907
  baseOptions: {
895
908
  ...this.mock ? { adapter: (config) => {
909
+ if (!this.mock) throw new Error("Mock adapter used without a mock instance");
896
910
  return this.mock.handleAPIRequest(config);
897
911
  } } : {},
898
912
  ...config.baseOptions
@@ -917,7 +931,7 @@ var Nova = class {
917
931
  }
918
932
  }
919
933
  makeWebsocketURL(path) {
920
- const url = new URL(urlJoin(this.instanceUrl.href, `/api/v2`, path));
934
+ const url = new URL(`/api/v2/${path.replace(/^\/+/, "")}`, this.instanceUrl);
921
935
  url.protocol = url.protocol.replace("http", "ws");
922
936
  url.protocol = url.protocol.replace("https", "wss");
923
937
  if (this.accessToken) url.searchParams.append("token", this.accessToken);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/deprecated/v2/NovaCellAPIClient.ts","../../../src/lib/v2/mock/getCurrentRobotControllerState.ts","../../../src/lib/v2/mock/getMotionGroupDescription.ts","../../../src/lib/v2/mock/getMotionGroupKinematicModel.ts","../../../src/lib/v2/mock/getRobotController.ts","../../../src/lib/v2/mock/listCoordinateSystems.ts","../../../src/lib/v2/mock/listRobotControllers.ts","../../../src/lib/v2/mock/MockNovaInstance.ts","../../../src/lib/deprecated/v2/NovaClient.ts","../../../src/lib/deprecated/v2/wandelscriptUtils.ts","../../../src/lib/v2/NovaAPIClient.ts","../../../src/lib/v2/Nova.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: legacy code */\n/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type {\n BaseAPI,\n Configuration as BaseConfiguration,\n} from \"@wandelbots/nova-api/v2\"\nimport {\n ApplicationApi,\n BUSInputsOutputsApi,\n CellApi,\n ControllerApi,\n ControllerInputsOutputsApi,\n JoggingApi,\n KinematicsApi,\n LicenseApi,\n MotionGroupApi,\n MotionGroupModelsApi,\n NOVACloudApi,\n ProgramApi,\n RobotConfigurationsApi,\n SessionApi,\n StoreCollisionComponentsApi,\n StoreCollisionSetupsApi,\n StoreObjectApi,\n SystemApi,\n TrajectoryCachingApi,\n TrajectoryExecutionApi,\n TrajectoryPlanningApi,\n VersionApi,\n VirtualControllerApi,\n VirtualControllerBehaviorApi,\n VirtualControllerInputsOutputsApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R\n ? (...args: P) => R\n : never\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any) => any\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\nexport type WithCellId<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<OmitFirstArg<T[P]>>\n}\n\nexport type WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * API client providing type-safe access to all the Nova API REST endpoints\n * associated with a specific cell id.\n */\nexport class NovaCellAPIClient {\n constructor(\n readonly cellId: string,\n readonly opts: BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n },\n ) {}\n\n /**\n * Some TypeScript sorcery which alters the API class methods so you don't\n * have to pass the cell id to every single one, and de-encapsulates the\n * response data\n */\n private withCellId<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, [this.cellId, ...args])\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithCellId<T>\n }\n\n /**\n * As withCellId, but only does the response unwrapping\n */\n private withUnwrappedResponsesOnly<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, args)\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n }\n\n readonly system = this.withUnwrappedResponsesOnly(SystemApi)\n readonly cell = this.withUnwrappedResponsesOnly(CellApi)\n\n readonly motionGroup = this.withCellId(MotionGroupApi)\n readonly motionGroupModels =\n this.withUnwrappedResponsesOnly(MotionGroupModelsApi)\n\n readonly controller = this.withCellId(ControllerApi)\n\n readonly controllerIOs = this.withCellId(ControllerInputsOutputsApi)\n\n readonly trajectoryPlanning = this.withCellId(TrajectoryPlanningApi)\n readonly trajectoryExecution = this.withCellId(TrajectoryExecutionApi)\n readonly trajectoryCaching = this.withCellId(TrajectoryCachingApi)\n\n readonly application = this.withCellId(ApplicationApi)\n readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)\n\n readonly jogging = this.withCellId(JoggingApi)\n\n readonly kinematics = this.withCellId(KinematicsApi)\n\n readonly busInputsOutputs = this.withCellId(BUSInputsOutputsApi)\n\n readonly virtualController = this.withCellId(VirtualControllerApi)\n readonly virtualControllerBehavior = this.withCellId(\n VirtualControllerBehaviorApi,\n )\n readonly virtualControllerIOs = this.withCellId(\n VirtualControllerInputsOutputsApi,\n )\n\n readonly storeObject = this.withCellId(StoreObjectApi)\n readonly storeCollisionComponents = this.withCellId(\n StoreCollisionComponentsApi,\n )\n readonly storeCollisionSetups = this.withCellId(StoreCollisionSetupsApi)\n\n readonly program = this.withCellId(ProgramApi)\n\n readonly license = this.withUnwrappedResponsesOnly(LicenseApi)\n readonly novaCloud = this.withUnwrappedResponsesOnly(NOVACloudApi)\n readonly robotConfigurations = this.withUnwrappedResponsesOnly(\n RobotConfigurationsApi,\n )\n readonly version = this.withUnwrappedResponsesOnly(VersionApi)\n readonly session = this.withUnwrappedResponsesOnly(SessionApi)\n}\n","export const getCurrentRobotControllerState = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/state\",\n handle() {\n return {\n mode: \"MODE_CONTROL\",\n last_error: [],\n timestamp: \"2025-10-16T09:19:26.634534092Z\",\n sequence_number: 1054764,\n controller: \"mock-ur5e\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n velocity_override: 100,\n motion_groups: [\n {\n timestamp: \"2025-10-16T09:19:26.634534092Z\",\n sequence_number: 1054764,\n motion_group: \"0@mock-ur5e\",\n controller: \"mock-ur5e\",\n joint_position: [\n 1.487959623336792, -1.8501918315887451, 1.8003005981445312,\n 6.034560203552246, 1.4921919107437134, 1.593459963798523,\n ],\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n joint_torque: [],\n joint_current: [0, 0, 0, 0, 0, 0],\n flange_pose: {\n position: [\n 107.6452433732927, -409.0402987746852, 524.2402132330305,\n ],\n orientation: [\n 0.9874434028353319, -0.986571714997442, 1.3336589451098142,\n ],\n },\n tcp: \"Flange\",\n tcp_pose: {\n position: [\n 107.6452433732927, -409.0402987746852, 524.2402132330305,\n ],\n orientation: [\n 0.9874434028353319, -0.986571714997442, 1.3336589451098142,\n ],\n },\n payload: \"\",\n coordinate_system: \"\",\n standstill: true,\n },\n ],\n }\n },\n}\n","export const getMotionGroupDescription = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/motion-groups/:motionGroupId/description\",\n handle() {\n return {\n motion_group_model: \"UniversalRobots_UR5e\",\n mounting: {\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n },\n tcps: {\n Flange: {\n name: \"Default-Flange\",\n pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n },\n },\n },\n payloads: {\n \"FPay-0\": {\n name: \"FPay-0\",\n payload: 0,\n center_of_mass: [0, 0, 0],\n moment_of_inertia: [0, 0, 0],\n },\n },\n cycle_time: 8,\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n d: 162.25,\n },\n {\n a: -425,\n },\n {\n a: -392.2,\n },\n {\n alpha: 1.5707963267948966,\n d: 133.3,\n },\n {\n alpha: -1.5707963267948966,\n d: 99.7,\n },\n {\n d: 99.6,\n },\n ],\n operation_limits: {\n auto_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n elbow: {\n velocity: 5000,\n },\n flange: {\n velocity: 5000,\n },\n },\n manual_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n manual_t1_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n manual_t2_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n },\n serial_number: \"WBVirtualRobot\",\n }\n },\n}\n","export const getMotionGroupKinematicModel = {\n method: \"GET\",\n path: \"/motion-group-models/:motionGroupModel/kinematic\",\n handle() {\n return {\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 162.25,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: -425.0,\n d: 0.0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: -392.2,\n d: 0.0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 133.3,\n reverse_rotation_direction: false,\n },\n {\n alpha: -1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 99.7,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: 0.0,\n d: 99.6,\n reverse_rotation_direction: false,\n },\n ],\n inverse_solver: \"Universalrobots\",\n }\n },\n}\n","import type { RobotController } from \"@wandelbots/nova-api/v2\"\n\nexport const getRobotController = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId\",\n handle() {\n return {\n configuration: {\n initial_joint_position: \"[0,-1.571,-1.571,-1.571,1.571,-1.571,0]\",\n kind: \"VirtualController\",\n manufacturer: \"universalrobots\",\n type: \"universalrobots-ur5e\",\n },\n name: \"mock-ur5\",\n } satisfies RobotController\n },\n}\n","export const listCoordinateSystems = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/coordinate-systems\",\n handle() {\n return [\n {\n coordinate_system: \"\",\n name: \"world\",\n reference_coordinate_system: \"\",\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n orientation_type: \"ROTATION_VECTOR\",\n },\n {\n coordinate_system: \"CS-0\",\n name: \"Default-CS\",\n reference_coordinate_system: \"\",\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n orientation_type: \"ROTATION_VECTOR\",\n },\n ]\n },\n}\n","export const listRobotControllers = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers\",\n handle() {\n return [\"mock-ur5e\"]\n },\n}\n","import type { MotionGroupState } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\nimport { AxiosError } from \"axios\"\nimport * as pathToRegexp from \"path-to-regexp\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\nimport { getCurrentRobotControllerState } from \"./getCurrentRobotControllerState\"\nimport { getMotionGroupDescription } from \"./getMotionGroupDescription\"\nimport { getMotionGroupKinematicModel } from \"./getMotionGroupKinematicModel\"\nimport { getRobotController } from \"./getRobotController\"\nimport { listCoordinateSystems } from \"./listCoordinateSystems\"\nimport { listRobotControllers } from \"./listRobotControllers\"\n\n/**\n * Ultra-simplified mock Nova server for testing stuff\n */\nexport class MockNovaInstance {\n readonly connections: AutoReconnectingWebsocket[] = []\n\n async handleAPIRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<AxiosResponse> {\n const apiHandlers = [\n listRobotControllers,\n getRobotController,\n getMotionGroupDescription,\n getCurrentRobotControllerState,\n listCoordinateSystems,\n getMotionGroupKinematicModel,\n ]\n\n const method = config.method?.toUpperCase() || \"GET\"\n if (!config.url) {\n throw new Error(\"No url sent with request\")\n }\n const path = config.url.split(\"?\")[0]\n\n for (const handler of apiHandlers) {\n const match = pathToRegexp.match(handler.path)(path)\n if (method === handler.method && match) {\n const json = handler.handle()\n return {\n status: 200,\n statusText: \"Success\",\n data: JSON.stringify(json),\n headers: {},\n config,\n request: {\n responseURL: config.url,\n },\n }\n }\n }\n\n throw new AxiosError(\n `No mock handler matched this request: ${method} ${path}`,\n \"404\",\n config,\n )\n }\n\n // Please note: Only very basic websocket mocking is done here, needs to be extended as needed\n handleWebsocketConnection(socket: AutoReconnectingWebsocket) {\n this.connections.push(socket)\n\n setTimeout(() => {\n socket.dispatchEvent(new Event(\"open\"))\n\n console.log(\"Websocket connection opened from\", socket.url)\n\n if (socket.url.includes(\"/state-stream\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify(defaultMotionState),\n }),\n )\n }\n\n if (socket.url.includes(\"/execution/jogging\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n message: \"string\",\n kind: \"INITIALIZE_RECEIVED\",\n },\n }),\n }),\n )\n }\n }, 10)\n }\n\n handleWebsocketMessage(socket: AutoReconnectingWebsocket, message: string) {\n console.log(`Received message on ${socket.url}`, message)\n }\n}\n\nconst defaultMotionState = {\n result: {\n motion_group: \"0@universalrobots-ur5e\",\n controller: \"universalrobots-ur5e\",\n timestamp: new Date().toISOString(),\n sequence_number: 1,\n joint_position: [\n 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,\n 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,\n ],\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n standstill: false,\n flange_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n tcp_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n description_revision: 0,\n } satisfies MotionGroupState,\n}\n","/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport urlJoin from \"url-join\"\nimport { loginWithAuth0 } from \"../../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../../availableStorage\"\nimport { parseNovaInstanceUrl } from \"../../converters\"\nimport { MockNovaInstance } from \"../../v2/mock/MockNovaInstance\"\nimport { NovaCellAPIClient } from \"./NovaCellAPIClient\"\n\nexport type NovaClientConfig = {\n /**\n * Url of the deployed Nova instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string | \"https://mock.example.com\"\n\n /**\n * Identifier of the cell on the Nova instance to connect this client to.\n * If omitted, the default identifier \"cell\" is used.\n **/\n cellId?: string\n\n /**\n * Username for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n username?: string\n\n /**\n * Password for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n password?: string\n\n /**\n * Access token for Bearer authentication.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\ntype NovaClientConfigWithDefaults = NovaClientConfig & { cellId: string }\n\n/**\n *\n * Client for connecting to a Nova instance and controlling robots.\n */\nexport class NovaClient {\n readonly api: NovaCellAPIClient\n readonly config: NovaClientConfigWithDefaults\n readonly mock?: MockNovaInstance\n readonly instanceUrl: URL\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaClientConfig) {\n const cellId = config.cellId ?? \"cell\"\n this.config = {\n cellId,\n ...config,\n }\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl)\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: urlJoin(this.instanceUrl.href, \"/api/v2\"),\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(`${config.username}:${config.password}`)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaCellAPIClient(cellId, {\n ...config,\n basePath: urlJoin(this.instanceUrl.href, \"/api/v2\"),\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n return this.mock!.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n const storedToken = availableStorage.getString(\"wbjs.access_token\")\n if (storedToken && this.accessToken !== storedToken) {\n // Might be newer than the one we have\n this.accessToken = storedToken\n return\n }\n\n // Otherwise, perform login flow\n this.authPromise = loginWithAuth0(this.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(\n urlJoin(\n this.instanceUrl.href,\n `/api/v2/cells/${this.config.cellId}`,\n path,\n ),\n )\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n","import type { Pose } from \"@wandelbots/nova-api/v2\"\n\n/**\n * Convert a Pose object representing a motion group position\n * into a string which represents that pose in Wandelscript.\n */\nexport function poseToWandelscriptString(\n pose: Pick<Pose, \"position\" | \"orientation\">,\n) {\n const position = [\n pose.position?.[0] ?? 0,\n pose.position?.[1] ?? 0,\n pose.position?.[2] ?? 0,\n ]\n\n const orientation = [\n pose.orientation?.[0] ?? 0,\n pose.orientation?.[1] ?? 0,\n pose.orientation?.[2] ?? 0,\n ]\n\n const positionValues = position.map((v) => v.toFixed(1))\n // Rotation needs more precision since it's in radians\n const rotationValues = orientation.map((v) => v.toFixed(4))\n\n return `(${positionValues.concat(rotationValues).join(\", \")})`\n}\n","import type {\n BaseAPI,\n Configuration as BaseConfiguration,\n} from \"@wandelbots/nova-api/v2\"\nimport * as novaApiV2 from \"@wandelbots/nova-api/v2\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: unknown[]) => unknown[]\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\ntype WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * Filters nova-api/v2 exports to just the API class constructors,\n * excluding helper factories and param creators.\n */\ntype ApiConstructors = {\n [K in keyof typeof novaApiV2 as K extends `${string}Api`\n ? K extends\n | `${string}Factory${string}`\n | `${string}Fp${string}`\n | `${string}ParamCreator${string}`\n ? never\n : K\n : never]: (typeof novaApiV2)[K]\n}\n\n/**\n * Lowercases leading uppercase characters to produce a camelCase property name.\n * e.g. \"BUSInputsOutputs\" -> \"busInputsOutputs\", \"NOVACloud\" -> \"novaCloud\",\n * \"Application\" -> \"application\"\n */\ntype CamelCase<S extends string> =\n S extends `${Uppercase<infer A>}${Uppercase<infer B>}${infer Rest}`\n ? Rest extends `${Lowercase<string>}${string}`\n ? `${Lowercase<A>}${CamelCase<`${Uppercase<B>}${Rest}`>}`\n : `${Lowercase<A>}${CamelCase<`${Uppercase<B>}${Rest}`>}`\n : Uncapitalize<S>\n\n/**\n * Maps API class names to property names by stripping \"Api\" and converting\n * the leading acronym to lowercase camelCase.\n *\n * Properties are auto-discovered from the upstream package at runtime,\n * so new API sections are available immediately without code changes.\n */\ntype ApiProperties = {\n readonly [K in keyof ApiConstructors as K extends `${infer P}Api`\n ? CamelCase<P>\n : never]: ApiConstructors[K] extends new (\n ...args: unknown[]\n ) => infer I\n ? WithUnwrappedAxiosResponse<I>\n : never\n}\n\ntype NovaAPIClientOpts = BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n}\n\nfunction isApiClass(\n name: string,\n value: unknown,\n): value is new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n) => BaseAPI {\n return (\n name.endsWith(\"Api\") &&\n typeof value === \"function\" &&\n !name.includes(\"Factory\") &&\n !name.includes(\"Fp\") &&\n !name.includes(\"ParamCreator\")\n )\n}\n\nfunction wrapApi<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n opts: NovaAPIClientOpts,\n): WithUnwrappedAxiosResponse<T> {\n const apiClient = new ApiConstructor(\n {\n ...opts,\n isJsonMime: (mime: string) => mime === \"application/json\",\n },\n opts.basePath ?? \"\",\n opts.axiosInstance ?? axios.create(),\n ) as Record<string | symbol, unknown>\n\n for (const key of Reflect.ownKeys(\n Reflect.getPrototypeOf(apiClient) as object,\n )) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key] as (\n ...args: unknown[]\n ) => Promise<{ data: unknown }>\n apiClient[key] = (...args: unknown[]) =>\n originalFunction.apply(apiClient, args).then((res) => res.data)\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n}\n\n/**\n * API client providing type-safe access to all the endpoints of a NOVA\n * instance. API sections are auto-discovered from @wandelbots/nova-api/v2\n * at runtime, so new sections added upstream are exposed automatically.\n */\nexport const NovaAPIClient = class NovaAPIClient {\n readonly opts: NovaAPIClientOpts\n\n constructor(opts: NovaAPIClientOpts) {\n this.opts = opts\n\n for (const [name, value] of Object.entries(novaApiV2)) {\n if (isApiClass(name, value)) {\n const stripped = name.slice(0, -3)\n // Lowercase leading acronym run: \"BUSInputsOutputs\" -> \"busInputsOutputs\"\n let i = 0\n while (\n i < stripped.length &&\n stripped[i] === stripped[i].toUpperCase() &&\n stripped[i] !== stripped[i].toLowerCase()\n ) {\n i++\n }\n // If multiple uppercase chars, keep the last one uppercase (it starts the next word)\n const boundary = i > 1 ? i - 1 : i\n const propName =\n stripped.slice(0, boundary).toLowerCase() + stripped.slice(boundary)\n // biome-ignore lint/suspicious/noExplicitAny: dynamically assigning discovered API properties\n ;(this as any)[propName] = wrapApi(value, opts)\n }\n }\n }\n} as {\n new (\n opts: NovaAPIClientOpts,\n ): ApiProperties & {\n readonly cellId: string\n readonly opts: NovaAPIClientOpts\n }\n}\n\nexport type NovaAPIClient = InstanceType<typeof NovaAPIClient>\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport urlJoin from \"url-join\"\nimport { loginWithAuth0 } from \"../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../availableStorage\"\nimport { parseNovaInstanceUrl } from \"../converters\"\nimport { NovaAPIClient } from \"./NovaAPIClient\"\nimport { MockNovaInstance } from \"./mock/MockNovaInstance\"\n\nexport type NovaClientConfig = {\n /**\n * Url of the deployed NOVA instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string\n\n /**\n * Access token for Bearer authentication.\n * If running on a NOVA instance, this can be automatically retrieved from\n * the current session when omitted.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\n/**\n *\n * Client for connecting to a NOVA instance and controlling robots.\n */\nexport class Nova {\n readonly api: NovaAPIClient\n readonly config: NovaClientConfig\n readonly mock?: MockNovaInstance\n readonly instanceUrl: URL\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaClientConfig) {\n this.config = config\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl)\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: urlJoin(this.instanceUrl.href, \"/api/v2\"),\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(`${config.username}:${config.password}`)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaAPIClient({\n ...config,\n basePath: urlJoin(this.instanceUrl.href, \"/api/v2\"),\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n // biome-ignore lint/style/noNonNullAssertion: guarded by ternary condition\n return this.mock!.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n const storedToken = availableStorage.getString(\"wbjs.access_token\")\n if (storedToken && this.accessToken !== storedToken) {\n // Might be newer than the one we have\n this.accessToken = storedToken\n return\n }\n\n // Otherwise, perform login flow\n this.authPromise = loginWithAuth0(this.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(urlJoin(this.instanceUrl.href, `/api/v2`, path))\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n"],"mappings":"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,EACF;GACA,UAAU,EACR,UAAU;IACR,MAAM;IACN,SAAS;IACT,gBAAgB;KAAC;KAAG;KAAG;IAAC;IACxB,mBAAmB;KAAC;KAAG;KAAG;IAAC;GAC7B,EACF;GACA,YAAY;GACZ,eAAe;IACb;KACE,OAAO;KACP,GAAG;IACL;IACA,EACE,GAAG,KACL;IACA,EACE,GAAG,OACL;IACA;KACE,OAAO;KACP,GAAG;IACL;IACA;KACE,OAAO;KACP,GAAG;IACL;IACA,EACE,GAAG,KACL;GACF;GACA,kBAAkB;IAChB,aAAa;KACX,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;KACA,OAAO,EACL,UAAU,IACZ;KACA,QAAQ,EACN,UAAU,IACZ;IACF;IACA,eAAe;KACb,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;IACA,kBAAkB;KAChB,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;IACA,kBAAkB;KAChB,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;GACF;GACA,eAAe;EACjB;CACF;AACF;;;AClTA,MAAa,+BAA+B;CAC1C,QAAQ;CACR,MAAM;CACN,SAAS;EACP,OAAO;GACL,eAAe;IACb;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;IACA;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;IACA;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;IACA;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;IACA;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;IACA;KACE,OAAO;KACP,OAAO;KACP,GAAG;KACH,GAAG;KACH,4BAA4B;IAC9B;GACF;GACA,gBAAgB;EAClB;CACF;AACF;;;AClDA,MAAa,qBAAqB;CAChC,QAAQ;CACR,MAAM;CACN,SAAS;EACP,OAAO;GACL,eAAe;IACb,wBAAwB;IACxB,MAAM;IACN,cAAc;IACd,MAAM;GACR;GACA,MAAM;EACR;CACF;AACF;;;AChBA,MAAa,wBAAwB;CACnC,QAAQ;CACR,MAAM;CACN,SAAS;EACP,OAAO,CACL;GACE,mBAAmB;GACnB,MAAM;GACN,6BAA6B;GAC7B,UAAU;IAAC;IAAG;IAAG;GAAC;GAClB,aAAa;IAAC;IAAG;IAAG;GAAC;GACrB,kBAAkB;EACpB,GACA;GACE,mBAAmB;GACnB,MAAM;GACN,6BAA6B;GAC7B,UAAU;IAAC;IAAG;IAAG;GAAC;GAClB,aAAa;IAAC;IAAG;IAAG;GAAC;GACrB,kBAAkB;EACpB,CACF;CACF;AACF;;;ACvBA,MAAa,uBAAuB;CAClC,QAAQ;CACR,MAAM;CACN,SAAS;EACP,OAAO,CAAC,WAAW;CACrB;AACF;;;;;;ACSA,IAAa,mBAAb,MAA8B;;qBACwB,CAAC;;CAErD,MAAM,iBACJ,QACwB;EACxB,MAAM,cAAc;GAClB;GACA;GACA;GACA;GACA;GACA;EACF;EAEA,MAAM,SAAS,OAAO,QAAQ,YAAY,KAAK;EAC/C,IAAI,CAAC,OAAO,KACV,MAAM,IAAI,MAAM,0BAA0B;EAE5C,MAAM,OAAO,OAAO,IAAI,MAAM,GAAG,EAAE;EAEnC,KAAK,MAAM,WAAW,aAAa;GACjC,MAAM,QAAQ,aAAa,MAAM,QAAQ,IAAI,EAAE,IAAI;GACnD,IAAI,WAAW,QAAQ,UAAU,OAAO;IACtC,MAAM,OAAO,QAAQ,OAAO;IAC5B,OAAO;KACL,QAAQ;KACR,YAAY;KACZ,MAAM,KAAK,UAAU,IAAI;KACzB,SAAS,CAAC;KACV;KACA,SAAS,EACP,aAAa,OAAO,IACtB;IACF;GACF;EACF;EAEA,MAAM,IAAI,WACR,yCAAyC,OAAO,GAAG,QACnD,OACA,MACF;CACF;CAGA,0BAA0B,QAAmC;EAC3D,KAAK,YAAY,KAAK,MAAM;EAE5B,iBAAiB;GACf,OAAO,cAAc,IAAI,MAAM,MAAM,CAAC;GAEtC,QAAQ,IAAI,oCAAoC,OAAO,GAAG;GAE1D,IAAI,OAAO,IAAI,SAAS,eAAe,GACrC,OAAO,cACL,IAAI,aAAa,WAAW,EAC1B,MAAM,KAAK,UAAU,kBAAkB,EACzC,CAAC,CACH;GAGF,IAAI,OAAO,IAAI,SAAS,oBAAoB,GAC1C,OAAO,cACL,IAAI,aAAa,WAAW,EAC1B,MAAM,KAAK,UAAU,EACnB,QAAQ;IACN,SAAS;IACT,MAAM;GACR,EACF,CAAC,EACH,CAAC,CACH;EAEJ,GAAG,EAAE;CACP;CAEA,uBAAuB,QAAmC,SAAiB;EACzE,QAAQ,IAAI,uBAAuB,OAAO,OAAO,OAAO;CAC1D;AACF;AAEA,MAAM,qBAAqB,EACzB,QAAQ;CACN,cAAc;CACd,YAAY;CACZ,4BAAW,IAAI,KAAK,GAAE,YAAY;CAClC,iBAAiB;CACjB,gBAAgB;EACd;EAAoB;EAAqB;EACzC;EAAoB;EAAoB;CAC1C;CACA,qBAAqB,EACnB,eAAe;EAAC;EAAO;EAAO;EAAO;EAAO;EAAO;CAAK,EAC1D;CACA,YAAY;CACZ,aAAa;EACX,UAAU;GAAC;GAAoB;GAAoB;EAAiB;EACpE,aAAa;GACX;GAAoB;GAAqB;EAC3C;CACF;CACA,UAAU;EACR,UAAU;GAAC;GAAoB;GAAoB;EAAiB;EACpE,aAAa;GACX;GAAoB;GAAqB;EAC3C;CACF;CACA,sBAAsB;AACxB,EACF;;;;;;;AC5EA,IAAa,aAAb,MAAwB;CAQtB,YAAY,QAA0B;qBAHO;qBAChB;EAG3B,MAAM,SAAS,OAAO,UAAU;EAChC,KAAK,SAAS;GACZ;GACA,GAAG;EACL;EACA,KAAK,cACH,OAAO,eACP,iBAAiB,UAAU,mBAAmB,KAC9C;EAEF,IAAI,KAAK,OAAO,gBAAgB,4BAC9B,KAAK,OAAO,IAAI,iBAAiB;EAEnC,KAAK,cAAc,qBAAqB,KAAK,OAAO,WAAW;EAG/D,MAAM,gBAAgB,MAAM,OAAO;GACjC,SAAS,QAAQ,KAAK,YAAY,MAAM,SAAS;GAEjD,SACE,OAAO,WAAW,eAClB,OAAO,SAAS,OAAO,SAAS,WAAW,IACvC,CAAC,IACD,EAEE,uBAAuB,yBACzB;EACR,CAAC;EAED,cAAc,aAAa,QAAQ,IAAI,OAAO,YAAY;GACxD,IAAI,CAAC,QAAQ,QAAQ;QACf,KAAK,aACP,QAAQ,QAAQ,gBAAgB,UAAU,KAAK;SAC1C,IAAI,KAAK,OAAO,YAAY,KAAK,OAAO,UAC7C,QAAQ,QAAQ,gBAAgB,SAAS,KAAK,GAAG,OAAO,SAAS,GAAG,OAAO,UAAU;GAAA;GAGzF,OAAO;EACT,CAAC;EAED,IAAI,OAAO,WAAW,aACpB,cAAc,aAAa,SAAS,KACjC,MAAM,GACP,OAAO,UAAU;GACf,IAAI,aAAa,KAAK;QAChB,MAAM,UAAU,WAAW,KAG7B,IAAI;KACF,MAAM,KAAK,oBAAoB;KAE/B,IAAI,MAAM,QAAQ;MAChB,IAAI,KAAK,aACP,MAAM,OAAO,QAAQ,gBAAgB,UAAU,KAAK;WAEpD,OAAO,MAAM,OAAO,QAAQ;MAE9B,OAAO,cAAc,QAAQ,MAAM,MAAM;KAC3C;IACF,SAAS,KAAK;KACZ,OAAO,QAAQ,OAAO,GAAG;IAC3B;SACK,IAAI,MAAM,UAAU,WAAW;UAGhC,MADc,MAAM,OAAO,SAAS,IAAI,GACpC,WAAW,KAEjB,OAAO,SAAS,OAAO;IAAA;GACzB;GAIJ,OAAO,QAAQ,OAAO,KAAK;EAC7B,CACF;EAGF,KAAK,MAAM,IAAI,kBAAkB,QAAQ;GACvC,GAAG;GACH,UAAU,QAAQ,KAAK,YAAY,MAAM,SAAS;GAClD,aAAa,SAAiB;IAC5B,OAAO,SAAS;GAClB;GACA,aAAa;IACX,GAAI,KAAK,OACJ,EACC,UAAU,WAAW;KACnB,OAAO,KAAK,KAAM,iBAAiB,MAAM;IAC3C,EACF,IACA,CAAC;IACL,GAAG,OAAO;GACZ;GACA;EACF,CAAC;CACH;CAEA,MAAM,sBAAqC;EACzC,IAAI,KAAK,aAEP;EAGF,MAAM,cAAc,iBAAiB,UAAU,mBAAmB;EAClE,IAAI,eAAe,KAAK,gBAAgB,aAAa;GAEnD,KAAK,cAAc;GACnB;EACF;EAGA,KAAK,cAAc,eAAe,KAAK,WAAW;EAClD,IAAI;GACF,KAAK,cAAc,MAAM,KAAK;GAC9B,IAAI,KAAK,aAEP,iBAAiB,UAAU,qBAAqB,KAAK,WAAW;QAEhE,iBAAiB,OAAO,mBAAmB;EAE/C,UAAU;GACR,KAAK,cAAc;EACrB;CACF;CAEA,iBAAiB,MAAsB;EACrC,MAAM,MAAM,IAAI,IACd,QACE,KAAK,YAAY,MACjB,iBAAiB,KAAK,OAAO,UAC7B,IACF,CACF;EACA,IAAI,WAAW,IAAI,SAAS,QAAQ,QAAQ,IAAI;EAChD,IAAI,WAAW,IAAI,SAAS,QAAQ,SAAS,KAAK;EAKlD,IAAI,KAAK,aACP,IAAI,aAAa,OAAO,SAAS,KAAK,WAAW;OAC5C,IAAI,KAAK,OAAO,YAAY,KAAK,OAAO,UAAU;GACvD,IAAI,WAAW,KAAK,OAAO;GAC3B,IAAI,WAAW,KAAK,OAAO;EAC7B;EAEA,OAAO,IAAI,SAAS;CACtB;;;;;;CAOA,0BAA0B,MAAc;EACtC,OAAO,IAAI,0BAA0B,KAAK,iBAAiB,IAAI,GAAG,EAChE,MAAM,KAAK,KACb,CAAC;CACH;AACF;;;;;;;ACnNA,SAAgB,yBACd,MACA;CACA,MAAM,WAAW;EACf,KAAK,WAAW,MAAM;EACtB,KAAK,WAAW,MAAM;EACtB,KAAK,WAAW,MAAM;CACxB;CAEA,MAAM,cAAc;EAClB,KAAK,cAAc,MAAM;EACzB,KAAK,cAAc,MAAM;EACzB,KAAK,cAAc,MAAM;CAC3B;CAEA,MAAM,iBAAiB,SAAS,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC;CAEvD,MAAM,iBAAiB,YAAY,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC;CAE1D,OAAO,IAAI,eAAe,OAAO,cAAc,EAAE,KAAK,IAAI,EAAE;AAC9D;;;ACyCA,SAAS,WACP,MACA,OAKW;CACX,OACE,KAAK,SAAS,KAAK,KACnB,OAAO,UAAU,cACjB,CAAC,KAAK,SAAS,SAAS,KACxB,CAAC,KAAK,SAAS,IAAI,KACnB,CAAC,KAAK,SAAS,cAAc;AAEjC;AAEA,SAAS,QACP,gBAKA,MAC+B;CAC/B,MAAM,YAAY,IAAI,eACpB;EACE,GAAG;EACH,aAAa,SAAiB,SAAS;CACzC,GACA,KAAK,YAAY,IACjB,KAAK,iBAAiB,MAAM,OAAO,CACrC;CAEA,KAAK,MAAM,OAAO,QAAQ,QACxB,QAAQ,eAAe,SAAS,CAClC,GACE,IAAI,QAAQ,iBAAiB,OAAO,UAAU,SAAS,YAAY;EACjE,MAAM,mBAAmB,UAAU;EAGnC,UAAU,QAAQ,GAAG,SACnB,iBAAiB,MAAM,WAAW,IAAI,EAAE,MAAM,QAAQ,IAAI,IAAI;CAClE;CAGF,OAAO;AACT;;;;;;AAOA,MAAa,gBAAgB,MAAM,cAAc;CAG/C,YAAY,MAAyB;EACnC,KAAK,OAAO;EAEZ,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,GAClD,IAAI,WAAW,MAAM,KAAK,GAAG;GAC3B,MAAM,WAAW,KAAK,MAAM,GAAG,EAAE;GAEjC,IAAI,IAAI;GACR,OACE,IAAI,SAAS,UACb,SAAS,OAAO,SAAS,GAAG,YAAY,KACxC,SAAS,OAAO,SAAS,GAAG,YAAY,GAExC;GAGF,MAAM,WAAW,IAAI,IAAI,IAAI,IAAI;GACjC,MAAM,WACJ,SAAS,MAAM,GAAG,QAAQ,EAAE,YAAY,IAAI,SAAS,MAAM,QAAQ;GAEpE,KAAc,YAAY,QAAQ,OAAO,IAAI;EAChD;CAEJ;AACF;;;;;;;ACtHA,IAAa,OAAb,MAAkB;CAQhB,YAAY,QAA0B;qBAHO;qBAChB;EAG3B,KAAK,SAAS;EACd,KAAK,cACH,OAAO,eACP,iBAAiB,UAAU,mBAAmB,KAC9C;EAEF,IAAI,KAAK,OAAO,gBAAgB,4BAC9B,KAAK,OAAO,IAAI,iBAAiB;EAEnC,KAAK,cAAc,qBAAqB,KAAK,OAAO,WAAW;EAG/D,MAAM,gBAAgB,MAAM,OAAO;GACjC,SAAS,QAAQ,KAAK,YAAY,MAAM,SAAS;GAEjD,SACE,OAAO,WAAW,eAClB,OAAO,SAAS,OAAO,SAAS,WAAW,IACvC,CAAC,IACD,EAEE,uBAAuB,yBACzB;EACR,CAAC;EAED,cAAc,aAAa,QAAQ,IAAI,OAAO,YAAY;GACxD,IAAI,CAAC,QAAQ,QAAQ;QACf,KAAK,aACP,QAAQ,QAAQ,gBAAgB,UAAU,KAAK;SAC1C,IAAI,KAAK,OAAO,YAAY,KAAK,OAAO,UAC7C,QAAQ,QAAQ,gBAAgB,SAAS,KAAK,GAAG,OAAO,SAAS,GAAG,OAAO,UAAU;GAAA;GAGzF,OAAO;EACT,CAAC;EAED,IAAI,OAAO,WAAW,aACpB,cAAc,aAAa,SAAS,KACjC,MAAM,GACP,OAAO,UAAU;GACf,IAAI,aAAa,KAAK;QAChB,MAAM,UAAU,WAAW,KAG7B,IAAI;KACF,MAAM,KAAK,oBAAoB;KAE/B,IAAI,MAAM,QAAQ;MAChB,IAAI,KAAK,aACP,MAAM,OAAO,QAAQ,gBAAgB,UAAU,KAAK;WAEpD,OAAO,MAAM,OAAO,QAAQ;MAE9B,OAAO,cAAc,QAAQ,MAAM,MAAM;KAC3C;IACF,SAAS,KAAK;KACZ,OAAO,QAAQ,OAAO,GAAG;IAC3B;SACK,IAAI,MAAM,UAAU,WAAW;UAGhC,MADc,MAAM,OAAO,SAAS,IAAI,GACpC,WAAW,KAEjB,OAAO,SAAS,OAAO;IAAA;GACzB;GAIJ,OAAO,QAAQ,OAAO,KAAK;EAC7B,CACF;EAGF,KAAK,MAAM,IAAI,cAAc;GAC3B,GAAG;GACH,UAAU,QAAQ,KAAK,YAAY,MAAM,SAAS;GAClD,aAAa,SAAiB;IAC5B,OAAO,SAAS;GAClB;GACA,aAAa;IACX,GAAI,KAAK,OACJ,EACC,UAAU,WAAW;KAEnB,OAAO,KAAK,KAAM,iBAAiB,MAAM;IAC3C,EACF,IACA,CAAC;IACL,GAAG,OAAO;GACZ;GACA;EACF,CAAC;CACH;CAEA,MAAM,sBAAqC;EACzC,IAAI,KAAK,aAEP;EAGF,MAAM,cAAc,iBAAiB,UAAU,mBAAmB;EAClE,IAAI,eAAe,KAAK,gBAAgB,aAAa;GAEnD,KAAK,cAAc;GACnB;EACF;EAGA,KAAK,cAAc,eAAe,KAAK,WAAW;EAClD,IAAI;GACF,KAAK,cAAc,MAAM,KAAK;GAC9B,IAAI,KAAK,aAEP,iBAAiB,UAAU,qBAAqB,KAAK,WAAW;QAEhE,iBAAiB,OAAO,mBAAmB;EAE/C,UAAU;GACR,KAAK,cAAc;EACrB;CACF;CAEA,iBAAiB,MAAsB;EACrC,MAAM,MAAM,IAAI,IAAI,QAAQ,KAAK,YAAY,MAAM,WAAW,IAAI,CAAC;EACnE,IAAI,WAAW,IAAI,SAAS,QAAQ,QAAQ,IAAI;EAChD,IAAI,WAAW,IAAI,SAAS,QAAQ,SAAS,KAAK;EAKlD,IAAI,KAAK,aACP,IAAI,aAAa,OAAO,SAAS,KAAK,WAAW;OAC5C,IAAI,KAAK,OAAO,YAAY,KAAK,OAAO,UAAU;GACvD,IAAI,WAAW,KAAK,OAAO;GAC3B,IAAI,WAAW,KAAK,OAAO;EAC7B;EAEA,OAAO,IAAI,SAAS;CACtB;;;;;;CAOA,0BAA0B,MAAc;EACtC,OAAO,IAAI,0BAA0B,KAAK,iBAAiB,IAAI,GAAG,EAChE,MAAM,KAAK,KACb,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/deprecated/v2/NovaCellAPIClient.ts","../../../src/lib/v2/mock/getCurrentRobotControllerState.ts","../../../src/lib/v2/mock/getMotionGroupDescription.ts","../../../src/lib/v2/mock/getMotionGroupKinematicModel.ts","../../../src/lib/v2/mock/getRobotController.ts","../../../src/lib/v2/mock/listCoordinateSystems.ts","../../../src/lib/v2/mock/listRobotControllers.ts","../../../src/lib/v2/mock/MockNovaInstance.ts","../../../src/lib/deprecated/v2/NovaClient.ts","../../../src/lib/deprecated/v2/wandelscriptUtils.ts","../../../src/lib/v2/NovaAPIClient.ts","../../../src/lib/v2/Nova.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: legacy code */\n/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type {\n BaseAPI,\n Configuration as BaseConfiguration,\n} from \"@wandelbots/nova-api/v2\"\nimport {\n ApplicationApi,\n BUSInputsOutputsApi,\n CellApi,\n ControllerApi,\n ControllerInputsOutputsApi,\n JoggingApi,\n KinematicsApi,\n LicenseApi,\n MotionGroupApi,\n MotionGroupModelsApi,\n NOVACloudApi,\n ProgramApi,\n RobotConfigurationsApi,\n SessionApi,\n StoreCollisionComponentsApi,\n StoreCollisionSetupsApi,\n StoreObjectApi,\n SystemApi,\n TrajectoryCachingApi,\n TrajectoryExecutionApi,\n TrajectoryPlanningApi,\n VersionApi,\n VirtualControllerApi,\n VirtualControllerBehaviorApi,\n VirtualControllerInputsOutputsApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R\n ? (...args: P) => R\n : never\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any) => any\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\n/** @deprecated Use `NovaAPIClient` instead. */\nexport type WithCellId<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<OmitFirstArg<T[P]>>\n}\n\n/** @deprecated Use `NovaAPIClient` instead. */\nexport type WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * API client providing type-safe access to all the Nova API REST endpoints\n * associated with a specific cell id.\n * @deprecated Use `NovaAPIClient` from `@wandelbots/nova-js/v2` instead.\n */\nexport class NovaCellAPIClient {\n constructor(\n readonly cellId: string,\n readonly opts: BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n },\n ) {}\n\n /**\n * Some TypeScript sorcery which alters the API class methods so you don't\n * have to pass the cell id to every single one, and de-encapsulates the\n * response data\n */\n private withCellId<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, [this.cellId, ...args])\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithCellId<T>\n }\n\n /**\n * As withCellId, but only does the response unwrapping\n */\n private withUnwrappedResponsesOnly<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, args)\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n }\n\n readonly system = this.withUnwrappedResponsesOnly(SystemApi)\n readonly cell = this.withUnwrappedResponsesOnly(CellApi)\n\n readonly motionGroup = this.withCellId(MotionGroupApi)\n readonly motionGroupModels =\n this.withUnwrappedResponsesOnly(MotionGroupModelsApi)\n\n readonly controller = this.withCellId(ControllerApi)\n\n readonly controllerIOs = this.withCellId(ControllerInputsOutputsApi)\n\n readonly trajectoryPlanning = this.withCellId(TrajectoryPlanningApi)\n readonly trajectoryExecution = this.withCellId(TrajectoryExecutionApi)\n readonly trajectoryCaching = this.withCellId(TrajectoryCachingApi)\n\n readonly application = this.withCellId(ApplicationApi)\n readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)\n\n readonly jogging = this.withCellId(JoggingApi)\n\n readonly kinematics = this.withCellId(KinematicsApi)\n\n readonly busInputsOutputs = this.withCellId(BUSInputsOutputsApi)\n\n readonly virtualController = this.withCellId(VirtualControllerApi)\n readonly virtualControllerBehavior = this.withCellId(\n VirtualControllerBehaviorApi,\n )\n readonly virtualControllerIOs = this.withCellId(\n VirtualControllerInputsOutputsApi,\n )\n\n readonly storeObject = this.withCellId(StoreObjectApi)\n readonly storeCollisionComponents = this.withCellId(\n StoreCollisionComponentsApi,\n )\n readonly storeCollisionSetups = this.withCellId(StoreCollisionSetupsApi)\n\n readonly program = this.withCellId(ProgramApi)\n\n readonly license = this.withUnwrappedResponsesOnly(LicenseApi)\n readonly novaCloud = this.withUnwrappedResponsesOnly(NOVACloudApi)\n readonly robotConfigurations = this.withUnwrappedResponsesOnly(\n RobotConfigurationsApi,\n )\n readonly version = this.withUnwrappedResponsesOnly(VersionApi)\n readonly session = this.withUnwrappedResponsesOnly(SessionApi)\n}\n","export const getCurrentRobotControllerState = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/state\",\n handle() {\n return {\n mode: \"MODE_CONTROL\",\n last_error: [],\n timestamp: \"2025-10-16T09:19:26.634534092Z\",\n sequence_number: 1054764,\n controller: \"mock-ur5e\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n velocity_override: 100,\n motion_groups: [\n {\n timestamp: \"2025-10-16T09:19:26.634534092Z\",\n sequence_number: 1054764,\n motion_group: \"0@mock-ur5e\",\n controller: \"mock-ur5e\",\n joint_position: [\n 1.487959623336792, -1.8501918315887451, 1.8003005981445312,\n 6.034560203552246, 1.4921919107437134, 1.593459963798523,\n ],\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n joint_torque: [],\n joint_current: [0, 0, 0, 0, 0, 0],\n flange_pose: {\n position: [\n 107.6452433732927, -409.0402987746852, 524.2402132330305,\n ],\n orientation: [\n 0.9874434028353319, -0.986571714997442, 1.3336589451098142,\n ],\n },\n tcp: \"Flange\",\n tcp_pose: {\n position: [\n 107.6452433732927, -409.0402987746852, 524.2402132330305,\n ],\n orientation: [\n 0.9874434028353319, -0.986571714997442, 1.3336589451098142,\n ],\n },\n payload: \"\",\n coordinate_system: \"\",\n standstill: true,\n },\n ],\n }\n },\n}\n","export const getMotionGroupDescription = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/motion-groups/:motionGroupId/description\",\n handle() {\n return {\n motion_group_model: \"UniversalRobots_UR5e\",\n mounting: {\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n },\n tcps: {\n Flange: {\n name: \"Default-Flange\",\n pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n },\n },\n },\n payloads: {\n \"FPay-0\": {\n name: \"FPay-0\",\n payload: 0,\n center_of_mass: [0, 0, 0],\n moment_of_inertia: [0, 0, 0],\n },\n },\n cycle_time: 8,\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n d: 162.25,\n },\n {\n a: -425,\n },\n {\n a: -392.2,\n },\n {\n alpha: 1.5707963267948966,\n d: 133.3,\n },\n {\n alpha: -1.5707963267948966,\n d: 99.7,\n },\n {\n d: 99.6,\n },\n ],\n operation_limits: {\n auto_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n elbow: {\n velocity: 5000,\n },\n flange: {\n velocity: 5000,\n },\n },\n manual_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n manual_t1_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n manual_t2_limits: {\n joints: [\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 150,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n {\n position: {\n lower_limit: -6.283185307179586,\n upper_limit: 6.283185307179586,\n },\n velocity: 3.34159255027771,\n acceleration: 40,\n torque: 28,\n },\n ],\n tcp: {\n velocity: 5000,\n },\n },\n },\n serial_number: \"WBVirtualRobot\",\n }\n },\n}\n","export const getMotionGroupKinematicModel = {\n method: \"GET\",\n path: \"/motion-group-models/:motionGroupModel/kinematic\",\n handle() {\n return {\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 162.25,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: -425.0,\n d: 0.0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: -392.2,\n d: 0.0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 133.3,\n reverse_rotation_direction: false,\n },\n {\n alpha: -1.5707963267948966,\n theta: 0.0,\n a: 0.0,\n d: 99.7,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0.0,\n theta: 0.0,\n a: 0.0,\n d: 99.6,\n reverse_rotation_direction: false,\n },\n ],\n inverse_solver: \"Universalrobots\",\n }\n },\n}\n","import type { RobotController } from \"@wandelbots/nova-api/v2\"\n\nexport const getRobotController = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId\",\n handle() {\n return {\n configuration: {\n initial_joint_position: \"[0,-1.571,-1.571,-1.571,1.571,-1.571,0]\",\n kind: \"VirtualController\",\n manufacturer: \"universalrobots\",\n type: \"universalrobots-ur5e\",\n },\n name: \"mock-ur5\",\n } satisfies RobotController\n },\n}\n","export const listCoordinateSystems = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId/coordinate-systems\",\n handle() {\n return [\n {\n coordinate_system: \"\",\n name: \"world\",\n reference_coordinate_system: \"\",\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n orientation_type: \"ROTATION_VECTOR\",\n },\n {\n coordinate_system: \"CS-0\",\n name: \"Default-CS\",\n reference_coordinate_system: \"\",\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n orientation_type: \"ROTATION_VECTOR\",\n },\n ]\n },\n}\n","export const listRobotControllers = {\n method: \"GET\",\n path: \"/cells/:cellId/controllers\",\n handle() {\n return [\"mock-ur5e\"]\n },\n}\n","import type { MotionGroupState } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\nimport { AxiosError } from \"axios\"\nimport * as pathToRegexp from \"path-to-regexp\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\nimport { getCurrentRobotControllerState } from \"./getCurrentRobotControllerState\"\nimport { getMotionGroupDescription } from \"./getMotionGroupDescription\"\nimport { getMotionGroupKinematicModel } from \"./getMotionGroupKinematicModel\"\nimport { getRobotController } from \"./getRobotController\"\nimport { listCoordinateSystems } from \"./listCoordinateSystems\"\nimport { listRobotControllers } from \"./listRobotControllers\"\n\n/**\n * Ultra-simplified mock Nova server for testing stuff\n */\nexport class MockNovaInstance {\n readonly connections: AutoReconnectingWebsocket[] = []\n\n async handleAPIRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<AxiosResponse> {\n const apiHandlers = [\n listRobotControllers,\n getRobotController,\n getMotionGroupDescription,\n getCurrentRobotControllerState,\n listCoordinateSystems,\n getMotionGroupKinematicModel,\n ]\n\n const method = config.method?.toUpperCase() || \"GET\"\n if (!config.url) {\n throw new Error(\"No url sent with request\")\n }\n const path = config.url.split(\"?\")[0]\n\n for (const handler of apiHandlers) {\n const match = pathToRegexp.match(handler.path)(path)\n if (method === handler.method && match) {\n const json = handler.handle()\n return {\n status: 200,\n statusText: \"Success\",\n data: JSON.stringify(json),\n headers: {},\n config,\n request: {\n responseURL: config.url,\n },\n }\n }\n }\n\n throw new AxiosError(\n `No mock handler matched this request: ${method} ${path}`,\n \"404\",\n config,\n )\n }\n\n // Please note: Only very basic websocket mocking is done here, needs to be extended as needed\n handleWebsocketConnection(socket: AutoReconnectingWebsocket) {\n this.connections.push(socket)\n\n setTimeout(() => {\n socket.dispatchEvent(new Event(\"open\"))\n\n console.log(\"Websocket connection opened from\", socket.url)\n\n if (socket.url.includes(\"/state-stream\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify(defaultMotionState),\n }),\n )\n }\n\n if (socket.url.includes(\"/execution/jogging\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n message: \"string\",\n kind: \"INITIALIZE_RECEIVED\",\n },\n }),\n }),\n )\n }\n }, 10)\n }\n\n handleWebsocketMessage(socket: AutoReconnectingWebsocket, message: string) {\n console.log(`Received message on ${socket.url}`, message)\n }\n}\n\nconst defaultMotionState = {\n result: {\n motion_group: \"0@universalrobots-ur5e\",\n controller: \"universalrobots-ur5e\",\n timestamp: new Date().toISOString(),\n sequence_number: 1,\n joint_position: [\n 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,\n 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,\n ],\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n standstill: false,\n flange_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n tcp_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n description_revision: 0,\n } satisfies MotionGroupState,\n}\n","/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport { loginWithAuth0 } from \"../../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../../availableStorage\"\nimport { parseNovaInstanceUrl } from \"../../converters\"\n\nimport { MockNovaInstance } from \"../../v2/mock/MockNovaInstance\"\nimport { NovaCellAPIClient } from \"./NovaCellAPIClient\"\n\n/** @deprecated Use `NovaClientConfig` from `Nova` instead. */\nexport type NovaClientConfig = {\n /**\n * Url of the deployed Nova instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string | \"https://mock.example.com\"\n\n /**\n * Identifier of the cell on the Nova instance to connect this client to.\n * If omitted, the default identifier \"cell\" is used.\n **/\n cellId?: string\n\n /**\n * Username for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n username?: string\n\n /**\n * Password for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n password?: string\n\n /**\n * Access token for Bearer authentication.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\ntype NovaClientConfigWithDefaults = NovaClientConfig & { cellId: string }\n\n/**\n * Client for connecting to a Nova instance and controlling robots.\n * @deprecated Use `Nova` from `@wandelbots/nova-js/v2` instead.\n */\nexport class NovaClient {\n readonly api: NovaCellAPIClient\n readonly config: NovaClientConfigWithDefaults\n readonly mock?: MockNovaInstance\n readonly instanceUrl: URL\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaClientConfig) {\n const cellId = config.cellId ?? \"cell\"\n this.config = {\n cellId,\n ...config,\n }\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl)\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: new URL(\"/api/v2\", this.instanceUrl).href,\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(`${config.username}:${config.password}`)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaCellAPIClient(cellId, {\n ...config,\n basePath: new URL(\"/api/v2\", this.instanceUrl).href,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n return this.mock!.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n const storedToken = availableStorage.getString(\"wbjs.access_token\")\n if (storedToken && this.accessToken !== storedToken) {\n // Might be newer than the one we have\n this.accessToken = storedToken\n return\n }\n\n // Otherwise, perform login flow\n this.authPromise = loginWithAuth0(this.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(\n new URL(\n `/api/v2/cells/${this.config.cellId}/${path.replace(/^\\/+/, \"\")}`,\n this.instanceUrl,\n ).href,\n )\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n","import type { Pose } from \"@wandelbots/nova-api/v2\"\n\n/**\n * Convert a Pose object representing a motion group position\n * into a string which represents that pose in Wandelscript.\n * @deprecated Wandelscript usage is deprecated; switching to Python is recommended.\n */\nexport function poseToWandelscriptString(\n pose: Pick<Pose, \"position\" | \"orientation\">,\n) {\n const position = [\n pose.position?.[0] ?? 0,\n pose.position?.[1] ?? 0,\n pose.position?.[2] ?? 0,\n ]\n\n const orientation = [\n pose.orientation?.[0] ?? 0,\n pose.orientation?.[1] ?? 0,\n pose.orientation?.[2] ?? 0,\n ]\n\n const positionValues = position.map((v) => v.toFixed(1))\n // Rotation needs more precision since it's in radians\n const rotationValues = orientation.map((v) => v.toFixed(4))\n\n return `(${positionValues.concat(rotationValues).join(\", \")})`\n}\n","import type {\n BaseAPI,\n Configuration as BaseConfiguration,\n} from \"@wandelbots/nova-api/v2\"\nimport {\n ApplicationApi,\n BUSInputsOutputsApi,\n CellApi,\n ControllerApi,\n ControllerInputsOutputsApi,\n JoggingApi,\n KinematicsApi,\n LicenseApi,\n MotionGroupApi,\n MotionGroupModelsApi,\n NOVACloudApi,\n ProgramApi,\n RobotConfigurationsApi,\n SessionApi,\n StoreCollisionComponentsApi,\n StoreCollisionSetupsApi,\n StoreObjectApi,\n SystemApi,\n TrajectoryCachingApi,\n TrajectoryExecutionApi,\n TrajectoryPlanningApi,\n VersionApi,\n VirtualControllerApi,\n VirtualControllerBehaviorApi,\n VirtualControllerInputsOutputsApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\n// biome-ignore lint/suspicious/noExplicitAny: metamagic\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any[]) => any\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\ntype WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\ntype NovaAPIClientOpts = BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n}\n\nfunction unwrap<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n opts: NovaAPIClientOpts,\n): WithUnwrappedAxiosResponse<T> {\n const apiClient = new ApiConstructor(\n {\n ...opts,\n isJsonMime: (mime: string) => mime === \"application/json\",\n },\n opts.basePath ?? \"\",\n opts.axiosInstance ?? axios.create(),\n ) as Record<string | symbol, unknown>\n\n for (const key of Reflect.ownKeys(\n Reflect.getPrototypeOf(apiClient) as object,\n )) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key] as (\n ...args: unknown[]\n ) => Promise<{ data: unknown }>\n apiClient[key] = (...args: unknown[]) =>\n originalFunction.apply(apiClient, args).then((res) => res.data)\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n}\n\n/**\n * API client providing type-safe access to all the endpoints of a NOVA\n * instance.\n */\nexport class NovaAPIClient {\n readonly opts: NovaAPIClientOpts\n\n readonly application: WithUnwrappedAxiosResponse<ApplicationApi>\n readonly busIOs: WithUnwrappedAxiosResponse<BUSInputsOutputsApi>\n readonly cell: WithUnwrappedAxiosResponse<CellApi>\n readonly controller: WithUnwrappedAxiosResponse<ControllerApi>\n readonly controllerIOs: WithUnwrappedAxiosResponse<ControllerInputsOutputsApi>\n readonly jogging: WithUnwrappedAxiosResponse<JoggingApi>\n readonly kinematics: WithUnwrappedAxiosResponse<KinematicsApi>\n readonly license: WithUnwrappedAxiosResponse<LicenseApi>\n readonly motionGroup: WithUnwrappedAxiosResponse<MotionGroupApi>\n readonly motionGroupModels: WithUnwrappedAxiosResponse<MotionGroupModelsApi>\n readonly novaCloud: WithUnwrappedAxiosResponse<NOVACloudApi>\n readonly program: WithUnwrappedAxiosResponse<ProgramApi>\n readonly robotConfigurations: WithUnwrappedAxiosResponse<RobotConfigurationsApi>\n readonly session: WithUnwrappedAxiosResponse<SessionApi>\n readonly storeCollisionComponents: WithUnwrappedAxiosResponse<StoreCollisionComponentsApi>\n readonly storeCollisionSetups: WithUnwrappedAxiosResponse<StoreCollisionSetupsApi>\n readonly storeObject: WithUnwrappedAxiosResponse<StoreObjectApi>\n readonly system: WithUnwrappedAxiosResponse<SystemApi>\n readonly trajectoryCaching: WithUnwrappedAxiosResponse<TrajectoryCachingApi>\n readonly trajectoryExecution: WithUnwrappedAxiosResponse<TrajectoryExecutionApi>\n readonly trajectoryPlanning: WithUnwrappedAxiosResponse<TrajectoryPlanningApi>\n readonly version: WithUnwrappedAxiosResponse<VersionApi>\n readonly virtualController: WithUnwrappedAxiosResponse<VirtualControllerApi>\n readonly virtualControllerBehavior: WithUnwrappedAxiosResponse<VirtualControllerBehaviorApi>\n readonly virtualControllerIOs: WithUnwrappedAxiosResponse<VirtualControllerInputsOutputsApi>\n\n constructor(opts: NovaAPIClientOpts) {\n this.opts = opts\n\n this.application = unwrap(ApplicationApi, opts)\n this.busIOs = unwrap(BUSInputsOutputsApi, opts)\n this.cell = unwrap(CellApi, opts)\n this.controller = unwrap(ControllerApi, opts)\n this.controllerIOs = unwrap(ControllerInputsOutputsApi, opts)\n this.jogging = unwrap(JoggingApi, opts)\n this.kinematics = unwrap(KinematicsApi, opts)\n this.license = unwrap(LicenseApi, opts)\n this.motionGroup = unwrap(MotionGroupApi, opts)\n this.motionGroupModels = unwrap(MotionGroupModelsApi, opts)\n this.novaCloud = unwrap(NOVACloudApi, opts)\n this.program = unwrap(ProgramApi, opts)\n this.robotConfigurations = unwrap(RobotConfigurationsApi, opts)\n this.session = unwrap(SessionApi, opts)\n this.storeCollisionComponents = unwrap(StoreCollisionComponentsApi, opts)\n this.storeCollisionSetups = unwrap(StoreCollisionSetupsApi, opts)\n this.storeObject = unwrap(StoreObjectApi, opts)\n this.system = unwrap(SystemApi, opts)\n this.trajectoryCaching = unwrap(TrajectoryCachingApi, opts)\n this.trajectoryExecution = unwrap(TrajectoryExecutionApi, opts)\n this.trajectoryPlanning = unwrap(TrajectoryPlanningApi, opts)\n this.version = unwrap(VersionApi, opts)\n this.virtualController = unwrap(VirtualControllerApi, opts)\n this.virtualControllerBehavior = unwrap(VirtualControllerBehaviorApi, opts)\n this.virtualControllerIOs = unwrap(VirtualControllerInputsOutputsApi, opts)\n }\n}\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport { loginWithAuth0 } from \"../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../availableStorage\"\nimport { parseNovaInstanceUrl } from \"../converters\"\nimport { NovaAPIClient } from \"./NovaAPIClient\"\nimport { MockNovaInstance } from \"./mock/MockNovaInstance\"\n\nexport type NovaConfig = {\n /**\n * Url of the deployed NOVA instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string\n\n /**\n * Access token for Bearer authentication.\n * If running on a NOVA instance, this can be automatically retrieved from\n * the current session when omitted.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\n/**\n *\n * Client for connecting to a NOVA instance and controlling robots.\n */\nexport class Nova {\n readonly api: NovaAPIClient\n readonly config: NovaConfig\n readonly mock?: MockNovaInstance\n readonly instanceUrl: URL\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaConfig) {\n this.config = config\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n this.instanceUrl = parseNovaInstanceUrl(this.config.instanceUrl)\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: new URL(\"/api/v2\", this.instanceUrl).href,\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(`${config.username}:${config.password}`)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaAPIClient({\n ...config,\n basePath: new URL(\"/api/v2\", this.instanceUrl).href,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n if (!this.mock) {\n throw new Error(\"Mock adapter used without a mock instance\")\n }\n return this.mock.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n const storedToken = availableStorage.getString(\"wbjs.access_token\")\n if (storedToken && this.accessToken !== storedToken) {\n // Might be newer than the one we have\n this.accessToken = storedToken\n return\n }\n\n // Otherwise, perform login flow\n this.authPromise = loginWithAuth0(this.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(`/api/v2/${path.replace(/^\\/+/, \"\")}`, this.instanceUrl)\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n"],"mappings":"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EACF;GACA,UAAU,EACR,UAAU;IACR,MAAM;IACN,SAAS;IACT,gBAAgB;KAAC;KAAG;KAAG;IAAC;IACxB,mBAAmB;KAAC;KAAG;KAAG;IAAC;GAC7B,EACF;GACA,YAAY;GACZ,eAAe;IACb;KACE,OAAO;KACP,GAAG;IACL;IACA,EACE,GAAG,KACL;IACA,EACE,GAAG,OACL;IACA;KACE,OAAO;KACP,GAAG;IACL;IACA;KACE,OAAO;KACP,GAAG;IACL;IACA,EACE,GAAG,KACL;GACF;GACA,kBAAkB;IAChB,aAAa;KACX,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;KACA,OAAO,EACL,UAAU,IACZ;KACA,QAAQ,EACN,UAAU,IACZ;IACF;IACA,eAAe;KACb,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;IACA,kBAAkB;KAChB,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;IACA,kBAAkB;KAChB,QAAQ;MACN;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;MACA;OACE,UAAU;QACR,aAAa;QACb,aAAa;OACf;OACA,UAAU;OACV,cAAc;OACd,QAAQ;MACV;KACF;KACA,KAAK,EACH,UAAU,IACZ;IACF;GACF;GACA,eAAe;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"}