@apito-io/js-admin-sdk 2.5.0 → 3.0.0

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/dist/index.mjs CHANGED
@@ -1,18 +1,18 @@
1
1
  // @apito-io/js-admin-sdk - Admin SDK for Apito GraphQL API
2
- import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);this.code=r;this.statusCode=n;this.details=s;this.name="ApitoError"}},g=class extends p{constructor(t,r,n){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=n;this.name="GraphQLError"}get partialData(){return this.response?.data}},i=class extends p{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};var l=class{constructor(e){this.baseURL=e.baseURL,this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=y.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json",...this.apiKey.startsWith("cli-")||this.apiKey.startsWith("sdk-")?{"X-Apito-Sync-Key":this.apiKey}:{"X-Apito-Key":this.apiKey}},...e.httpClient}),this.tenantId&&(this.httpClient.defaults.headers["X-Apito-Tenant-ID"]=this.tenantId)}async executeGraphQL(e,t,r){try{let n={query:e,variables:t||{}},s={"Content-Type":"application/json",...this.apiKey.startsWith("cli-")||this.apiKey.startsWith("sdk-")?{"X-Apito-Sync-Key":this.apiKey}:{"X-Apito-Key":this.apiKey}};(r?.tenantId||this.tenantId)&&(s["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let a=await this.httpClient.post(this.baseURL,n,{headers:s});if(a.data.errors&&a.data.errors.length>0)throw new g("GraphQL query failed",a.data.errors,a.data);return a.data}catch(n){throw y.isAxiosError(n)?new p(n.response?.data?.message||n.message,"HTTP_ERROR",n.response?.status,n.response?.data):n}}async generateTenantToken(e,t,r){let n=(t??"").trim();if(!n){let c=new Date;n=`${c.getUTCFullYear()+1}-${String(c.getUTCMonth()+1).padStart(2,"0")}-${String(c.getUTCDate()).padStart(2,"0")}`}let s=`
2
+ import m from"axios";var l=class extends Error{constructor(t,r,s,n){super(t);this.code=r;this.statusCode=s;this.details=n;this.name="ApitoError"}},g=class extends l{constructor(t,r,s){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=s;this.name="GraphQLError"}get partialData(){return this.response?.data}},i=class extends l{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};function _(c){let e=c.trim().replace(/\/$/,"");return e.endsWith("/graphql")?e.slice(0,-8):e}var p=class{constructor(e){this.baseURL=e.baseURL,this.restBaseURL=(e.restBaseURL??"").trim()||_(e.baseURL),this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=m.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json",...this.apiKey.startsWith("cli-")||this.apiKey.startsWith("sdk-")?{"X-Apito-Sync-Key":this.apiKey}:{"X-Apito-Key":this.apiKey}},...e.httpClient}),this.tenantId&&(this.httpClient.defaults.headers["X-Apito-Tenant-ID"]=this.tenantId)}async executeGraphQL(e,t,r){try{let s={query:e,variables:t||{}},n={"Content-Type":"application/json",...this.apiKey.startsWith("cli-")||this.apiKey.startsWith("sdk-")?{"X-Apito-Sync-Key":this.apiKey}:{"X-Apito-Key":this.apiKey}};(r?.tenantId||this.tenantId)&&(n["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let a=await this.httpClient.post(this.baseURL,s,{headers:n});if(a.data.errors&&a.data.errors.length>0)throw new g("GraphQL query failed",a.data.errors,a.data);return a.data}catch(s){throw m.isAxiosError(s)?new l(s.response?.data?.message||s.message,"HTTP_ERROR",s.response?.status,s.response?.data):s}}async generateTenantToken(e,t,r){let s=(t??"").trim();if(!s){let u=new Date;s=`${u.getUTCFullYear()+1}-${String(u.getUTCMonth()+1).padStart(2,"0")}-${String(u.getUTCDate()).padStart(2,"0")}`}let n=`
3
3
  mutation GenerateTenantToken($tenantId: String!, $duration: String!, $role: String) {
4
4
  generateTenantToken(tenant_id: $tenantId, duration: $duration, role: $role) {
5
5
  token
6
6
  }
7
7
  }
8
- `,a={tenantId:e,duration:n,role:r!==void 0&&r.trim()!==""?r.trim():null},u=(await this.executeGraphQL(s,a,{tenantId:e})).data?.generateTenantToken;if(!u?.token)throw new i("Invalid response format for tenant token");return u.token}async loginTenantUser(e,t,r){let n=`
9
- query LoginTenantUser($project_id: String!, $username: String!, $password: String!) {
10
- loginTenantUser(project_id: $project_id, username: $username, password: $password) {
8
+ `,a={tenantId:e,duration:s,role:r!==void 0&&r.trim()!==""?r.trim():null},d=(await this.executeGraphQL(n,a,{tenantId:e})).data?.generateTenantToken;if(!d?.token)throw new i("Invalid response format for tenant token");return d.token}authHeaders(e){let t={...this.apiKey.startsWith("cli-")||this.apiKey.startsWith("sdk-")?{"X-Apito-Sync-Key":this.apiKey}:{"X-Apito-Key":this.apiKey}},r=e??this.tenantId;return r&&(t["X-Apito-Tenant-ID"]=r),t}async executeREST(e,t,r){let s=new URL(`${this.restBaseURL.replace(/\/$/,"")}${t}`);if(r?.query)for(let[o,d]of Object.entries(r.query))d!==void 0&&d!==""&&s.searchParams.set(o,String(d));let n=this.authHeaders(),a;r?.formData?a=r.formData:r?.jsonBody&&(n["Content-Type"]="application/json",a=r.jsonBody);try{let d=(await this.httpClient.request({method:e,url:s.toString(),headers:n,data:a,maxBodyLength:1/0,maxContentLength:1/0})).data;if(d.success===!1&&!r?.allowFailure)throw new i(String(d.message??"request failed"));return d}catch(o){if(m.isAxiosError(o)){let d=o.response?.data?.message??o.message;throw new l(d,"HTTP_ERROR",o.response?.status,o.response?.data)}throw o}}async loginUser(e){let t=(e.authMethod??"general").trim().toLowerCase()||"general",r={project_id:e.projectId};if(t==="google"){r.auth_method="google";let o=(e.code??"").trim(),d=(e.state??"").trim();if(!o||!d)throw new i("code and state are required for Google login");r.code=o,r.state=d}else{let o=(e.password??"").trim();if(!o)throw new i("password is required");r.password=o;let d=(e.email??"").trim(),u=(e.phone??"").trim();if(!d&&!u)throw new i("email or phone is required");d&&(r.email=d),u&&(r.phone=u)}let a=(await this.executeGraphQL(`
9
+ query LoginUser($project_id: String!, $password: String, $auth_method: String, $email: String, $phone: String, $code: String, $state: String) {
10
+ loginUser(project_id: $project_id, password: $password, auth_method: $auth_method, email: $email, phone: $phone, code: $code, state: $state) {
11
11
  token
12
12
  user {
13
13
  id
14
- username
15
14
  email
15
+ phone
16
16
  role
17
17
  provider
18
18
  tenant_id
@@ -22,31 +22,20 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
22
22
  }
23
23
  }
24
24
  }
25
- `,s={project_id:r,username:e,password:t},o=(await this.executeGraphQL(n,s)).data?.loginTenantUser;if(!o?.token)throw new i("Invalid response format for loginTenantUser");return{token:o.token,user:o.user}}async loginTenantUserGoogle(e,t){let r=`
26
- mutation LoginTenantUserGoogle($project_id: String!, $id_token: String!) {
27
- loginTenantUserGoogle(project_id: $project_id, id_token: $id_token) {
28
- token
29
- user {
30
- id
31
- username
32
- email
33
- role
34
- provider
35
- tenant_id
36
- status
37
- created_at
38
- updated_at
39
- }
25
+ `,r)).data?.loginUser;if(!a?.token)throw new i("Invalid response format for loginUser");return{token:a.token,user:a.user}}async googleOAuthState(e){let t=`
26
+ query GoogleOAuthState($project_id: String!) {
27
+ googleOAuthState(project_id: $project_id) {
28
+ state
40
29
  }
41
30
  }
42
- `,n={project_id:e,id_token:t},a=(await this.executeGraphQL(r,n)).data?.loginTenantUserGoogle;if(!a?.token)throw new i("Invalid response format for loginTenantUserGoogle");return{token:a.token,user:a.user}}async searchTenantUsers(e,t,r){let n=`
43
- query SearchTenantUsers($project_id: String!, $limit: Int, $offset: Int) {
44
- searchTenantUsers(project_id: $project_id, limit: $limit, offset: $offset) {
31
+ `,r={project_id:e},n=(await this.executeGraphQL(t,r)).data?.googleOAuthState,a=typeof n?.state=="string"?n.state.trim():"";if(!a)throw new i("Invalid response format for googleOAuthState");return{state:a}}async searchUsers(e,t,r){let s=`
32
+ query SearchUsers($project_id: String!, $limit: Int, $offset: Int) {
33
+ searchUsers(project_id: $project_id, limit: $limit, offset: $offset) {
45
34
  count
46
35
  users {
47
36
  id
48
- username
49
37
  email
38
+ phone
50
39
  role
51
40
  provider
52
41
  tenant_id
@@ -56,7 +45,7 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
56
45
  }
57
46
  }
58
47
  }
59
- `,s={project_id:e};t!==void 0&&(s.limit=t),r!==void 0&&(s.offset=r);let o=(await this.executeGraphQL(n,s)).data?.searchTenantUsers;if(!o)throw new i("Invalid response format for searchTenantUsers");let u=0;return typeof o.count=="number"&&(u=o.count),{users:o.users??[],count:u}}async searchTenantsByDomain(e,t){let r=`
48
+ `,n={project_id:e};t!==void 0&&(n.limit=t),r!==void 0&&(n.offset=r);let o=(await this.executeGraphQL(s,n)).data?.searchUsers;if(!o)throw new i("Invalid response format for searchUsers");let d=0;return typeof o.count=="number"&&(d=o.count),{users:o.users??[],count:d}}async searchTenantsByDomain(e,t){let r=`
60
49
  query SearchTenantsByDomain($project_id: String!, $domain: String!) {
61
50
  searchTenantsByDomain(project_id: $project_id, domain: $domain) {
62
51
  tenant {
@@ -68,12 +57,12 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
68
57
  }
69
58
  }
70
59
  }
71
- `,n={project_id:e,domain:t},a=(await this.executeGraphQL(r,n)).data?.searchTenantsByDomain;if(!a)throw new i("Invalid response format for searchTenantsByDomain");return{tenant:a.tenant??null}}async createTenantUser(e,t,r,n,s){let a=`
72
- mutation CreateTenantUser($project_id: String!, $username: String!, $password: String!, $role: String, $email: String) {
73
- createTenantUser(project_id: $project_id, username: $username, password: $password, role: $role, email: $email) {
60
+ `,s={project_id:e,domain:t},a=(await this.executeGraphQL(r,s)).data?.searchTenantsByDomain;if(!a)throw new i("Invalid response format for searchTenantsByDomain");return{tenant:a.tenant??null}}async createUser(e,t){let r=(t.password??"").trim();if(!r)throw new i("password is required");let s=`
61
+ mutation CreateUser($project_id: String!, $password: String!, $role: String, $email: String, $phone: String) {
62
+ createUser(project_id: $project_id, password: $password, role: $role, email: $email, phone: $phone) {
74
63
  id
75
- username
76
64
  email
65
+ phone
77
66
  role
78
67
  provider
79
68
  tenant_id
@@ -82,7 +71,59 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
82
71
  updated_at
83
72
  }
84
73
  }
85
- `,o={project_id:e,username:t,password:n,email:r,role:s},c=(await this.executeGraphQL(a,o)).data?.createTenantUser;if(!c?.id)throw new i("Invalid response format for createTenantUser");return c}async getSingleResource(e,t,r=!1){let n=`
74
+ `,n={project_id:e,password:r},a=(t.role??"").trim();a&&(n.role=a);let o=(t.email??"").trim();o&&(n.email=o);let d=(t.phone??"").trim();d&&(n.phone=d);let y=(await this.executeGraphQL(s,n)).data?.createUser;if(!y?.id)throw new i("Invalid response format for createUser");return y}async updateUser(e,t){let r=(e??"").trim();if(!r)throw new i("userId is required");if(t.email===void 0&&t.phone===void 0&&t.role===void 0)throw new i("at least one field must be provided");let s=`
75
+ mutation UpdateUser($user_id: String!, $email: String, $phone: String, $role: String) {
76
+ updateUser(user_id: $user_id, email: $email, phone: $phone, role: $role) {
77
+ id
78
+ email
79
+ phone
80
+ role
81
+ provider
82
+ tenant_id
83
+ status
84
+ created_at
85
+ updated_at
86
+ }
87
+ }
88
+ `,n={user_id:r};t.email!==void 0&&(n.email=t.email),t.phone!==void 0&&(n.phone=t.phone),t.role!==void 0&&(n.role=t.role);let o=(await this.executeGraphQL(s,n)).data?.updateUser;if(!o?.id)throw new i("Invalid response format for updateUser");return o}async resetUserPassword(e,t){let r=(e??"").trim();if(!r)throw new i("userId is required");if(!(t??"").trim())throw new i("password is required");let a=(await this.executeGraphQL(`
89
+ mutation ResetUserPassword($user_id: String!, $password: String!) {
90
+ resetUserPassword(user_id: $user_id, password: $password)
91
+ }
92
+ `,{user_id:r,password:t})).data?.resetUserPassword;if(typeof a!="boolean")throw new i("Invalid response format for resetUserPassword");return a}async deleteUser(e){let t=(e??"").trim();if(!t)throw new i("userId is required");let n=(await this.executeGraphQL(`
93
+ mutation DeleteUser($user_id: String!) {
94
+ deleteUser(user_id: $user_id)
95
+ }
96
+ `,{user_id:t})).data?.deleteUser;if(typeof n!="boolean")throw new i("Invalid response format for deleteUser");return n}async getProjectStorageSettings(e){let s=(await this.executeGraphQL(`
97
+ query GetProjectStorageSettings($_id: String!) {
98
+ getProject(_id: $_id) {
99
+ storage_settings {
100
+ use_free_cloud_storage
101
+ endpoint
102
+ region
103
+ bucket
104
+ access_key_id
105
+ has_secret_access_key
106
+ public_base_url
107
+ force_path_style
108
+ }
109
+ }
110
+ }
111
+ `,{_id:e})).data?.getProject?.storage_settings;if(!s)throw new i("Invalid response format for getProjectStorageSettings");return s}async updateProjectStorageSettings(e){let s=(await this.executeGraphQL(`
112
+ mutation UpdateProjectStorageSettings($input: UpdateProjectStorageInput!) {
113
+ updateProjectStorageSettings(input: $input) {
114
+ storage_settings {
115
+ use_free_cloud_storage
116
+ endpoint
117
+ region
118
+ bucket
119
+ access_key_id
120
+ has_secret_access_key
121
+ public_base_url
122
+ force_path_style
123
+ }
124
+ }
125
+ }
126
+ `,{input:e})).data?.updateProjectStorageSettings?.storage_settings;if(!s)throw new i("Invalid response format for updateProjectStorageSettings");return s}async uploadSystemFile(e){let t=(e.content instanceof ArrayBuffer,e.content.byteLength);if(!e.content||t===0)throw new i("file content is required");let r=(e.fileName??"").trim()||"upload",s=new FormData,n=e.content instanceof ArrayBuffer?new Uint8Array(e.content):e.content,a=new Blob([n]);s.append("file",a,r),e.fileType?.trim()&&s.append("file_type",e.fileType.trim());let o=await this.executeREST("POST","/files/upload",{formData:s});if(!o.file?.id)throw new i("Invalid response format for uploadSystemFile");return o.file}async listSystemFiles(e,t,r){let s=await this.executeREST("GET","/files/list",{query:{file_type:e,limit:t,offset:r}});return{files:s.files??[],total:s.total??0}}async deleteSystemFiles(e){if(!e?.length)throw new i("ids are required");let t=await this.executeREST("POST","/files/delete",{jsonBody:{ids:e},allowFailure:!0}),r={success:!!t.success,deleted_ids:t.deleted_ids??[],storage_failed:t.storage_failed,message:t.message};if(!r.success&&r.message)throw new i(r.message);return r}async getSingleResource(e,t,r=!1){let s=`
86
127
  query GetSingleData($model: String, $_id: String!, $single_page_data: Boolean) {
87
128
  getSingleData(model: $model, _id: $_id, single_page_data: $single_page_data) {
88
129
  _key
@@ -100,7 +141,7 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
100
141
  type
101
142
  }
102
143
  }
103
- `,s={model:e,_id:t,single_page_data:r},a=await this.executeGraphQL(n,s);if(!a.data?.getSingleData)throw new i("Resource not found");return a.data.getSingleData}async searchResources(e,t={},r=!1){let n=`
144
+ `,n={model:e,_id:t,single_page_data:r},a=await this.executeGraphQL(s,n);if(!a.data?.getSingleData)throw new i("Resource not found");return a.data.getSingleData}async searchResources(e,t={},r=!1){let s=`
104
145
  query GetModelData(
105
146
  $model: String!
106
147
  $page: Int
@@ -133,7 +174,7 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
133
174
  count
134
175
  }
135
176
  }
136
- `,s={model:e};t&&typeof t=="object"&&(t._key!==void 0&&(s._key=t._key),t.page!==void 0&&(s.page=t.page),t.limit!==void 0&&(s.limit=t.limit),t.where!==void 0&&(s.where=t.where),t.search!==void 0&&(s.search=t.search));let a=await this.executeGraphQL(n,s);if(!a.data?.getModelData)throw new i("Invalid search response format");return a.data.getModelData}async getRelationDocuments(e,t){let r=`
177
+ `,n={model:e};t&&typeof t=="object"&&(t._key!==void 0&&(n._key=t._key),t.page!==void 0&&(n.page=t.page),t.limit!==void 0&&(n.limit=t.limit),t.where!==void 0&&(n.where=t.where),t.search!==void 0&&(n.search=t.search));let a=await this.executeGraphQL(s,n);if(!a.data?.getModelData)throw new i("Invalid search response format");return a.data.getModelData}async getRelationDocuments(e,t){let r=`
137
178
  query GetModelData($model: String!, $page: Int, $limit: Int, $where: JSON, $search: String, $connection : ListAllDataDetailedOfAModelConnectionPayload) {
138
179
  getModelData(model: $model, page: $page, limit: $limit, where: $where, search: $search, connection: $connection) {
139
180
  results {
@@ -152,7 +193,7 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
152
193
  count
153
194
  }
154
195
  }
155
- `,n={connection:t};if(t.model)n.model=t.model;else throw new i("model is required in connection parameters");if(t.filter){let a=t.filter;a.page!==void 0&&(n.page=a.page),a.limit!==void 0&&(n.limit=a.limit),a.where!==void 0&&(n.where=a.where),a.search!==void 0&&(n.search=a.search)}let s=await this.executeGraphQL(r,n);if(!s.data?.getModelData)throw new i("Invalid relation documents response format");return s.data.getModelData}async createNewResource(e){if(!e.model)throw new i("model is required");if(!e.payload)throw new i("payload is required");let t=`
196
+ `,s={connection:t};if(t.model)s.model=t.model;else throw new i("model is required in connection parameters");if(t.filter){let a=t.filter;a.page!==void 0&&(s.page=a.page),a.limit!==void 0&&(s.limit=a.limit),a.where!==void 0&&(s.where=a.where),a.search!==void 0&&(s.search=a.search)}let n=await this.executeGraphQL(r,s);if(!n.data?.getModelData)throw new i("Invalid relation documents response format");return n.data.getModelData}async createNewResource(e){if(!e.model)throw new i("model is required");if(!e.payload)throw new i("payload is required");let t=`
156
197
  mutation CreateNewData($model: String!, $single_page_data: Boolean, $payload: JSON!, $connect: JSON) {
157
198
  upsertModelData(
158
199
  connect: $connect
@@ -172,7 +213,7 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
172
213
  }
173
214
  }
174
215
  }
175
- `,r={model:e.model,payload:e.payload,single_page_data:e.singlePageData||!1};e.connect&&(r.connect=e.connect);let n=await this.executeGraphQL(t,r);if(!n.data?.upsertModelData)throw new i("Invalid create response format");return n.data.upsertModelData}async updateResource(e){if(!e.id)throw new i("id is required");if(!e.model)throw new i("model is required");if(!e.payload)throw new i("payload is required");let t=`
216
+ `,r={model:e.model,payload:e.payload,single_page_data:e.singlePageData||!1};e.connect&&(r.connect=e.connect);let s=await this.executeGraphQL(t,r);if(!s.data?.upsertModelData)throw new i("Invalid create response format");return s.data.upsertModelData}async updateResource(e){if(!e.id)throw new i("id is required");if(!e.model)throw new i("model is required");if(!e.payload)throw new i("payload is required");let t=`
176
217
  mutation UpdateModelData($_id: String!, $model: String!, $single_page_data: Boolean, $force_update: Boolean, $payload: JSON!, $connect: JSON, $disconnect: JSON) {
177
218
  upsertModelData(
178
219
  connect: $connect
@@ -195,18 +236,18 @@ import y from"axios";var p=class extends Error{constructor(t,r,n,s){super(t);thi
195
236
  }
196
237
  }
197
238
  }
198
- `,r={_id:e.id,model:e.model,payload:e.payload,single_page_data:e.singlePageData||!1,force_update:e.forceUpdate||!1};e.connect&&(r.connect=e.connect),e.disconnect&&(r.disconnect=e.disconnect);let n=await this.executeGraphQL(t,r);if(!n.data?.upsertModelData)throw new i("Invalid update response format");return n.data.upsertModelData}async deleteResource(e,t){let r=`
239
+ `,r={_id:e.id,model:e.model,payload:e.payload,single_page_data:e.singlePageData||!1,force_update:e.forceUpdate||!1};e.connect&&(r.connect=e.connect),e.disconnect&&(r.disconnect=e.disconnect);let s=await this.executeGraphQL(t,r);if(!s.data?.upsertModelData)throw new i("Invalid update response format");return s.data.upsertModelData}async deleteResource(e,t){let r=`
199
240
  mutation DeleteData($model: String!, $_id: String!) {
200
241
  deleteModelData(model_name: $model, _id: $_id) {
201
242
  id
202
243
  }
203
244
  }
204
- `,n={model:e,_id:t};await this.executeGraphQL(r,n)}async debug(e,...t){let r=`
245
+ `,s={model:e,_id:t};await this.executeGraphQL(r,s)}async debug(e,...t){let r=`
205
246
  mutation Debug($stage: String!, $data: JSON) {
206
247
  debug(stage: $stage, data: $data) {
207
248
  message
208
249
  data
209
250
  }
210
251
  }
211
- `,n={stage:e,data:t};return(await this.executeGraphQL(r,n)).data?.debug}};function _(d){return new l(d)}var m=class d{constructor(e){this.client=e}static toTypedDocument(e){let t=JSON.parse(JSON.stringify(e.data));return{_key:e._key,_id:e._id,data:t,meta:e.meta,id:e.id,expire_at:e.expire_at,relation_doc_id:e.relation_doc_id,last_revision_doc_id:e.last_revision_doc_id,type:e.type,tenant_id:e.tenant_id,tenant_model:e.tenant_model}}async getSingleResourceTyped(e,t,r=!1){let n=await this.client.getSingleResource(e,t,r);return d.toTypedDocument(n)}async searchResourcesTyped(e,t={},r=!1){let n=await this.client.searchResources(e,t,r);return{results:n.results.map(s=>d.toTypedDocument(s)),count:n.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(n=>d.toTypedDocument(n)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return d.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return d.toTypedDocument(t)}};var h="2.5.0";function f(){return h}export{l as ApitoClient,p as ApitoError,g as GraphQLError,m as TypedOperations,i as ValidationError,h as Version,_ as createClient,l as default,f as getVersion};
252
+ `,s={stage:e,data:t};return(await this.executeGraphQL(r,s)).data?.debug}};function S(c){return new p(c)}var h=class c{constructor(e){this.client=e}static toTypedDocument(e){let t=JSON.parse(JSON.stringify(e.data));return{_key:e._key,_id:e._id,data:t,meta:e.meta,id:e.id,expire_at:e.expire_at,relation_doc_id:e.relation_doc_id,last_revision_doc_id:e.last_revision_doc_id,type:e.type,tenant_id:e.tenant_id,tenant_model:e.tenant_model}}async getSingleResourceTyped(e,t,r=!1){let s=await this.client.getSingleResource(e,t,r);return c.toTypedDocument(s)}async searchResourcesTyped(e,t={},r=!1){let s=await this.client.searchResources(e,t,r);return{results:s.results.map(n=>c.toTypedDocument(n)),count:s.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(s=>c.toTypedDocument(s)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return c.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return c.toTypedDocument(t)}};var f="3.0.0";function w(){return f}export{p as ApitoClient,l as ApitoError,g as GraphQLError,h as TypedOperations,i as ValidationError,f as Version,S as createClient,p as default,w as getVersion};
212
253
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/types.ts","../src/typed-operations.ts","../src/version.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport {\n ClientConfig,\n DefaultDocumentStructure,\n SearchResult,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n GraphQLResponse,\n GraphQLError as SDKGraphQLError,\n ApitoError,\n ValidationError,\n InjectedDBOperationInterface,\n TenantLoginResponse,\n TenantUser,\n TenantUsersResponse,\n TenantByDomainResponse,\n TenantCatalogSearchRow,\n} from './types';\n\n/**\n * Apito SDK Client - JavaScript implementation matching the Go SDK\n */\nexport class ApitoClient implements InjectedDBOperationInterface {\n private httpClient: AxiosInstance;\n private baseURL: string;\n private apiKey: string;\n private tenantId?: string;\n\n constructor(config: ClientConfig) {\n this.baseURL = config.baseURL;\n this.apiKey = config.apiKey;\n this.tenantId = config.tenantId;\n\n // Create axios instance with default configuration\n this.httpClient = axios.create({\n timeout: config.timeout || 30000,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey.startsWith('cli-') || this.apiKey.startsWith('sdk-')\n ? { 'X-Apito-Sync-Key': this.apiKey }\n : { 'X-Apito-Key': this.apiKey }),\n },\n ...config.httpClient,\n });\n\n // Add tenant ID to headers if provided\n if (this.tenantId) {\n this.httpClient.defaults.headers['X-Apito-Tenant-ID'] = this.tenantId;\n }\n }\n\n /**\n * Execute an arbitrary GraphQL query or mutation against the Apito admin (system) endpoint.\n * Use for plugin-registered operations (e.g. processLedger, plg_closeOrder) when not wrapped by dedicated SDK methods.\n */\n async executeGraphQL(\n query: string,\n variables?: Record<string, any>,\n options?: { tenantId?: string }\n ): Promise<GraphQLResponse> {\n try {\n const payload = {\n query,\n variables: variables || {},\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(this.apiKey.startsWith('cli-') || this.apiKey.startsWith('sdk-')\n ? { 'X-Apito-Sync-Key': this.apiKey }\n : { 'X-Apito-Key': this.apiKey }),\n };\n\n if (options?.tenantId || this.tenantId) {\n headers['X-Apito-Tenant-ID'] = options?.tenantId || this.tenantId!;\n }\n\n const response = await this.httpClient.post<GraphQLResponse>(\n this.baseURL,\n payload,\n { headers }\n );\n\n if (response.data.errors && response.data.errors.length > 0) {\n throw new SDKGraphQLError(\n 'GraphQL query failed',\n response.data.errors,\n response.data\n );\n }\n\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new ApitoError(\n error.response?.data?.message || error.message,\n 'HTTP_ERROR',\n error.response?.status,\n error.response?.data\n );\n }\n throw error;\n }\n }\n\n /**\n * Generate a tenant-scoped API key. Matches engine `generateTenantToken`: `tenant_id`, `duration`, optional `role`.\n * Auth uses `X-Apito-Key` (client `apiKey`).\n *\n * @param tenantId Catalog tenant id (`tenant_id` in the mutation).\n * @param duration Expiry calendar day `YYYY-MM-DD`. If omitted/empty, defaults to one year ahead in UTC.\n * @param role Optional token role; if omitted/empty, the engine defaults to `admin`.\n */\n async generateTenantToken(tenantId: string, duration?: string, role?: string): Promise<string> {\n let dur = (duration ?? '').trim();\n if (!dur) {\n const d = new Date();\n dur = `${d.getUTCFullYear() + 1}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(\n d.getUTCDate()\n ).padStart(2, '0')}`;\n }\n\n const query = `\n mutation GenerateTenantToken($tenantId: String!, $duration: String!, $role: String) {\n generateTenantToken(tenant_id: $tenantId, duration: $duration, role: $role) {\n token\n }\n }\n `;\n\n const variables: Record<string, any> = {\n tenantId,\n duration: dur,\n role: role !== undefined && role.trim() !== '' ? role.trim() : null,\n };\n const response = await this.executeGraphQL(query, variables, { tenantId });\n\n const data = response.data?.generateTenantToken;\n if (!data?.token) {\n throw new ValidationError('Invalid response format for tenant token');\n }\n\n return data.token;\n }\n\n /**\n * Tenant catalog login (system GraphQL). Returns a tenant-scoped `ak_` API token on success.\n */\n async loginTenantUser(\n username: string,\n password: string,\n projectId: string\n ): Promise<TenantLoginResponse> {\n const query = `\n query LoginTenantUser($project_id: String!, $username: String!, $password: String!) {\n loginTenantUser(project_id: $project_id, username: $username, password: $password) {\n token\n user {\n id\n username\n email\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n }\n `;\n const variables: Record<string, any> = { project_id: projectId, username, password };\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.loginTenantUser;\n if (!raw?.token) {\n throw new ValidationError('Invalid response format for loginTenantUser');\n }\n return {\n token: raw.token as string,\n user: raw.user as TenantUser | undefined,\n };\n }\n\n /**\n * Google ID token login for tenant users (project must have google_client_id set).\n */\n async loginTenantUserGoogle(projectId: string, idToken: string): Promise<TenantLoginResponse> {\n const query = `\n mutation LoginTenantUserGoogle($project_id: String!, $id_token: String!) {\n loginTenantUserGoogle(project_id: $project_id, id_token: $id_token) {\n token\n user {\n id\n username\n email\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n }\n `;\n const variables = { project_id: projectId, id_token: idToken };\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.loginTenantUserGoogle;\n if (!raw?.token) {\n throw new ValidationError('Invalid response format for loginTenantUserGoogle');\n }\n return {\n token: raw.token as string,\n user: raw.user as TenantUser | undefined,\n };\n }\n\n /**\n * Search tenant users for a project.\n */\n async searchTenantUsers(\n projectId: string,\n limit?: number,\n offset?: number\n ): Promise<TenantUsersResponse> {\n const query = `\n query SearchTenantUsers($project_id: String!, $limit: Int, $offset: Int) {\n searchTenantUsers(project_id: $project_id, limit: $limit, offset: $offset) {\n count\n users {\n id\n username\n email\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n }\n `;\n const variables: Record<string, any> = { project_id: projectId };\n if (limit !== undefined) variables.limit = limit;\n if (offset !== undefined) variables.offset = offset;\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.searchTenantUsers;\n if (!raw) {\n throw new ValidationError('Invalid response format for searchTenantUsers');\n }\n let count = 0;\n if (typeof raw.count === 'number') {\n count = raw.count;\n }\n const users = (raw.users ?? []) as TenantUser[];\n return { users, count };\n }\n\n /**\n * Resolve the single SaaS catalog tenant for an exact domain match in the project (`tenant` null if none).\n */\n async searchTenantsByDomain(projectId: string, domain: string): Promise<TenantByDomainResponse> {\n const query = `\n query SearchTenantsByDomain($project_id: String!, $domain: String!) {\n searchTenantsByDomain(project_id: $project_id, domain: $domain) {\n tenant {\n id\n name\n status\n domain\n data\n }\n }\n }\n `;\n const variables: Record<string, any> = {\n project_id: projectId,\n domain,\n };\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.searchTenantsByDomain;\n if (!raw) {\n throw new ValidationError('Invalid response format for searchTenantsByDomain');\n }\n const tenant = (raw.tenant ?? null) as TenantCatalogSearchRow | null;\n return { tenant };\n }\n\n /**\n * Create a tenant catalog user (local password).\n */\n async createTenantUser(\n projectId: string,\n username: string,\n email: string,\n password: string,\n role: string\n ): Promise<TenantUser> {\n const query = `\n mutation CreateTenantUser($project_id: String!, $username: String!, $password: String!, $role: String, $email: String) {\n createTenantUser(project_id: $project_id, username: $username, password: $password, role: $role, email: $email) {\n id\n username\n email\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n `;\n const variables = { project_id: projectId, username, password, email, role };\n const response = await this.executeGraphQL(query, variables);\n const u = response.data?.createTenantUser;\n if (!u?.id) {\n throw new ValidationError('Invalid response format for createTenantUser');\n }\n return u as TenantUser;\n }\n\n /**\n * Get a single resource by model and ID\n */\n async getSingleResource(\n model: string,\n id: string,\n singlePageData: boolean = false\n ): Promise<DefaultDocumentStructure> {\n const query = `\n query GetSingleData($model: String, $_id: String!, $single_page_data: Boolean) {\n getSingleData(model: $model, _id: $_id, single_page_data: $single_page_data) {\n _key\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n id\n expire_at\n relation_doc_id\n type\n }\n }\n `;\n\n const variables = {\n model,\n _id: id,\n single_page_data: singlePageData,\n };\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getSingleData) {\n throw new ValidationError('Resource not found');\n }\n\n return response.data.getSingleData;\n }\n\n /**\n * Search resources in a model\n */\n async searchResources(\n model: string,\n filter: Record<string, any> = {},\n aggregate: boolean = false\n ): Promise<SearchResult> {\n const query = `\n query GetModelData(\n $model: String!\n $page: Int\n $limit: Int\n $_key: JSON\n $where: JSON\n $search: String\n ) {\n getModelData(\n model: $model\n page: $page\n limit: $limit\n _key: $_key\n where: $where\n search: $search\n ) {\n results {\n id\n relation_doc_id\n data\n type\n expire_at\n meta {\n created_at\n updated_at\n status\n root_revision_id\n }\n }\n count\n }\n }\n `;\n\n // Only forward keys declared on the GraphQL operation (matches go-internal-sdk)\n const variables: Record<string, any> = { model };\n if (filter && typeof filter === 'object') {\n if (filter._key !== undefined) {\n variables._key = filter._key;\n }\n if (filter.page !== undefined) {\n variables.page = filter.page;\n }\n if (filter.limit !== undefined) {\n variables.limit = filter.limit;\n }\n if (filter.where !== undefined) {\n variables.where = filter.where;\n }\n if (filter.search !== undefined) {\n variables.search = filter.search;\n }\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getModelData) {\n throw new ValidationError('Invalid search response format');\n }\n\n return response.data.getModelData;\n }\n\n /**\n * Get related documents\n */\n async getRelationDocuments(\n id: string,\n connection: Record<string, any>\n ): Promise<SearchResult> {\n const query = `\n query GetModelData($model: String!, $page: Int, $limit: Int, $where: JSON, $search: String, $connection : ListAllDataDetailedOfAModelConnectionPayload) {\n getModelData(model: $model, page: $page, limit: $limit, where: $where, search: $search, connection: $connection) {\n results {\n id\n relation_doc_id\n data\n type\n expire_at\n meta {\n created_at\n updated_at\n status\n root_revision_id\n }\n }\n count\n }\n }\n `;\n\n const variables: Record<string, any> = {\n connection,\n };\n\n // Extract model from connection if available\n if (connection.model) {\n variables.model = connection.model;\n } else {\n throw new ValidationError('model is required in connection parameters');\n }\n\n // Add filter parameters if provided in connection\n if (connection.filter) {\n const filter = connection.filter;\n if (filter.page !== undefined) {\n variables.page = filter.page;\n }\n if (filter.limit !== undefined) {\n variables.limit = filter.limit;\n }\n if (filter.where !== undefined) {\n variables.where = filter.where;\n }\n if (filter.search !== undefined) {\n variables.search = filter.search;\n }\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getModelData) {\n throw new ValidationError('Invalid relation documents response format');\n }\n\n return response.data.getModelData;\n }\n\n /**\n * Create a new resource\n */\n async createNewResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure> {\n if (!request.model) {\n throw new ValidationError('model is required');\n }\n\n if (!request.payload) {\n throw new ValidationError('payload is required');\n }\n\n const query = `\n mutation CreateNewData($model: String!, $single_page_data: Boolean, $payload: JSON!, $connect: JSON) {\n upsertModelData(\n connect: $connect\n model_name: $model\n single_page_data: $single_page_data\n payload: $payload\n ) {\n id\n type\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n }\n }\n `;\n\n const variables: Record<string, any> = {\n model: request.model,\n payload: request.payload,\n single_page_data: request.singlePageData || false,\n };\n\n if (request.connect) {\n variables.connect = request.connect;\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.upsertModelData) {\n throw new ValidationError('Invalid create response format');\n }\n\n return response.data.upsertModelData;\n }\n\n /**\n * Update an existing resource\n */\n async updateResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure> {\n if (!request.id) {\n throw new ValidationError('id is required');\n }\n\n if (!request.model) {\n throw new ValidationError('model is required');\n }\n\n if (!request.payload) {\n throw new ValidationError('payload is required');\n }\n\n const query = `\n mutation UpdateModelData($_id: String!, $model: String!, $single_page_data: Boolean, $force_update: Boolean, $payload: JSON!, $connect: JSON, $disconnect: JSON) {\n upsertModelData(\n connect: $connect\n model_name: $model\n single_page_data: $single_page_data\n force_update: $force_update\n disconnect: $disconnect\n _id: $_id\n payload: $payload\n ) {\n id\n type\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n }\n }\n `;\n\n const variables: Record<string, any> = {\n _id: request.id,\n model: request.model,\n payload: request.payload,\n single_page_data: request.singlePageData || false,\n force_update: request.forceUpdate || false,\n };\n\n if (request.connect) {\n variables.connect = request.connect;\n }\n if (request.disconnect) {\n variables.disconnect = request.disconnect;\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.upsertModelData) {\n throw new ValidationError('Invalid update response format');\n }\n\n return response.data.upsertModelData;\n }\n\n /**\n * Delete a resource by model and ID\n */\n async deleteResource(model: string, id: string): Promise<void> {\n const query = `\n mutation DeleteData($model: String!, $_id: String!) {\n deleteModelData(model_name: $model, _id: $_id) {\n id\n }\n }\n `;\n\n const variables = {\n model,\n _id: id,\n };\n\n await this.executeGraphQL(query, variables);\n }\n\n /**\n * Debug is used to debug the plugin, you can pass data here to debug the plugin\n */\n async debug(stage: string, ...data: any[]): Promise<any> {\n const query = `\n mutation Debug($stage: String!, $data: JSON) {\n debug(stage: $stage, data: $data) {\n message\n data\n }\n }\n `;\n\n const variables = {\n stage,\n data,\n };\n\n const response = await this.executeGraphQL(query, variables);\n\n return response.data?.debug;\n }\n}\n\n/**\n * Factory function to create a new Apito client\n */\nexport function createClient(config: ClientConfig): ApitoClient {\n return new ApitoClient(config);\n}\n","/**\n * Type definitions for the Apito JavaScript SDK\n */\n\nexport interface MetaField {\n created_at: string;\n updated_at: string;\n status: string;\n revision?: string;\n revision_at?: string;\n root_revision_id?: string;\n}\n\nexport interface DefaultDocumentStructure {\n _key?: string;\n _id?: string;\n data: any;\n meta?: MetaField;\n id: string;\n expire_at?: string | number;\n relation_doc_id?: string;\n last_revision_doc_id?: string;\n type?: string;\n tenant_id?: string;\n tenant_model?: string;\n}\n\nexport interface SearchResult {\n results: DefaultDocumentStructure[];\n count: number;\n}\n\nexport interface TypedDocumentStructure<T> {\n _key?: string;\n _id?: string;\n data: T;\n meta?: MetaField;\n id: string;\n expire_at?: string | number;\n relation_doc_id?: string;\n last_revision_doc_id?: string;\n type?: string;\n tenant_id?: string;\n tenant_model?: string;\n}\n\nexport interface TypedSearchResult<T> {\n results: TypedDocumentStructure<T>[];\n count: number;\n}\n\nexport interface Filter {\n page?: number;\n offset?: number;\n limit?: number;\n order?: string;\n min?: number;\n max?: number;\n category?: string;\n}\n\nexport interface GraphQLErrorLocation {\n line: number;\n column: number;\n}\n\nexport interface GraphQLError {\n message: string;\n locations?: GraphQLErrorLocation[];\n path?: (string | number)[];\n extensions?: Record<string, any>;\n}\n\nexport interface GraphQLResponse {\n data?: any;\n errors?: GraphQLError[];\n}\n\nexport interface CreateAndUpdateRequest {\n id?: string;\n model: string;\n payload: any;\n connect?: Record<string, any>;\n disconnect?: Record<string, any>;\n singlePageData?: boolean;\n forceUpdate?: boolean;\n}\n\n/** Tenant catalog user from engine system DB (pro_tenant_users). */\nexport interface TenantUser {\n id: string;\n username: string;\n email?: string;\n role: string;\n tenant_id: string;\n provider?: string;\n status?: string;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface TenantLoginResponse {\n token: string;\n user?: TenantUser;\n}\n\nexport interface TenantUsersResponse {\n users: TenantUser[];\n count: number;\n}\n\n/** One SaaS catalog tenant row from searchTenantsByDomain. */\nexport interface TenantCatalogSearchRow {\n id: string;\n name: string;\n status?: string;\n domain?: string;\n data?: string;\n}\n\nexport interface TenantByDomainResponse {\n tenant: TenantCatalogSearchRow | null;\n}\n\nexport interface ClientConfig {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n httpClient?: any;\n tenantId?: string;\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface SearchOptions {\n limit?: number;\n page?: number;\n offset?: number;\n where?: Record<string, any>;\n search?: string;\n sort?: Record<string, 1 | -1>;\n}\n\nexport interface ConnectionOptions {\n model: string;\n filter?: SearchOptions;\n}\n\n// Plugin interface matching the Go SDK\nexport interface InjectedDBOperationInterface {\n executeGraphQL(\n query: string,\n variables?: Record<string, any>,\n options?: { tenantId?: string }\n ): Promise<GraphQLResponse>;\n /** @param token Legacy; ignored. Auth uses client API key. */\n generateTenantToken(tenantId: string, duration?: string, role?: string): Promise<string>;\n loginTenantUser(username: string, password: string, projectId: string): Promise<TenantLoginResponse>;\n loginTenantUserGoogle(projectId: string, idToken: string): Promise<TenantLoginResponse>;\n searchTenantUsers(projectId: string, limit?: number, offset?: number): Promise<TenantUsersResponse>;\n searchTenantsByDomain(projectId: string, domain: string): Promise<TenantByDomainResponse>;\n createTenantUser(\n projectId: string,\n username: string,\n email: string,\n password: string,\n role: string\n ): Promise<TenantUser>;\n getSingleResource(model: string, id: string, singlePageData?: boolean): Promise<DefaultDocumentStructure>;\n searchResources(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<SearchResult>;\n getRelationDocuments(id: string, connection: Record<string, any>): Promise<SearchResult>;\n createNewResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure>;\n updateResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure>;\n deleteResource(model: string, id: string): Promise<void>;\n debug(stage: string, ...data: any[]): Promise<any>;\n}\n\n// Typed operations interface\nexport interface TypedOperations {\n getSingleResourceTyped<T>(model: string, id: string, singlePageData?: boolean): Promise<TypedDocumentStructure<T>>;\n searchResourcesTyped<T>(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<TypedSearchResult<T>>;\n getRelationDocumentsTyped<T>(id: string, connection: Record<string, any>): Promise<TypedSearchResult<T>>;\n createNewResourceTyped<T>(request: CreateAndUpdateRequest): Promise<TypedDocumentStructure<T>>;\n updateResourceTyped<T>(request: CreateAndUpdateRequest): Promise<TypedDocumentStructure<T>>;\n}\n\n// Error classes\nexport class ApitoError extends Error {\n constructor(\n message: string,\n public code?: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'ApitoError';\n }\n}\n\nexport class GraphQLError extends ApitoError {\n constructor(\n message: string,\n public graphQLErrors: GraphQLError[],\n public response?: any\n ) {\n super(message, 'GRAPHQL_ERROR');\n this.name = 'GraphQLError';\n }\n\n get partialData(): any {\n return this.response?.data;\n }\n}\n\nexport class ValidationError extends ApitoError {\n constructor(message: string, public field?: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n","import {\n DefaultDocumentStructure,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n} from './types';\nimport { ApitoClient } from './client';\n\n/**\n * Typed operations wrapper for the Apito SDK\n * Provides type-safe methods for working with typed data\n */\nexport class TypedOperations {\n constructor(private client: ApitoClient) {}\n\n private static toTypedDocument<T>(raw: DefaultDocumentStructure): TypedDocumentStructure<T> {\n const data = JSON.parse(JSON.stringify(raw.data)) as T;\n return {\n _key: raw._key,\n _id: raw._id,\n data,\n meta: raw.meta,\n id: raw.id,\n expire_at: raw.expire_at,\n relation_doc_id: raw.relation_doc_id,\n last_revision_doc_id: raw.last_revision_doc_id,\n type: raw.type,\n tenant_id: raw.tenant_id,\n tenant_model: raw.tenant_model,\n };\n }\n\n /**\n * Get a single resource with type safety\n */\n async getSingleResourceTyped<T>(\n model: string,\n id: string,\n singlePageData: boolean = false\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.getSingleResource(model, id, singlePageData);\n return TypedOperations.toTypedDocument<T>(result);\n }\n\n /**\n * Search resources with type safety\n */\n async searchResourcesTyped<T>(\n model: string,\n filter: Record<string, any> = {},\n aggregate: boolean = false\n ): Promise<TypedSearchResult<T>> {\n const result = await this.client.searchResources(model, filter, aggregate);\n return {\n results: result.results.map((doc) => TypedOperations.toTypedDocument<T>(doc)),\n count: result.count,\n };\n }\n\n /**\n * Get related documents with type safety\n */\n async getRelationDocumentsTyped<T>(\n id: string,\n connection: Record<string, any>\n ): Promise<TypedSearchResult<T>> {\n const result = await this.client.getRelationDocuments(id, connection);\n return {\n results: result.results.map((doc) => TypedOperations.toTypedDocument<T>(doc)),\n count: result.count,\n };\n }\n\n /**\n * Create a new resource with type safety\n */\n async createNewResourceTyped<T>(\n request: CreateAndUpdateRequest\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.createNewResource(request);\n return TypedOperations.toTypedDocument<T>(result);\n }\n\n /**\n * Update a resource with type safety\n */\n async updateResourceTyped<T>(\n request: CreateAndUpdateRequest\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.updateResource(request);\n return TypedOperations.toTypedDocument<T>(result);\n }\n}\n","/**\n * Apito JavaScript internal SDK version (kept in sync with package.json for releases)\n */\nexport const Version = '2.5.0';\n\n/**\n * GetVersion returns the current version of the SDK\n */\nexport function getVersion(): string {\n return Version;\n}\n"],"mappings":"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","names":["axios","ApitoError","message","code","statusCode","details","GraphQLError","graphQLErrors","response","ValidationError","field","ApitoClient","config","axios","query","variables","options","payload","headers","response","GraphQLError","error","ApitoError","tenantId","duration","role","dur","d","data","ValidationError","username","password","projectId","raw","idToken","limit","offset","count","domain","email","u","model","id","singlePageData","filter","aggregate","connection","request","stage","createClient","TypedOperations","_TypedOperations","client","raw","data","model","id","singlePageData","result","filter","aggregate","doc","connection","request","Version","getVersion"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/types.ts","../src/typed-operations.ts","../src/version.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport {\n ClientConfig,\n DefaultDocumentStructure,\n SearchResult,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n GraphQLResponse,\n GraphQLError as SDKGraphQLError,\n ApitoError,\n ValidationError,\n InjectedDBOperationInterface,\n LoginUserResponse,\n User,\n UsersResponse,\n TenantByDomainResponse,\n TenantCatalogSearchRow,\n LoginUserParams,\n CreateUserParams,\n UpdateUserParams,\n GoogleOAuthStateResponse,\n ProjectStorageSettings,\n UpdateProjectStorageInput,\n SystemFile,\n SystemFilesListResponse,\n SystemFileUploadParams,\n DeleteSystemFilesResponse,\n} from './types';\n\nfunction deriveRestBaseURL(graphqlURL: string): string {\n const u = graphqlURL.trim().replace(/\\/$/, '');\n if (u.endsWith('/graphql')) {\n return u.slice(0, -'/graphql'.length);\n }\n return u;\n}\n\n/**\n * Apito SDK Client - JavaScript implementation matching the Go SDK\n */\nexport class ApitoClient implements InjectedDBOperationInterface {\n private httpClient: AxiosInstance;\n private baseURL: string;\n private restBaseURL: string;\n private apiKey: string;\n private tenantId?: string;\n\n constructor(config: ClientConfig) {\n this.baseURL = config.baseURL;\n this.restBaseURL = (config.restBaseURL ?? '').trim() || deriveRestBaseURL(config.baseURL);\n this.apiKey = config.apiKey;\n this.tenantId = config.tenantId;\n\n // Create axios instance with default configuration\n this.httpClient = axios.create({\n timeout: config.timeout || 30000,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey.startsWith('cli-') || this.apiKey.startsWith('sdk-')\n ? { 'X-Apito-Sync-Key': this.apiKey }\n : { 'X-Apito-Key': this.apiKey }),\n },\n ...config.httpClient,\n });\n\n // Add tenant ID to headers if provided\n if (this.tenantId) {\n this.httpClient.defaults.headers['X-Apito-Tenant-ID'] = this.tenantId;\n }\n }\n\n /**\n * Execute an arbitrary GraphQL query or mutation against the Apito admin (system) endpoint.\n * Use for plugin-registered operations (e.g. processLedger, plg_closeOrder) when not wrapped by dedicated SDK methods.\n */\n async executeGraphQL(\n query: string,\n variables?: Record<string, any>,\n options?: { tenantId?: string }\n ): Promise<GraphQLResponse> {\n try {\n const payload = {\n query,\n variables: variables || {},\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(this.apiKey.startsWith('cli-') || this.apiKey.startsWith('sdk-')\n ? { 'X-Apito-Sync-Key': this.apiKey }\n : { 'X-Apito-Key': this.apiKey }),\n };\n\n if (options?.tenantId || this.tenantId) {\n headers['X-Apito-Tenant-ID'] = options?.tenantId || this.tenantId!;\n }\n\n const response = await this.httpClient.post<GraphQLResponse>(\n this.baseURL,\n payload,\n { headers }\n );\n\n if (response.data.errors && response.data.errors.length > 0) {\n throw new SDKGraphQLError(\n 'GraphQL query failed',\n response.data.errors,\n response.data\n );\n }\n\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new ApitoError(\n error.response?.data?.message || error.message,\n 'HTTP_ERROR',\n error.response?.status,\n error.response?.data\n );\n }\n throw error;\n }\n }\n\n /**\n * Generate a tenant-scoped API key. Matches engine `generateTenantToken`: `tenant_id`, `duration`, optional `role`.\n * Auth uses `X-Apito-Key` (client `apiKey`).\n *\n * @param tenantId Catalog tenant id (`tenant_id` in the mutation).\n * @param duration Expiry calendar day `YYYY-MM-DD`. If omitted/empty, defaults to one year ahead in UTC.\n * @param role Optional token role; if omitted/empty, the engine defaults to `admin`.\n */\n async generateTenantToken(tenantId: string, duration?: string, role?: string): Promise<string> {\n let dur = (duration ?? '').trim();\n if (!dur) {\n const d = new Date();\n dur = `${d.getUTCFullYear() + 1}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(\n d.getUTCDate()\n ).padStart(2, '0')}`;\n }\n\n const query = `\n mutation GenerateTenantToken($tenantId: String!, $duration: String!, $role: String) {\n generateTenantToken(tenant_id: $tenantId, duration: $duration, role: $role) {\n token\n }\n }\n `;\n\n const variables: Record<string, any> = {\n tenantId,\n duration: dur,\n role: role !== undefined && role.trim() !== '' ? role.trim() : null,\n };\n const response = await this.executeGraphQL(query, variables, { tenantId });\n\n const data = response.data?.generateTenantToken;\n if (!data?.token) {\n throw new ValidationError('Invalid response format for tenant token');\n }\n\n return data.token;\n }\n\n private authHeaders(tenantId?: string): Record<string, string> {\n const headers: Record<string, string> = {\n ...(this.apiKey.startsWith('cli-') || this.apiKey.startsWith('sdk-')\n ? { 'X-Apito-Sync-Key': this.apiKey }\n : { 'X-Apito-Key': this.apiKey }),\n };\n const tid = tenantId ?? this.tenantId;\n if (tid) {\n headers['X-Apito-Tenant-ID'] = tid;\n }\n return headers;\n }\n\n private async executeREST<T>(\n method: 'GET' | 'POST',\n path: string,\n options?: {\n query?: Record<string, string | number | undefined>;\n jsonBody?: Record<string, unknown>;\n formData?: FormData;\n allowFailure?: boolean;\n }\n ): Promise<T> {\n const url = new URL(`${this.restBaseURL.replace(/\\/$/, '')}${path}`);\n if (options?.query) {\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== '') {\n url.searchParams.set(k, String(v));\n }\n }\n }\n const headers = this.authHeaders();\n let data: FormData | Record<string, unknown> | undefined;\n if (options?.formData) {\n data = options.formData;\n } else if (options?.jsonBody) {\n headers['Content-Type'] = 'application/json';\n data = options.jsonBody;\n }\n try {\n const response = await this.httpClient.request({\n method,\n url: url.toString(),\n headers,\n data,\n maxBodyLength: Infinity,\n maxContentLength: Infinity,\n });\n const body = response.data as Record<string, unknown>;\n if (body.success === false && !options?.allowFailure) {\n throw new ValidationError(String(body.message ?? 'request failed'));\n }\n return body as T;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const msg =\n (error.response?.data as { message?: string })?.message ?? error.message;\n throw new ApitoError(msg, 'HTTP_ERROR', error.response?.status, error.response?.data);\n }\n throw error;\n }\n }\n\n /**\n * Project user login (system GraphQL `loginUser`). Password path: pass `password` and `email` or `phone` per project Authentication settings. Google OAuth path: `authMethod: 'google'` with `code` and `state` from the redirect; call `googleOAuthState(projectId)` before opening Google to obtain `state`.\n */\n async loginUser(params: LoginUserParams): Promise<LoginUserResponse> {\n const authMethod = (params.authMethod ?? 'general').trim().toLowerCase() || 'general';\n const variables: Record<string, any> = {\n project_id: params.projectId,\n };\n\n if (authMethod === 'google') {\n variables.auth_method = 'google';\n const code = (params.code ?? '').trim();\n const state = (params.state ?? '').trim();\n if (!code || !state) {\n throw new ValidationError('code and state are required for Google login');\n }\n variables.code = code;\n variables.state = state;\n } else {\n const password = (params.password ?? '').trim();\n if (!password) {\n throw new ValidationError('password is required');\n }\n variables.password = password;\n const email = (params.email ?? '').trim();\n const phone = (params.phone ?? '').trim();\n if (!email && !phone) {\n throw new ValidationError('email or phone is required');\n }\n if (email) variables.email = email;\n if (phone) variables.phone = phone;\n }\n\n const query = `\n query LoginUser($project_id: String!, $password: String, $auth_method: String, $email: String, $phone: String, $code: String, $state: String) {\n loginUser(project_id: $project_id, password: $password, auth_method: $auth_method, email: $email, phone: $phone, code: $code, state: $state) {\n token\n user {\n id\n email\n phone\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n }\n `;\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.loginUser;\n if (!raw?.token) {\n throw new ValidationError('Invalid response format for loginUser');\n }\n return {\n token: raw.token as string,\n user: raw.user as User | undefined,\n };\n }\n\n /**\n * Signed OAuth state for Google login (system query `googleOAuthState`). Use in the authorize URL together with project `google_client_id` and the configured redirect URI.\n */\n async googleOAuthState(projectId: string): Promise<GoogleOAuthStateResponse> {\n const query = `\n query GoogleOAuthState($project_id: String!) {\n googleOAuthState(project_id: $project_id) {\n state\n }\n }\n `;\n const variables = { project_id: projectId };\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.googleOAuthState;\n const state = typeof raw?.state === 'string' ? raw.state.trim() : '';\n if (!state) {\n throw new ValidationError('Invalid response format for googleOAuthState');\n }\n return { state };\n }\n\n /**\n * Search project end-users.\n */\n async searchUsers(\n projectId: string,\n limit?: number,\n offset?: number\n ): Promise<UsersResponse> {\n const query = `\n query SearchUsers($project_id: String!, $limit: Int, $offset: Int) {\n searchUsers(project_id: $project_id, limit: $limit, offset: $offset) {\n count\n users {\n id\n email\n phone\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n }\n `;\n const variables: Record<string, any> = { project_id: projectId };\n if (limit !== undefined) variables.limit = limit;\n if (offset !== undefined) variables.offset = offset;\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.searchUsers;\n if (!raw) {\n throw new ValidationError('Invalid response format for searchUsers');\n }\n let count = 0;\n if (typeof raw.count === 'number') {\n count = raw.count;\n }\n const users = (raw.users ?? []) as User[];\n return { users, count };\n }\n\n /**\n * Resolve the single SaaS catalog tenant for an exact domain match in the project (`tenant` null if none).\n */\n async searchTenantsByDomain(projectId: string, domain: string): Promise<TenantByDomainResponse> {\n const query = `\n query SearchTenantsByDomain($project_id: String!, $domain: String!) {\n searchTenantsByDomain(project_id: $project_id, domain: $domain) {\n tenant {\n id\n name\n status\n domain\n data\n }\n }\n }\n `;\n const variables: Record<string, any> = {\n project_id: projectId,\n domain,\n };\n const response = await this.executeGraphQL(query, variables);\n const raw = response.data?.searchTenantsByDomain;\n if (!raw) {\n throw new ValidationError('Invalid response format for searchTenantsByDomain');\n }\n const tenant = (raw.tenant ?? null) as TenantCatalogSearchRow | null;\n return { tenant };\n }\n\n /**\n * Create a project user (local password). Use `email` and/or `phone` per engine validation for the project identifier mode.\n */\n async createUser(projectId: string, params: CreateUserParams): Promise<User> {\n const password = (params.password ?? '').trim();\n if (!password) {\n throw new ValidationError('password is required');\n }\n const query = `\n mutation CreateUser($project_id: String!, $password: String!, $role: String, $email: String, $phone: String) {\n createUser(project_id: $project_id, password: $password, role: $role, email: $email, phone: $phone) {\n id\n email\n phone\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n `;\n const variables: Record<string, any> = {\n project_id: projectId,\n password,\n };\n const role = (params.role ?? '').trim();\n if (role) variables.role = role;\n const email = (params.email ?? '').trim();\n if (email) variables.email = email;\n const phone = (params.phone ?? '').trim();\n if (phone) variables.phone = phone;\n const response = await this.executeGraphQL(query, variables);\n const u = response.data?.createUser;\n if (!u?.id) {\n throw new ValidationError('Invalid response format for createUser');\n }\n return u as User;\n }\n\n /**\n * Update a project user. Project scope is implied by the API key. Only include fields to change.\n */\n async updateUser(userId: string, params: UpdateUserParams): Promise<User> {\n const uid = (userId ?? '').trim();\n if (!uid) {\n throw new ValidationError('userId is required');\n }\n if (params.email === undefined && params.phone === undefined && params.role === undefined) {\n throw new ValidationError('at least one field must be provided');\n }\n const query = `\n mutation UpdateUser($user_id: String!, $email: String, $phone: String, $role: String) {\n updateUser(user_id: $user_id, email: $email, phone: $phone, role: $role) {\n id\n email\n phone\n role\n provider\n tenant_id\n status\n created_at\n updated_at\n }\n }\n `;\n const variables: Record<string, any> = { user_id: uid };\n if (params.email !== undefined) variables.email = params.email;\n if (params.phone !== undefined) variables.phone = params.phone;\n if (params.role !== undefined) variables.role = params.role;\n const response = await this.executeGraphQL(query, variables);\n const u = response.data?.updateUser;\n if (!u?.id) {\n throw new ValidationError('Invalid response format for updateUser');\n }\n return u as User;\n }\n\n /** Set a new password for a project user (admin mutation resetUserPassword). */\n async resetUserPassword(userId: string, password: string): Promise<boolean> {\n const uid = (userId ?? '').trim();\n if (!uid) {\n throw new ValidationError('userId is required');\n }\n if (!(password ?? '').trim()) {\n throw new ValidationError('password is required');\n }\n const query = `\n mutation ResetUserPassword($user_id: String!, $password: String!) {\n resetUserPassword(user_id: $user_id, password: $password)\n }\n `;\n const response = await this.executeGraphQL(query, { user_id: uid, password });\n const ok = response.data?.resetUserPassword;\n if (typeof ok !== 'boolean') {\n throw new ValidationError('Invalid response format for resetUserPassword');\n }\n return ok;\n }\n\n /**\n * Delete a project user by id. Project scope is implied by the API key.\n */\n async deleteUser(userId: string): Promise<boolean> {\n const uid = (userId ?? '').trim();\n if (!uid) {\n throw new ValidationError('userId is required');\n }\n const query = `\n mutation DeleteUser($user_id: String!) {\n deleteUser(user_id: $user_id)\n }\n `;\n const response = await this.executeGraphQL(query, { user_id: uid });\n const ok = response.data?.deleteUser;\n if (typeof ok !== 'boolean') {\n throw new ValidationError('Invalid response format for deleteUser');\n }\n return ok;\n }\n\n /** Read project storage settings via getProject. */\n async getProjectStorageSettings(projectId: string): Promise<ProjectStorageSettings> {\n const query = `\n query GetProjectStorageSettings($_id: String!) {\n getProject(_id: $_id) {\n storage_settings {\n use_free_cloud_storage\n endpoint\n region\n bucket\n access_key_id\n has_secret_access_key\n public_base_url\n force_path_style\n }\n }\n }\n `;\n const response = await this.executeGraphQL(query, { _id: projectId });\n const settings = response.data?.getProject?.storage_settings;\n if (!settings) {\n throw new ValidationError('Invalid response format for getProjectStorageSettings');\n }\n return settings as ProjectStorageSettings;\n }\n\n /** Persist project storage settings. */\n async updateProjectStorageSettings(\n input: UpdateProjectStorageInput\n ): Promise<ProjectStorageSettings> {\n const query = `\n mutation UpdateProjectStorageSettings($input: UpdateProjectStorageInput!) {\n updateProjectStorageSettings(input: $input) {\n storage_settings {\n use_free_cloud_storage\n endpoint\n region\n bucket\n access_key_id\n has_secret_access_key\n public_base_url\n force_path_style\n }\n }\n }\n `;\n const response = await this.executeGraphQL(query, { input });\n const settings = response.data?.updateProjectStorageSettings?.storage_settings;\n if (!settings) {\n throw new ValidationError('Invalid response format for updateProjectStorageSettings');\n }\n return settings as ProjectStorageSettings;\n }\n\n /** Upload a file via POST /system/files/upload. */\n async uploadSystemFile(params: SystemFileUploadParams): Promise<SystemFile> {\n const size =\n params.content instanceof ArrayBuffer\n ? params.content.byteLength\n : params.content.byteLength;\n if (!params.content || size === 0) {\n throw new ValidationError('file content is required');\n }\n const fileName = (params.fileName ?? '').trim() || 'upload';\n const form = new FormData();\n const bytes =\n params.content instanceof ArrayBuffer ? new Uint8Array(params.content) : params.content;\n const blob = new Blob([bytes as BlobPart]);\n form.append('file', blob, fileName);\n if (params.fileType?.trim()) {\n form.append('file_type', params.fileType.trim());\n }\n const body = await this.executeREST<{ file: SystemFile }>('POST', '/files/upload', {\n formData: form,\n });\n if (!body.file?.id) {\n throw new ValidationError('Invalid response format for uploadSystemFile');\n }\n return body.file;\n }\n\n /** List files via GET /system/files/list. */\n async listSystemFiles(\n fileType?: string,\n limit?: number,\n offset?: number\n ): Promise<SystemFilesListResponse> {\n const body = await this.executeREST<{\n files: SystemFile[];\n total: number;\n }>('GET', '/files/list', {\n query: {\n file_type: fileType,\n limit,\n offset,\n },\n });\n return {\n files: body.files ?? [],\n total: body.total ?? 0,\n };\n }\n\n /** Delete files via POST /system/files/delete. */\n async deleteSystemFiles(ids: string[]): Promise<DeleteSystemFilesResponse> {\n if (!ids?.length) {\n throw new ValidationError('ids are required');\n }\n const body = await this.executeREST<DeleteSystemFilesResponse>('POST', '/files/delete', {\n jsonBody: { ids },\n allowFailure: true,\n });\n const result: DeleteSystemFilesResponse = {\n success: !!body.success,\n deleted_ids: body.deleted_ids ?? [],\n storage_failed: body.storage_failed,\n message: body.message,\n };\n if (!result.success && result.message) {\n throw new ValidationError(result.message);\n }\n return result;\n }\n\n /**\n * Get a single resource by model and ID\n */\n async getSingleResource(\n model: string,\n id: string,\n singlePageData: boolean = false\n ): Promise<DefaultDocumentStructure> {\n const query = `\n query GetSingleData($model: String, $_id: String!, $single_page_data: Boolean) {\n getSingleData(model: $model, _id: $_id, single_page_data: $single_page_data) {\n _key\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n id\n expire_at\n relation_doc_id\n type\n }\n }\n `;\n\n const variables = {\n model,\n _id: id,\n single_page_data: singlePageData,\n };\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getSingleData) {\n throw new ValidationError('Resource not found');\n }\n\n return response.data.getSingleData;\n }\n\n /**\n * Search resources in a model\n */\n async searchResources(\n model: string,\n filter: Record<string, any> = {},\n aggregate: boolean = false\n ): Promise<SearchResult> {\n const query = `\n query GetModelData(\n $model: String!\n $page: Int\n $limit: Int\n $_key: JSON\n $where: JSON\n $search: String\n ) {\n getModelData(\n model: $model\n page: $page\n limit: $limit\n _key: $_key\n where: $where\n search: $search\n ) {\n results {\n id\n relation_doc_id\n data\n type\n expire_at\n meta {\n created_at\n updated_at\n status\n root_revision_id\n }\n }\n count\n }\n }\n `;\n\n // Only forward keys declared on the GraphQL operation (matches go-internal-sdk)\n const variables: Record<string, any> = { model };\n if (filter && typeof filter === 'object') {\n if (filter._key !== undefined) {\n variables._key = filter._key;\n }\n if (filter.page !== undefined) {\n variables.page = filter.page;\n }\n if (filter.limit !== undefined) {\n variables.limit = filter.limit;\n }\n if (filter.where !== undefined) {\n variables.where = filter.where;\n }\n if (filter.search !== undefined) {\n variables.search = filter.search;\n }\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getModelData) {\n throw new ValidationError('Invalid search response format');\n }\n\n return response.data.getModelData;\n }\n\n /**\n * Get related documents\n */\n async getRelationDocuments(\n id: string,\n connection: Record<string, any>\n ): Promise<SearchResult> {\n const query = `\n query GetModelData($model: String!, $page: Int, $limit: Int, $where: JSON, $search: String, $connection : ListAllDataDetailedOfAModelConnectionPayload) {\n getModelData(model: $model, page: $page, limit: $limit, where: $where, search: $search, connection: $connection) {\n results {\n id\n relation_doc_id\n data\n type\n expire_at\n meta {\n created_at\n updated_at\n status\n root_revision_id\n }\n }\n count\n }\n }\n `;\n\n const variables: Record<string, any> = {\n connection,\n };\n\n // Extract model from connection if available\n if (connection.model) {\n variables.model = connection.model;\n } else {\n throw new ValidationError('model is required in connection parameters');\n }\n\n // Add filter parameters if provided in connection\n if (connection.filter) {\n const filter = connection.filter;\n if (filter.page !== undefined) {\n variables.page = filter.page;\n }\n if (filter.limit !== undefined) {\n variables.limit = filter.limit;\n }\n if (filter.where !== undefined) {\n variables.where = filter.where;\n }\n if (filter.search !== undefined) {\n variables.search = filter.search;\n }\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.getModelData) {\n throw new ValidationError('Invalid relation documents response format');\n }\n\n return response.data.getModelData;\n }\n\n /**\n * Create a new resource\n */\n async createNewResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure> {\n if (!request.model) {\n throw new ValidationError('model is required');\n }\n\n if (!request.payload) {\n throw new ValidationError('payload is required');\n }\n\n const query = `\n mutation CreateNewData($model: String!, $single_page_data: Boolean, $payload: JSON!, $connect: JSON) {\n upsertModelData(\n connect: $connect\n model_name: $model\n single_page_data: $single_page_data\n payload: $payload\n ) {\n id\n type\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n }\n }\n `;\n\n const variables: Record<string, any> = {\n model: request.model,\n payload: request.payload,\n single_page_data: request.singlePageData || false,\n };\n\n if (request.connect) {\n variables.connect = request.connect;\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.upsertModelData) {\n throw new ValidationError('Invalid create response format');\n }\n\n return response.data.upsertModelData;\n }\n\n /**\n * Update an existing resource\n */\n async updateResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure> {\n if (!request.id) {\n throw new ValidationError('id is required');\n }\n\n if (!request.model) {\n throw new ValidationError('model is required');\n }\n\n if (!request.payload) {\n throw new ValidationError('payload is required');\n }\n\n const query = `\n mutation UpdateModelData($_id: String!, $model: String!, $single_page_data: Boolean, $force_update: Boolean, $payload: JSON!, $connect: JSON, $disconnect: JSON) {\n upsertModelData(\n connect: $connect\n model_name: $model\n single_page_data: $single_page_data\n force_update: $force_update\n disconnect: $disconnect\n _id: $_id\n payload: $payload\n ) {\n id\n type\n data\n meta {\n created_at\n updated_at\n status\n revision\n revision_at\n }\n }\n }\n `;\n\n const variables: Record<string, any> = {\n _id: request.id,\n model: request.model,\n payload: request.payload,\n single_page_data: request.singlePageData || false,\n force_update: request.forceUpdate || false,\n };\n\n if (request.connect) {\n variables.connect = request.connect;\n }\n if (request.disconnect) {\n variables.disconnect = request.disconnect;\n }\n\n const response = await this.executeGraphQL(query, variables);\n\n if (!response.data?.upsertModelData) {\n throw new ValidationError('Invalid update response format');\n }\n\n return response.data.upsertModelData;\n }\n\n /**\n * Delete a resource by model and ID\n */\n async deleteResource(model: string, id: string): Promise<void> {\n const query = `\n mutation DeleteData($model: String!, $_id: String!) {\n deleteModelData(model_name: $model, _id: $_id) {\n id\n }\n }\n `;\n\n const variables = {\n model,\n _id: id,\n };\n\n await this.executeGraphQL(query, variables);\n }\n\n /**\n * Debug is used to debug the plugin, you can pass data here to debug the plugin\n */\n async debug(stage: string, ...data: any[]): Promise<any> {\n const query = `\n mutation Debug($stage: String!, $data: JSON) {\n debug(stage: $stage, data: $data) {\n message\n data\n }\n }\n `;\n\n const variables = {\n stage,\n data,\n };\n\n const response = await this.executeGraphQL(query, variables);\n\n return response.data?.debug;\n }\n}\n\n/**\n * Factory function to create a new Apito client\n */\nexport function createClient(config: ClientConfig): ApitoClient {\n return new ApitoClient(config);\n}\n","/**\n * Type definitions for the Apito JavaScript SDK\n */\n\nexport interface MetaField {\n created_at: string;\n updated_at: string;\n status: string;\n revision?: string;\n revision_at?: string;\n root_revision_id?: string;\n}\n\nexport interface DefaultDocumentStructure {\n _key?: string;\n _id?: string;\n data: any;\n meta?: MetaField;\n id: string;\n expire_at?: string | number;\n relation_doc_id?: string;\n last_revision_doc_id?: string;\n type?: string;\n tenant_id?: string;\n tenant_model?: string;\n}\n\nexport interface SearchResult {\n results: DefaultDocumentStructure[];\n count: number;\n}\n\nexport interface TypedDocumentStructure<T> {\n _key?: string;\n _id?: string;\n data: T;\n meta?: MetaField;\n id: string;\n expire_at?: string | number;\n relation_doc_id?: string;\n last_revision_doc_id?: string;\n type?: string;\n tenant_id?: string;\n tenant_model?: string;\n}\n\nexport interface TypedSearchResult<T> {\n results: TypedDocumentStructure<T>[];\n count: number;\n}\n\nexport interface Filter {\n page?: number;\n offset?: number;\n limit?: number;\n order?: string;\n min?: number;\n max?: number;\n category?: string;\n}\n\nexport interface GraphQLErrorLocation {\n line: number;\n column: number;\n}\n\nexport interface GraphQLError {\n message: string;\n locations?: GraphQLErrorLocation[];\n path?: (string | number)[];\n extensions?: Record<string, any>;\n}\n\nexport interface GraphQLResponse {\n data?: any;\n errors?: GraphQLError[];\n}\n\nexport interface CreateAndUpdateRequest {\n id?: string;\n model: string;\n payload: any;\n connect?: Record<string, any>;\n disconnect?: Record<string, any>;\n singlePageData?: boolean;\n forceUpdate?: boolean;\n}\n\n/** Project end-user from engine system DB (table project_users). */\nexport interface User {\n id: string;\n email?: string;\n phone?: string;\n role: string;\n tenant_id?: string;\n provider?: string;\n status?: string;\n created_at?: string;\n updated_at?: string;\n}\n\n/** Login via system GraphQL `loginUser`. Password path: use `email` or `phone` per project settings. Google OAuth code path: `authMethod: 'google'`, `code`, `state` from redirect (get `state` first via `googleOAuthState`). */\nexport interface LoginUserParams {\n projectId: string;\n password?: string;\n email?: string;\n phone?: string;\n authMethod?: string;\n code?: string;\n state?: string;\n}\n\nexport interface GoogleOAuthStateResponse {\n state: string;\n}\n\nexport interface CreateUserParams {\n password: string;\n role?: string;\n email?: string;\n phone?: string;\n}\n\n/** Optional fields for `updateUser`; omitted keys are not sent. */\nexport interface UpdateUserParams {\n email?: string;\n phone?: string;\n role?: string;\n}\n\nexport interface LoginUserResponse {\n token: string;\n user?: User;\n}\n\nexport interface UsersResponse {\n users: User[];\n count: number;\n}\n\nexport interface ProjectStorageSettings {\n use_free_cloud_storage: boolean;\n endpoint?: string | null;\n region?: string | null;\n bucket?: string | null;\n access_key_id?: string | null;\n has_secret_access_key: boolean;\n public_base_url?: string | null;\n force_path_style?: boolean | null;\n}\n\nexport interface UpdateProjectStorageInput {\n use_free_cloud_storage?: boolean;\n endpoint?: string;\n region?: string;\n bucket?: string;\n access_key_id?: string;\n secret_access_key?: string;\n public_base_url?: string;\n force_path_style?: boolean;\n}\n\nexport interface SystemFile {\n id: string;\n file_type: string;\n file_name: string;\n file_extension?: string;\n content_type?: string;\n size: number;\n url: string;\n created_by?: string;\n created_at?: string;\n}\n\nexport interface SystemFilesListResponse {\n files: SystemFile[];\n total: number;\n}\n\nexport interface SystemFileUploadParams {\n fileName: string;\n content: Uint8Array | ArrayBuffer;\n fileType?: string;\n}\n\nexport interface DeleteSystemFilesResponse {\n success: boolean;\n deleted_ids: string[];\n storage_failed?: string[];\n message?: string;\n}\n\n/** One SaaS catalog tenant row from searchTenantsByDomain. */\nexport interface TenantCatalogSearchRow {\n id: string;\n name: string;\n status?: string;\n domain?: string;\n data?: string;\n}\n\nexport interface TenantByDomainResponse {\n tenant: TenantCatalogSearchRow | null;\n}\n\nexport interface ClientConfig {\n baseURL: string;\n /** REST base (e.g. http://host:5050/system); derived from baseURL when omitted */\n restBaseURL?: string;\n apiKey: string;\n timeout?: number;\n httpClient?: any;\n tenantId?: string;\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport interface SearchOptions {\n limit?: number;\n page?: number;\n offset?: number;\n where?: Record<string, any>;\n search?: string;\n sort?: Record<string, 1 | -1>;\n}\n\nexport interface ConnectionOptions {\n model: string;\n filter?: SearchOptions;\n}\n\n// Plugin interface matching the Go SDK\nexport interface InjectedDBOperationInterface {\n executeGraphQL(\n query: string,\n variables?: Record<string, any>,\n options?: { tenantId?: string }\n ): Promise<GraphQLResponse>;\n /** @param token Legacy; ignored. Auth uses client API key. */\n generateTenantToken(tenantId: string, duration?: string, role?: string): Promise<string>;\n loginUser(params: LoginUserParams): Promise<LoginUserResponse>;\n googleOAuthState(projectId: string): Promise<GoogleOAuthStateResponse>;\n searchUsers(projectId: string, limit?: number, offset?: number): Promise<UsersResponse>;\n searchTenantsByDomain(projectId: string, domain: string): Promise<TenantByDomainResponse>;\n createUser(projectId: string, params: CreateUserParams): Promise<User>;\n updateUser(userId: string, params: UpdateUserParams): Promise<User>;\n resetUserPassword(userId: string, password: string): Promise<boolean>;\n deleteUser(userId: string): Promise<boolean>;\n getProjectStorageSettings(projectId: string): Promise<ProjectStorageSettings>;\n updateProjectStorageSettings(input: UpdateProjectStorageInput): Promise<ProjectStorageSettings>;\n uploadSystemFile(params: SystemFileUploadParams): Promise<SystemFile>;\n listSystemFiles(fileType?: string, limit?: number, offset?: number): Promise<SystemFilesListResponse>;\n deleteSystemFiles(ids: string[]): Promise<DeleteSystemFilesResponse>;\n getSingleResource(model: string, id: string, singlePageData?: boolean): Promise<DefaultDocumentStructure>;\n searchResources(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<SearchResult>;\n getRelationDocuments(id: string, connection: Record<string, any>): Promise<SearchResult>;\n createNewResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure>;\n updateResource(request: CreateAndUpdateRequest): Promise<DefaultDocumentStructure>;\n deleteResource(model: string, id: string): Promise<void>;\n debug(stage: string, ...data: any[]): Promise<any>;\n}\n\n// Typed operations interface\nexport interface TypedOperations {\n getSingleResourceTyped<T>(model: string, id: string, singlePageData?: boolean): Promise<TypedDocumentStructure<T>>;\n searchResourcesTyped<T>(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<TypedSearchResult<T>>;\n getRelationDocumentsTyped<T>(id: string, connection: Record<string, any>): Promise<TypedSearchResult<T>>;\n createNewResourceTyped<T>(request: CreateAndUpdateRequest): Promise<TypedDocumentStructure<T>>;\n updateResourceTyped<T>(request: CreateAndUpdateRequest): Promise<TypedDocumentStructure<T>>;\n}\n\n// Error classes\nexport class ApitoError extends Error {\n constructor(\n message: string,\n public code?: string,\n public statusCode?: number,\n public details?: any\n ) {\n super(message);\n this.name = 'ApitoError';\n }\n}\n\nexport class GraphQLError extends ApitoError {\n constructor(\n message: string,\n public graphQLErrors: GraphQLError[],\n public response?: any\n ) {\n super(message, 'GRAPHQL_ERROR');\n this.name = 'GraphQLError';\n }\n\n get partialData(): any {\n return this.response?.data;\n }\n}\n\nexport class ValidationError extends ApitoError {\n constructor(message: string, public field?: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n","import {\n DefaultDocumentStructure,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n} from './types';\nimport { ApitoClient } from './client';\n\n/**\n * Typed operations wrapper for the Apito SDK\n * Provides type-safe methods for working with typed data\n */\nexport class TypedOperations {\n constructor(private client: ApitoClient) {}\n\n private static toTypedDocument<T>(raw: DefaultDocumentStructure): TypedDocumentStructure<T> {\n const data = JSON.parse(JSON.stringify(raw.data)) as T;\n return {\n _key: raw._key,\n _id: raw._id,\n data,\n meta: raw.meta,\n id: raw.id,\n expire_at: raw.expire_at,\n relation_doc_id: raw.relation_doc_id,\n last_revision_doc_id: raw.last_revision_doc_id,\n type: raw.type,\n tenant_id: raw.tenant_id,\n tenant_model: raw.tenant_model,\n };\n }\n\n /**\n * Get a single resource with type safety\n */\n async getSingleResourceTyped<T>(\n model: string,\n id: string,\n singlePageData: boolean = false\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.getSingleResource(model, id, singlePageData);\n return TypedOperations.toTypedDocument<T>(result);\n }\n\n /**\n * Search resources with type safety\n */\n async searchResourcesTyped<T>(\n model: string,\n filter: Record<string, any> = {},\n aggregate: boolean = false\n ): Promise<TypedSearchResult<T>> {\n const result = await this.client.searchResources(model, filter, aggregate);\n return {\n results: result.results.map((doc) => TypedOperations.toTypedDocument<T>(doc)),\n count: result.count,\n };\n }\n\n /**\n * Get related documents with type safety\n */\n async getRelationDocumentsTyped<T>(\n id: string,\n connection: Record<string, any>\n ): Promise<TypedSearchResult<T>> {\n const result = await this.client.getRelationDocuments(id, connection);\n return {\n results: result.results.map((doc) => TypedOperations.toTypedDocument<T>(doc)),\n count: result.count,\n };\n }\n\n /**\n * Create a new resource with type safety\n */\n async createNewResourceTyped<T>(\n request: CreateAndUpdateRequest\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.createNewResource(request);\n return TypedOperations.toTypedDocument<T>(result);\n }\n\n /**\n * Update a resource with type safety\n */\n async updateResourceTyped<T>(\n request: CreateAndUpdateRequest\n ): Promise<TypedDocumentStructure<T>> {\n const result = await this.client.updateResource(request);\n return TypedOperations.toTypedDocument<T>(result);\n }\n}\n","/**\n * Apito JavaScript internal SDK version (kept in sync with package.json for releases)\n */\nexport const Version = '3.0.0';\n\n/**\n * GetVersion returns the current version of the SDK\n */\nexport function getVersion(): string {\n return Version;\n}\n"],"mappings":"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","names":["axios","ApitoError","message","code","statusCode","details","GraphQLError","graphQLErrors","response","ValidationError","field","deriveRestBaseURL","graphqlURL","u","ApitoClient","config","axios","query","variables","options","payload","headers","response","GraphQLError","error","ApitoError","tenantId","duration","role","dur","d","data","ValidationError","tid","method","path","url","k","v","body","msg","params","authMethod","code","state","password","email","phone","raw","projectId","limit","offset","count","domain","userId","uid","ok","settings","input","size","fileName","form","bytes","blob","fileType","ids","result","model","id","singlePageData","filter","aggregate","connection","request","stage","createClient","TypedOperations","_TypedOperations","client","raw","data","model","id","singlePageData","result","filter","aggregate","doc","connection","request","Version","getVersion"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apito-io/js-admin-sdk",
3
- "version": "2.5.0",
3
+ "version": "3.0.0",
4
4
  "description": "Admin JavaScript SDK for Apito GraphQL API (mirrors go-internal-sdk)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -39,8 +39,8 @@ interface Product {
39
39
  created_at: string;
40
40
  }
41
41
 
42
- // User interface for testing typed operations
43
- interface User {
42
+ // Sample document shape for typed operation tests (not engine User type)
43
+ interface ExampleProfileUser {
44
44
  email: string;
45
45
  first_name: string;
46
46
  last_name: string;
@@ -251,11 +251,11 @@ describe('ApitoClient', () => {
251
251
  }
252
252
  const client = getTestClient();
253
253
  try {
254
- const { count, users } = await client.searchTenantUsers(projectId, 10, 0);
254
+ const { count, users } = await client.searchUsers(projectId, 10, 0);
255
255
  expect(count).toBeGreaterThanOrEqual(0);
256
- console.log('✅ searchTenantUsers:', count, users?.length);
256
+ console.log('✅ searchUsers:', count, users?.length);
257
257
  } catch (error) {
258
- console.log('searchTenantUsers failed (may be expected):', error);
258
+ console.log('searchUsers failed (may be expected):', error);
259
259
  }
260
260
  }, 30000);
261
261
 
@@ -277,22 +277,28 @@ describe('ApitoClient', () => {
277
277
 
278
278
  it('should login when APITO_PROJECT_ID and credentials are set', async () => {
279
279
  const projectId = process.env.APITO_PROJECT_ID;
280
- const username = process.env.APITO_TENANT_USERNAME;
280
+ const email = process.env.APITO_TENANT_EMAIL ?? '';
281
+ const phone = process.env.APITO_TENANT_PHONE ?? '';
281
282
  const password = process.env.APITO_TENANT_PASSWORD;
282
- if (!projectId || !username || !password) {
283
+ if (!projectId || !(email.trim() || phone.trim()) || !password) {
283
284
  console.log(
284
- 'loginTenantUser skipped — set APITO_PROJECT_ID, APITO_TENANT_USERNAME, APITO_TENANT_PASSWORD'
285
+ 'loginUser skipped — set APITO_PROJECT_ID, APITO_TENANT_PASSWORD, and APITO_TENANT_EMAIL and/or APITO_TENANT_PHONE'
285
286
  );
286
287
  return;
287
288
  }
288
289
  const client = getTestClient();
289
290
  try {
290
- const login = await client.loginTenantUser(username, password, projectId);
291
+ const login = await client.loginUser({
292
+ projectId,
293
+ password,
294
+ ...(email.trim() ? { email: email.trim() } : {}),
295
+ ...(phone.trim() ? { phone: phone.trim() } : {}),
296
+ });
291
297
  expect(login.token).toBeDefined();
292
298
  expect(login.token.length).toBeGreaterThan(0);
293
- console.log('✅ loginTenantUser token length:', login.token.length);
299
+ console.log('✅ loginUser token length:', login.token.length);
294
300
  } catch (error) {
295
- console.log('loginTenantUser failed (may be expected):', error);
301
+ console.log('loginUser failed (may be expected):', error);
296
302
  }
297
303
  }, 30000);
298
304
  });