@apito-io/js-admin-sdk 2.1.1 → 2.1.2

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.d.mts CHANGED
@@ -96,6 +96,7 @@ interface InjectedDBOperationInterface {
96
96
  executeGraphQL(query: string, variables?: Record<string, any>, options?: {
97
97
  tenantId?: string;
98
98
  }): Promise<GraphQLResponse>;
99
+ /** @param token Legacy; ignored. Auth uses client API key. */
99
100
  generateTenantToken(token: string, tenantId: string): Promise<string>;
100
101
  getSingleResource(model: string, id: string, singlePageData?: boolean): Promise<DefaultDocumentStructure>;
101
102
  searchResources(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<SearchResult>;
@@ -145,7 +146,10 @@ declare class ApitoClient implements InjectedDBOperationInterface {
145
146
  tenantId?: string;
146
147
  }): Promise<GraphQLResponse>;
147
148
  /**
148
- * Generate a new tenant token for the specified tenant ID
149
+ * Generate a tenant-scoped API key for {@link tenantId}.
150
+ *
151
+ * `token` is legacy and ignored; the engine authenticates via `X-Apito-Key` (client `apiKey`).
152
+ * Expiry is sent as a calendar day `YYYY-MM-DD`; defaults to one year ahead in UTC (same default as Go admin/internal SDK).
149
153
  */
150
154
  generateTenantToken(token: string, tenantId: string): Promise<string>;
151
155
  /**
package/dist/index.d.ts CHANGED
@@ -96,6 +96,7 @@ interface InjectedDBOperationInterface {
96
96
  executeGraphQL(query: string, variables?: Record<string, any>, options?: {
97
97
  tenantId?: string;
98
98
  }): Promise<GraphQLResponse>;
99
+ /** @param token Legacy; ignored. Auth uses client API key. */
99
100
  generateTenantToken(token: string, tenantId: string): Promise<string>;
100
101
  getSingleResource(model: string, id: string, singlePageData?: boolean): Promise<DefaultDocumentStructure>;
101
102
  searchResources(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<SearchResult>;
@@ -145,7 +146,10 @@ declare class ApitoClient implements InjectedDBOperationInterface {
145
146
  tenantId?: string;
146
147
  }): Promise<GraphQLResponse>;
147
148
  /**
148
- * Generate a new tenant token for the specified tenant ID
149
+ * Generate a tenant-scoped API key for {@link tenantId}.
150
+ *
151
+ * `token` is legacy and ignored; the engine authenticates via `X-Apito-Key` (client `apiKey`).
152
+ * Expiry is sent as a calendar day `YYYY-MM-DD`; defaults to one year ahead in UTC (same default as Go admin/internal SDK).
149
153
  */
150
154
  generateTenantToken(token: string, tenantId: string): Promise<string>;
151
155
  /**
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // @apito-io/js-admin-sdk - Admin SDK for Apito GraphQL API
2
- var f=Object.create;var p=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var $=(n,e)=>{for(var t in e)p(n,t,{get:e[t],enumerable:!0})},y=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of D(e))!S.call(n,a)&&a!==t&&p(n,a,{get:()=>e[a],enumerable:!(r=R(e,a))||r.enumerable});return n};var x=(n,e,t)=>(t=n!=null?f(T(n)):{},y(e||!n||!n.__esModule?p(t,"default",{value:n,enumerable:!0}):t,n)),b=n=>y(p({},"__esModule",{value:!0}),n);var w={};$(w,{ApitoClient:()=>c,ApitoError:()=>d,GraphQLError:()=>u,TypedOperations:()=>l,ValidationError:()=>s,Version:()=>m,createClient:()=>h,default:()=>c,getVersion:()=>_});module.exports=b(w);var g=x(require("axios"));var d=class extends Error{constructor(t,r,a,o){super(t);this.code=r;this.statusCode=a;this.details=o;this.name="ApitoError"}},u=class extends d{constructor(t,r,a){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=a;this.name="GraphQLError"}get partialData(){return this.response?.data}},s=class extends d{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};var c=class{constructor(e){this.baseURL=e.baseURL,this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=g.default.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json","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 a={query:e,variables:t||{}},o={"Content-Type":"application/json","X-Apito-Key":this.apiKey};(r?.tenantId||this.tenantId)&&(o["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let i=await this.httpClient.post(this.baseURL,a,{headers:o});if(i.data.errors&&i.data.errors.length>0)throw new u("GraphQL query failed",i.data.errors,i.data);return i.data}catch(a){throw g.default.isAxiosError(a)?new d(a.response?.data?.message||a.message,"HTTP_ERROR",a.response?.status,a.response?.data):a}}async generateTenantToken(e,t){let r=`
3
- mutation GenerateTenantToken($token: String!, $tenantId: String!) {
4
- generateTenantToken(token: $token, tenant_id: $tenantId) {
2
+ var R=Object.create;var p=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var x=(n,e)=>{for(var t in e)p(n,t,{get:e[t],enumerable:!0})},h=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of T(e))!$.call(n,a)&&a!==t&&p(n,a,{get:()=>e[a],enumerable:!(r=D(e,a))||r.enumerable});return n};var b=(n,e,t)=>(t=n!=null?R(S(n)):{},h(e||!n||!n.__esModule?p(t,"default",{value:n,enumerable:!0}):t,n)),w=n=>h(p({},"__esModule",{value:!0}),n);var C={};x(C,{ApitoClient:()=>c,ApitoError:()=>d,GraphQLError:()=>u,TypedOperations:()=>l,ValidationError:()=>s,Version:()=>m,createClient:()=>_,default:()=>c,getVersion:()=>f});module.exports=w(C);var g=b(require("axios"));var d=class extends Error{constructor(t,r,a,o){super(t);this.code=r;this.statusCode=a;this.details=o;this.name="ApitoError"}},u=class extends d{constructor(t,r,a){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=a;this.name="GraphQLError"}get partialData(){return this.response?.data}},s=class extends d{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};var c=class{constructor(e){this.baseURL=e.baseURL,this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=g.default.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json","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 a={query:e,variables:t||{}},o={"Content-Type":"application/json","X-Apito-Key":this.apiKey};(r?.tenantId||this.tenantId)&&(o["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let i=await this.httpClient.post(this.baseURL,a,{headers:o});if(i.data.errors&&i.data.errors.length>0)throw new u("GraphQL query failed",i.data.errors,i.data);return i.data}catch(a){throw g.default.isAxiosError(a)?new d(a.response?.data?.message||a.message,"HTTP_ERROR",a.response?.status,a.response?.data):a}}async generateTenantToken(e,t){let r=new Date,a=`${r.getUTCFullYear()+1}-${String(r.getUTCMonth()+1).padStart(2,"0")}-${String(r.getUTCDate()).padStart(2,"0")}`,o=`
3
+ mutation GenerateTenantToken($tenantId: String!, $duration: String!) {
4
+ generateTenantToken(tenant_id: $tenantId, duration: $duration) {
5
5
  token
6
6
  }
7
7
  }
8
- `,a={token:e,tenantId:t},i=(await this.executeGraphQL(r,a,{tenantId:t})).data?.generateTenantToken;if(!i?.token)throw new s("Invalid response format for tenant token");return i.token}async getSingleResource(e,t,r=!1){let a=`
8
+ `,i={tenantId:t,duration:a},y=(await this.executeGraphQL(o,i,{tenantId:t})).data?.generateTenantToken;if(!y?.token)throw new s("Invalid response format for tenant token");return y.token}async getSingleResource(e,t,r=!1){let a=`
9
9
  query GetSingleData($model: String, $_id: String!, $single_page_data: Boolean) {
10
10
  getSingleData(model: $model, _id: $_id, single_page_data: $single_page_data) {
11
11
  _key
@@ -131,5 +131,5 @@ var f=Object.create;var p=Object.defineProperty;var R=Object.getOwnPropertyDescr
131
131
  data
132
132
  }
133
133
  }
134
- `,a={stage:e,data:t};return(await this.executeGraphQL(r,a)).data?.debug}};function h(n){return new c(n)}var l=class n{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 a=await this.client.getSingleResource(e,t,r);return n.toTypedDocument(a)}async searchResourcesTyped(e,t={},r=!1){let a=await this.client.searchResources(e,t,r);return{results:a.results.map(o=>n.toTypedDocument(o)),count:a.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(a=>n.toTypedDocument(a)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return n.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return n.toTypedDocument(t)}};var m="2.1.1";function _(){return m}0&&(module.exports={ApitoClient,ApitoError,GraphQLError,TypedOperations,ValidationError,Version,createClient,getVersion});
134
+ `,a={stage:e,data:t};return(await this.executeGraphQL(r,a)).data?.debug}};function _(n){return new c(n)}var l=class n{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 a=await this.client.getSingleResource(e,t,r);return n.toTypedDocument(a)}async searchResourcesTyped(e,t={},r=!1){let a=await this.client.searchResources(e,t,r);return{results:a.results.map(o=>n.toTypedDocument(o)),count:a.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(a=>n.toTypedDocument(a)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return n.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return n.toTypedDocument(t)}};var m="2.1.1";function f(){return m}0&&(module.exports={ApitoClient,ApitoError,GraphQLError,TypedOperations,ValidationError,Version,createClient,getVersion});
135
135
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/types.ts","../src/typed-operations.ts","../src/version.ts"],"sourcesContent":["/**\n * Apito JavaScript SDK\n * A comprehensive JavaScript SDK for communicating with Apito GraphQL API endpoints\n * \n * @module @apito-io/js-admin-sdk\n */\n\n// Export main client and types\nexport { ApitoClient, createClient } from './client';\nexport { TypedOperations } from './typed-operations';\nexport { Version, getVersion } from './version';\nexport * from './types';\n\n// Re-export commonly used types for convenience\nexport type {\n ClientConfig,\n DefaultDocumentStructure,\n SearchResult,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n GraphQLResponse,\n GraphQLError,\n ApitoError,\n ValidationError,\n InjectedDBOperationInterface,\n} from './types';\n\n// Default export for convenience\nexport { ApitoClient as default } from './client';\n","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} 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 '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 '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 new tenant token for the specified tenant ID\n */\n async generateTenantToken(token: string, tenantId: string): Promise<string> {\n const query = `\n mutation GenerateTenantToken($token: String!, $tenantId: String!) {\n generateTenantToken(token: $token, tenant_id: $tenantId) {\n token\n }\n }\n `;\n\n const variables = { token, tenantId };\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 * 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\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 generateTenantToken(token: string, tenantId: string): Promise<string>;\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.1.1';\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":["index_exports","__export","ApitoClient","ApitoError","GraphQLError","TypedOperations","ValidationError","Version","createClient","getVersion","__toCommonJS","import_axios","ApitoError","message","code","statusCode","details","GraphQLError","graphQLErrors","response","ValidationError","field","ApitoClient","config","axios","query","variables","options","payload","headers","response","GraphQLError","error","ApitoError","token","tenantId","data","ValidationError","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/index.ts","../src/client.ts","../src/types.ts","../src/typed-operations.ts","../src/version.ts"],"sourcesContent":["/**\n * Apito JavaScript SDK\n * A comprehensive JavaScript SDK for communicating with Apito GraphQL API endpoints\n * \n * @module @apito-io/js-admin-sdk\n */\n\n// Export main client and types\nexport { ApitoClient, createClient } from './client';\nexport { TypedOperations } from './typed-operations';\nexport { Version, getVersion } from './version';\nexport * from './types';\n\n// Re-export commonly used types for convenience\nexport type {\n ClientConfig,\n DefaultDocumentStructure,\n SearchResult,\n TypedDocumentStructure,\n TypedSearchResult,\n CreateAndUpdateRequest,\n GraphQLResponse,\n GraphQLError,\n ApitoError,\n ValidationError,\n InjectedDBOperationInterface,\n} from './types';\n\n// Default export for convenience\nexport { ApitoClient as default } from './client';\n","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} 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 '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 '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 for {@link tenantId}.\n *\n * `token` is legacy and ignored; the engine authenticates via `X-Apito-Key` (client `apiKey`).\n * Expiry is sent as a calendar day `YYYY-MM-DD`; defaults to one year ahead in UTC (same default as Go admin/internal SDK).\n */\n async generateTenantToken(token: string, tenantId: string): Promise<string> {\n void token;\n\n const d = new Date();\n const duration = `${d.getUTCFullYear() + 1}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(\n d.getUTCDate()\n ).padStart(2, '0')}`;\n\n const query = `\n mutation GenerateTenantToken($tenantId: String!, $duration: String!) {\n generateTenantToken(tenant_id: $tenantId, duration: $duration) {\n token\n }\n }\n `;\n\n const variables = { tenantId, duration };\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 * 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\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(token: string, tenantId: string): Promise<string>;\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.1.1';\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":["index_exports","__export","ApitoClient","ApitoError","GraphQLError","TypedOperations","ValidationError","Version","createClient","getVersion","__toCommonJS","import_axios","ApitoError","message","code","statusCode","details","GraphQLError","graphQLErrors","response","ValidationError","field","ApitoClient","config","axios","query","variables","options","payload","headers","response","GraphQLError","error","ApitoError","token","tenantId","d","duration","data","ValidationError","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/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  // @apito-io/js-admin-sdk - Admin SDK for Apito GraphQL API
2
- import l from"axios";var d=class extends Error{constructor(t,r,a,i){super(t);this.code=r;this.statusCode=a;this.details=i;this.name="ApitoError"}},u=class extends d{constructor(t,r,a){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=a;this.name="GraphQLError"}get partialData(){return this.response?.data}},o=class extends d{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};var c=class{constructor(e){this.baseURL=e.baseURL,this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=l.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json","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 a={query:e,variables:t||{}},i={"Content-Type":"application/json","X-Apito-Key":this.apiKey};(r?.tenantId||this.tenantId)&&(i["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let n=await this.httpClient.post(this.baseURL,a,{headers:i});if(n.data.errors&&n.data.errors.length>0)throw new u("GraphQL query failed",n.data.errors,n.data);return n.data}catch(a){throw l.isAxiosError(a)?new d(a.response?.data?.message||a.message,"HTTP_ERROR",a.response?.status,a.response?.data):a}}async generateTenantToken(e,t){let r=`
3
- mutation GenerateTenantToken($token: String!, $tenantId: String!) {
4
- generateTenantToken(token: $token, tenant_id: $tenantId) {
2
+ import g from"axios";var d=class extends Error{constructor(t,r,a,i){super(t);this.code=r;this.statusCode=a;this.details=i;this.name="ApitoError"}},u=class extends d{constructor(t,r,a){super(t,"GRAPHQL_ERROR");this.graphQLErrors=r;this.response=a;this.name="GraphQLError"}get partialData(){return this.response?.data}},o=class extends d{constructor(t,r){super(t,"VALIDATION_ERROR");this.field=r;this.name="ValidationError"}};var c=class{constructor(e){this.baseURL=e.baseURL,this.apiKey=e.apiKey,this.tenantId=e.tenantId,this.httpClient=g.create({timeout:e.timeout||3e4,headers:{"Content-Type":"application/json","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 a={query:e,variables:t||{}},i={"Content-Type":"application/json","X-Apito-Key":this.apiKey};(r?.tenantId||this.tenantId)&&(i["X-Apito-Tenant-ID"]=r?.tenantId||this.tenantId);let n=await this.httpClient.post(this.baseURL,a,{headers:i});if(n.data.errors&&n.data.errors.length>0)throw new u("GraphQL query failed",n.data.errors,n.data);return n.data}catch(a){throw g.isAxiosError(a)?new d(a.response?.data?.message||a.message,"HTTP_ERROR",a.response?.status,a.response?.data):a}}async generateTenantToken(e,t){let r=new Date,a=`${r.getUTCFullYear()+1}-${String(r.getUTCMonth()+1).padStart(2,"0")}-${String(r.getUTCDate()).padStart(2,"0")}`,i=`
3
+ mutation GenerateTenantToken($tenantId: String!, $duration: String!) {
4
+ generateTenantToken(tenant_id: $tenantId, duration: $duration) {
5
5
  token
6
6
  }
7
7
  }
8
- `,a={token:e,tenantId:t},n=(await this.executeGraphQL(r,a,{tenantId:t})).data?.generateTenantToken;if(!n?.token)throw new o("Invalid response format for tenant token");return n.token}async getSingleResource(e,t,r=!1){let a=`
8
+ `,n={tenantId:t,duration:a},l=(await this.executeGraphQL(i,n,{tenantId:t})).data?.generateTenantToken;if(!l?.token)throw new o("Invalid response format for tenant token");return l.token}async getSingleResource(e,t,r=!1){let a=`
9
9
  query GetSingleData($model: String, $_id: String!, $single_page_data: Boolean) {
10
10
  getSingleData(model: $model, _id: $_id, single_page_data: $single_page_data) {
11
11
  _key
@@ -131,5 +131,5 @@ import l from"axios";var d=class extends Error{constructor(t,r,a,i){super(t);thi
131
131
  data
132
132
  }
133
133
  }
134
- `,a={stage:e,data:t};return(await this.executeGraphQL(r,a)).data?.debug}};function m(s){return new c(s)}var p=class s{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 a=await this.client.getSingleResource(e,t,r);return s.toTypedDocument(a)}async searchResourcesTyped(e,t={},r=!1){let a=await this.client.searchResources(e,t,r);return{results:a.results.map(i=>s.toTypedDocument(i)),count:a.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(a=>s.toTypedDocument(a)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return s.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return s.toTypedDocument(t)}};var g="2.1.1";function y(){return g}export{c as ApitoClient,d as ApitoError,u as GraphQLError,p as TypedOperations,o as ValidationError,g as Version,m as createClient,c as default,y as getVersion};
134
+ `,a={stage:e,data:t};return(await this.executeGraphQL(r,a)).data?.debug}};function y(s){return new c(s)}var p=class s{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 a=await this.client.getSingleResource(e,t,r);return s.toTypedDocument(a)}async searchResourcesTyped(e,t={},r=!1){let a=await this.client.searchResources(e,t,r);return{results:a.results.map(i=>s.toTypedDocument(i)),count:a.count}}async getRelationDocumentsTyped(e,t){let r=await this.client.getRelationDocuments(e,t);return{results:r.results.map(a=>s.toTypedDocument(a)),count:r.count}}async createNewResourceTyped(e){let t=await this.client.createNewResource(e);return s.toTypedDocument(t)}async updateResourceTyped(e){let t=await this.client.updateResource(e);return s.toTypedDocument(t)}};var m="2.1.1";function h(){return m}export{c as ApitoClient,d as ApitoError,u as GraphQLError,p as TypedOperations,o as ValidationError,m as Version,y as createClient,c as default,h as getVersion};
135
135
  //# 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} 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 '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 '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 new tenant token for the specified tenant ID\n */\n async generateTenantToken(token: string, tenantId: string): Promise<string> {\n const query = `\n mutation GenerateTenantToken($token: String!, $tenantId: String!) {\n generateTenantToken(token: $token, tenant_id: $tenantId) {\n token\n }\n }\n `;\n\n const variables = { token, tenantId };\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 * 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\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 generateTenantToken(token: string, tenantId: string): Promise<string>;\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.1.1';\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","token","tenantId","data","ValidationError","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} 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 '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 '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 for {@link tenantId}.\n *\n * `token` is legacy and ignored; the engine authenticates via `X-Apito-Key` (client `apiKey`).\n * Expiry is sent as a calendar day `YYYY-MM-DD`; defaults to one year ahead in UTC (same default as Go admin/internal SDK).\n */\n async generateTenantToken(token: string, tenantId: string): Promise<string> {\n void token;\n\n const d = new Date();\n const duration = `${d.getUTCFullYear() + 1}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(\n d.getUTCDate()\n ).padStart(2, '0')}`;\n\n const query = `\n mutation GenerateTenantToken($tenantId: String!, $duration: String!) {\n generateTenantToken(tenant_id: $tenantId, duration: $duration) {\n token\n }\n }\n `;\n\n const variables = { tenantId, duration };\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 * 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\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(token: string, tenantId: string): Promise<string>;\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.1.1';\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","token","tenantId","d","duration","data","ValidationError","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.1.1",
3
+ "version": "2.1.2",
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",
package/src/client.ts CHANGED
@@ -96,18 +96,28 @@ export class ApitoClient implements InjectedDBOperationInterface {
96
96
  }
97
97
 
98
98
  /**
99
- * Generate a new tenant token for the specified tenant ID
99
+ * Generate a tenant-scoped API key for {@link tenantId}.
100
+ *
101
+ * `token` is legacy and ignored; the engine authenticates via `X-Apito-Key` (client `apiKey`).
102
+ * Expiry is sent as a calendar day `YYYY-MM-DD`; defaults to one year ahead in UTC (same default as Go admin/internal SDK).
100
103
  */
101
104
  async generateTenantToken(token: string, tenantId: string): Promise<string> {
105
+ void token;
106
+
107
+ const d = new Date();
108
+ const duration = `${d.getUTCFullYear() + 1}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(
109
+ d.getUTCDate()
110
+ ).padStart(2, '0')}`;
111
+
102
112
  const query = `
103
- mutation GenerateTenantToken($token: String!, $tenantId: String!) {
104
- generateTenantToken(token: $token, tenant_id: $tenantId) {
113
+ mutation GenerateTenantToken($tenantId: String!, $duration: String!) {
114
+ generateTenantToken(tenant_id: $tenantId, duration: $duration) {
105
115
  token
106
116
  }
107
117
  }
108
118
  `;
109
119
 
110
- const variables = { token, tenantId };
120
+ const variables = { tenantId, duration };
111
121
  const response = await this.executeGraphQL(query, variables, { tenantId });
112
122
 
113
123
  const data = response.data?.generateTenantToken;
package/src/types.ts CHANGED
@@ -120,6 +120,7 @@ export interface InjectedDBOperationInterface {
120
120
  variables?: Record<string, any>,
121
121
  options?: { tenantId?: string }
122
122
  ): Promise<GraphQLResponse>;
123
+ /** @param token Legacy; ignored. Auth uses client API key. */
123
124
  generateTenantToken(token: string, tenantId: string): Promise<string>;
124
125
  getSingleResource(model: string, id: string, singlePageData?: boolean): Promise<DefaultDocumentStructure>;
125
126
  searchResources(model: string, filter?: Record<string, any>, aggregate?: boolean): Promise<SearchResult>;