@cubicweb/client 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/api/Api.d.ts CHANGED
@@ -17,12 +17,11 @@ export default class Api {
17
17
  private transactionApiUrl;
18
18
  constructor(apiUrl: string);
19
19
  execute(query: string, params: RQLParams): Promise<ResultSet>;
20
- schema(): Promise<RawSchema<import("../schema/SchemaJSON").EntityRawSchemaArray, import("../schema/SchemaJSON").RelationDefinitionRawSchemaArray<import("../schema/SchemaJSON").EntityRawSchemaArray>>>;
20
+ schema(): Promise<RawSchema>;
21
21
  login(login: string, password: string): Promise<boolean>;
22
22
  transactionBegin(): Promise<string>;
23
23
  transactionExecute(uuid: string, query: string, params: RQLParams): Promise<ResultSet>;
24
24
  transactionCommit(uuid: string): Promise<null>;
25
25
  transactionRollback(uuid: string): Promise<null>;
26
26
  }
27
- export declare const fetchApi: <R = unknown>(input: RequestInfo, init?: RequestInit | undefined) => Promise<R>;
28
27
  //# sourceMappingURL=Api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,oBAAY,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,CAAC;AAEb,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,MAAM,EAAE,MAAM;IAKpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAQxC,MAAM;IAON,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAarC,gBAAgB;IAQhB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAQjE,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAQ9B,mBAAmB,CAAC,IAAI,EAAE,MAAM;CAOvC;AAED,eAAO,MAAM,QAAQ,uBACZ,WAAW,+CAoBnB,CAAC"}
