@sutech_jp/raas-client-for-typescript 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # RaaS Client for TypeScript
2
+
3
+ TypeScriptで実装されたRaaS(Report as a Service)クライアントライブラリです。このライブラリを使用することで、RaaSサービスへの接続と操作を簡単に行うことができます。
4
+
5
+ ## インストール
6
+
7
+ ```bash
8
+ npm install @sutech-jp/raas-client-for-typescript
9
+ ```
10
+ 事前に「.npmrc」の準備が必要になります
11
+
12
+ ## 設定
13
+
14
+ RaaSクライアントを使用するには、接続設定とユーザーコンテキストが必要です。
15
+
16
+ ### 接続設定
17
+
18
+ ```typescript
19
+ import { RaasConnectionConfig } from '@sutech_jp/raas-client-for-typescript';
20
+
21
+ const config: RaasConnectionConfig = {
22
+ app: 'your-app-name',
23
+ token: 'your-api-token',
24
+ landscape: 'dev' // または 'prod'
25
+ };
26
+ ```
27
+ app / tokenはSuTech担当者より提供された値を利用して下さい
28
+
29
+ ### ユーザーコンテキスト
30
+
31
+ ```typescript
32
+ import { RaasClientContext } from '@sutech_jp/raas-client-for-typescript';
33
+
34
+ const userContext: RaasClientContext = {
35
+ tenant: 'your-tenant-id',
36
+ tenantAlias: 'your-tenant-alias', // 障害調査などの際に利用しますので必要に応じてセットして下さい
37
+ tenantType: 'paid', // 'paid', 'trial', 'demo', 'dev' のいずれか(オプション)
38
+ sub: 'user-subject-id',
39
+ email: 'user@example.com', // ワークフローオプションを利用する場合には必須です
40
+ subAlias: 'user-alias', // ワークフローオプションを利用する場合には必須です
41
+ subDomain: 'user-domain' // ワークフローオプションを利用する場合には必須です
42
+ };
43
+ ```
44
+
45
+ ## 使用方法
46
+
47
+ ### GETリクエスト
48
+
49
+ ```typescript
50
+ import { get } from '@sutech_jp/raas-client-for-typescript';
51
+
52
+ // データ取得の例
53
+ const fetchData = async () => {
54
+ try {
55
+ const data = await get(config, userContext, '/api/endpoint');
56
+ console.log('取得したデータ:', data);
57
+ } catch (error) {
58
+ console.error('エラー:', error);
59
+ }
60
+ };
61
+ ```
62
+
63
+ ### POSTリクエスト
64
+
65
+ ```typescript
66
+ import { post } from '@sutech_jp/raas-client-for-typescript';
67
+
68
+ // データ送信の例
69
+ const sendData = async () => {
70
+ const payload = {
71
+ key1: 'value1',
72
+ key2: 'value2'
73
+ };
74
+
75
+ try {
76
+ const response = await post(config, userContext, '/api/endpoint', payload);
77
+ console.log('レスポンス:', response);
78
+ } catch (error) {
79
+ console.error('エラー:', error);
80
+ }
81
+ };
82
+ ```
83
+
84
+ ### PUTリクエスト
85
+
86
+ ```typescript
87
+ import { put } from '@sutech_jp/raas-client-for-typescript';
88
+
89
+ // データ更新の例
90
+ const updateData = async () => {
91
+ const payload = {
92
+ key1: 'updated-value1',
93
+ key2: 'updated-value2'
94
+ };
95
+
96
+ try {
97
+ const response = await put(config, userContext, '/api/endpoint', payload);
98
+ console.log('レスポンス:', response);
99
+ } catch (error) {
100
+ console.error('エラー:', error);
101
+ }
102
+ };
103
+ ```
104
+
105
+ ### DELETEリクエスト
106
+
107
+ ```typescript
108
+ import { del } from '@sutech_jp/raas-client-for-typescript';
109
+
110
+ // データ削除の例
111
+ const deleteData = async () => {
112
+ try {
113
+ await del(config, userContext, '/api/endpoint');
114
+ console.log('削除成功');
115
+ } catch (error) {
116
+ console.error('エラー:', error);
117
+ }
118
+ };
119
+ ```
120
+
121
+ ## エラーハンドリング
122
+
123
+ すべてのAPIリクエストメソッドは、HTTPエラーが発生した場合にエラーをスローします。try/catchブロックを使用してエラーを適切に処理してください。
124
+
125
+ ## 開発
126
+
127
+ ### 必要条件
128
+
129
+ - Node.js 18以上
130
+ - npm 7以上
131
+
132
+ ## ライセンス
133
+
134
+ SuTech-JP社の製品を利用するのに必要です
@@ -0,0 +1,26 @@
1
+ export type RaasConnectionConfig = {
2
+ app: string;
3
+ token: string;
4
+ landscape: 'dev' | 'prod';
5
+ };
6
+ export type RaasUserContext = {
7
+ tenant: string;
8
+ tenantAlias?: string;
9
+ tenantType?: 'paid' | 'trial' | 'demo' | 'dev';
10
+ sub: string;
11
+ email?: string;
12
+ subAlias?: string;
13
+ subDomain?: string;
14
+ };
15
+ export type RaasSessionRequest = {
16
+ msa: 'report' | 'datatraveler';
17
+ backUrl: string;
18
+ subUrl?: string;
19
+ subDomain?: string;
20
+ };
21
+ export declare const createSession: <R>(config: RaasConnectionConfig, userContext: RaasUserContext, request: RaasSessionRequest) => Promise<R>;
22
+ export declare const get: <R>(config: RaasConnectionConfig, userContext: RaasUserContext, url: string) => Promise<R>;
23
+ export declare const post: <R, B>(config: RaasConnectionConfig, userContext: RaasUserContext, url: string, body: B) => Promise<R>;
24
+ export declare const put: <R, B>(config: RaasConnectionConfig, userContext: RaasUserContext, url: string, body: B) => Promise<R>;
25
+ export declare const del: <B>(config: RaasConnectionConfig, userContext: RaasUserContext, url: string, body: B) => Promise<void>;
26
+ export declare const deleteTenant: (config: RaasConnectionConfig, tenant: string) => Promise<void>;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteTenant = exports.del = exports.put = exports.post = exports.get = exports.createSession = void 0;
4
+ const userTokenCache = new Map();
5
+ const getBaseUrl = (config) => {
6
+ const { app, landscape } = config;
7
+ return landscape === 'dev' ? `https://${app}.dev.functions.asaservice.inc` : `https://${app}.functions.asaservice.inc`;
8
+ };
9
+ const createSession = async (config, userContext, request) => {
10
+ return fetch(`${getBaseUrl(config)}/${request.msa}/external/session`, {
11
+ method: 'POST',
12
+ headers: {
13
+ Authorization: `Bearer ${config.token}`,
14
+ 'Content-Type': 'application/json',
15
+ },
16
+ body: JSON.stringify({
17
+ ...userContext,
18
+ ...request,
19
+ }),
20
+ }).then((response) => {
21
+ if (!response.ok) {
22
+ throw new Error(`HTTP error! status: ${response.status}`);
23
+ }
24
+ return response.json();
25
+ });
26
+ };
27
+ exports.createSession = createSession;
28
+ const get = async (config, userContext, url) => {
29
+ const token = await getUserToken(config, userContext);
30
+ return fetch(`${getBaseUrl(config)}${url}`, {
31
+ method: 'GET',
32
+ headers: {
33
+ Authorization: `Bearer ${token}`,
34
+ 'Content-Type': 'application/json',
35
+ },
36
+ }).then((response) => {
37
+ if (!response.ok) {
38
+ throw new Error(`HTTP error! status: ${response.status}`);
39
+ }
40
+ return response.json();
41
+ });
42
+ };
43
+ exports.get = get;
44
+ const post = async (config, userContext, url, body) => {
45
+ const token = await getUserToken(config, userContext);
46
+ return fetch(`${getBaseUrl(config)}${url}`, {
47
+ method: 'POST',
48
+ headers: {
49
+ Authorization: `Bearer ${token}`,
50
+ 'Content-Type': 'application/json',
51
+ },
52
+ body: JSON.stringify(body),
53
+ }).then((response) => {
54
+ if (!response.ok) {
55
+ throw new Error(`HTTP error! status: ${response.status}`);
56
+ }
57
+ return response.json();
58
+ });
59
+ };
60
+ exports.post = post;
61
+ const put = async (config, userContext, url, body) => {
62
+ const token = await getUserToken(config, userContext);
63
+ return fetch(`${getBaseUrl(config)}${url}`, {
64
+ method: 'PUT',
65
+ headers: {
66
+ Authorization: `Bearer ${token}`,
67
+ 'Content-Type': 'application/json',
68
+ },
69
+ body: JSON.stringify(body),
70
+ }).then((response) => {
71
+ if (!response.ok) {
72
+ throw new Error(`HTTP error! status: ${response.status}`);
73
+ }
74
+ return response.json();
75
+ });
76
+ };
77
+ exports.put = put;
78
+ const del = async (config, userContext, url, body) => {
79
+ const token = await getUserToken(config, userContext);
80
+ return fetch(`${getBaseUrl(config)}${url}`, {
81
+ method: 'DELETE',
82
+ headers: {
83
+ Authorization: `Bearer ${token}`,
84
+ 'Content-Type': 'application/json',
85
+ },
86
+ body: JSON.stringify(body),
87
+ }).then((response) => {
88
+ if (!response.ok) {
89
+ throw new Error(`HTTP error! status: ${response.status}`);
90
+ }
91
+ });
92
+ };
93
+ exports.del = del;
94
+ const getUserToken = async (config, context) => {
95
+ const key = `${context.tenant}-##-${context.sub}`;
96
+ const token = userTokenCache.get(key);
97
+ if (token) {
98
+ return token;
99
+ }
100
+ const tokenResp = await getUserTokenImpl(config, context);
101
+ if (tokenResp.token) {
102
+ userTokenCache.set(key, tokenResp.token);
103
+ }
104
+ else {
105
+ throw new Error(`Failed to get user token(${tokenResp.token})`);
106
+ }
107
+ return tokenResp.token;
108
+ };
109
+ const getUserTokenImpl = async (config, context) => {
110
+ const { token } = config;
111
+ const url = `/report/external/token`;
112
+ return fetch(`${getBaseUrl(config)}${url}`, {
113
+ method: 'POST',
114
+ headers: {
115
+ Authorization: `Bearer ${token}`,
116
+ 'Content-Type': 'application/json',
117
+ },
118
+ body: JSON.stringify(context),
119
+ }).then((response) => {
120
+ if (!response.ok) {
121
+ throw new Error(`HTTP error! status: ${response.status}`);
122
+ }
123
+ return response.json();
124
+ });
125
+ };
126
+ const deleteTenant = async (config, tenant) => {
127
+ const { token } = config;
128
+ const msa = 'report';
129
+ const url = `/${msa}/external/tenant`;
130
+ return fetch(`${getBaseUrl(config)}${url}`, {
131
+ method: 'DELETE',
132
+ headers: {
133
+ Authorization: `Bearer ${token}`,
134
+ 'Content-Type': 'application/json',
135
+ },
136
+ body: JSON.stringify({ tenant }),
137
+ }).then((response) => {
138
+ if (!response.ok) {
139
+ throw new Error(`HTTP error! status: ${response.status}`);
140
+ }
141
+ });
142
+ };
143
+ exports.deleteTenant = deleteTenant;
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VUZWNoQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcGwvU3VUZWNoQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVCQSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQTtBQUVoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQTRCLEVBQUUsRUFBRTtJQUNsRCxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUNqQyxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLDJCQUEyQixDQUFBO0FBQ3hILENBQUMsQ0FBQTtBQUVNLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFDaEMsTUFBNEIsRUFDNUIsV0FBNEIsRUFDNUIsT0FBMkIsRUFDM0IsRUFBRTtJQUNGLE9BQU8sS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLG1CQUFtQixFQUFFO1FBQ3BFLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsYUFBYSxFQUFFLFVBQVUsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUN2QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO1FBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkIsR0FBRyxXQUFXO1lBQ2QsR0FBRyxPQUFPO1NBQ1gsQ0FBQztLQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtTQUMxRDtRQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBZ0IsQ0FBQTtJQUN0QyxDQUFDLENB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Q0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFO1FBQzFDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLE9BQU8sRUFBRTtZQUNQLGFBQWEsRUFBRSxVQUFVLEtBQUssRUFBRTtZQUNoQyxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO1FBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztLQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7U0FDMUQ7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQWhCWSxRQUFBLFlBQVksZ0JBZ0J4QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFJhYXNDb25uZWN0aW9uQ29uZmlnID0ge1xuICBhcHA6IHN0cmluZ1xuICB0b2tlbjogc3RyaW5nXG4gIGxhbmRzY2FwZTogJ2RldicgfCAncHJvZCdcbn1cblxuZXhwb3J0IHR5cGUgUmFhc1VzZXJDb250ZXh0ID0ge1xuICB0ZW5hbnQ6IHN0cmluZ1xuICB0ZW5hbnRBbGlhcz86IHN0cmluZ1xuICB0ZW5hbnRUeXBlPzogJ3BhaWQnIHwgJ3RyaWFsJyB8ICdkZW1vJyB8ICdkZXYnXG4gIHN1Yjogc3RyaW5nXG4gIGVtYWlsPzogc3RyaW5nXG4gIHN1YkFsaWFzPzogc3RyaW5nXG4gIHN1YkRvbWFpbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSYWFzU2Vzc2lvblJlcXVlc3QgPSB7XG4gIG1zYTogJ3JlcG9ydCcgfCAnZGF0YXRyYXZlbGVyJ1xuICBiYWNrVXJsOiBzdHJpbmdcbiAgc3ViVXJsPzogc3RyaW5nXG4gIHN1YkRvbWFpbj86IHN0cmluZ1xufVxuXG5jb25zdCB1c2VyVG9rZW5DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcblxuY29uc3QgZ2V0QmFzZVVybCA9IChjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnKSA9PiB7XG4gIGNvbnN0IHsgYXBwLCBsYW5kc2NhcGUgfSA9IGNvbmZpZ1xuICByZXR1cm4gbGFuZHNjYXBlID09PSAnZGV2JyA/IGBodHRwczovLyR7YXBwfS5kZXYuZnVuY3Rpb25zLmFzYXNlcnZpY2UuaW5jYCA6IGBodHRwczovLyR7YXBwfS5mdW5jdGlvbnMuYXNhc2VydmljZS5pbmNgXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTZXNzaW9uID0gYXN5bmMgPFI+KFxuICBjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnLFxuICB1c2VyQ29udGV4dDogUmFhc1VzZXJDb250ZXh0LFxuICByZXF1ZXN0OiBSYWFzU2Vzc2lvblJlcXVlc3RcbikgPT4ge1xuICByZXR1cm4gZmV0Y2goYCR7Z2V0QmFzZVVybChjb25maWcpfS8ke3JlcXVlc3QubXNhfS9leHRlcm5hbC9zZXNzaW9uYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb25maWcudG9rZW59YCxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAuLi51c2VyQ29udGV4dCxcbiAgICAgIC4uLnJlcXVlc3QsXG4gICAgfSksXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxSPlxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgZ2V0ID0gYXN5bmMgPFI+KGNvbmZpZzogUmFhc0Nvbm5lY3Rpb25Db25maWcsIHVzZXJDb250ZXh0OiBSYWFzVXNlckNvbnRleHQsIHVybDogc3RyaW5nKTogUHJvbWlzZTxSPiA9PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0VXNlclRva2VuKGNvbmZpZywgdXNlckNvbnRleHQpXG4gIHJldHVybiBmZXRjaChgJHtnZXRCYXNlVXJsKGNvbmZpZyl9JHt1cmx9YCwge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxSPlxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcG9zdCA9IGFzeW5jIDxSLCBCPihcbiAgY29uZmlnOiBSYWFzQ29ubmVjdGlvbkNvbmZpZyxcbiAgdXNlckNvbnRleHQ6IFJhYXNVc2VyQ29udGV4dCxcbiAgdXJsOiBzdHJpbmcsXG4gIGJvZHk6IEJcbik6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldFVzZXJUb2tlbihjb25maWcsIHVzZXJDb250ZXh0KVxuXG4gIHJldHVybiBmZXRjaChgJHtnZXRCYXNlVXJsKGNvbmZpZyl9JHt1cmx9YCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8Uj5cbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHB1dCA9IGFzeW5jIDxSLCBCPihcbiAgY29uZmlnOiBSYWFzQ29ubmVjdGlvbkNvbmZpZyxcbiAgdXNlckNvbnRleHQ6IFJhYXNVc2VyQ29udGV4dCxcbiAgdXJsOiBzdHJpbmcsXG4gIGJvZHk6IEJcbik6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldFVzZXJUb2tlbihjb25maWcsIHVzZXJDb250ZXh0KVxuXG4gIHJldHVybiBmZXRjaChgJHtnZXRCYXNlVXJsKGNvbmZpZyl9JHt1cmx9YCwge1xuICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxSPlxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgZGVsID0gYXN5bmMgPEI+KFxuICBjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnLFxuICB1c2VyQ29udGV4dDogUmFhc1VzZXJDb250ZXh0LFxuICB1cmw6IHN0cmluZyxcbiAgYm9keTogQlxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0VXNlclRva2VuKGNvbmZpZywgdXNlckNvbnRleHQpXG5cbiAgcmV0dXJuIGZldGNoKGAke2dldEJhc2VVcmwoY29uZmlnKX0ke3VybH1gLCB7XG4gICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGdldFVzZXJUb2tlbiA9IGFzeW5jIChjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnLCBjb250ZXh0OiBSYWFzVXNlckNvbnRleHQpID0+IHtcbiAgY29uc3Qga2V5ID0gYCR7Y29udGV4dC50ZW5hbnR9LSMjLSR7Y29udGV4dC5zdWJ9YFxuICBjb25zdCB0b2tlbiA9IHVzZXJUb2tlbkNhY2hlLmdldChrZXkpXG4gIGlmICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlblxuICB9XG4gIGNvbnN0IHRva2VuUmVzcCA9IGF3YWl0IGdldFVzZXJUb2tlbkltcGwoY29uZmlnLCBjb250ZXh0KVxuICBpZiAodG9rZW5SZXNwLnRva2VuKSB7XG4gICAgdXNlclRva2VuQ2FjaGUuc2V0KGtleSwgdG9rZW5SZXNwLnRva2VuKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyIHRva2VuKCR7dG9rZW5SZXNwLnRva2VufSlgKVxuICB9XG4gIHJldHVybiB0b2tlblJlc3AudG9rZW5cbn1cblxuY29uc3QgZ2V0VXNlclRva2VuSW1wbCA9IGFzeW5jIChjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnLCBjb250ZXh0OiBSYWFzVXNlckNvbnRleHQpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZyB9PiA9PiB7XG4gIGNvbnN0IHsgdG9rZW4gfSA9IGNvbmZpZ1xuICBjb25zdCB1cmwgPSBgL3JlcG9ydC9leHRlcm5hbC90b2tlbmBcbiAgcmV0dXJuIGZldGNoKGAke2dldEJhc2VVcmwoY29uZmlnKX0ke3VybH1gLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29udGV4dCksXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5qc29uKClcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVRlbmFudCA9IGFzeW5jIChjb25maWc6IFJhYXNDb25uZWN0aW9uQ29uZmlnLCB0ZW5hbnQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IHRva2VuIH0gPSBjb25maWdcbiAgY29uc3QgbXNhID0gJ3JlcG9ydCdcbiAgY29uc3QgdXJsID0gYC8ke21zYX0vZXh0ZXJuYWwvdGVuYW50YFxuICByZXR1cm4gZmV0Y2goYCR7Z2V0QmFzZVVybChjb25maWcpfSR7dXJsfWAsIHtcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGVuYW50IH0pLFxuICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgfSlcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export { get, post, put, del, deleteTenant, RaasUserContext as RaasClientContext, RaasConnectionConfig, createSession, RaasSessionRequest, } from './impl/SuTechClient';
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSession = exports.deleteTenant = exports.del = exports.put = exports.post = exports.get = void 0;
4
+ var SuTechClient_1 = require("./impl/SuTechClient");
5
+ Object.defineProperty(exports, "get", { enumerable: true, get: function () { return SuTechClient_1.get; } });
6
+ Object.defineProperty(exports, "post", { enumerable: true, get: function () { return SuTechClient_1.post; } });
7
+ Object.defineProperty(exports, "put", { enumerable: true, get: function () { return SuTechClient_1.put; } });
8
+ Object.defineProperty(exports, "del", { enumerable: true, get: function () { return SuTechClient_1.del; } });
9
+ Object.defineProperty(exports, "deleteTenant", { enumerable: true, get: function () { return SuTechClient_1.deleteTenant; } });
10
+ Object.defineProperty(exports, "createSession", { enumerable: true, get: function () { return SuTechClient_1.createSession; } });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0RBVTRCO0FBVDFCLG1HQUFBLEdBQUcsT0FBQTtBQUNILG9HQUFBLElBQUksT0FBQTtBQUNKLG1HQUFBLEdBQUcsT0FBQTtBQUNILG1HQUFBLEdBQUcsT0FBQTtBQUNILDRHQUFBLFlBQVksT0FBQTtBQUdaLDZHQUFBLGFBQWEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gIGdldCxcbiAgcG9zdCxcbiAgcHV0LFxuICBkZWwsXG4gIGRlbGV0ZVRlbmFudCxcbiAgUmFhc1VzZXJDb250ZXh0IGFzIFJhYXNDbGllbnRDb250ZXh0LFxuICBSYWFzQ29ubmVjdGlvbkNvbmZpZyxcbiAgY3JlYXRlU2Vzc2lvbixcbiAgUmFhc1Nlc3Npb25SZXF1ZXN0LFxufSBmcm9tICcuL2ltcGwvU3VUZWNoQ2xpZW50J1xuIl19
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@sutech_jp/raas-client-for-typescript",
3
+ "version": "0.5.5",
4
+ "description": "RaaS client for TypeScript",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "publishConfig": {
8
+ "registry": "https://registry.npmjs.org/",
9
+ "access": "public"
10
+ },
11
+ "scripts": {
12
+ "test": "jest",
13
+ "build": "rimraf dist&&tsc",
14
+ "watch": "tsc -w",
15
+ "prepublishOnly": "npm run build",
16
+ "lint:fix": "eslint --fix \"./{src,test}/**/*.{ts,js}\" --ignore-path .gitignore",
17
+ "format": "prettier --write \"./{src,test}/**/*.{ts,js}\" --ignore-path .gitignore",
18
+ "precommit": "npm run format && npm run lint:fix"
19
+ },
20
+ "husky": {
21
+ "hooks": {
22
+ "pre-commit": "lint-staged"
23
+ }
24
+ },
25
+ "lint-staged": {
26
+ "./{src,test}/**/*.{ts,js}": [
27
+ "npm run precommit"
28
+ ]
29
+ },
30
+ "devDependencies": {
31
+ "@types/jest": "^29.5.11",
32
+ "@typescript-eslint/eslint-plugin": "^6.17.0",
33
+ "@typescript-eslint/parser": "^6.17.0",
34
+ "dotenv": "^16.5.0",
35
+ "eslint": "^7.32.0",
36
+ "eslint-config-prettier": "^8.3.0",
37
+ "eslint-plugin-import": "^2.25.2",
38
+ "husky": "^4.3.8",
39
+ "jest": "^29.6.4",
40
+ "jest-jasmine2": "^29.7.0",
41
+ "lint-staged": "^11.1.2",
42
+ "prettier": "^2.4.0",
43
+ "rimraf": "^3.0.2",
44
+ "ts-jest": "^29.2.5",
45
+ "ts-node": "^10.4.0",
46
+ "typescript": "^4.7.4"
47
+ }
48
+ }
@@ -0,0 +1,58 @@
1
+ import {
2
+ getUserTokenImpl as getUserToken,
3
+ createSession,
4
+ RaasUserContext,
5
+ RaasConnectionConfig,
6
+ get,
7
+ } from '../src/impl/SuTechClient'
8
+
9
+ describe('getUserToken', () => {
10
+ it('should be defined', async () => {
11
+ const config: RaasConnectionConfig = {
12
+ app: 'sample',
13
+ token: 'sample',
14
+ landscape: 'dev',
15
+ }
16
+ const context: RaasUserContext = {
17
+ tenant: 'sample2',
18
+ sub: 'sample-user01',
19
+ }
20
+ const token = await getUserToken(config, context)
21
+ expect(token).toBeDefined()
22
+ })
23
+ })
24
+
25
+ describe('createSession', () => {
26
+ it('should be defined', async () => {
27
+ const config: RaasConnectionConfig = {
28
+ app: 'sample',
29
+ token: 'sample',
30
+ landscape: 'dev',
31
+ }
32
+ const context: RaasUserContext = {
33
+ tenant: 'sample2',
34
+ sub: 'sample-user02',
35
+ }
36
+ const session = await createSession(config, context, {
37
+ mas: 'report',
38
+ backUrl: 'https://www.google.com',
39
+ })
40
+ expect(session).toBeDefined()
41
+ })
42
+ })
43
+
44
+ describe('get', () => {
45
+ it('should be defined', async () => {
46
+ const config: RaasConnectionConfig = {
47
+ app: 'sample',
48
+ token: 'sample',
49
+ landscape: 'dev',
50
+ }
51
+ const context: RaasUserContext = {
52
+ tenant: 'sample2',
53
+ sub: 'sample-user02',
54
+ }
55
+ const resp = await get(config, context, '/report/layouts/tutorial/invoice')
56
+ expect(resp).toBeDefined()
57
+ })
58
+ })