@capytale/activity.js 3.1.27 → 3.1.29

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.
@@ -34,6 +34,8 @@ export type ActivityType = {
34
34
  filterWith?: string | null;
35
35
  /** Si ce type d'activité produit des évaluations détaillées. */
36
36
  detailedEvaluation: boolean;
37
+ /** Si ce type d'activité utilise les consignes */
38
+ hasInstructions: boolean;
37
39
  /** Si ce type d'activité est exportable. */
38
40
  exportable: boolean;
39
41
  /** Si ce type d'activité est compatible lti. (`null` signifie ne sera jamais compatible) */
@@ -1 +1 @@
1
- {"version":3,"file":"activityType.js","sourceRoot":"","sources":["../../src/activity/activityType/activityType.ts"],"names":[],"mappings":"","sourcesContent":["import type { ActivityMode } from \"~/activitySession\";\n\ntype IframeUrlMap = {\n create: string;\n review: string;\n assignment: string;\n view: string;\n}\n\ntype ContractParameters = {\n variant?: string;\n backend?: 'db' | 'fs';\n [p: string] : number | boolean | string | undefined;\n}\n\nexport type ActivityType = {\n id: string;\n name: string;\n status?: { beta?: boolean };\n icon: {\n path: string;\n style?: { [s: string]: string };\n };\n helpUrl: string;\n summary: string;\n description: string;\n tags?: string;\n bundle: string;\n /** Si ce type d'activité est disponible pour l'utilisateur courant. */\n available: boolean;\n /** Indique que ce type d'activité est remplacé. */\n replacedBy?: string | null;\n /** Ce type d'activité devrait être filtré en même temps que celui indiqué. */\n filterWith?: string | null;\n /** Si ce type d'activité produit des évaluations détaillées. */\n detailedEvaluation: boolean;\n /** Si ce type d'activité est exportable. */\n exportable: boolean;\n /** Si ce type d'activité est compatible lti. (`null` signifie ne sera jamais compatible) */\n lti: boolean | null;\n /** L'url de l'iFrame */\n \n iframe_url: null | string | IframeUrlMap;\n contracts: null | {\n [contract: string]: ContractParameters;\n }\n}\n\nexport type ActivityGroup = {\n title: string;\n tooltip?: string;\n activities: string[];\n};\n\nexport type ActivityGroups = {\n [key: string]: ActivityGroup;\n};\n\nexport type ActivityWeights = {\n all: { [key: string]: number };\n niveaux: {\n [key: string]: {\n title: string;\n activities: { [key: string]: number }\n }\n };\n groups: ActivityGroups;\n};\n"]}
1
+ {"version":3,"file":"activityType.js","sourceRoot":"","sources":["../../src/activity/activityType/activityType.ts"],"names":[],"mappings":"","sourcesContent":["import type { ActivityMode } from \"~/activitySession\";\n\ntype IframeUrlMap = {\n create: string;\n review: string;\n assignment: string;\n view: string;\n}\n\ntype ContractParameters = {\n variant?: string;\n backend?: 'db' | 'fs';\n [p: string] : number | boolean | string | undefined;\n}\n\nexport type ActivityType = {\n id: string;\n name: string;\n status?: { beta?: boolean };\n icon: {\n path: string;\n style?: { [s: string]: string };\n };\n helpUrl: string;\n summary: string;\n description: string;\n tags?: string;\n bundle: string;\n /** Si ce type d'activité est disponible pour l'utilisateur courant. */\n available: boolean;\n /** Indique que ce type d'activité est remplacé. */\n replacedBy?: string | null;\n /** Ce type d'activité devrait être filtré en même temps que celui indiqué. */\n filterWith?: string | null;\n /** Si ce type d'activité produit des évaluations détaillées. */\n detailedEvaluation: boolean;\n /** Si ce type d'activité utilise les consignes */\n hasInstructions: boolean;\n /** Si ce type d'activité est exportable. */\n exportable: boolean;\n /** Si ce type d'activité est compatible lti. (`null` signifie ne sera jamais compatible) */\n lti: boolean | null;\n /** L'url de l'iFrame */\n \n iframe_url: null | string | IframeUrlMap;\n contracts: null | {\n [contract: string]: ContractParameters;\n }\n}\n\nexport type ActivityGroup = {\n title: string;\n tooltip?: string;\n activities: string[];\n};\n\nexport type ActivityGroups = {\n [key: string]: ActivityGroup;\n};\n\nexport type ActivityWeights = {\n all: { [key: string]: number };\n niveaux: {\n [key: string]: {\n title: string;\n activities: { [key: string]: number }\n }\n };\n groups: ActivityGroups;\n};\n"]}
@@ -10,6 +10,11 @@ export type ReturnValueType<T extends ReturnType> = {
10
10
  'stream': ReadableStream<Uint8Array> | null;
11
11
  'void': void;
12
12
  }[T];
13
+ export interface HttpRequestOptions {
14
+ credentials?: RequestCredentials;
15
+ mode?: RequestMode;
16
+ headers?: HeadersInit;
17
+ }
13
18
  export interface CredentialProvider {
14
19
  /**
15
20
  * Fournit les en-têtes d'authentification pour une requête HTTP.
@@ -17,11 +22,9 @@ export interface CredentialProvider {
17
22
  * @param isSafe - indique si la requête est considérée safe (GET, HEAD, OPTIONS)
18
23
  * @param url - l'URL de la requête
19
24
  * @param auth - indique si l'authentification est requise
20
- * @param hdr - si défini, les en-têtes de la requête auquel ajouter les en-têtes d'authentification
21
- * si non défini, les en-têtes d'authentification seuls sont retournés
22
- * @returns les en-têtes d'authentification
25
+ * @returns les options de requête à employer
23
26
  */
24
- getCredentialsFor(isSafe: boolean, url: string, auth?: boolean, hdr?: HeadersInit): Promise<HeadersInit>;
27
+ getCredentialsFor(isSafe: boolean, url: string, auth?: boolean): Promise<HttpRequestOptions>;
25
28
  }
26
29
  export interface HttpBackend {
27
30
  requestAsync<const T extends ReturnType>(method: string, route: RouteOrString, data: any, retType: T, auth?: boolean, expectedStatus?: number | number[], hdr?: HeadersInit): Promise<ReturnValueType<T>>;
@@ -5,6 +5,17 @@ function isSafeMethod(method) {
5
5
  }
6
6
  ;
7
7
  ;
8
+ function mergeHeaders(hdr1, hdr2) {
9
+ if (hdr1 == null)
10
+ return hdr2;
11
+ if (hdr2 == null)
12
+ return hdr1;
13
+ const merged = new Headers(hdr1);
14
+ for (const [key, value] of (new Headers(hdr2)).entries()) {
15
+ merged.set(key, value);
16
+ }
17
+ return merged;
18
+ }
8
19
  function isOk(r, expected) {
9
20
  if (expected == null)
10
21
  return r.ok;
@@ -12,14 +23,15 @@ function isOk(r, expected) {
12
23
  return expected.includes(r.status);
13
24
  return r.status === expected;
14
25
  }
15
- async function rawRequestAsync(method, url, data, expectedStatus, hdr) {
26
+ async function rawRequestAsync(method, url, data, expectedStatus, hdr, options) {
16
27
  let response;
28
+ if (options == null)
29
+ options = {};
30
+ options.headers = mergeHeaders(hdr, options.headers);
31
+ options.method = method;
32
+ options.body = data;
17
33
  try {
18
- let request = new Request(url, {
19
- method: method,
20
- headers: hdr,
21
- body: data,
22
- });
34
+ let request = new Request(url, options);
23
35
  response = await fetch(request);
24
36
  if (isOk(response, expectedStatus))
25
37
  return response;
@@ -46,7 +58,7 @@ export default function (r, cp) {
46
58
  function authRawRequestAsync(method, route, data, auth, expectedStatus, hdr) {
47
59
  method = method.toUpperCase();
48
60
  const url = typeof route === 'string' ? route : r(route);
49
- return cp.getCredentialsFor(isSafeMethod(method), url, auth, hdr).then(hdr => rawRequestAsync(method, url, data, expectedStatus, hdr));
61
+ return cp.getCredentialsFor(isSafeMethod(method), url, auth).then(options => rawRequestAsync(method, url, data, expectedStatus, hdr, options));
50
62
  }
51
63
  function requestAsync(method, route, data, retType, auth, expectedStatus, hdr) {
52
64
  const reqTask = authRawRequestAsync(method, route, data, auth, expectedStatus, hdr);
@@ -1 +1 @@
1
- {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/api/http/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import { NetworkError, StatusError, ApiError, PayloadError } from \"./error\";\r\nimport type { Route, RouteResolver } from \"./route\";\r\n\r\ntype RouteOrString = Route | string;\r\n\r\nexport type NonVoidReturnType = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'stream';\r\nexport type ReturnType = NonVoidReturnType | 'void';\r\ntype CallableReturnType = Exclude<NonVoidReturnType, 'stream'>;\r\n\r\nexport type ReturnValueType<T extends ReturnType> = {\r\n 'json': unknown;\r\n 'text': string;\r\n 'blob': Blob;\r\n 'arrayBuffer': ArrayBuffer;\r\n 'stream': ReadableStream<Uint8Array> | null;\r\n 'void': void;\r\n}[T];\r\n\r\nconst safeMethods = ['GET', 'HEAD', 'OPTIONS'];\r\n\r\nfunction isSafeMethod(method: string): boolean {\r\n return safeMethods.includes(method);\r\n}\r\n\r\nexport interface CredentialProvider {\r\n /**\r\n * Fournit les en-têtes d'authentification pour une requête HTTP.\r\n * \r\n * @param isSafe - indique si la requête est considérée safe (GET, HEAD, OPTIONS)\r\n * @param url - l'URL de la requête\r\n * @param auth - indique si l'authentification est requise\r\n * @param hdr - si défini, les en-têtes de la requête auquel ajouter les en-têtes d'authentification \r\n * si non défini, les en-têtes d'authentification seuls sont retournés\r\n * @returns les en-têtes d'authentification\r\n */\r\n getCredentialsFor(isSafe: boolean, url: string, auth?: boolean, hdr?: HeadersInit): Promise<HeadersInit>\r\n};\r\n\r\nexport interface HttpBackend {\r\n requestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T>>;\r\n\r\n getAsync<const T extends ReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean\r\n ): Promise<ReturnValueType<T>>;\r\n getJsonAsync(route: RouteOrString, auth?: boolean): Promise<unknown | null>;\r\n getJsonAsync<T>(route: RouteOrString, auth?: boolean): Promise<T | null>;\r\n getStringAsync(route: RouteOrString, auth?: boolean): Promise<string>;\r\n\r\n getNullableAsync<const T extends NonVoidReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean\r\n ): Promise<ReturnValueType<T> | null>;\r\n getNullableStringAsync(route: RouteOrString, auth?: boolean): Promise<string | null>;\r\n\r\n postAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n postJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n postGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n postGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n putAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n putJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n putGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n putGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n patchAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n patchJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n patchGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n patchGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n deleteAsync(route: RouteOrString): Promise<void>;\r\n deleteGetJsonAsync(route: RouteOrString): Promise<unknown>;\r\n deleteGetJsonAsync<T>(route: RouteOrString): Promise<T>;\r\n};\r\n\r\nfunction isOk(r: Response, expected?: number | number[]): boolean {\r\n if (expected == null) return r.ok;\r\n if (Array.isArray(expected)) return expected.includes(r.status);\r\n return r.status === expected;\r\n}\r\n\r\nasync function rawRequestAsync(\r\n method: string,\r\n url: string,\r\n data: any,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n): Promise<Response> {\r\n let response: Response;\r\n try {\r\n let request = new Request(url, {\r\n method: method,\r\n headers: hdr,\r\n body: data,\r\n });\r\n response = await fetch(request);\r\n if (isOk(response, expectedStatus)) return response;\r\n } catch (e: any) {\r\n throw new NetworkError({ method, url }, e.message);\r\n }\r\n // Il y a une erreur. On extraie le message d'erreur du corps de la réponse\r\n if (response.headers.get('Content-Type')?.includes('application/json')) {\r\n let payload: any;\r\n try {\r\n payload = await response.json();\r\n } catch (e) {\r\n throw new StatusError({ method, url }, response.statusText, response.status);\r\n }\r\n if (typeof payload === 'object' && payload != null) {\r\n throw new ApiError({ method, url }, response.statusText, response.status, payload);\r\n }\r\n }\r\n throw new StatusError({ method, url }, response.statusText, response.status);\r\n}\r\n\r\n\r\nexport default function (r: RouteResolver, cp: CredentialProvider): HttpBackend {\r\n function authRawRequestAsync(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<Response> {\r\n method = method.toUpperCase();\r\n const url = typeof route === 'string' ? route : r(route);\r\n return cp.getCredentialsFor(isSafeMethod(method), url, auth, hdr).then(\r\n hdr => rawRequestAsync(method, url, data, expectedStatus, hdr)\r\n );\r\n }\r\n\r\n function requestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T>> {\r\n const reqTask = authRawRequestAsync(method, route, data, auth, expectedStatus, hdr);\r\n if (retType === 'void') return reqTask.then(_ => void 0 as ReturnValueType<T>);\r\n else return reqTask.then(\r\n (response: Response) => {\r\n if (retType === 'stream') return response.body;\r\n else return response[retType as CallableReturnType]().catch((e) => {\r\n throw new PayloadError({ method, url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Une requête avec un type mime spécifié\r\n */\r\n function typedRequestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n type?: string\r\n ): Promise<ReturnValueType<T>> {\r\n if (type == null) return requestAsync(method, route, data, retType, auth, expectedStatus);\r\n const hdr = { 'Content-Type': type };\r\n return requestAsync(method, route, data, retType, auth, expectedStatus, hdr);\r\n }\r\n\r\n function jsonDataRequestAsync(\r\n method: string,\r\n route: RouteOrString,\r\n getResponse: boolean,\r\n data: any,\r\n json?: boolean\r\n ): Promise<any> {\r\n if (!json) data = JSON.stringify(data);\r\n const hdr = { 'Content-Type': 'application/json' };\r\n return authRawRequestAsync(method, route, data, true, [200, 201, 204], hdr).then(\r\n (response: Response) => {\r\n if (!getResponse) return void 0;\r\n if (response.status === 204) return null;\r\n else return response.json().catch((e) => {\r\n throw new PayloadError({ method, url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n function getNullableAsync<const T extends NonVoidReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean,\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T> | null> {\r\n return authRawRequestAsync(\"GET\", route, null, auth, [200, 204], hdr).then(\r\n (response: Response) => {\r\n if (response.status === 204) return null;\r\n if (retType === 'stream') return response.body;\r\n else return response[retType as CallableReturnType]().catch((e) => {\r\n throw new PayloadError({ method: 'GET', url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n\r\n return (\r\n {\r\n requestAsync(method, route, data, retType, auth?, expectedStatus?, hdr?) {\r\n return requestAsync(method, route, data, retType, auth, expectedStatus, hdr);\r\n },\r\n\r\n getAsync(route, retType, auth?) {\r\n return requestAsync(\"GET\", route, null, retType, auth);\r\n },\r\n getJsonAsync(route: RouteOrString, auth?: boolean): Promise<unknown> {\r\n return getNullableAsync(route, 'json', auth);\r\n },\r\n getStringAsync(route: RouteOrString, auth?: boolean): Promise<string> {\r\n return requestAsync(\"GET\", route, null, \"text\", auth);\r\n },\r\n getNullableAsync(route, retType, auth?) {\r\n return getNullableAsync(route, retType, auth)\r\n },\r\n getNullableStringAsync(route: RouteOrString, auth?: boolean): Promise<string | null> {\r\n return getNullableAsync(route, 'text', auth);\r\n },\r\n\r\n postAsync(route, data: any, type?: string): Promise<void> {\r\n return typedRequestAsync(\"POST\", route, data, 'void', true, [200, 201], type);\r\n },\r\n postJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"POST\", route, false, data, json);\r\n },\r\n postGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"POST\", route, true, data, json);\r\n },\r\n\r\n putAsync(route, data, type?: string): Promise<void> {\r\n return typedRequestAsync(\"PUT\", route, data, 'void', true, [200, 204], type);\r\n },\r\n putJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"PUT\", route, false, data, json);\r\n },\r\n putGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"PUT\", route, true, data, json);\r\n },\r\n\r\n patchAsync(route, data: any, type?: string): Promise<void> {\r\n return typedRequestAsync(\"PATCH\", route, data, 'void', true, [200, 204], type);\r\n },\r\n patchJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"PATCH\", route, false, data, json);\r\n },\r\n patchGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"PATCH\", route, true, data, json);\r\n },\r\n\r\n deleteAsync(route): Promise<void> {\r\n return requestAsync(\"DELETE\", route, null, 'void', true, [200, 204]);\r\n },\r\n deleteGetJsonAsync(route: RouteOrString): Promise<unknown> {\r\n return requestAsync(\"DELETE\", route, null, 'json', true);\r\n },\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/api/http/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import { NetworkError, StatusError, ApiError, PayloadError } from \"./error\";\r\nimport type { Route, RouteResolver } from \"./route\";\r\n\r\ntype RouteOrString = Route | string;\r\n\r\nexport type NonVoidReturnType = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'stream';\r\nexport type ReturnType = NonVoidReturnType | 'void';\r\ntype CallableReturnType = Exclude<NonVoidReturnType, 'stream'>;\r\n\r\nexport type ReturnValueType<T extends ReturnType> = {\r\n 'json': unknown;\r\n 'text': string;\r\n 'blob': Blob;\r\n 'arrayBuffer': ArrayBuffer;\r\n 'stream': ReadableStream<Uint8Array> | null;\r\n 'void': void;\r\n}[T];\r\n\r\nconst safeMethods = ['GET', 'HEAD', 'OPTIONS'];\r\n\r\nfunction isSafeMethod(method: string): boolean {\r\n return safeMethods.includes(method);\r\n}\r\n\r\nexport interface HttpRequestOptions {\r\n credentials?: RequestCredentials;\r\n mode?: RequestMode;\r\n headers?: HeadersInit;\r\n}\r\n\r\nexport interface CredentialProvider {\r\n /**\r\n * Fournit les en-têtes d'authentification pour une requête HTTP.\r\n * \r\n * @param isSafe - indique si la requête est considérée safe (GET, HEAD, OPTIONS)\r\n * @param url - l'URL de la requête\r\n * @param auth - indique si l'authentification est requise\r\n * @returns les options de requête à employer\r\n */\r\n getCredentialsFor(isSafe: boolean, url: string, auth?: boolean): Promise<HttpRequestOptions>\r\n};\r\n\r\nexport interface HttpBackend {\r\n requestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T>>;\r\n\r\n getAsync<const T extends ReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean\r\n ): Promise<ReturnValueType<T>>;\r\n getJsonAsync(route: RouteOrString, auth?: boolean): Promise<unknown | null>;\r\n getJsonAsync<T>(route: RouteOrString, auth?: boolean): Promise<T | null>;\r\n getStringAsync(route: RouteOrString, auth?: boolean): Promise<string>;\r\n\r\n getNullableAsync<const T extends NonVoidReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean\r\n ): Promise<ReturnValueType<T> | null>;\r\n getNullableStringAsync(route: RouteOrString, auth?: boolean): Promise<string | null>;\r\n\r\n postAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n postJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n postGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n postGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n putAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n putJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n putGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n putGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n patchAsync(route: RouteOrString, data: any, type?: string): Promise<void>;\r\n patchJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void>;\r\n patchGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown>;\r\n patchGetJsonAsync<T>(route: RouteOrString, data: any, json?: boolean): Promise<T>;\r\n\r\n deleteAsync(route: RouteOrString): Promise<void>;\r\n deleteGetJsonAsync(route: RouteOrString): Promise<unknown>;\r\n deleteGetJsonAsync<T>(route: RouteOrString): Promise<T>;\r\n};\r\n\r\nfunction mergeHeaders(hdr1?: HeadersInit, hdr2?: HeadersInit): HeadersInit | undefined {\r\n if (hdr1 == null) return hdr2;\r\n if (hdr2 == null) return hdr1;\r\n const merged = new Headers(hdr1);\r\n for (const [key, value] of (new Headers(hdr2)).entries()) {\r\n merged.set(key, value);\r\n }\r\n return merged;\r\n}\r\n\r\nfunction isOk(r: Response, expected?: number | number[]): boolean {\r\n if (expected == null) return r.ok;\r\n if (Array.isArray(expected)) return expected.includes(r.status);\r\n return r.status === expected;\r\n}\r\n\r\nasync function rawRequestAsync(\r\n method: string,\r\n url: string,\r\n data: any,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit,\r\n options?: RequestInit\r\n): Promise<Response> {\r\n let response: Response;\r\n if (options == null) options = {};\r\n options.headers = mergeHeaders(hdr, options.headers);\r\n options.method = method;\r\n options.body = data;\r\n try {\r\n let request = new Request(url, options);\r\n response = await fetch(request);\r\n if (isOk(response, expectedStatus)) return response;\r\n } catch (e: any) {\r\n throw new NetworkError({ method, url }, e.message);\r\n }\r\n // Il y a une erreur. On extraie le message d'erreur du corps de la réponse\r\n if (response.headers.get('Content-Type')?.includes('application/json')) {\r\n let payload: any;\r\n try {\r\n payload = await response.json();\r\n } catch (e) {\r\n throw new StatusError({ method, url }, response.statusText, response.status);\r\n }\r\n if (typeof payload === 'object' && payload != null) {\r\n throw new ApiError({ method, url }, response.statusText, response.status, payload);\r\n }\r\n }\r\n throw new StatusError({ method, url }, response.statusText, response.status);\r\n}\r\n\r\n\r\nexport default function (r: RouteResolver, cp: CredentialProvider): HttpBackend {\r\n function authRawRequestAsync(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<Response> {\r\n method = method.toUpperCase();\r\n const url = typeof route === 'string' ? route : r(route);\r\n return cp.getCredentialsFor(isSafeMethod(method), url, auth).then(\r\n options => rawRequestAsync(method, url, data, expectedStatus, hdr, options)\r\n );\r\n }\r\n\r\n function requestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T>> {\r\n const reqTask = authRawRequestAsync(method, route, data, auth, expectedStatus, hdr);\r\n if (retType === 'void') return reqTask.then(_ => void 0 as ReturnValueType<T>);\r\n else return reqTask.then(\r\n (response: Response) => {\r\n if (retType === 'stream') return response.body;\r\n else return response[retType as CallableReturnType]().catch((e) => {\r\n throw new PayloadError({ method, url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Une requête avec un type mime spécifié\r\n */\r\n function typedRequestAsync<const T extends ReturnType>(\r\n method: string,\r\n route: RouteOrString,\r\n data: any,\r\n retType: T,\r\n auth?: boolean,\r\n expectedStatus?: number | number[],\r\n type?: string\r\n ): Promise<ReturnValueType<T>> {\r\n if (type == null) return requestAsync(method, route, data, retType, auth, expectedStatus);\r\n const hdr = { 'Content-Type': type };\r\n return requestAsync(method, route, data, retType, auth, expectedStatus, hdr);\r\n }\r\n\r\n function jsonDataRequestAsync(\r\n method: string,\r\n route: RouteOrString,\r\n getResponse: boolean,\r\n data: any,\r\n json?: boolean\r\n ): Promise<any> {\r\n if (!json) data = JSON.stringify(data);\r\n const hdr = { 'Content-Type': 'application/json' };\r\n return authRawRequestAsync(method, route, data, true, [200, 201, 204], hdr).then(\r\n (response: Response) => {\r\n if (!getResponse) return void 0;\r\n if (response.status === 204) return null;\r\n else return response.json().catch((e) => {\r\n throw new PayloadError({ method, url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n function getNullableAsync<const T extends NonVoidReturnType>(\r\n route: RouteOrString,\r\n retType: T,\r\n auth?: boolean,\r\n hdr?: HeadersInit\r\n ): Promise<ReturnValueType<T> | null> {\r\n return authRawRequestAsync(\"GET\", route, null, auth, [200, 204], hdr).then(\r\n (response: Response) => {\r\n if (response.status === 204) return null;\r\n if (retType === 'stream') return response.body;\r\n else return response[retType as CallableReturnType]().catch((e) => {\r\n throw new PayloadError({ method: 'GET', url: typeof route === 'string' ? route : r(route) }, e.message);\r\n });\r\n }\r\n );\r\n }\r\n\r\n\r\n return (\r\n {\r\n requestAsync(method, route, data, retType, auth?, expectedStatus?, hdr?) {\r\n return requestAsync(method, route, data, retType, auth, expectedStatus, hdr);\r\n },\r\n\r\n getAsync(route, retType, auth?) {\r\n return requestAsync(\"GET\", route, null, retType, auth);\r\n },\r\n getJsonAsync(route: RouteOrString, auth?: boolean): Promise<unknown> {\r\n return getNullableAsync(route, 'json', auth);\r\n },\r\n getStringAsync(route: RouteOrString, auth?: boolean): Promise<string> {\r\n return requestAsync(\"GET\", route, null, \"text\", auth);\r\n },\r\n getNullableAsync(route, retType, auth?) {\r\n return getNullableAsync(route, retType, auth)\r\n },\r\n getNullableStringAsync(route: RouteOrString, auth?: boolean): Promise<string | null> {\r\n return getNullableAsync(route, 'text', auth);\r\n },\r\n\r\n postAsync(route, data: any, type?: string): Promise<void> {\r\n return typedRequestAsync(\"POST\", route, data, 'void', true, [200, 201], type);\r\n },\r\n postJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"POST\", route, false, data, json);\r\n },\r\n postGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"POST\", route, true, data, json);\r\n },\r\n\r\n putAsync(route, data, type?: string): Promise<void> {\r\n return typedRequestAsync(\"PUT\", route, data, 'void', true, [200, 204], type);\r\n },\r\n putJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"PUT\", route, false, data, json);\r\n },\r\n putGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"PUT\", route, true, data, json);\r\n },\r\n\r\n patchAsync(route, data: any, type?: string): Promise<void> {\r\n return typedRequestAsync(\"PATCH\", route, data, 'void', true, [200, 204], type);\r\n },\r\n patchJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<void> {\r\n return jsonDataRequestAsync(\"PATCH\", route, false, data, json);\r\n },\r\n patchGetJsonAsync(route: RouteOrString, data: any, json?: boolean): Promise<unknown> {\r\n return jsonDataRequestAsync(\"PATCH\", route, true, data, json);\r\n },\r\n\r\n deleteAsync(route): Promise<void> {\r\n return requestAsync(\"DELETE\", route, null, 'void', true, [200, 204]);\r\n },\r\n deleteGetJsonAsync(route: RouteOrString): Promise<unknown> {\r\n return requestAsync(\"DELETE\", route, null, 'json', true);\r\n },\r\n });\r\n}\r\n"]}
@@ -6,63 +6,89 @@ function addApiAccessHeader(hdr) {
6
6
  return hdr;
7
7
  }
8
8
  const errorMsg = 'Impossible de récupérer le jeton CSRF';
9
- let csrfTkPromise;
10
- function getCsrfTkAsync() {
9
+ let csrfTk;
10
+ async function getCsrfTkAsync() {
11
11
  if (ltiSession.isActive)
12
- return Promise.resolve('');
13
- if (null != csrfTkPromise)
14
- return csrfTkPromise;
12
+ return '';
13
+ if (null != csrfTk)
14
+ return csrfTk;
15
15
  const url = resolve({ name: 'session', id: 'token' });
16
- const headers = new Headers();
17
- return csrfTkPromise = fetch(url, { headers })
18
- .then((resp) => {
16
+ try {
17
+ const resp = await fetch(url);
19
18
  if (!resp.ok) {
20
- csrfTkPromise = undefined;
19
+ csrfTk = undefined;
21
20
  throw new Error(errorMsg);
22
21
  }
23
- return resp.text();
24
- })
25
- .catch(e => {
26
- csrfTkPromise = undefined;
27
- throw new AggregateError([e], errorMsg);
28
- });
22
+ csrfTk = await resp.text();
23
+ return csrfTk;
24
+ }
25
+ catch (error) {
26
+ csrfTk = undefined;
27
+ throw new AggregateError([error], errorMsg);
28
+ }
29
29
  }
30
30
  export default {
31
- getCredentialsFor(isSafe, url, auth, hdr) {
32
- const addApiHdr = auth === true;
31
+ async getCredentialsFor(isSafe, url, auth) {
32
+ const urlO = new URL(url, window.location.href);
33
+ const sameOrigin = urlO.origin === window.location.origin;
34
+ let sameApp;
35
+ if (sameOrigin) {
36
+ sameApp = true;
37
+ }
38
+ else {
39
+ sameApp = urlO.hostname.endsWith(window.location.hostname);
40
+ }
41
+ if (!sameApp) {
42
+ return { mode: 'cors' };
43
+ }
44
+ const secured = urlO.protocol === 'https:';
45
+ if (!secured) {
46
+ if (sameOrigin) {
47
+ return {};
48
+ }
49
+ else {
50
+ return { mode: 'cors' };
51
+ }
52
+ }
53
+ const options = {
54
+ headers: new Headers(),
55
+ };
56
+ if (!sameOrigin) {
57
+ options.mode = 'cors';
58
+ }
59
+ const addApiHdr = (auth === true) && sameOrigin;
33
60
  if (auth == null)
34
61
  auth = true;
35
- if (null == hdr)
36
- hdr = {};
37
- if (!(hdr instanceof Headers))
38
- hdr = new Headers(hdr);
39
- const urlO = new URL(url, window.location.href);
40
- if (urlO.origin === window.location.origin) {
41
- if (isSafe) {
62
+ if (isSafe) {
63
+ if (auth) {
42
64
  if (ltiSession.isActive) {
43
- if (auth) {
44
- ltiSession.addLtiAuthHeader(hdr);
45
- }
65
+ ltiSession.addLtiAuthHeader(options.headers);
46
66
  }
47
- if (addApiHdr) {
48
- addApiAccessHeader(hdr);
67
+ else {
68
+ if (!sameOrigin) {
69
+ options.credentials = 'include';
70
+ }
49
71
  }
50
72
  }
51
- else {
52
- if (auth) {
53
- if (ltiSession.isActive) {
54
- ltiSession.addLtiAuthHeader(hdr);
55
- }
56
- else {
57
- return getCsrfTkAsync().then(tk => {
58
- hdr.set('X-CSRF-Token', tk);
59
- return hdr;
60
- });
73
+ if (addApiHdr) {
74
+ addApiAccessHeader(options.headers);
75
+ }
76
+ }
77
+ else {
78
+ if (auth) {
79
+ if (ltiSession.isActive) {
80
+ ltiSession.addLtiAuthHeader(options.headers);
81
+ }
82
+ else {
83
+ if (!sameOrigin) {
84
+ options.credentials = 'include';
61
85
  }
86
+ const tk = await getCsrfTkAsync();
87
+ options.headers.set('X-CSRF-Token', tk);
62
88
  }
63
89
  }
64
90
  }
65
- return Promise.resolve(hdr);
91
+ return options;
66
92
  },
67
93
  };
68
94
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/backend/capytale/auth.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,UAAU,MAAM,OAAO,CAAC;AAG/B,oBAAoB;AACpB,SAAS,kBAAkB,CAAC,GAAY;IACpC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AACzD,IAAI,aAA0C,CAAC;AAE/C,SAAS,cAAc;IACnB,IAAI,UAAU,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,aAAa,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACX,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACX,aAAa,GAAG,SAAS,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE;QACP,aAAa,GAAG,SAAS,CAAC;QAC1B,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACX,CAAC;AAED,eAAe;IACX,iBAAiB,CAAC,MAAe,EAAE,GAAW,EAAE,IAAc,EAAE,GAAiB;QAC7E,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;QAChC,IAAI,IAAI,IAAI,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,IAAI,GAAG;YAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,GAAG,YAAY,OAAO,CAAC;YAAE,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACT,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACtB,IAAI,IAAI,EAAE,CAAC;wBACP,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACZ,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,IAAI,EAAE,CAAC;oBACP,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;wBACtB,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACrC,CAAC;yBAAM,CAAC;wBACJ,OAAO,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;4BAC9B,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;4BAC5B,OAAO,GAAG,CAAC;wBACf,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACkB,CAAC","sourcesContent":["import type { CredentialProvider } from '../../api/http/backend';\nimport resolve from \"./resolver\";\nimport ltiSession from \"./lti\";\n\n\n// API access header\nfunction addApiAccessHeader(hdr: Headers): Headers {\n hdr.set('X-API-ACCESS', 'capytale');\n return hdr;\n}\n\nconst errorMsg = 'Impossible de récupérer le jeton CSRF';\nlet csrfTkPromise: Promise<string> | undefined;\n\nfunction getCsrfTkAsync(): Promise<string> {\n if (ltiSession.isActive) return Promise.resolve('');\n if (null != csrfTkPromise) return csrfTkPromise;\n const url = resolve({ name: 'session', id: 'token' });\n const headers = new Headers();\n return csrfTkPromise = fetch(url, { headers })\n .then((resp) => {\n if (!resp.ok) {\n csrfTkPromise = undefined;\n throw new Error(errorMsg);\n }\n return resp.text();\n })\n .catch(e => {\n csrfTkPromise = undefined;\n throw new AggregateError([e], errorMsg);\n });\n}\n\nexport default {\n getCredentialsFor(isSafe: boolean, url: string, auth?: boolean, hdr?: HeadersInit) {\n const addApiHdr = auth === true;\n if (auth == null) auth = true;\n if (null == hdr) hdr = {};\n if (!(hdr instanceof Headers)) hdr = new Headers(hdr);\n const urlO = new URL(url, window.location.href);\n if (urlO.origin === window.location.origin) {\n if (isSafe) {\n if (ltiSession.isActive) {\n if (auth) {\n ltiSession.addLtiAuthHeader(hdr);\n }\n }\n if (addApiHdr) {\n addApiAccessHeader(hdr);\n }\n } else {\n if (auth) {\n if (ltiSession.isActive) {\n ltiSession.addLtiAuthHeader(hdr);\n } else {\n return getCsrfTkAsync().then(tk => {\n hdr.set('X-CSRF-Token', tk);\n return hdr;\n });\n }\n }\n }\n }\n return Promise.resolve(hdr);\n },\n} as CredentialProvider;"]}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/backend/capytale/auth.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CredentialProvider, HttpRequestOptions } from '../../api/http/backend';\nimport resolve from \"./resolver\";\nimport ltiSession from \"./lti\";\n\n\n// API access header\nfunction addApiAccessHeader(hdr: Headers): Headers {\n hdr.set('X-API-ACCESS', 'capytale');\n return hdr;\n}\n\nconst errorMsg = 'Impossible de récupérer le jeton CSRF';\nlet csrfTk: string | undefined;\n\nasync function getCsrfTkAsync(): Promise<string> {\n if (ltiSession.isActive) return '';\n if (null != csrfTk) return csrfTk;\n const url = resolve({ name: 'session', id: 'token' });\n try {\n const resp = await fetch(url);\n if (!resp.ok) {\n csrfTk = undefined;\n throw new Error(errorMsg);\n }\n csrfTk = await resp.text();\n return csrfTk;\n } catch (error) {\n csrfTk = undefined;\n throw new AggregateError([error], errorMsg);\n }\n}\n\nexport default {\n async getCredentialsFor(isSafe: boolean, url: string, auth?: boolean) {\n const urlO = new URL(url, window.location.href);\n const sameOrigin = urlO.origin === window.location.origin;\n let sameApp: boolean;\n if (sameOrigin) {\n sameApp = true;\n }\n else {\n sameApp = urlO.hostname.endsWith(window.location.hostname);\n }\n if (!sameApp) {\n return { mode: 'cors' };\n }\n const secured = urlO.protocol === 'https:';\n if (!secured) {\n if (sameOrigin) {\n return {};\n } else {\n return { mode: 'cors' };\n }\n }\n\n const options: HttpRequestOptions = {\n headers: new Headers(),\n };\n if (!sameOrigin) {\n options.mode = 'cors';\n }\n\n const addApiHdr = (auth === true) && sameOrigin;\n if (auth == null) auth = true;\n if (isSafe) {\n if (auth) {\n if (ltiSession.isActive) {\n ltiSession.addLtiAuthHeader(options.headers as Headers);\n } else {\n if (!sameOrigin) {\n options.credentials = 'include';\n }\n }\n }\n if (addApiHdr) {\n addApiAccessHeader(options.headers as Headers);\n }\n } else {\n if (auth) {\n if (ltiSession.isActive) {\n ltiSession.addLtiAuthHeader(options.headers as Headers);\n } else {\n if (!sameOrigin) {\n options.credentials = 'include';\n }\n const tk = await getCsrfTkAsync();\n (options.headers as Headers).set('X-CSRF-Token', tk);\n }\n }\n }\n return options;\n },\n} as CredentialProvider;"]}
@@ -100,6 +100,11 @@ function evalResolve(route) {
100
100
  else
101
101
  return `${cActApiEp}n/${route.id}/e/${route.uid}`;
102
102
  }
103
+ function servicesResolve(route) {
104
+ if (!route.path.startsWith('/'))
105
+ route.path = '/' + route.path;
106
+ return `//services.${window.location.hostname}${route.path}`;
107
+ }
103
108
  function resolve(route) {
104
109
  switch (route.name) {
105
110
  case 'fs.list': return `${cActApiEp}n/${route.id}/fields`;
@@ -121,14 +126,15 @@ function resolve(route) {
121
126
  case 'vanilla': return vanillaEp + route.service + '.php';
122
127
  case 'vs-db': return '/web/vs-db/api/n/' + route.id;
123
128
  case 'activityNav': return navResolve(route);
129
+ case 'services': return servicesResolve(route);
124
130
  }
125
131
  return '';
126
132
  }
127
133
  export default function (route, absolute = false) {
128
134
  const relative = resolve(route);
129
- if (absolute)
130
- return window.location.origin + relative;
131
- else
135
+ if (!absolute)
132
136
  return relative;
137
+ const url = new URL(relative, window.location.href);
138
+ return url.href;
133
139
  }
134
140
  //# sourceMappingURL=resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/backend/capytale/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Route } from \"../../api/http/route\";\nimport ltiSession from \"./lti\";\n\nconst cActApiEp = '/web/c-act/api/';\nconst cAuthApiEp = '/web/c-auth/api/';\nconst cUiApiEp = '/web/c-ui/api/';\nconst cHdlsEp = '/web/c-hdls/';\nconst nodeEp = '/web/node/';\nconst userEp = '/web/userinfos?uid_raw=';\nconst sessionEp = '/web/session/';\nconst frontEp = '/web/';\nconst vanillaEp = '/vanilla/';\n\nfunction restResolve(route: Route): string {\n let url;\n switch (route.type) {\n case 'node': url = nodeEp + route.id + '?_format=json'; break;\n case 'user': url = userEp + route.id + '&_format=json'; break;\n }\n if (url == null) return '';\n if (route?.noecho) url += '&_noecho=1';\n return url;\n}\n\nfunction typeResolve(route: Route): string {\n if (route.type) return `${cActApiEp}t/${route.type}`;\n else return `${cActApiEp}t`;\n}\n\nfunction typeFavoriteResolve(route: Route): string {\n if (route.type) return `${cUiApiEp}favorite_activity/${route.type}`;\n else return `${cUiApiEp}favorite_activity`;\n}\n\nfunction frontResolve(route: Route): string {\n switch (route.page) {\n case 'bib': return frontEp + 'bibliotheque';\n case 'assignments': return frontEp + 'assignments/' + route.id;\n case 'edit': return frontEp + 'node/' + route.id + '/edit';\n case 'my': return frontEp + 'my';\n }\n return frontEp;\n}\n\nfunction stdNavResolve(route: Route): string {\n if (route.page === 'return') {\n switch (route.mode) {\n case 'view': return frontEp + 'bibliotheque';\n case 'create': return frontEp + 'my';\n case 'review': return frontEp + 'assignments/' + route.id;\n case 'assignment': return frontEp + 'my';\n }\n return frontEp + 'my';\n } else if (route.page === 'edit') {\n return `${cHdlsEp}node/${route.id}/edit`;\n } else if (route.page === 'create') {\n return `${cHdlsEp}activity/${route.type}/add`;\n } else {\n return frontEp + 'my';\n }\n}\n\nfunction ltiNavResolve(route: Route): string {\n switch (route.page) {\n case 'return':\n return ltiSession.getProperty('returnUrl');\n case 'edit':\n return ltiSession.getProperty('formUrl');\n case 'create':\n return frontEp + 'tks/lti/tool/activity/add/' + route.type + '?lti=' + ltiSession.getSessId();\n }\n return '';\n}\n\nfunction navResolve(route: Route): string {\n if (ltiSession.isActive) return ltiNavResolve(route);\n else return stdNavResolve(route);\n}\n\nfunction sesameUserResole(route: Route): string {\n if (route.count) return cAuthApiEp + 'sesame/user/count';\n if (route.uid) return cAuthApiEp + 'sesame/user/' + route.uid;\n return cAuthApiEp + 'sesame/user';\n}\n\nfunction sesameCodeResole(route: Route): string {\n if (route.code) return cAuthApiEp + 'sesame/code/' + route.code;\n return cAuthApiEp + 'sesame/code';\n}\n\nfunction evalResolve(route: Route): string {\n if (route.uid == null) return `${cActApiEp}n/${route.id}/e`;\n else return `${cActApiEp}n/${route.id}/e/${route.uid}`;\n}\n\nfunction resolve(route: Route): string {\n switch (route.name) {\n case 'fs.list': return `${cActApiEp}n/${route.id}/fields`;\n case 'fs.field': return `${cActApiEp}n/${route.id}/fields/${route.field}`;\n case 'rest': return restResolve(route);\n case 'session': return sessionEp + route.id;\n case 'c-auth.me': return cAuthApiEp + 'me';\n case 'sa.list': return `${cActApiEp}n/${route.id}/assignments`;\n case 'sa.launch': return frontEp + 'c/' + route.code;\n case 'sa.eval': return evalResolve(route);\n case 'type': return typeResolve(route);\n case 'type.groups': return `${cActApiEp}g`;\n case 'type.weights': return `${cActApiEp}w`;\n case 'type.favorite': return typeFavoriteResolve(route);\n case 'front': return frontResolve(route);\n case 'ent': return cAuthApiEp + 'list';\n case 'sesame.user': return sesameUserResole(route);\n case 'sesame.code': return sesameCodeResole(route);\n case 'vanilla': return vanillaEp + route.service + '.php';\n case 'vs-db': return '/web/vs-db/api/n/' + route.id;\n case 'activityNav': return navResolve(route);\n }\n return '';\n}\n\nexport default function (route: Route, absolute: boolean = false): string {\n const relative = resolve(route);\n if (absolute) return window.location.origin + relative;\n else return relative;\n}"]}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/backend/capytale/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Route } from \"../../api/http/route\";\nimport ltiSession from \"./lti\";\n\nconst cActApiEp = '/web/c-act/api/';\nconst cAuthApiEp = '/web/c-auth/api/';\nconst cUiApiEp = '/web/c-ui/api/';\nconst cHdlsEp = '/web/c-hdls/';\nconst nodeEp = '/web/node/';\nconst userEp = '/web/userinfos?uid_raw=';\nconst sessionEp = '/web/session/';\nconst frontEp = '/web/';\nconst vanillaEp = '/vanilla/';\n\nfunction restResolve(route: Route): string {\n let url;\n switch (route.type) {\n case 'node': url = nodeEp + route.id + '?_format=json'; break;\n case 'user': url = userEp + route.id + '&_format=json'; break;\n }\n if (url == null) return '';\n if (route?.noecho) url += '&_noecho=1';\n return url;\n}\n\nfunction typeResolve(route: Route): string {\n if (route.type) return `${cActApiEp}t/${route.type}`;\n else return `${cActApiEp}t`;\n}\n\nfunction typeFavoriteResolve(route: Route): string {\n if (route.type) return `${cUiApiEp}favorite_activity/${route.type}`;\n else return `${cUiApiEp}favorite_activity`;\n}\n\nfunction frontResolve(route: Route): string {\n switch (route.page) {\n case 'bib': return frontEp + 'bibliotheque';\n case 'assignments': return frontEp + 'assignments/' + route.id;\n case 'edit': return frontEp + 'node/' + route.id + '/edit';\n case 'my': return frontEp + 'my';\n }\n return frontEp;\n}\n\nfunction stdNavResolve(route: Route): string {\n if (route.page === 'return') {\n switch (route.mode) {\n case 'view': return frontEp + 'bibliotheque';\n case 'create': return frontEp + 'my';\n case 'review': return frontEp + 'assignments/' + route.id;\n case 'assignment': return frontEp + 'my';\n }\n return frontEp + 'my';\n } else if (route.page === 'edit') {\n return `${cHdlsEp}node/${route.id}/edit`;\n } else if (route.page === 'create') {\n return `${cHdlsEp}activity/${route.type}/add`;\n } else {\n return frontEp + 'my';\n }\n}\n\nfunction ltiNavResolve(route: Route): string {\n switch (route.page) {\n case 'return':\n return ltiSession.getProperty('returnUrl');\n case 'edit':\n return ltiSession.getProperty('formUrl');\n case 'create':\n return frontEp + 'tks/lti/tool/activity/add/' + route.type + '?lti=' + ltiSession.getSessId();\n }\n return '';\n}\n\nfunction navResolve(route: Route): string {\n if (ltiSession.isActive) return ltiNavResolve(route);\n else return stdNavResolve(route);\n}\n\nfunction sesameUserResole(route: Route): string {\n if (route.count) return cAuthApiEp + 'sesame/user/count';\n if (route.uid) return cAuthApiEp + 'sesame/user/' + route.uid;\n return cAuthApiEp + 'sesame/user';\n}\n\nfunction sesameCodeResole(route: Route): string {\n if (route.code) return cAuthApiEp + 'sesame/code/' + route.code;\n return cAuthApiEp + 'sesame/code';\n}\n\nfunction evalResolve(route: Route): string {\n if (route.uid == null) return `${cActApiEp}n/${route.id}/e`;\n else return `${cActApiEp}n/${route.id}/e/${route.uid}`;\n}\n\nfunction servicesResolve(route: Route): string {\n if (!(route.path as string).startsWith('/')) route.path = '/' + route.path;\n return `//services.${window.location.hostname}${route.path}`;\n}\n\nfunction resolve(route: Route): string {\n switch (route.name) {\n case 'fs.list': return `${cActApiEp}n/${route.id}/fields`;\n case 'fs.field': return `${cActApiEp}n/${route.id}/fields/${route.field}`;\n case 'rest': return restResolve(route);\n case 'session': return sessionEp + route.id;\n case 'c-auth.me': return cAuthApiEp + 'me';\n case 'sa.list': return `${cActApiEp}n/${route.id}/assignments`;\n case 'sa.launch': return frontEp + 'c/' + route.code;\n case 'sa.eval': return evalResolve(route);\n case 'type': return typeResolve(route);\n case 'type.groups': return `${cActApiEp}g`;\n case 'type.weights': return `${cActApiEp}w`;\n case 'type.favorite': return typeFavoriteResolve(route);\n case 'front': return frontResolve(route);\n case 'ent': return cAuthApiEp + 'list';\n case 'sesame.user': return sesameUserResole(route);\n case 'sesame.code': return sesameCodeResole(route);\n case 'vanilla': return vanillaEp + route.service + '.php';\n case 'vs-db': return '/web/vs-db/api/n/' + route.id;\n case 'activityNav': return navResolve(route);\n case 'services': return servicesResolve(route);\n }\n return '';\n}\n\nexport default function (route: Route, absolute: boolean = false): string {\n const relative = resolve(route);\n if (!absolute) return relative;\n const url = new URL(relative, window.location.href);\n return url.href;\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capytale/activity.js",
3
- "version": "3.1.27",
3
+ "version": "3.1.29",
4
4
  "author": "Capytale.fr",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "bin": {