1
+ {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,oBAAY,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,CAAC;AAEb,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,MAAM,EAAE,MAAM;IAKpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ7D,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAO5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAQnC,kBAAkB,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,SAAS,CAAC;IAQf,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
package/lib/api/Api.js CHANGED
@@ -9,7 +9,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.fetchApi = void 0;
13
12
  class Api {
14
13
  constructor(apiUrl) {
15
14
  this.apiUrl = `${apiUrl}/v1`;
@@ -17,7 +16,7 @@ class Api {
17
16
  }
18
17
  execute(query, params) {
19
18
  return __awaiter(this, void 0, void 0, function* () {
20
- return (0, exports.fetchApi)(`${this.apiUrl}/rql`, {
19
+ return nonNullFetchApi(`${this.apiUrl}/rql`, {
21
20
  method: "POST",
22
21
  body: JSON.stringify({ query, params }),
23
22
  credentials: "include", // FIXME is it secure?
@@ -26,7 +25,7 @@ class Api {
26
25
  }
27
26
  schema() {
28
27
  return __awaiter(this, void 0, void 0, function* () {
29
- return (0, exports.fetchApi)(`${this.apiUrl}/schema`, {
28
+ return nonNullFetchApi(`${this.apiUrl}/schema`, {
30
29
  method: "GET",
31
30
  credentials: "include",
32
31
  });
@@ -34,7 +33,7 @@ class Api {
34
33
  }
35
34
  login(login, password) {
36
35
  return __awaiter(this, void 0, void 0, function* () {
37
- return (0, exports.fetchApi)(`${this.apiUrl}/login`, {
36
+ return fetchApi(`${this.apiUrl}/login`, {
38
37
  method: "POST",
39
38
  body: JSON.stringify({
40
39
  login,
@@ -48,7 +47,7 @@ class Api {
48
47
  }
49
48
  transactionBegin() {
50
49
  return __awaiter(this, void 0, void 0, function* () {
51
- return (0, exports.fetchApi)(this.transactionApiUrl, {
50
+ return nonNullFetchApi(this.transactionApiUrl, {
52
51
  method: "POST",
53
52
  body: JSON.stringify({ action: "begin" }),
54
53
  credentials: "include",
@@ -57,7 +56,7 @@ class Api {
57
56
  }
58
57
  transactionExecute(uuid, query, params) {
59
58
  return __awaiter(this, void 0, void 0, function* () {
60
- return (0, exports.fetchApi)(this.transactionApiUrl, {
59
+ return nonNullFetchApi(this.transactionApiUrl, {
61
60
  method: "POST",
62
61
  body: JSON.stringify({ action: "execute", uuid, query, params }),
63
62
  credentials: "include",
@@ -66,7 +65,7 @@ class Api {
66
65
  }
67
66
  transactionCommit(uuid) {
68
67
  return __awaiter(this, void 0, void 0, function* () {
69
- return (0, exports.fetchApi)(this.transactionApiUrl, {
68
+ return fetchApi(this.transactionApiUrl, {
70
69
  method: "POST",
71
70
  body: JSON.stringify({ action: "commit", uuid }),
72
71
  credentials: "include",
@@ -75,7 +74,7 @@ class Api {
75
74
  }
76
75
  transactionRollback(uuid) {
77
76
  return __awaiter(this, void 0, void 0, function* () {
78
- return (0, exports.fetchApi)(this.transactionApiUrl, {
77
+ return fetchApi(this.transactionApiUrl, {
79
78
  method: "POST",
80
79
  body: JSON.stringify({ action: "commit", uuid }),
81
80
  credentials: "include",
@@ -84,11 +83,39 @@ class Api {
84
83
  }
85
84
  }
86
85
  exports.default = Api;
86
+ const nonNullFetchApi = (input, init) => {
87
+ return new Promise((resolve, reject) => fetchApi(input, init)
88
+ .then((v) => {
89
+ if (v == null) {
90
+ const error = {
91
+ status: 500,
92
+ error: "Unexpected null response",
93
+ message: "Response was null but a value was expected",
94
+ };
95
+ reject(error);
96
+ }
97
+ else {
98
+ resolve(v);
99
+ }
100
+ })
101
+ .catch(reject));
102
+ };
87
103
  const fetchApi = (input, init) => {
88
104
  return new Promise((resolve, reject) => fetch(input, init).then((response) => {
89
105
  const status = response.status;
90
106
  if (status >= 200 && status < 300) {
91
- response.json().then(resolve);
107
+ if (status === 204) {
108
+ resolve(null);
109
+ }
110
+ else {
111
+ response
112
+ .json()
113
+ .then(resolve)
114
+ .catch((e) => {
115
+ console.error(e);
116
+ resolve(null);
117
+ });
118
+ }
92
119
  }
93
120
  else {
94
121
  response.json().then((data) => {
@@ -101,5 +128,4 @@ const fetchApi = (input, init) => {
101
128
  }
102
129
  }));
103
130
  };
104
- exports.fetchApi = fetchApi;
105
131
  //# sourceMappingURL=Api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@cubicweb/client",
3
3
  "description": "Official JS client for CubicWeb API",
4
4
  "author": "Logilab",
5
- "version": "1.1.0",
5
+ "version": "1.1.1",
6
6
  "license": "LGPL-3.0-or-later",
7
7
  "main": "lib/index.js",
8
8
  "types": "lib/index.d.ts",
package/src/api/Api.ts CHANGED
@@ -22,23 +22,23 @@ export default class Api {
22
22
  this.transactionApiUrl = `${this.apiUrl}/transaction`;
23
23
  }
24
24
 
25
- async execute(query: string, params: RQLParams) {
26
- return fetchApi<ResultSet>(`${this.apiUrl}/rql`, {
25
+ async execute(query: string, params: RQLParams): Promise<ResultSet> {
26
+ return nonNullFetchApi<ResultSet>(`${this.apiUrl}/rql`, {
27
27
  method: "POST",
28
28
  body: JSON.stringify({ query, params }),
29
29
  credentials: "include", // FIXME is it secure?
30
30
  });
31
31
  }
32
32
 
33
- async schema() {
34
- return fetchApi<RawSchema>(`${this.apiUrl}/schema`, {
33
+ async schema(): Promise<RawSchema> {
34
+ return nonNullFetchApi<RawSchema>(`${this.apiUrl}/schema`, {
35
35
  method: "GET",
36
36
  credentials: "include",
37
37
  });
38
38
  }
39
39
 
40
- async login(login: string, password: string) {
41
- return fetchApi<boolean>(`${this.apiUrl}/login`, {
40
+ async login(login: string, password: string): Promise<boolean> {
41
+ return fetchApi<null>(`${this.apiUrl}/login`, {
42
42
  method: "POST",
43
43
  body: JSON.stringify({
44
44
  login,
@@ -50,23 +50,27 @@ export default class Api {
50
50
  .catch(() => false);
51
51
  }
52
52
 
53
- async transactionBegin() {
54
- return fetchApi<string>(this.transactionApiUrl, {
53
+ async transactionBegin(): Promise<string> {
54
+ return nonNullFetchApi<string>(this.transactionApiUrl, {
55
55
  method: "POST",
56
56
  body: JSON.stringify({ action: "begin" }),
57
57
  credentials: "include",
58
58
  });
59
59
  }
60
60
 
61
- async transactionExecute(uuid: string, query: string, params: RQLParams) {
62
- return fetchApi<ResultSet>(this.transactionApiUrl, {
61
+ async transactionExecute(
62
+ uuid: string,
63
+ query: string,
64
+ params: RQLParams
65
+ ): Promise<ResultSet> {
66
+ return nonNullFetchApi<ResultSet>(this.transactionApiUrl, {
63
67
  method: "POST",
64
68
  body: JSON.stringify({ action: "execute", uuid, query, params }),
65
69
  credentials: "include",
66
70
  });
67
71
  }
68
72
 
69
- async transactionCommit(uuid: string) {
73
+ async transactionCommit(uuid: string): Promise<null> {
70
74
  return fetchApi<null>(this.transactionApiUrl, {
71
75
  method: "POST",
72
76
  body: JSON.stringify({ action: "commit", uuid }),
@@ -74,7 +78,7 @@ export default class Api {
74
78
  });
75
79
  }
76
80
 
77
- async transactionRollback(uuid: string) {
81
+ async transactionRollback(uuid: string): Promise<null> {
78
82
  return fetchApi<null>(this.transactionApiUrl, {
79
83
  method: "POST",
80
84
  body: JSON.stringify({ action: "commit", uuid }),
@@ -83,16 +87,49 @@ export default class Api {
83
87
  }
84
88
  }
85
89
 
86
- export const fetchApi = <R = unknown>(
90
+ const nonNullFetchApi = <R = unknown>(
87
91
  input: RequestInfo,
88
92
  init?: RequestInit
89
93
  ) => {
90
94
  return new Promise(
91
95
  (resolve: (value: R) => void, reject: (reason: ApiErrorResponse) => void) =>
96
+ fetchApi<R>(input, init)
97
+ .then((v) => {
98
+ if (v == null) {
99
+ const error: ApiErrorResponse = {
100
+ status: 500,
101
+ error: "Unexpected null response",
102
+ message: "Response was null but a value was expected",
103
+ };
104
+ reject(error);
105
+ } else {
106
+ resolve(v);
107
+ }
108
+ })
109
+ .catch(reject)
110
+ );
111
+ };
112
+
113
+ const fetchApi = <R = unknown>(input: RequestInfo, init?: RequestInit) => {
114
+ return new Promise(
115
+ (
116
+ resolve: (value: R | null) => void,
117
+ reject: (reason: ApiErrorResponse) => void
118
+ ) =>
92
119
  fetch(input, init).then((response) => {
93
120
  const status = response.status;
94
121
  if (status >= 200 && status < 300) {
95
- response.json().then(resolve);
122
+ if (status === 204) {
123
+ resolve(null);
124
+ } else {
125
+ response
126
+ .json()
127
+ .then(resolve)
128
+ .catch((e) => {
129
+ console.error(e);
130
+ resolve(null);
131
+ });
132
+ }
96
133
  } else {
97
134
  response.json().then((data: ApiError) => {
98
135
  reject({