@lumi.new/sdk 0.0.10 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -251,9 +251,6 @@ async function deletePost(id: string) {
251
251
 
252
252
  // Example Request:
253
253
  deletePost('your-post-id');
254
-
255
- // The console will output:
256
- // Post deleted.
257
254
  ```
258
255
 
259
256
  ### Delete Multiple Records
@@ -268,9 +265,74 @@ async function deleteMultiplePosts(ids: string[]) {
268
265
 
269
266
  // Example Request:
270
267
  deleteMultiplePosts(['post-id-1', 'post-id-2']);
268
+ ```
269
+
270
+ ## Tools
271
+
272
+ The `tools` client provides access to various utilities, such as sending emails.
273
+
274
+ ### Send an Email
275
+
276
+ You can send an email using the `email.send` method.
277
+
278
+ ```typescript
279
+ async function sendWelcomeEmail(email: string) {
280
+ try {
281
+ await lumi.tools.email.send({
282
+ to: email,
283
+ subject: 'Welcome to Our Service!',
284
+ fromName: 'The Team',
285
+ html: '<h1>Welcome!</h1><p>We are glad to have you with us.</p>',
286
+ });
287
+ console.log('Email sent successfully.');
288
+ } catch (error) {
289
+ console.error('Failed to send email:', error);
290
+ }
291
+ }
292
+
293
+ // Example Request:
294
+ sendWelcomeEmail('test@example.com');
295
+ ```
296
+
297
+ ### Upload Files
298
+
299
+ Upload multiple files in a single request. This method returns an array of objects, each representing the result of one file upload.
300
+
301
+ ```typescript
302
+ async function uploadFiles(files: File[]) {
303
+ const results = await lumi.tools.file.upload(files)
304
+ console.log('Upload results:', results)
305
+ }
306
+
307
+ // Example Request (in a browser environment):
308
+ // const fileInput = document.querySelector('input[type="file"]');
309
+ // if (fileInput.files) {
310
+ // uploadFiles(Array.from(fileInput.files));
311
+ // }
312
+
313
+ // Example Response:
314
+ // Upload results: [
315
+ // { fileName: 'image.png', fileUrl: 'https://your-storage.com/image.png' },
316
+ // { fileName: 'application.exe', uploadError: 'Invalid file type' }
317
+ // ]
318
+ ```
319
+
320
+ ### Delete Files
321
+
322
+ Delete multiple files by their URLs in a single request.
323
+
324
+ ```typescript
325
+ async function deleteFiles(urls:string[]) {
326
+ await lumi.tools.file.delete(urls);
327
+ console.log('Files deleted.');
328
+ }
271
329
 
272
- // The console will output:
273
- // Posts deleted.
330
+ // Example Request:
331
+ const filesToDelete = [
332
+ 'https://your-storage.com/image.png',
333
+ 'https://your-storage.com/document.pdf'
334
+ ];
335
+ deleteFiles(filesToDelete);
274
336
  ```
275
337
 
276
338
  ---
@@ -470,3 +532,53 @@ Deletes multiple records by their IDs.
470
532
  **Returns:**
471
533
 
472
534
  - `Promise<void>`: A promise that resolves when the operation is complete.
535
+
536
+ ### Tools (`lumi.tools`)
537
+
538
+ Provides access to various tools and utilities.
539
+
540
+ #### `email.send(options)`
541
+
542
+ Sends an email.
543
+
544
+ **Parameters:**
545
+
546
+ - `options` (`object`): Email options.
547
+ - `to` (`string | string[]`): The recipient's email address or addresses.
548
+ - `subject` (`string`): The subject of the email.
549
+ - `fromName` (`string`, optional): The sender's name.
550
+ - `html` (`string`, optional): The HTML body of the email. At least one of `html` or `text` must be provided.
551
+ - `text` (`string`, optional): The plain text body of the email. At least one of `html` or `text` must be provided.
552
+ - `replyTo` (`string | string[]`, optional): Email address or addresses to reply to.
553
+ - `scheduledAt` (`string`, optional): An ISO 8601 formatted date string to schedule the email for later sending.
554
+
555
+ **Returns:**
556
+
557
+ - `Promise<void>`: A promise that resolves when the email sending request is accepted.
558
+
559
+ #### `file.upload(files)`
560
+
561
+ Uploads one or more files.
562
+
563
+ **Parameters:**
564
+
565
+ - `files` (`File[]`): An array of `File` objects to upload.
566
+
567
+ **Returns:**
568
+
569
+ - `Promise<Array<object>>`: A promise that resolves with an array of objects, where each object represents the result of a single file upload.
570
+ - `fileName` (`string`): The original name of the file.
571
+ - `fileUrl` (`string`, optional): The URL of the uploaded file. Present only on successful upload.
572
+ - `uploadError` (`string`, optional): An error message if the upload for this specific file failed.
573
+
574
+ #### `file.delete(fileUrls)`
575
+
576
+ Deletes one or more files based on their URLs.
577
+
578
+ **Parameters:**
579
+
580
+ - `fileUrls` (`string[]`): An array of file URLs to be deleted.
581
+
582
+ **Returns:**
583
+
584
+ - `Promise<void>`: A promise that resolves when the delete operation is complete.
package/dist/index.d.mts CHANGED
@@ -38,6 +38,42 @@ declare class EntitiesClient {
38
38
  constructor(lumi: LumiClient);
39
39
  }
40
40
 
41
+ declare class EmailTool {
42
+ #private;
43
+ constructor(lumi: LumiClient);
44
+ /** 发送邮件 */
45
+ send({ to, subject, fromName, html, text, replyTo, scheduledAt }: {
46
+ to: string | string[];
47
+ subject: string;
48
+ fromName?: string;
49
+ html?: string;
50
+ text?: string;
51
+ replyTo?: string | string[];
52
+ scheduledAt?: string;
53
+ }): Promise<void>;
54
+ }
55
+
56
+ interface UploadItem {
57
+ fileName: string;
58
+ fileUrl?: string;
59
+ uploadError?: string;
60
+ }
61
+ declare class FileTool {
62
+ #private;
63
+ constructor(lumi: LumiClient);
64
+ /** 上传文件 */
65
+ upload(files: File[]): Promise<UploadItem[]>;
66
+ /** 批量删除文件 */
67
+ delete(fileUrls: string[]): Promise<void>;
68
+ }
69
+
70
+ declare class ToolsClient {
71
+ #private;
72
+ email: EmailTool;
73
+ file: FileTool;
74
+ constructor(lumi: LumiClient);
75
+ }
76
+
41
77
  interface LumiClientConfig {
42
78
  projectId: string;
43
79
  apiBaseUrl: string;
@@ -47,6 +83,7 @@ declare class LumiClient {
47
83
  config: LumiClientConfig;
48
84
  auth: LumiAuthClient;
49
85
  entities: EntitiesClient;
86
+ tools: ToolsClient;
50
87
  constructor(config: LumiClientConfig);
51
88
  }
52
89
  declare function createClient(config: LumiClientConfig): LumiClient;
@@ -106,4 +143,4 @@ declare class LumiAuthClient {
106
143
  }) => void): () => void;
107
144
  }
108
145
 
109
- export { EntitiesClient, type Entity, EntityClient, LumiAuthClient, LumiClient, type LumiClientConfig, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageSignInData, type User, createClient };
146
+ export { EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, LumiAuthClient, LumiClient, type LumiClientConfig, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageSignInData, ToolsClient, type UploadItem, type User, createClient };
package/dist/index.d.ts CHANGED
@@ -38,6 +38,42 @@ declare class EntitiesClient {
38
38
  constructor(lumi: LumiClient);
39
39
  }
40
40
 
41
+ declare class EmailTool {
42
+ #private;
43
+ constructor(lumi: LumiClient);
44
+ /** 发送邮件 */
45
+ send({ to, subject, fromName, html, text, replyTo, scheduledAt }: {
46
+ to: string | string[];
47
+ subject: string;
48
+ fromName?: string;
49
+ html?: string;
50
+ text?: string;
51
+ replyTo?: string | string[];
52
+ scheduledAt?: string;
53
+ }): Promise<void>;
54
+ }
55
+
56
+ interface UploadItem {
57
+ fileName: string;
58
+ fileUrl?: string;
59
+ uploadError?: string;
60
+ }
61
+ declare class FileTool {
62
+ #private;
63
+ constructor(lumi: LumiClient);
64
+ /** 上传文件 */
65
+ upload(files: File[]): Promise<UploadItem[]>;
66
+ /** 批量删除文件 */
67
+ delete(fileUrls: string[]): Promise<void>;
68
+ }
69
+
70
+ declare class ToolsClient {
71
+ #private;
72
+ email: EmailTool;
73
+ file: FileTool;
74
+ constructor(lumi: LumiClient);
75
+ }
76
+
41
77
  interface LumiClientConfig {
42
78
  projectId: string;
43
79
  apiBaseUrl: string;
@@ -47,6 +83,7 @@ declare class LumiClient {
47
83
  config: LumiClientConfig;
48
84
  auth: LumiAuthClient;
49
85
  entities: EntitiesClient;
86
+ tools: ToolsClient;
50
87
  constructor(config: LumiClientConfig);
51
88
  }
52
89
  declare function createClient(config: LumiClientConfig): LumiClient;
@@ -106,4 +143,4 @@ declare class LumiAuthClient {
106
143
  }) => void): () => void;
107
144
  }
108
145
 
109
- export { EntitiesClient, type Entity, EntityClient, LumiAuthClient, LumiClient, type LumiClientConfig, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageSignInData, type User, createClient };
146
+ export { EmailTool, EntitiesClient, type Entity, EntityClient, FileTool, LumiAuthClient, LumiClient, type LumiClientConfig, type MessageDataReceive, type MessageDataSend, type MessageInitData, type MessageSignInData, ToolsClient, type UploadItem, type User, createClient };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var S=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames,v=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var D=i=>{throw TypeError(i)};var P=(i,e,t)=>e in i?S(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,A=(i,e)=>{for(var t in e||(e={}))M.call(e,t)&&P(i,t,e[t]);if(v)for(var t of v(e))B.call(e,t)&&P(i,t,e[t]);return i};var G=(i,e)=>{for(var t in e)S(i,t,{get:e[t],enumerable:!0})},F=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of q(e))!M.call(i,s)&&s!==t&&S(i,s,{get:()=>e[s],enumerable:!(r=_(e,s))||r.enumerable});return i};var J=i=>F(S({},"__esModule",{value:!0}),i);var O=(i,e,t)=>e.has(i)||D("Cannot "+t);var n=(i,e,t)=>(O(i,e,"read from private field"),t?t.call(i):e.get(i)),m=(i,e,t)=>e.has(i)?D("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),d=(i,e,t,r)=>(O(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t);var l=(i,e,t)=>new Promise((r,s)=>{var o=u=>{try{f(t.next(u))}catch(y){s(y)}},h=u=>{try{f(t.throw(u))}catch(y){s(y)}},f=u=>u.done?r(u.value):Promise.resolve(u.value).then(o,h);f((t=t.apply(i,e)).next())});var Y={};G(Y,{EntitiesClient:()=>T,EntityClient:()=>E,LumiAuthClient:()=>w,LumiClient:()=>I,createClient:()=>V});module.exports=J(Y);var $=require("uuid");var k=require("ofetch");function c(i,e,t={}){return i.auth.accessToken&&(t.headers=A({Authorization:`Bearer ${i.auth.accessToken}`},t.headers)),(0,k.ofetch)(e,A({baseURL:i.config.apiBaseUrl},t))}function N(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function U(){var i;return(i=document.title)!=null?i:null}function x(i,e,t=localStorage){let r=t.getItem(i),s=e?JSON.stringify(e):null;s?t.setItem(i,s):t.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:r,newValue:s,storageArea:t}))}function L(i,e=localStorage){let t=e.getItem(i);try{return t?JSON.parse(t):null}catch(r){return null}}var g,C,w=class{constructor(e){m(this,g);m(this,C,`lumi-auth-${(0,$.v4)()}`);d(this,g,e)}get accessToken(){return L("lumi-access-token")}set accessToken(e){x("lumi-access-token",e)}get user(){return L("lumi-user")}set user(e){x("lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){let r=(window.screen.width-800)/2,s=(window.screen.height-600)/2,o=window.open(n(this,g).config.authOrigin,n(this,C),`width=800,height=600,left=${r},top=${s}`),h;return new Promise((f,u)=>{if(!o)return u(new Error("Open auth window failed"));let y=setInterval(()=>{o.closed&&u(new Error("Auth window closed"))},1e3),R=({data:p,origin:j,source:K})=>{if(!(j!==n(this,g).config.authOrigin||K!==o))switch(p==null?void 0:p.type){case"lumi-ready":{o.postMessage({type:"lumi-init",data:{projectId:n(this,g).config.projectId,icon:N(),title:U()}},n(this,g).config.authOrigin);break}case"lumi-sign-in":{if(p.data.projectId!==n(this,g).config.projectId)break;o.close(),window.focus(),this.accessToken=p.data.accessToken,this.user=p.data.user,f(p.data);break}}};window.addEventListener("message",R),h=()=>{clearInterval(y),window.removeEventListener("message",R)}}).finally(()=>h==null?void 0:h())}signOut(){this.accessToken=null,this.user=null}refreshUser(){return l(this,null,function*(){let e=yield c(n(this,g),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){let t=r=>{(r.key==="lumi-access-token"||r.key==="lumi-user"||r.key===null)&&e({isAuthenticated:this.isAuthenticated,user:this.user})};return window.addEventListener("storage",t),()=>{window.removeEventListener("storage",t)}}};g=new WeakMap,C=new WeakMap;var a,E=class{constructor(e,t){m(this,a);d(this,a,e),this.entityName=t}list(){return l(this,arguments,function*({filter:e,sort:t,limit:r,skip:s}={}){if(r){let o=yield c(n(this,a),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:s}});if(o.code!==200)throw new Error(o.message);return o.data}else{let o=yield c(n(this,a),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(o.code!==200)throw new Error(o.message);return{total:o.data.length,list:o.data}}})}get(e){return l(this,null,function*(){let t=yield c(n(this,a),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return l(this,null,function*(){let t=yield c(n(this,a),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return l(this,null,function*(){let t=yield c(n(this,a),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return l(this,null,function*(){let r=yield c(n(this,a),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return l(this,null,function*(){let t=yield c(n(this,a),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return l(this,null,function*(){let t=yield c(n(this,a),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${n(this,a).config.projectId}/${this.entityName}/documents${e}`}};a=new WeakMap;var b,T=class{constructor(e){m(this,b);return d(this,b,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new E(n(t,b),r)),t[r]}})}};b=new WeakMap;var I=class{constructor(e){this.config=e,this.auth=new w(this),this.entities=new T(this)}};function V(i){return new I(i)}0&&(module.exports={EntitiesClient,EntityClient,LumiAuthClient,LumiClient,createClient});
1
+ "use strict";var R=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames,k=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,H=Object.prototype.propertyIsEnumerable;var q=i=>{throw TypeError(i)};var $=(i,e,t)=>e in i?R(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,M=(i,e)=>{for(var t in e||(e={}))j.call(e,t)&&$(i,t,e[t]);if(k)for(var t of k(e))H.call(e,t)&&$(i,t,e[t]);return i};var Q=(i,e)=>{for(var t in e)R(i,t,{get:e[t],enumerable:!0})},W=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of z(e))!j.call(i,n)&&n!==t&&R(i,n,{get:()=>e[n],enumerable:!(r=Y(e,n))||r.enumerable});return i};var X=i=>W(R({},"__esModule",{value:!0}),i);var K=(i,e,t)=>e.has(i)||q("Cannot "+t);var s=(i,e,t)=>(K(i,e,"read from private field"),t?t.call(i):e.get(i)),l=(i,e,t)=>e.has(i)?q("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),m=(i,e,t,r)=>(K(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t);var c=(i,e,t)=>new Promise((r,n)=>{var o=g=>{try{y(t.next(g))}catch(h){n(h)}},p=g=>{try{y(t.throw(g))}catch(h){n(h)}},y=g=>g.done?r(g.value):Promise.resolve(g.value).then(o,p);y((t=t.apply(i,e)).next())});var ee={};Q(ee,{EmailTool:()=>L,EntitiesClient:()=>S,EntityClient:()=>C,FileTool:()=>x,LumiAuthClient:()=>T,LumiClient:()=>D,ToolsClient:()=>A,createClient:()=>Z});module.exports=X(ee);var G=require("uuid");var _=require("ofetch");function a(i,e,t={}){return i.auth.accessToken&&(t.headers=M({Authorization:`Bearer ${i.auth.accessToken}`},t.headers)),(0,_.ofetch)(e,M({baseURL:i.config.apiBaseUrl},t))}function F(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function B(){var i;return(i=document.title)!=null?i:null}function O(i,e,t=localStorage){let r=t.getItem(i),n=e?JSON.stringify(e):null;n?t.setItem(i,n):t.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:r,newValue:n,storageArea:t}))}function U(i,e=localStorage){let t=e.getItem(i);try{return t?JSON.parse(t):null}catch(r){return null}}var d,P,T=class{constructor(e){l(this,d);l(this,P,`lumi-auth-${(0,G.v4)()}`);m(this,d,e)}get accessToken(){return U("lumi-access-token")}set accessToken(e){O("lumi-access-token",e)}get user(){return U("lumi-user")}set user(e){O("lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){let r=(window.screen.width-800)/2,n=(window.screen.height-600)/2,o=window.open(s(this,d).config.authOrigin,s(this,P),`width=800,height=600,left=${r},top=${n}`),p;return new Promise((y,g)=>{if(!o)return g(new Error("Open auth window failed"));let h=setInterval(()=>{o.closed&&g(new Error("Auth window closed"))},1e3),N=({data:w,origin:J,source:V})=>{if(!(J!==s(this,d).config.authOrigin||V!==o))switch(w==null?void 0:w.type){case"lumi-ready":{o.postMessage({type:"lumi-init",data:{projectId:s(this,d).config.projectId,icon:F(),title:B()}},s(this,d).config.authOrigin);break}case"lumi-sign-in":{if(w.data.projectId!==s(this,d).config.projectId)break;o.close(),window.focus(),this.accessToken=w.data.accessToken,this.user=w.data.user,y(w.data);break}}};window.addEventListener("message",N),p=()=>{clearInterval(h),window.removeEventListener("message",N)}}).finally(()=>p==null?void 0:p())}signOut(){this.accessToken=null,this.user=null}refreshUser(){return c(this,null,function*(){let e=yield a(s(this,d),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){let t=r=>{(r.key==="lumi-access-token"||r.key==="lumi-user"||r.key===null)&&e({isAuthenticated:this.isAuthenticated,user:this.user})};return window.addEventListener("storage",t),()=>{window.removeEventListener("storage",t)}}};d=new WeakMap,P=new WeakMap;var u,C=class{constructor(e,t){l(this,u);m(this,u,e),this.entityName=t}list(){return c(this,arguments,function*({filter:e,sort:t,limit:r,skip:n}={}){if(r){let o=yield a(s(this,u),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:n}});if(o.code!==200)throw new Error(o.message);return o.data}else{let o=yield a(s(this,u),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(o.code!==200)throw new Error(o.message);return{total:o.data.length,list:o.data}}})}get(e){return c(this,null,function*(){let t=yield a(s(this,u),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return c(this,null,function*(){let t=yield a(s(this,u),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return c(this,null,function*(){let t=yield a(s(this,u),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return c(this,null,function*(){let r=yield a(s(this,u),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return c(this,null,function*(){let t=yield a(s(this,u),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return c(this,null,function*(){let t=yield a(s(this,u),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${s(this,u).config.projectId}/${this.entityName}/documents${e}`}};u=new WeakMap;var I,S=class{constructor(e){l(this,I);return m(this,I,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new C(s(t,I),r)),t[r]}})}};I=new WeakMap;var E=class extends Error{constructor(e,t){super(t),this.code=e}};var b,L=class{constructor(e){l(this,b);m(this,b,e)}send(g){return c(this,arguments,function*({to:e,subject:t,fromName:r,html:n,text:o="",replyTo:p,scheduledAt:y}){if(!e||!t||!n&&!o)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof p=="string"&&(p=[p]);let h=yield a(s(this,b),`/lm/${s(this,b).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:r,html:n,text:o,replyTo:p,scheduledAt:y}});if(h.code!==200)throw new E(h.code,h.message)})}};b=new WeakMap;var f,x=class{constructor(e){l(this,f);m(this,f,e)}upload(e){return c(this,null,function*(){let t=new FormData;e.forEach(n=>{t.append("files",n)});let r=yield a(s(this,f),`/lm/${s(this,f).config.projectId}/file/batch`,{method:"POST",headers:{"Content-Type":"multipart/form-data"},body:t});if(r.code!==200)throw new E(r.code,r.message);return r.data})}delete(e){return c(this,null,function*(){let t=yield a(s(this,f),`/lm/${s(this,f).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new E(t.code,t.message)})}};f=new WeakMap;var v,A=class{constructor(e){l(this,v);m(this,v,e),this.email=new L(e),this.file=new x(e)}};v=new WeakMap;var D=class{constructor(e){this.config=e,this.auth=new T(this),this.entities=new S(this),this.tools=new A(this)}};function Z(i){return new D(i)}0&&(module.exports={EmailTool,EntitiesClient,EntityClient,FileTool,LumiAuthClient,LumiClient,ToolsClient,createClient});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/auth-client.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["export * from './core/auth-client'\nexport * from './core/entities-client'\nexport * from './core/entity-client'\nexport * from './core/lumi-client'\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n createdTime: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: MessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n return getStorage<string>(StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n setStorage(StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n /** 用户 */\n public get user(): User | null {\n return getStorage<User>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(this.#lumi.config.authOrigin, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case MessageType.READY: {\n popup.postMessage({\n type: MessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case MessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n window.addEventListener('message', handleMessage)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n }\n }).finally(() => cleanup?.())\n }\n\n /** 退出登录 */\n public signOut(): void {\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n const handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n if (lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n })\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n","import type { StorageKey } from '@/constants'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/find'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n\n constructor(config: LumiClientConfig) {\n this.config = config\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n }\n}\n\nexport function createClient(config: LumiClientConfig): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"otCAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,iBAAAC,EAAA,mBAAAC,EAAA,eAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAP,GCEA,IAAAQ,EAAmB,gBCAnB,IAAAC,EAAuB,kBAahB,SAASC,EAAWC,EAAkBC,EAAaC,EAAgC,CAAC,EAAe,CACxG,OAAIF,EAAK,KAAK,cACZE,EAAQ,QAAUC,EAAA,CAChB,cAAe,UAAUH,EAAK,KAAK,WAAW,IAC3CE,EAAQ,aAIR,UAAUD,EAAKE,EAAA,CACpB,QAASH,EAAK,OAAO,YAClBE,EACJ,CACH,CC3BO,SAASE,GAAyB,CAAzC,IAAAC,EAAAC,EACE,OAAOA,GAAAD,EAAA,SAAS,cAA+B,kBAAkB,IAA1D,YAAAA,EAA6D,OAA7D,KAAAC,EAAqE,IAC9E,CAEO,SAASC,GAA0B,CAJ1C,IAAAF,EAKE,OAAOA,EAAA,SAAS,QAAT,KAAAA,EAAkB,IAC3B,CCJO,SAASG,EAAcC,EAAiBC,EAAUC,EAAmB,aAAoB,CAC9F,IAAMC,EAAWD,EAAQ,QAAQF,CAAG,EAC9BI,EAAWH,EAAQ,KAAK,UAAUA,CAAK,EAAI,KAC7CG,EACFF,EAAQ,QAAQF,EAAKI,CAAQ,EAE7BF,EAAQ,WAAWF,CAAG,EAExB,OAAO,cAAc,IAAI,aAAa,UAAW,CAC/C,IAAAA,EACA,SAAAG,EACA,SAAAC,EACA,YAAaF,CACf,CAAC,CAAC,CACJ,CAEO,SAASG,EAAcL,EAAiBE,EAAmB,aAAwB,CACxF,IAAMD,EAAQC,EAAQ,QAAQF,CAAG,EACjC,GAAI,CACF,OAAOC,EAAQ,KAAK,MAAMA,CAAK,EAAI,IACrC,OACOK,EAAI,CACT,OAAO,IACT,CACF,CH1BA,IAAAC,EAAAC,EAuCaC,EAAN,KAAqB,CAI1B,YAAYC,EAAkB,CAH9BC,EAAA,KAASJ,GACTI,EAAA,KAASH,EAAqB,gBAAa,MAAG,CAAC,IAG7CI,EAAA,KAAKL,EAAQG,EACf,CAGA,IAAW,aAA6B,CACtC,OAAOG,qBAA0C,CACnD,CAEA,IAAW,YAAYC,EAA4B,CACjDC,sBAAoCD,CAAW,CACjD,CAGA,IAAW,MAAoB,CAC7B,OAAOD,aAAgC,CACzC,CAEA,IAAW,KAAKG,EAAmB,CACjCD,cAA4BC,CAAI,CAClC,CAEA,IAAW,iBAA2B,CACpC,MAAO,CAAC,CAAC,KAAK,WAChB,CAGO,QAAqC,CAG1C,IAAMC,GAAQ,OAAO,OAAO,MAAQ,KAAS,EACvCC,GAAO,OAAO,OAAO,OAAS,KAAU,EACxCC,EAAQ,OAAO,KAAKC,EAAA,KAAKb,GAAM,OAAO,WAAYa,EAAA,KAAKZ,GAAY,6BAAwCS,CAAI,QAAQC,CAAG,EAAE,EAE9HG,EACJ,OAAO,IAAI,QAA2B,CAACC,EAASC,IAAW,CACzD,GAAI,CAACJ,EACH,OAAOI,EAAO,IAAI,MAAM,yBAAyB,CAAC,EAEpD,IAAMC,EAAQ,YAAY,IAAM,CAC1BL,EAAM,QACRI,EAAO,IAAI,MAAM,oBAAoB,CAAC,CAC1C,EAAG,GAAI,EAEDE,EAAgB,CAAC,CAAE,KAAAC,EAAM,OAAAC,EAAQ,OAAAC,CAAO,IAAqD,CACjG,GAAI,EAAAD,IAAWP,EAAA,KAAKb,GAAM,OAAO,YAAcqB,IAAWT,GAG1D,OAAQO,GAAA,YAAAA,EAAM,KAAM,CAClB,iBAAwB,CACtBP,EAAM,YAAY,CAChB,iBACA,KAAM,CACJ,UAAWC,EAAA,KAAKb,GAAM,OAAO,UAC7B,KAAMsB,EAAQ,EACd,MAAOC,EAAS,CAClB,CACF,EAA6BV,EAAA,KAAKb,GAAM,OAAO,UAAU,EACzD,KACF,CACA,mBAA0B,CACxB,GAAImB,EAAK,KAAK,YAAcN,EAAA,KAAKb,GAAM,OAAO,UAC5C,MACFY,EAAM,MAAM,EACZ,OAAO,MAAM,EACb,KAAK,YAAcO,EAAK,KAAK,YAC7B,KAAK,KAAOA,EAAK,KAAK,KACtBJ,EAAQI,EAAK,IAAI,EACjB,KACF,CACF,CACF,EACA,OAAO,iBAAiB,UAAWD,CAAa,EAEhDJ,EAAU,IAAM,CACd,cAAcG,CAAK,EACnB,OAAO,oBAAoB,UAAWC,CAAa,CACrD,CACF,CAAC,EAAE,QAAQ,IAAMJ,GAAA,YAAAA,GAAW,CAC9B,CAGO,SAAgB,CACrB,KAAK,YAAc,KACnB,KAAK,KAAO,IACd,CAGa,aAA6B,QAAAU,EAAA,sBACxC,IAAMC,EAAM,MAAMC,EAA2Bb,EAAA,KAAKb,GAAO,gBAAiB,CACxE,OAAQ,MACV,CAAC,EACD,GAAIyB,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,YAAK,KAAOA,EAAI,KACTA,EAAI,IACb,GAGO,aAAaE,EAGI,CACtB,IAAMC,EAAuBC,GAA8B,EACrDA,EAAM,MAAQ,qBAA2BA,EAAM,MAAQ,aAAmBA,EAAM,MAAQ,OAC1FF,EAAS,CACP,gBAAiB,KAAK,gBACtB,KAAM,KAAK,IACb,CAAC,CAEL,EAEA,cAAO,iBAAiB,UAAWC,CAAmB,EAE/C,IAAM,CACX,OAAO,oBAAoB,UAAWA,CAAmB,CAC3D,CACF,CACF,EAzHW5B,EAAA,YACAC,EAAA,YIzCX,IAAA6B,EAQaC,EAAN,KAAmB,CAIxB,YAAYC,EAAkBC,EAAoB,CAHlDC,EAAA,KAASJ,GAIPK,EAAA,KAAKL,EAAQE,GACb,KAAK,WAAaC,CACpB,CAGa,MAK4B,QAAAG,EAAA,yBALvB,CAAE,OAAAC,EAAQ,KAAAC,EAAM,MAAAC,EAAO,KAAAC,CAAK,EAK1C,CAAC,EAAoC,CACvC,GAAKD,EAYA,CACH,IAAME,EAAM,MAAMC,EAA6CC,EAAA,KAAKb,GAAO,KAAK,IAAI,OAAO,EAAG,CAC5F,OAAQ,OACR,KAAM,CAAE,OAAAO,EAAQ,KAAAC,EAAM,MAAAC,EAAO,KAAAC,CAAK,CACpC,CAAC,EACD,GAAIC,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,OAAOA,EAAI,IACb,KApBY,CACV,IAAMA,EAAM,MAAMC,EAA+BC,EAAA,KAAKb,GAAO,KAAK,IAAI,OAAO,EAAG,CAC9E,OAAQ,OACR,KAAM,CAAE,OAAAO,EAAQ,KAAAC,CAAK,CACvB,CAAC,EACD,GAAIG,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,MAAO,CACL,MAAOA,EAAI,KAAK,OAChB,KAAMA,EAAI,IACZ,CACF,CAUF,GAGa,IAAIG,EAAoC,QAAAR,EAAA,sBACnD,IAAMK,EAAM,MAAMC,EAA6BC,EAAA,KAAKb,GAAO,KAAK,IAAI,IAAIc,CAAE,EAAE,EAAG,CAC7E,OAAQ,KACV,CAAC,EACD,GAAIH,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,OAAOA,EAAI,IACb,GAGa,OAAOI,EAA4C,QAAAT,EAAA,sBAC9D,IAAMK,EAAM,MAAMC,EAA6BC,EAAA,KAAKb,GAAO,KAAK,IAAI,EAAG,CACrE,OAAQ,OACR,KAAMe,CACR,CAAC,EACD,GAAIJ,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,OAAOA,EAAI,IACb,GAGa,WAAWI,EAAgD,QAAAT,EAAA,sBACtE,IAAMK,EAAM,MAAMC,EAA+BC,EAAA,KAAKb,GAAO,KAAK,IAAI,QAAQ,EAAG,CAC/E,OAAQ,OACR,KAAMe,CACR,CAAC,EACD,GAAIJ,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,OAAOA,EAAI,IACb,GAGa,OAAOG,EAAYC,EAA4C,QAAAT,EAAA,sBAC1E,IAAMK,EAAM,MAAMC,EAA6BC,EAAA,KAAKb,GAAO,KAAK,IAAI,EAAG,CACrE,OAAQ,MACR,KAAM,CAAE,OAAQ,CAAE,IAAKc,CAAG,EAAG,OAAQC,CAAK,CAC5C,CAAC,EACD,GAAIJ,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,EAC7B,OAAOA,EAAI,IACb,GAGa,OAAOG,EAA2B,QAAAR,EAAA,sBAC7C,IAAMK,EAAM,MAAMC,EAA2BC,EAAA,KAAKb,GAAO,KAAK,IAAI,IAAIc,CAAE,EAAE,EAAG,CAC3E,OAAQ,QACV,CAAC,EACD,GAAIH,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,CAC/B,GAGa,WAAWK,EAA8B,QAAAV,EAAA,sBACpD,IAAMK,EAAM,MAAMC,EAA2BC,EAAA,KAAKb,GAAO,KAAK,IAAI,eAAe,EAAG,CAClF,OAAQ,SACR,OAAQ,CAAE,IAAAgB,CAAI,CAChB,CAAC,EACD,GAAIL,EAAI,OAAS,IACf,MAAM,IAAI,MAAMA,EAAI,OAAO,CAC/B,GAEQ,IAAIM,EAAS,GAAY,CAC/B,MAAO,OAAOJ,EAAA,KAAKb,GAAM,OAAO,SAAS,IAAI,KAAK,UAAU,aAAaiB,CAAM,EACjF,CACF,EAvGWjB,EAAA,YCTX,IAAAkB,EAGaC,EAAN,KAAqB,CAI1B,YAAYC,EAAkB,CAH9BC,EAAA,KAASH,GAIP,OAAAI,EAAA,KAAKJ,EAAQE,GACN,IAAI,MAAM,KAAM,CACrB,IAAIG,EAAwBC,EAAW,CACrC,OAAMA,KAAKD,IACTA,EAAOC,CAAC,EAAI,IAAIC,EAAaC,EAAAH,EAAOL,GAAOM,CAAC,GACvCD,EAAOC,CAAC,CACjB,CACF,CAAC,CACH,CACF,EAbWN,EAAA,YCKJ,IAAMS,EAAN,KAAiB,CAMtB,YAAYC,EAA0B,CACpC,KAAK,OAASA,EACd,KAAK,KAAO,IAAIC,EAAe,IAAI,EACnC,KAAK,SAAW,IAAIC,EAAe,IAAI,CACzC,CACF,EAEO,SAASC,EAAaH,EAAsC,CACjE,OAAO,IAAID,EAAWC,CAAM,CAC9B","names":["index_exports","__export","EntitiesClient","EntityClient","LumiAuthClient","LumiClient","createClient","__toCommonJS","import_uuid","import_ofetch","request","lumi","uri","options","__spreadValues","getIcon","_a","_b","getTitle","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","LumiAuthClient","lumi","__privateAdd","__privateSet","getStorage","accessToken","setStorage","user","left","top","popup","__privateGet","cleanup","resolve","reject","timer","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","event","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","LumiClient","config","LumiAuthClient","EntitiesClient","createClient"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/auth-client.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/lib/error.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["export * from './core/auth-client'\nexport * from './core/entities-client'\nexport * from './core/entity-client'\nexport * from './core/lumi-client'\nexport * from './core/tools-client'\nexport * from './tools'\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n createdTime: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: MessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n return getStorage<string>(StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n setStorage(StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n /** 用户 */\n public get user(): User | null {\n return getStorage<User>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(this.#lumi.config.authOrigin, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case MessageType.READY: {\n popup.postMessage({\n type: MessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case MessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n window.addEventListener('message', handleMessage)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n }\n }).finally(() => cleanup?.())\n }\n\n /** 退出登录 */\n public signOut(): void {\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n const handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n if (lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n })\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n","import type { StorageKey } from '@/constants'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/find'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","export class LumiError extends Error {\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport interface UploadItem {\n fileName: string\n fileUrl?: string\n uploadError?: string\n}\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n }\n}\n","import { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n\n constructor(config: LumiClientConfig) {\n this.config = config\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n }\n}\n\nexport function createClient(config: LumiClientConfig): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["index_exports","__export","EmailTool","EntitiesClient","EntityClient","FileTool","LumiAuthClient","LumiClient","ToolsClient","createClient","__toCommonJS","import_uuid","import_ofetch","request","lumi","uri","options","__spreadValues","getIcon","_a","_b","getTitle","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","LumiAuthClient","lumi","__privateAdd","__privateSet","getStorage","accessToken","setStorage","user","left","top","popup","__privateGet","cleanup","resolve","reject","timer","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","event","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","LumiError","code","message","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","LumiClient","config","LumiAuthClient","EntitiesClient","ToolsClient","createClient"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var U=Object.defineProperty;var R=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var P=i=>{throw TypeError(i)};var v=(i,e,t)=>e in i?U(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,C=(i,e)=>{for(var t in e||(e={}))$.call(e,t)&&v(i,t,e[t]);if(R)for(var t of R(e))j.call(e,t)&&v(i,t,e[t]);return i};var M=(i,e,t)=>e.has(i)||P("Cannot "+t);var n=(i,e,t)=>(M(i,e,"read from private field"),t?t.call(i):e.get(i)),m=(i,e,t)=>e.has(i)?P("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),d=(i,e,t,r)=>(M(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t);var l=(i,e,t)=>new Promise((r,c)=>{var s=u=>{try{f(t.next(u))}catch(y){c(y)}},h=u=>{try{f(t.throw(u))}catch(y){c(y)}},f=u=>u.done?r(u.value):Promise.resolve(u.value).then(s,h);f((t=t.apply(i,e)).next())});import{v4 as _}from"uuid";import{ofetch as K}from"ofetch";function a(i,e,t={}){return i.auth.accessToken&&(t.headers=C({Authorization:`Bearer ${i.auth.accessToken}`},t.headers)),K(e,C({baseURL:i.config.apiBaseUrl},t))}function D(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function O(){var i;return(i=document.title)!=null?i:null}function I(i,e,t=localStorage){let r=t.getItem(i),c=e?JSON.stringify(e):null;c?t.setItem(i,c):t.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:r,newValue:c,storageArea:t}))}function A(i,e=localStorage){let t=e.getItem(i);try{return t?JSON.parse(t):null}catch(r){return null}}var g,T,E=class{constructor(e){m(this,g);m(this,T,`lumi-auth-${_()}`);d(this,g,e)}get accessToken(){return A("lumi-access-token")}set accessToken(e){I("lumi-access-token",e)}get user(){return A("lumi-user")}set user(e){I("lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){let r=(window.screen.width-800)/2,c=(window.screen.height-600)/2,s=window.open(n(this,g).config.authOrigin,n(this,T),`width=800,height=600,left=${r},top=${c}`),h;return new Promise((f,u)=>{if(!s)return u(new Error("Open auth window failed"));let y=setInterval(()=>{s.closed&&u(new Error("Auth window closed"))},1e3),L=({data:p,origin:k,source:N})=>{if(!(k!==n(this,g).config.authOrigin||N!==s))switch(p==null?void 0:p.type){case"lumi-ready":{s.postMessage({type:"lumi-init",data:{projectId:n(this,g).config.projectId,icon:D(),title:O()}},n(this,g).config.authOrigin);break}case"lumi-sign-in":{if(p.data.projectId!==n(this,g).config.projectId)break;s.close(),window.focus(),this.accessToken=p.data.accessToken,this.user=p.data.user,f(p.data);break}}};window.addEventListener("message",L),h=()=>{clearInterval(y),window.removeEventListener("message",L)}}).finally(()=>h==null?void 0:h())}signOut(){this.accessToken=null,this.user=null}refreshUser(){return l(this,null,function*(){let e=yield a(n(this,g),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){let t=r=>{(r.key==="lumi-access-token"||r.key==="lumi-user"||r.key===null)&&e({isAuthenticated:this.isAuthenticated,user:this.user})};return window.addEventListener("storage",t),()=>{window.removeEventListener("storage",t)}}};g=new WeakMap,T=new WeakMap;var o,b=class{constructor(e,t){m(this,o);d(this,o,e),this.entityName=t}list(){return l(this,arguments,function*({filter:e,sort:t,limit:r,skip:c}={}){if(r){let s=yield a(n(this,o),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:c}});if(s.code!==200)throw new Error(s.message);return s.data}else{let s=yield a(n(this,o),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(s.code!==200)throw new Error(s.message);return{total:s.data.length,list:s.data}}})}get(e){return l(this,null,function*(){let t=yield a(n(this,o),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return l(this,null,function*(){let t=yield a(n(this,o),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return l(this,null,function*(){let t=yield a(n(this,o),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return l(this,null,function*(){let r=yield a(n(this,o),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return l(this,null,function*(){let t=yield a(n(this,o),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return l(this,null,function*(){let t=yield a(n(this,o),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${n(this,o).config.projectId}/${this.entityName}/documents${e}`}};o=new WeakMap;var w,S=class{constructor(e){m(this,w);return d(this,w,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new b(n(t,w),r)),t[r]}})}};w=new WeakMap;var x=class{constructor(e){this.config=e,this.auth=new E(this),this.entities=new S(this)}};function ae(i){return new x(i)}export{S as EntitiesClient,b as EntityClient,E as LumiAuthClient,x as LumiClient,ae as createClient};
1
+ var B=Object.defineProperty;var N=Object.getOwnPropertySymbols;var G=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable;var $=i=>{throw TypeError(i)};var k=(i,e,t)=>e in i?B(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t,v=(i,e)=>{for(var t in e||(e={}))G.call(e,t)&&k(i,t,e[t]);if(N)for(var t of N(e))J.call(e,t)&&k(i,t,e[t]);return i};var j=(i,e,t)=>e.has(i)||$("Cannot "+t);var s=(i,e,t)=>(j(i,e,"read from private field"),t?t.call(i):e.get(i)),l=(i,e,t)=>e.has(i)?$("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t),m=(i,e,t,r)=>(j(i,e,"write to private field"),r?r.call(i,t):e.set(i,t),t);var c=(i,e,t)=>new Promise((r,a)=>{var n=g=>{try{y(t.next(g))}catch(h){a(h)}},p=g=>{try{y(t.throw(g))}catch(h){a(h)}},y=g=>g.done?r(g.value):Promise.resolve(g.value).then(n,p);y((t=t.apply(i,e)).next())});import{v4 as Y}from"uuid";import{ofetch as V}from"ofetch";function o(i,e,t={}){return i.auth.accessToken&&(t.headers=v({Authorization:`Bearer ${i.auth.accessToken}`},t.headers)),V(e,v({baseURL:i.config.apiBaseUrl},t))}function q(){var i,e;return(e=(i=document.querySelector('link[rel="icon"]'))==null?void 0:i.href)!=null?e:null}function K(){var i;return(i=document.title)!=null?i:null}function D(i,e,t=localStorage){let r=t.getItem(i),a=e?JSON.stringify(e):null;a?t.setItem(i,a):t.removeItem(i),window.dispatchEvent(new StorageEvent("storage",{key:i,oldValue:r,newValue:a,storageArea:t}))}function M(i,e=localStorage){let t=e.getItem(i);try{return t?JSON.parse(t):null}catch(r){return null}}var d,S,C=class{constructor(e){l(this,d);l(this,S,`lumi-auth-${Y()}`);m(this,d,e)}get accessToken(){return M("lumi-access-token")}set accessToken(e){D("lumi-access-token",e)}get user(){return M("lumi-user")}set user(e){D("lumi-user",e)}get isAuthenticated(){return!!this.accessToken}signIn(){let r=(window.screen.width-800)/2,a=(window.screen.height-600)/2,n=window.open(s(this,d).config.authOrigin,s(this,S),`width=800,height=600,left=${r},top=${a}`),p;return new Promise((y,g)=>{if(!n)return g(new Error("Open auth window failed"));let h=setInterval(()=>{n.closed&&g(new Error("Auth window closed"))},1e3),U=({data:w,origin:_,source:F})=>{if(!(_!==s(this,d).config.authOrigin||F!==n))switch(w==null?void 0:w.type){case"lumi-ready":{n.postMessage({type:"lumi-init",data:{projectId:s(this,d).config.projectId,icon:q(),title:K()}},s(this,d).config.authOrigin);break}case"lumi-sign-in":{if(w.data.projectId!==s(this,d).config.projectId)break;n.close(),window.focus(),this.accessToken=w.data.accessToken,this.user=w.data.user,y(w.data);break}}};window.addEventListener("message",U),p=()=>{clearInterval(h),window.removeEventListener("message",U)}}).finally(()=>p==null?void 0:p())}signOut(){this.accessToken=null,this.user=null}refreshUser(){return c(this,null,function*(){let e=yield o(s(this,d),"/lm/user/info",{method:"POST"});if(e.code!==200)throw new Error(e.message);return this.user=e.data,e.data})}onAuthChange(e){let t=r=>{(r.key==="lumi-access-token"||r.key==="lumi-user"||r.key===null)&&e({isAuthenticated:this.isAuthenticated,user:this.user})};return window.addEventListener("storage",t),()=>{window.removeEventListener("storage",t)}}};d=new WeakMap,S=new WeakMap;var u,I=class{constructor(e,t){l(this,u);m(this,u,e),this.entityName=t}list(){return c(this,arguments,function*({filter:e,sort:t,limit:r,skip:a}={}){if(r){let n=yield o(s(this,u),this.uri("/find"),{method:"POST",body:{filter:e,sort:t,limit:r,skip:a}});if(n.code!==200)throw new Error(n.message);return n.data}else{let n=yield o(s(this,u),this.uri("/list"),{method:"POST",body:{filter:e,sort:t}});if(n.code!==200)throw new Error(n.message);return{total:n.data.length,list:n.data}}})}get(e){return c(this,null,function*(){let t=yield o(s(this,u),this.uri(`/${e}`),{method:"GET"});if(t.code!==200)throw new Error(t.message);return t.data})}create(e){return c(this,null,function*(){let t=yield o(s(this,u),this.uri(),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}createMany(e){return c(this,null,function*(){let t=yield o(s(this,u),this.uri("/batch"),{method:"POST",body:e});if(t.code!==200)throw new Error(t.message);return t.data})}update(e,t){return c(this,null,function*(){let r=yield o(s(this,u),this.uri(),{method:"PUT",body:{filter:{_id:e},update:t}});if(r.code!==200)throw new Error(r.message);return r.data})}delete(e){return c(this,null,function*(){let t=yield o(s(this,u),this.uri(`/${e}`),{method:"DELETE"});if(t.code!==200)throw new Error(t.message)})}deleteMany(e){return c(this,null,function*(){let t=yield o(s(this,u),this.uri("/batch-by-ids"),{method:"DELETE",params:{ids:e}});if(t.code!==200)throw new Error(t.message)})}uri(e=""){return`/lm/${s(this,u).config.projectId}/${this.entityName}/documents${e}`}};u=new WeakMap;var T,L=class{constructor(e){l(this,T);return m(this,T,e),new Proxy(this,{get(t,r){return r in t||(t[r]=new I(s(t,T),r)),t[r]}})}};T=new WeakMap;var E=class extends Error{constructor(e,t){super(t),this.code=e}};var b,x=class{constructor(e){l(this,b);m(this,b,e)}send(g){return c(this,arguments,function*({to:e,subject:t,fromName:r,html:a,text:n="",replyTo:p,scheduledAt:y}){if(!e||!t||!a&&!n)throw new Error("Failed to send email: Missing required parameters.");typeof e=="string"&&(e=[e]),typeof p=="string"&&(p=[p]);let h=yield o(s(this,b),`/lm/${s(this,b).config.projectId}/email/send`,{method:"POST",body:{to:e,subject:t,fromName:r,html:a,text:n,replyTo:p,scheduledAt:y}});if(h.code!==200)throw new E(h.code,h.message)})}};b=new WeakMap;var f,A=class{constructor(e){l(this,f);m(this,f,e)}upload(e){return c(this,null,function*(){let t=new FormData;e.forEach(a=>{t.append("files",a)});let r=yield o(s(this,f),`/lm/${s(this,f).config.projectId}/file/batch`,{method:"POST",headers:{"Content-Type":"multipart/form-data"},body:t});if(r.code!==200)throw new E(r.code,r.message);return r.data})}delete(e){return c(this,null,function*(){let t=yield o(s(this,f),`/lm/${s(this,f).config.projectId}/file/batch`,{method:"DELETE",body:{fileUrls:e}});if(t.code!==200)throw new E(t.code,t.message)})}};f=new WeakMap;var P,R=class{constructor(e){l(this,P);m(this,P,e),this.email=new x(e),this.file=new A(e)}};P=new WeakMap;var O=class{constructor(e){this.config=e,this.auth=new C(this),this.entities=new L(this),this.tools=new R(this)}};function Ae(i){return new O(i)}export{x as EmailTool,L as EntitiesClient,I as EntityClient,A as FileTool,C as LumiAuthClient,O as LumiClient,R as ToolsClient,Ae as createClient};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/auth-client.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n createdTime: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: MessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n return getStorage<string>(StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n setStorage(StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n /** 用户 */\n public get user(): User | null {\n return getStorage<User>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(this.#lumi.config.authOrigin, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case MessageType.READY: {\n popup.postMessage({\n type: MessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case MessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n window.addEventListener('message', handleMessage)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n }\n }).finally(() => cleanup?.())\n }\n\n /** 退出登录 */\n public signOut(): void {\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n const handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n if (lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n })\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n","import type { StorageKey } from '@/constants'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/find'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","import { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n\n constructor(config: LumiClientConfig) {\n this.config = config\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n }\n}\n\nexport function createClient(config: LumiClientConfig): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["v4","ofetch","request","lumi","uri","options","__spreadValues","ofetch","getIcon","_a","_b","getTitle","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","getStorage","accessToken","setStorage","user","left","top","popup","__privateGet","cleanup","resolve","reject","timer","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","event","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","LumiClient","config","LumiAuthClient","EntitiesClient","createClient"]}
1
+ {"version":3,"sources":["../src/core/auth-client.ts","../src/lib/request.ts","../src/utils/common.ts","../src/utils/storage.ts","../src/core/entity-client.ts","../src/core/entities-client.ts","../src/lib/error.ts","../src/tools/email-tool.ts","../src/tools/file-tool.ts","../src/core/tools-client.ts","../src/core/lumi-client.ts"],"sourcesContent":["import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { v4 } from 'uuid'\nimport { MessageType, StorageKey } from '@/constants'\nimport { request } from '@/lib/request'\nimport { getIcon, getTitle } from '@/utils/common'\nimport { getStorage, setStorage } from '@/utils/storage'\n\nexport interface User {\n userId: string\n email: string\n userName: string\n createdTime: string\n}\n\nexport interface MessageSignInData {\n projectId: string\n accessToken: string\n user: User\n}\n\nexport type MessageDataReceive = {\n type: MessageType.READY\n} | {\n type: MessageType.SIGN_IN\n data: MessageSignInData\n}\n\nexport interface MessageInitData {\n projectId: string\n icon: string | null\n title: string | null\n}\n\nexport interface MessageDataSend {\n type: MessageType.INIT\n data: MessageInitData\n}\n\nexport class LumiAuthClient {\n readonly #lumi: LumiClient\n readonly #popupName: string = `lumi-auth-${v4()}`\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 访问令牌 */\n public get accessToken(): string | null {\n return getStorage<string>(StorageKey.ACCESS_TOKEN)\n }\n\n public set accessToken(accessToken: string | null) {\n setStorage(StorageKey.ACCESS_TOKEN, accessToken)\n }\n\n /** 用户 */\n public get user(): User | null {\n return getStorage<User>(StorageKey.USER)\n }\n\n public set user(user: User | null) {\n setStorage(StorageKey.USER, user)\n }\n\n public get isAuthenticated(): boolean {\n return !!this.accessToken\n }\n\n /** 登录 */\n public signIn(): Promise<MessageSignInData> {\n const width = 800\n const height = 600\n const left = (window.screen.width - width) / 2\n const top = (window.screen.height - height) / 2\n const popup = window.open(this.#lumi.config.authOrigin, this.#popupName, `width=${width},height=${height},left=${left},top=${top}`)\n\n let cleanup: () => void\n return new Promise<MessageSignInData>((resolve, reject) => {\n if (!popup)\n return reject(new Error('Open auth window failed'))\n\n const timer = setInterval(() => {\n if (popup.closed)\n reject(new Error('Auth window closed'))\n }, 1000)\n\n const handleMessage = ({ data, origin, source }: MessageEvent<MessageDataReceive | null>): void => {\n if (origin !== this.#lumi.config.authOrigin || source !== popup)\n return\n\n switch (data?.type) {\n case MessageType.READY: {\n popup.postMessage({\n type: MessageType.INIT,\n data: {\n projectId: this.#lumi.config.projectId,\n icon: getIcon(),\n title: getTitle(),\n },\n } satisfies MessageDataSend, this.#lumi.config.authOrigin)\n break\n }\n case MessageType.SIGN_IN: {\n if (data.data.projectId !== this.#lumi.config.projectId)\n break\n popup.close()\n window.focus()\n this.accessToken = data.data.accessToken\n this.user = data.data.user\n resolve(data.data)\n break\n }\n }\n }\n window.addEventListener('message', handleMessage)\n\n cleanup = () => {\n clearInterval(timer)\n window.removeEventListener('message', handleMessage)\n }\n }).finally(() => cleanup?.())\n }\n\n /** 退出登录 */\n public signOut(): void {\n this.accessToken = null\n this.user = null\n }\n\n /** 获取当前用户 */\n public async refreshUser(): Promise<User> {\n const res = await request<ApiResponse<User>>(this.#lumi, '/lm/user/info', {\n method: 'POST',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n this.user = res.data\n return res.data\n }\n\n /** 监听登录状态变化 */\n public onAuthChange(callback: (args: {\n isAuthenticated: boolean\n user: User | null\n }) => void): () => void {\n const handleStorageChange = (event: StorageEvent): void => {\n if (event.key === StorageKey.ACCESS_TOKEN || event.key === StorageKey.USER || event.key === null) {\n callback({\n isAuthenticated: this.isAuthenticated,\n user: this.user,\n })\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\n }\n}\n","import type { FetchOptions } from 'ofetch'\nimport type { LumiClient } from '@/core/lumi-client'\nimport { ofetch } from 'ofetch'\n\nexport interface ApiResponse<T> {\n code: number\n message: string\n data: T\n}\n\nexport interface PaginationData<T> {\n total: number\n list: T[]\n}\n\nexport function request<T>(lumi: LumiClient, uri: string, options: FetchOptions<'json'> = {}): Promise<T> {\n if (lumi.auth.accessToken) {\n options.headers = {\n Authorization: `Bearer ${lumi.auth.accessToken}`,\n ...options.headers,\n }\n }\n\n return ofetch<T>(uri, {\n baseURL: lumi.config.apiBaseUrl,\n ...options,\n })\n}\n","export function getIcon(): string | null {\n return document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')?.href ?? null\n}\n\nexport function getTitle(): string | null {\n return document.title ?? null\n}\n","import type { StorageKey } from '@/constants'\n\nexport function setStorage<T>(key: StorageKey, value: T, storage: Storage = localStorage): void {\n const oldValue = storage.getItem(key)\n const newValue = value ? JSON.stringify(value) : null\n if (newValue)\n storage.setItem(key, newValue)\n else\n storage.removeItem(key)\n\n window.dispatchEvent(new StorageEvent('storage', {\n key,\n oldValue,\n newValue,\n storageArea: storage,\n }))\n}\n\nexport function getStorage<T>(key: StorageKey, storage: Storage = localStorage): T | null {\n const value = storage.getItem(key)\n try {\n return value ? JSON.parse(value) : null\n }\n catch (_e) {\n return null\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse, PaginationData } from '@/lib/request'\nimport { request } from '@/lib/request'\n\nexport interface Entity extends Record<string, any> {\n id: string\n}\n\nexport class EntityClient {\n readonly #lumi: LumiClient\n public readonly entityName: string\n\n constructor(lumi: LumiClient, entityName: string) {\n this.#lumi = lumi\n this.entityName = entityName\n }\n\n /** 查询文档列表 */\n public async list({ filter, sort, limit, skip }: {\n filter?: any\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n } = {}): Promise<PaginationData<Entity>> {\n if (!limit) {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/list'), {\n method: 'POST',\n body: { filter, sort },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return {\n total: res.data.length,\n list: res.data,\n }\n }\n else {\n const res = await request<ApiResponse<PaginationData<Entity>>>(this.#lumi, this.uri('/find'), {\n method: 'POST',\n body: { filter, sort, limit, skip },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n }\n\n /** 获取单个文档 */\n public async get(id: string): Promise<Entity | null> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(`/${id}`), {\n method: 'GET',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 创建文档 */\n public async create(data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 批量创建文档 */\n public async createMany(data: Record<string, any>[]): Promise<Entity[]> {\n const res = await request<ApiResponse<Entity[]>>(this.#lumi, this.uri('/batch'), {\n method: 'POST',\n body: data,\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 更新文档 */\n public async update(id: string, data: Record<string, any>): Promise<Entity> {\n const res = await request<ApiResponse<Entity>>(this.#lumi, this.uri(), {\n method: 'PUT',\n body: { filter: { _id: id }, update: data },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n return res.data\n }\n\n /** 删除文档 */\n public async delete(id: string): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri(`/${id}`), {\n method: 'DELETE',\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n /** 批量删除文档 */\n public async deleteMany(ids: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, this.uri('/batch-by-ids'), {\n method: 'DELETE',\n params: { ids },\n })\n if (res.code !== 200)\n throw new Error(res.message)\n }\n\n private uri(suffix = ''): string {\n return `/lm/${this.#lumi.config.projectId}/${this.entityName}/documents${suffix}`\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EntityClient } from '@/core/entity-client'\n\nexport class EntitiesClient {\n readonly #lumi: LumiClient\n [key: string]: EntityClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n return new Proxy(this, {\n get(target: EntitiesClient, p: string) {\n if (!(p in target))\n target[p] = new EntityClient(target.#lumi, p)\n return target[p]\n },\n }) as this\n }\n}\n","export class LumiError extends Error {\n code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport class EmailTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 发送邮件 */\n public async send({ to, subject, fromName, html, text = '', replyTo, scheduledAt }: {\n to: string | string[]\n subject: string\n fromName?: string\n html?: string\n text?: string\n replyTo?: string | string[]\n scheduledAt?: string\n }): Promise<void> {\n if (!to || !subject || (!html && !text))\n throw new Error('Failed to send email: Missing required parameters.')\n\n if (typeof to === 'string')\n to = [to]\n if (typeof replyTo === 'string')\n replyTo = [replyTo]\n\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/email/send`, {\n method: 'POST',\n body: { to, subject, fromName, html, text, replyTo, scheduledAt },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport type { ApiResponse } from '@/lib/request'\nimport { LumiError } from '@/lib/error'\nimport { request } from '@/lib/request'\n\nexport interface UploadItem {\n fileName: string\n fileUrl?: string\n uploadError?: string\n}\n\nexport class FileTool {\n readonly #lumi: LumiClient\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n }\n\n /** 上传文件 */\n public async upload(files: File[]): Promise<UploadItem[]> {\n const formData = new FormData()\n files.forEach((file) => {\n formData.append('files', file)\n })\n\n const res = await request<ApiResponse<UploadItem[]>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n body: formData,\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n\n return res.data\n }\n\n /** 批量删除文件 */\n public async delete(fileUrls: string[]): Promise<void> {\n const res = await request<ApiResponse<null>>(this.#lumi, `/lm/${this.#lumi.config.projectId}/file/batch`, {\n method: 'DELETE',\n body: { fileUrls },\n })\n\n if (res.code !== 200)\n throw new LumiError(res.code, res.message)\n }\n}\n","import type { LumiClient } from '@/core/lumi-client'\nimport { EmailTool, FileTool } from '@/tools'\n\nexport class ToolsClient {\n readonly #lumi: LumiClient\n\n public email: EmailTool\n public file: FileTool\n\n constructor(lumi: LumiClient) {\n this.#lumi = lumi\n this.email = new EmailTool(lumi)\n this.file = new FileTool(lumi)\n }\n}\n","import { LumiAuthClient } from '@/core/auth-client'\nimport { EntitiesClient } from '@/core/entities-client'\nimport { ToolsClient } from '@/core/tools-client'\n\nexport interface LumiClientConfig {\n projectId: string\n apiBaseUrl: string\n authOrigin: string\n}\n\nexport class LumiClient {\n public config: LumiClientConfig\n\n public auth: LumiAuthClient\n public entities: EntitiesClient\n public tools: ToolsClient\n\n constructor(config: LumiClientConfig) {\n this.config = config\n this.auth = new LumiAuthClient(this)\n this.entities = new EntitiesClient(this)\n this.tools = new ToolsClient(this)\n }\n}\n\nexport function createClient(config: LumiClientConfig): LumiClient {\n return new LumiClient(config)\n}\n"],"mappings":"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","names":["v4","ofetch","request","lumi","uri","options","__spreadValues","ofetch","getIcon","_a","_b","getTitle","setStorage","key","value","storage","oldValue","newValue","getStorage","_e","_lumi","_popupName","LumiAuthClient","lumi","__privateAdd","v4","__privateSet","getStorage","accessToken","setStorage","user","left","top","popup","__privateGet","cleanup","resolve","reject","timer","handleMessage","data","origin","source","getIcon","getTitle","__async","res","request","callback","handleStorageChange","event","_lumi","EntityClient","lumi","entityName","__privateAdd","__privateSet","__async","filter","sort","limit","skip","res","request","__privateGet","id","data","ids","suffix","_lumi","EntitiesClient","lumi","__privateAdd","__privateSet","target","p","EntityClient","__privateGet","LumiError","code","message","_lumi","EmailTool","lumi","__privateAdd","__privateSet","_0","__async","to","subject","fromName","html","text","replyTo","scheduledAt","res","request","__privateGet","LumiError","_lumi","FileTool","lumi","__privateAdd","__privateSet","files","__async","formData","file","res","request","__privateGet","LumiError","fileUrls","_lumi","ToolsClient","lumi","__privateAdd","__privateSet","EmailTool","FileTool","LumiClient","config","LumiAuthClient","EntitiesClient","ToolsClient","createClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumi.new/sdk",
3
- "version": "0.0.10",
3
+ "version": "0.1.3",
4
4
  "description": "SDK for Lumi.new",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",