entity-client 1.0.16 → 1.0.17

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.
Files changed (74) hide show
  1. package/README.md +362 -362
  2. package/dist/EntityAppServerApi.d.ts +16 -0
  3. package/dist/EntityAppServerApi.js.map +1 -1
  4. package/dist/EntityServerApi.d.ts +12 -0
  5. package/dist/EntityServerApi.js.map +1 -1
  6. package/dist/client/base.d.ts +1 -0
  7. package/dist/client/base.js +1 -1
  8. package/dist/client/base.js.map +3 -3
  9. package/dist/client/hmac.js.map +1 -1
  10. package/dist/client/packet.js.map +1 -1
  11. package/dist/client/request.js.map +1 -1
  12. package/dist/client/utils.js.map +1 -1
  13. package/dist/hooks/useEntityAppServer.js.map +1 -1
  14. package/dist/hooks/useEntityClient.js.map +1 -1
  15. package/dist/hooks/useEntityServer.js.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +3 -3
  18. package/dist/mixins/app/index.js.map +1 -1
  19. package/dist/mixins/app/plugins/alimtalk.d.ts +1 -0
  20. package/dist/mixins/app/plugins/alimtalk.js.map +1 -1
  21. package/dist/mixins/app/plugins/friendtalk.d.ts +1 -0
  22. package/dist/mixins/app/plugins/friendtalk.js.map +1 -1
  23. package/dist/mixins/app/plugins/holidays.d.ts +1 -0
  24. package/dist/mixins/app/plugins/holidays.js.map +1 -1
  25. package/dist/mixins/app/plugins/identity.d.ts +1 -0
  26. package/dist/mixins/app/plugins/identity.js.map +1 -1
  27. package/dist/mixins/app/plugins/index.js.map +1 -1
  28. package/dist/mixins/app/plugins/llm.d.ts +1 -0
  29. package/dist/mixins/app/plugins/llm.js.map +1 -1
  30. package/dist/mixins/app/plugins/ocr.d.ts +1 -0
  31. package/dist/mixins/app/plugins/ocr.js.map +1 -1
  32. package/dist/mixins/app/plugins/pg.d.ts +1 -0
  33. package/dist/mixins/app/plugins/pg.js.map +1 -1
  34. package/dist/mixins/app/plugins/push.d.ts +1 -0
  35. package/dist/mixins/app/plugins/push.js.map +1 -1
  36. package/dist/mixins/app/plugins/sms.d.ts +1 -0
  37. package/dist/mixins/app/plugins/sms.js.map +1 -1
  38. package/dist/mixins/app/plugins/taxinvoice.d.ts +1 -0
  39. package/dist/mixins/app/plugins/taxinvoice.js.map +1 -1
  40. package/dist/mixins/app/routes/account.d.ts +1 -0
  41. package/dist/mixins/app/routes/account.js.map +1 -1
  42. package/dist/mixins/app/routes/board.d.ts +1 -0
  43. package/dist/mixins/app/routes/board.js.map +1 -1
  44. package/dist/mixins/app/routes/email-verify.d.ts +1 -0
  45. package/dist/mixins/app/routes/email-verify.js.map +1 -1
  46. package/dist/mixins/app/routes/oauth.d.ts +1 -0
  47. package/dist/mixins/app/routes/oauth.js.map +1 -1
  48. package/dist/mixins/app/routes/password-reset.d.ts +1 -0
  49. package/dist/mixins/app/routes/password-reset.js.map +1 -1
  50. package/dist/mixins/app/routes/two-factor.d.ts +1 -0
  51. package/dist/mixins/app/routes/two-factor.js.map +1 -1
  52. package/dist/mixins/server/admin.d.ts +1 -0
  53. package/dist/mixins/server/admin.js.map +1 -1
  54. package/dist/mixins/server/auth.d.ts +5 -0
  55. package/dist/mixins/server/auth.js +1 -1
  56. package/dist/mixins/server/auth.js.map +3 -3
  57. package/dist/mixins/server/entity.d.ts +1 -0
  58. package/dist/mixins/server/entity.js.map +1 -1
  59. package/dist/mixins/server/file.d.ts +1 -0
  60. package/dist/mixins/server/file.js.map +1 -1
  61. package/dist/mixins/server/index.js.map +1 -1
  62. package/dist/mixins/server/push.d.ts +1 -0
  63. package/dist/mixins/server/push.js.map +1 -1
  64. package/dist/mixins/server/smtp.d.ts +1 -0
  65. package/dist/mixins/server/smtp.js.map +1 -1
  66. package/dist/mixins/server/transaction.d.ts +1 -0
  67. package/dist/mixins/server/transaction.js.map +1 -1
  68. package/dist/mixins/server/utils.d.ts +1 -0
  69. package/dist/mixins/server/utils.js.map +1 -1
  70. package/dist/packet.js.map +1 -1
  71. package/dist/react.js +1 -1
  72. package/dist/react.js.map +3 -3
  73. package/dist/types.d.ts +1 -1
  74. package/package.json +57 -57
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/password-reset.ts"],
4
- "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function PasswordResetMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class PasswordResetMixinClass extends Base {\n requestPasswordReset<T = unknown>(\n body: { email: string } | Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/request\",\n body,\n false,\n );\n }\n\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\n return this.http.get(\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\n false,\n );\n }\n\n verifyPasswordReset<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/verify\",\n body,\n false,\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function PasswordResetMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class PasswordResetMixinClass extends Base {\r\n requestPasswordReset<T = unknown>(\r\n body: { email: string } | Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/request\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\r\n false,\r\n );\r\n }\r\n\r\n verifyPasswordReset<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAsCA,CAAK,CAC9C,qBACIC,EACU,CACV,OAAO,KAAK,KAAK,KACb,6BACAA,EACA,EACJ,CACJ,CAEA,2BAAwCC,EAA2B,CAC/D,OAAO,KAAK,KAAK,IACb,+BAA+B,mBAAmBA,CAAK,CAAC,GACxD,EACJ,CACJ,CAEA,oBACID,EACU,CACV,OAAO,KAAK,KAAK,KACb,4BACAA,EACA,EACJ,CACJ,CACJ,CACJ",
6
6
  "names": ["PasswordResetMixin", "Base", "body", "token"]
7
7
  }
@@ -76,6 +76,7 @@ export declare function TwoFactorMixin<TBase extends GConstructor<EntityServerCl
76
76
  applyCsrfHealth(): void;
77
77
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
78
78
  get reqOpts(): import("../../../client/request.js").RequestOptions;
79
+ prepareRequest(_withAuth: boolean): Promise<void>;
79
80
  get http(): {
80
81
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
81
82
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/two-factor.ts"],
4
- "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function TwoFactorMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TwoFactorMixinClass extends Base {\n setupTwoFactor<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/2fa/setup\", body);\n }\n\n verifyTwoFactorSetup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/setup/verify\",\n body,\n false,\n );\n }\n\n disableTwoFactor<T = unknown>(): Promise<T> {\n return this.http.delete(\"/v1/account/2fa\");\n }\n\n getTwoFactorStatus<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/2fa/status\");\n }\n\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery/regenerate\",\n );\n }\n\n verifyTwoFactor<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/verify\",\n body,\n false,\n );\n }\n\n recoverTwoFactorAccess<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery\",\n body,\n false,\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function TwoFactorMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TwoFactorMixinClass extends Base {\r\n setupTwoFactor<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/2fa/setup\", body);\r\n }\r\n\r\n verifyTwoFactorSetup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/setup/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n disableTwoFactor<T = unknown>(): Promise<T> {\r\n return this.http.delete(\"/v1/account/2fa\");\r\n }\r\n\r\n getTwoFactorStatus<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/2fa/status\");\r\n }\r\n\r\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery/regenerate\",\r\n );\r\n }\r\n\r\n verifyTwoFactor<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n recoverTwoFactorAccess<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAkCA,CAAK,CAC1C,eACIC,EACU,CACV,OAAO,KAAK,KAAK,KAAK,wBAAyBA,CAAI,CACvD,CAEA,qBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,+BACAA,EACA,EACJ,CACJ,CAEA,kBAA4C,CACxC,OAAO,KAAK,KAAK,OAAO,iBAAiB,CAC7C,CAEA,oBAA8C,CAC1C,OAAO,KAAK,KAAK,IAAI,wBAAwB,CACjD,CAEA,kCAA4D,CACxD,OAAO,KAAK,KAAK,KACb,qCACJ,CACJ,CAEA,gBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,yBACAA,EACA,EACJ,CACJ,CAEA,uBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,2BACAA,EACA,EACJ,CACJ,CACJ,CACJ",
6
6
  "names": ["TwoFactorMixin", "Base", "body"]
7
7
  }
@@ -120,6 +120,7 @@ export declare function AdminMixin<TBase extends GConstructor<EntityServerClient
120
120
  applyCsrfHealth(): void;
121
121
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
122
122
  get reqOpts(): import("../../client/request.js").RequestOptions;
123
+ prepareRequest(_withAuth: boolean): Promise<void>;
123
124
  get http(): {
124
125
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
125
126
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/admin.ts"],
4
- "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AdminMixinClass extends Base {\n adminPath(path: string): string {\n return `/v1/admin${path}`;\n }\n\n adminGet<T>(path: string): Promise<T> {\n return this.http.get(this.adminPath(path));\n }\n\n adminPost<T>(path: string, body?: unknown): Promise<T> {\n return this.http.post(this.adminPath(path), body);\n }\n\n adminPut<T>(path: string, body?: unknown): Promise<T> {\n return this.http.put(this.adminPath(path), body);\n }\n\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\n return this.http.patch(this.adminPath(path), body);\n }\n\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\n return this.http.delete(this.adminPath(path), body);\n }\n\n listAdminEntities<T = unknown>(): Promise<T> {\n return this.adminGet(\"/entities\");\n }\n\n getAdminErdSchema<T = unknown>(): Promise<T> {\n return this.adminGet(\"/erd/schema\");\n }\n\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\n return this.adminPost(\"/entities/batch-ensure\", configs);\n }\n\n createAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/create`, config);\n }\n\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\n return this.adminGet(`/${entity}/config`);\n }\n\n updateAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPut(`/${entity}/config`, config);\n }\n\n validateAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/validate` : \"/entity/validate\",\n config,\n );\n }\n\n normalizeAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\n config,\n );\n }\n\n getAdminEntityStats<T = unknown>(\n entity: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/stats`, body);\n }\n\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reindex`);\n }\n\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/sync-schema`);\n }\n\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reset`);\n }\n\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/truncate`);\n }\n\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/drop`);\n }\n\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\n return this.adminPost(\"/reset-all\", body);\n }\n\n listAdminConfigs<T = unknown>(): Promise<T> {\n return this.adminGet(\"/configs\");\n }\n\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\n return this.adminGet(`/configs/${domain}`);\n }\n\n updateAdminConfig<T = unknown>(\n domain: string,\n patch: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/configs/${domain}`, patch);\n }\n\n listAdminRoles<T = unknown>(): Promise<T> {\n return this.adminGet(\"/roles\");\n }\n\n createAdminRole<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/roles\", body);\n }\n\n getAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/roles/${seq}`);\n }\n\n updateAdminRole<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/roles/${seq}`, body);\n }\n\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/roles/${seq}`);\n }\n\n listAdminApiKeys<T = unknown>(): Promise<T> {\n return this.adminGet(\"/api-keys\");\n }\n\n createAdminApiKey<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/api-keys\", body);\n }\n\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/api-keys/${seq}`);\n }\n\n updateAdminApiKey<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/api-keys/${seq}`, body);\n }\n\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/api-keys/${seq}`);\n }\n\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\n }\n\n listAdminAccounts<T = unknown>(): Promise<T> {\n return this.adminGet(\"/accounts\");\n }\n\n createAdminAccount<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/accounts\", body);\n }\n\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/accounts/${seq}`);\n }\n\n updateAdminAccount<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/accounts/${seq}`, body);\n }\n\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}`);\n }\n\n listAdminLicenses<T = unknown>(): Promise<T> {\n return this.adminGet(\"/licenses\");\n }\n\n createAdminLicense<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/licenses\", body);\n }\n\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/licenses/${seq}`);\n }\n\n updateAdminLicense<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/licenses/${seq}`, body);\n }\n\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/licenses/${seq}`);\n }\n\n runAdminBackup<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/run\", body);\n }\n\n getAdminBackupStatus<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/status\", body);\n }\n\n listAdminBackups<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/list\", body);\n }\n\n restoreAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/restore\", body);\n }\n\n deleteAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/delete\", body);\n }\n\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}/2fa`);\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AdminMixinClass extends Base {\r\n adminPath(path: string): string {\r\n return `/v1/admin${path}`;\r\n }\r\n\r\n adminGet<T>(path: string): Promise<T> {\r\n return this.http.get(this.adminPath(path));\r\n }\r\n\r\n adminPost<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.post(this.adminPath(path), body);\r\n }\r\n\r\n adminPut<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.put(this.adminPath(path), body);\r\n }\r\n\r\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.patch(this.adminPath(path), body);\r\n }\r\n\r\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.delete(this.adminPath(path), body);\r\n }\r\n\r\n listAdminEntities<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/entities\");\r\n }\r\n\r\n getAdminErdSchema<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/erd/schema\");\r\n }\r\n\r\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\r\n return this.adminPost(\"/entities/batch-ensure\", configs);\r\n }\r\n\r\n createAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/create`, config);\r\n }\r\n\r\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\r\n return this.adminGet(`/${entity}/config`);\r\n }\r\n\r\n updateAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPut(`/${entity}/config`, config);\r\n }\r\n\r\n validateAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/validate` : \"/entity/validate\",\r\n config,\r\n );\r\n }\r\n\r\n normalizeAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\r\n config,\r\n );\r\n }\r\n\r\n getAdminEntityStats<T = unknown>(\r\n entity: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/stats`, body);\r\n }\r\n\r\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reindex`);\r\n }\r\n\r\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/sync-schema`);\r\n }\r\n\r\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reset`);\r\n }\r\n\r\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/truncate`);\r\n }\r\n\r\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/drop`);\r\n }\r\n\r\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\r\n return this.adminPost(\"/reset-all\", body);\r\n }\r\n\r\n listAdminConfigs<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/configs\");\r\n }\r\n\r\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\r\n return this.adminGet(`/configs/${domain}`);\r\n }\r\n\r\n updateAdminConfig<T = unknown>(\r\n domain: string,\r\n patch: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/configs/${domain}`, patch);\r\n }\r\n\r\n listAdminRoles<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/roles\");\r\n }\r\n\r\n createAdminRole<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/roles\", body);\r\n }\r\n\r\n getAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/roles/${seq}`);\r\n }\r\n\r\n updateAdminRole<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/roles/${seq}`, body);\r\n }\r\n\r\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/roles/${seq}`);\r\n }\r\n\r\n listAdminApiKeys<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/api-keys\");\r\n }\r\n\r\n createAdminApiKey<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/api-keys\", body);\r\n }\r\n\r\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/api-keys/${seq}`);\r\n }\r\n\r\n updateAdminApiKey<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/api-keys/${seq}`, body);\r\n }\r\n\r\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/api-keys/${seq}`);\r\n }\r\n\r\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\r\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\r\n }\r\n\r\n listAdminAccounts<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/accounts\");\r\n }\r\n\r\n createAdminAccount<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/accounts\", body);\r\n }\r\n\r\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/accounts/${seq}`);\r\n }\r\n\r\n updateAdminAccount<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/accounts/${seq}`, body);\r\n }\r\n\r\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}`);\r\n }\r\n\r\n listAdminLicenses<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/licenses\");\r\n }\r\n\r\n createAdminLicense<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/licenses\", body);\r\n }\r\n\r\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/licenses/${seq}`);\r\n }\r\n\r\n updateAdminLicense<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/licenses/${seq}`, body);\r\n }\r\n\r\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/licenses/${seq}`);\r\n }\r\n\r\n runAdminBackup<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/run\", body);\r\n }\r\n\r\n getAdminBackupStatus<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/status\", body);\r\n }\r\n\r\n listAdminBackups<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/list\", body);\r\n }\r\n\r\n restoreAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/restore\", body);\r\n }\r\n\r\n deleteAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/delete\", body);\r\n }\r\n\r\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}/2fa`);\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": ["AdminMixin", "Base", "path", "body", "configs", "entity", "config", "domain", "patch", "seq"]
7
7
  }
@@ -33,6 +33,9 @@ export type AuthLoginResponse = AuthLoginSuccessResponse | AuthLoginRequiresTwoF
33
33
  export declare function isAuthLoginSuccessResponse(response: AuthLoginResponse): response is AuthLoginSuccessResponse;
34
34
  export declare function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
35
35
  new (...args: any[]): {
36
+ authBootstrapPromise: Promise<void> | null;
37
+ authBootstrapToken: string;
38
+ authBootstrapAnonymousCompleted: boolean;
36
39
  csrfRefresher: () => Promise<void>;
37
40
  /**
38
41
  * 서버 헬스 체크를 수행하고 패킷 암호화 활성 여부를 자동으로 감지합니다.
@@ -52,6 +55,8 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
52
55
  /** document.cookie 또는 Node 환경에서 쿠키 값 읽기 (SSR 대응) */
53
56
  readCookie(name: string): string | null;
54
57
  ensurePublicAuthBootstrap(): Promise<void>;
58
+ ensureAuthenticatedRequestBootstrap(): Promise<void>;
59
+ prepareRequest(withAuth: boolean): Promise<void>;
55
60
  /** 로그인 응답을 반환합니다. 성공 시에만 `access_token`을 내부 상태에 저장합니다. */
56
61
  login(email: string, password: string): Promise<AuthLoginResponse>;
57
62
  /** HttpOnly refresh cookie로 Access Token을 재발급받아 내부 토큰을 교체합니다. */
@@ -1,2 +1,2 @@
1
- import{entityRequest as c}from"../../client/request.js";function h(n){return n.ok===!0&&n.requires_2fa!==!0&&typeof n.data=="object"&&n.data!==null&&"access_token"in n.data}function d(n){return class extends n{csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){const t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");const r=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),i=await r.json(),o=r.headers.get("X-Access-Token");o&&(this.token=o,e&&o!==t&&this.onTokenRefreshed?.(o,0),e&&i.authenticated===!0&&this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{}));const a=this.readCookie("anon_token");return i.packet_encryption===!0&&a&&(this.anonymousPacketToken=a,this.encryptRequests=!0),this.applyCsrfHealth(),e&&i.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),i}readCookie(e){if(typeof document>"u")return null;const t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;const e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async login(e,t){await this.ensurePublicAuthBootstrap();const s=await c(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return h(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick(),this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{})),s}async tokenRefresh(){const e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();const t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");const t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}export{d as AuthMixin,h as isAuthLoginSuccessResponse};
1
+ import{entityRequest as h}from"../../client/request.js";function u(n){return n.ok===!0&&n.requires_2fa!==!0&&typeof n.data=="object"&&n.data!==null&&"access_token"in n.data}function f(n){return class extends n{authBootstrapPromise=null;authBootstrapToken="";authBootstrapAnonymousCompleted=!1;csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){try{const t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");const r=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),o=await r.json(),i=r.headers.get("X-Access-Token");i&&(this.token=i,e&&i!==t&&this.onTokenRefreshed?.(i,0),e&&o.authenticated===!0&&this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{}));const a=this.readCookie("anon_token");return o.packet_encryption===!0&&a&&(this.anonymousPacketToken=a,this.encryptRequests=!0),this.applyCsrfHealth(),this.onHealthChange?.(!0),e&&o.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),o}catch(t){throw this.onHealthChange?.(!1),t}}readCookie(e){if(typeof document>"u")return null;const t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;const e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async ensureAuthenticatedRequestBootstrap(){if(!(typeof document>"u")&&!(this.apiKey&&this.hmacSecret)){if(this.token){if(this.authBootstrapToken===this.token)return}else if(this.authBootstrapAnonymousCompleted)return;return this.authBootstrapPromise?this.authBootstrapPromise:(this.authBootstrapPromise=this.checkHealth(!0).then(()=>{this.token?this.authBootstrapToken=this.token:this.authBootstrapAnonymousCompleted=!0}).finally(()=>{this.authBootstrapPromise=null}),this.authBootstrapPromise)}}async prepareRequest(e){await super.prepareRequest(e),e&&await this.ensureAuthenticatedRequestBootstrap()}async login(e,t){await this.ensurePublicAuthBootstrap();const s=await h(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return u(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick(),this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{})),s}async tokenRefresh(){const e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();const t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");const t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}export{f as AuthMixin,u as isAuthLoginSuccessResponse};
2
2
  //# sourceMappingURL=auth.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/auth.ts"],
4
- "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\nimport { entityRequest } from \"../../client/request.js\";\n\nexport interface AuthLoginSuccessData {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n force_password_change?: boolean;\n password_expired?: boolean;\n password_expires_in_days?: number;\n}\n\nexport interface AuthLoginSuccessResponse {\n ok: true;\n data: AuthLoginSuccessData;\n requires_2fa?: false;\n}\n\nexport interface AuthLoginRequiresTwoFactorResponse {\n ok: true;\n requires_2fa: true;\n data: {\n two_factor_token: string;\n expires_in: number;\n };\n}\n\nexport interface AuthLoginSetupRequiredResponse {\n ok: false;\n error: \"2fa_setup_required\";\n message: string;\n data: {\n setup_token: string;\n expires_in: number;\n };\n}\n\nexport type AuthLoginResponse =\n | AuthLoginSuccessResponse\n | AuthLoginRequiresTwoFactorResponse\n | AuthLoginSetupRequiredResponse;\n\nexport function isAuthLoginSuccessResponse(\n response: AuthLoginResponse,\n): response is AuthLoginSuccessResponse {\n return (\n response.ok === true &&\n response.requires_2fa !== true &&\n typeof response.data === \"object\" &&\n response.data !== null &&\n \"access_token\" in response.data\n );\n}\n\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AuthMixinClass extends Base {\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n csrfRefresher = (): Promise<void> =>\n this.checkHealth(this.keepSession).then(() => {});\n\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * ```ts\n * await client.checkHealth();\n * await client.login(email, password);\n * ```\n */\n async checkHealth(bootstrapAuth = false): Promise<{\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n }> {\n const previousToken = this.token;\n const headers: Record<string, string> = {};\n if (bootstrapAuth) {\n headers[\"X-Session-Bootstrap\"] = \"1\";\n }\n\n const res = await fetch(`${this.baseUrl}/v1/health`, {\n signal: AbortSignal.timeout(3000),\n credentials: \"include\",\n headers,\n });\n const data = (await res.json()) as {\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n };\n\n const accessToken = res.headers.get(\"X-Access-Token\");\n if (accessToken) {\n this.token = accessToken;\n if (bootstrapAuth && accessToken !== previousToken) {\n this.onTokenRefreshed?.(accessToken, 0);\n }\n if (\n bootstrapAuth &&\n data.authenticated === true &&\n this.realtimeEnabled &&\n this.realtimeAutoConnect\n ) {\n this.connectRealtime().catch(() => {});\n }\n }\n\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\n const anonToken = this.readCookie(\"anon_token\");\n if (data.packet_encryption === true && anonToken) {\n this.anonymousPacketToken = anonToken;\n this.encryptRequests = true;\n }\n\n this.applyCsrfHealth();\n if (\n bootstrapAuth &&\n data.authenticated === false &&\n previousToken\n ) {\n this.disconnectRealtime(\"session_expired\");\n this.onSessionExpired?.(new Error(\"Session expired\"));\n }\n return data;\n }\n\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\n readCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\";\")\n .map((c) => c.trim())\n .find((c) => c.startsWith(`${name}=`));\n if (!match) return null;\n try {\n return decodeURIComponent(match.slice(name.length + 1));\n } catch {\n return match.slice(name.length + 1);\n }\n }\n\n async ensurePublicAuthBootstrap(): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (this.apiKey && this.hmacSecret) {\n return;\n }\n\n const hasAnonymousPacketToken =\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\n\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\n return;\n }\n\n await this.checkHealth(false);\n }\n\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async login(\n email: string,\n password: string,\n ): Promise<AuthLoginResponse> {\n await this.ensurePublicAuthBootstrap();\n\n const response = await entityRequest<AuthLoginResponse>(\n this.reqOpts,\n \"POST\",\n \"/v1/auth/login\",\n { email, passwd: password },\n false,\n {},\n { requireOkShape: false, allowStatuses: [403] },\n );\n\n if (isAuthLoginSuccessResponse(response)) {\n this.token = response.data.access_token;\n this.applyCsrfHealth();\n if (this.keepSession && this.healthTickTimer === null) {\n this.startHealthTick();\n }\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\n this.connectRealtime().catch(() => {});\n }\n }\n\n return response;\n }\n\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async tokenRefresh(): Promise<{\n access_token: string;\n refresh_token: string;\n expires_in: number;\n }> {\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async refreshToken(refreshToken?: string): Promise<{\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n }> {\n if (!refreshToken) {\n return this.tokenRefresh();\n }\n\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\n \"POST\",\n \"/v1/auth/refresh\",\n { refresh_token: refreshToken },\n false,\n );\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /**\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\n */\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\n this.stopKeepSession();\n this.stopHealthTick();\n this.disconnectRealtime(\"logout\");\n const data = await this.request<{ ok: boolean }>(\n \"POST\",\n \"/v1/auth/logout\",\n refreshToken ? { refresh_token: refreshToken } : undefined,\n false,\n );\n this.token = \"\";\n this.applyCsrfHealth();\n return data;\n }\n\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\n return this.request(\"GET\", \"/v1/auth/me\");\n }\n\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\n return this.request(\n \"POST\",\n \"/v1/auth/withdraw\",\n passwd ? { passwd } : {},\n );\n }\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["entityRequest", "isAuthLoginSuccessResponse", "response", "AuthMixin", "Base", "bootstrapAuth", "previousToken", "headers", "res", "data", "accessToken", "anonToken", "name", "match", "c", "hasAnonymousPacketToken", "hasCsrfCookie", "email", "password", "refreshToken", "passwd"]
4
+ "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\nimport { entityRequest } from \"../../client/request.js\";\r\n\r\nexport interface AuthLoginSuccessData {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n force_password_change?: boolean;\r\n password_expired?: boolean;\r\n password_expires_in_days?: number;\r\n}\r\n\r\nexport interface AuthLoginSuccessResponse {\r\n ok: true;\r\n data: AuthLoginSuccessData;\r\n requires_2fa?: false;\r\n}\r\n\r\nexport interface AuthLoginRequiresTwoFactorResponse {\r\n ok: true;\r\n requires_2fa: true;\r\n data: {\r\n two_factor_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport interface AuthLoginSetupRequiredResponse {\r\n ok: false;\r\n error: \"2fa_setup_required\";\r\n message: string;\r\n data: {\r\n setup_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport type AuthLoginResponse =\r\n | AuthLoginSuccessResponse\r\n | AuthLoginRequiresTwoFactorResponse\r\n | AuthLoginSetupRequiredResponse;\r\n\r\nexport function isAuthLoginSuccessResponse(\r\n response: AuthLoginResponse,\r\n): response is AuthLoginSuccessResponse {\r\n return (\r\n response.ok === true &&\r\n response.requires_2fa !== true &&\r\n typeof response.data === \"object\" &&\r\n response.data !== null &&\r\n \"access_token\" in response.data\r\n );\r\n}\r\n\r\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AuthMixinClass extends Base {\r\n authBootstrapPromise: Promise<void> | null = null;\r\n authBootstrapToken = \"\";\r\n authBootstrapAnonymousCompleted = false;\r\n\r\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\r\n csrfRefresher = (): Promise<void> =>\r\n this.checkHealth(this.keepSession).then(() => {});\r\n\r\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\r\n *\r\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * await client.checkHealth();\r\n * await client.login(email, password);\r\n * ```\r\n */\r\n async checkHealth(bootstrapAuth = false): Promise<{\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n }> {\r\n try {\r\n const previousToken = this.token;\r\n const headers: Record<string, string> = {};\r\n if (bootstrapAuth) {\r\n headers[\"X-Session-Bootstrap\"] = \"1\";\r\n }\r\n\r\n const res = await fetch(`${this.baseUrl}/v1/health`, {\r\n signal: AbortSignal.timeout(3000),\r\n credentials: \"include\",\r\n headers,\r\n });\r\n const data = (await res.json()) as {\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n };\r\n\r\n const accessToken = res.headers.get(\"X-Access-Token\");\r\n if (accessToken) {\r\n this.token = accessToken;\r\n if (bootstrapAuth && accessToken !== previousToken) {\r\n this.onTokenRefreshed?.(accessToken, 0);\r\n }\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === true &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoConnect\r\n ) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\r\n const anonToken = this.readCookie(\"anon_token\");\r\n if (data.packet_encryption === true && anonToken) {\r\n this.anonymousPacketToken = anonToken;\r\n this.encryptRequests = true;\r\n }\r\n\r\n this.applyCsrfHealth();\r\n this.onHealthChange?.(true);\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === false &&\r\n previousToken\r\n ) {\r\n this.disconnectRealtime(\"session_expired\");\r\n this.onSessionExpired?.(new Error(\"Session expired\"));\r\n }\r\n return data;\r\n } catch (error) {\r\n this.onHealthChange?.(false);\r\n throw error;\r\n }\r\n }\r\n\r\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\r\n readCookie(name: string): string | null {\r\n if (typeof document === \"undefined\") return null;\r\n const match = document.cookie\r\n .split(\";\")\r\n .map((c) => c.trim())\r\n .find((c) => c.startsWith(`${name}=`));\r\n if (!match) return null;\r\n try {\r\n return decodeURIComponent(match.slice(name.length + 1));\r\n } catch {\r\n return match.slice(name.length + 1);\r\n }\r\n }\r\n\r\n async ensurePublicAuthBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n const hasAnonymousPacketToken =\r\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\r\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\r\n\r\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\r\n return;\r\n }\r\n\r\n await this.checkHealth(false);\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 health \uAE30\uBC18 \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uD55C \uBC88 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\r\n async ensureAuthenticatedRequestBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n if (this.token) {\r\n if (this.authBootstrapToken === this.token) {\r\n return;\r\n }\r\n } else if (this.authBootstrapAnonymousCompleted) {\r\n return;\r\n }\r\n\r\n if (this.authBootstrapPromise) {\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n this.authBootstrapPromise = this.checkHealth(true)\r\n .then(() => {\r\n if (this.token) {\r\n this.authBootstrapToken = this.token;\r\n } else {\r\n this.authBootstrapAnonymousCompleted = true;\r\n }\r\n })\r\n .finally(() => {\r\n this.authBootstrapPromise = null;\r\n });\r\n\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804 \uC790\uB3D9 health \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n override async prepareRequest(withAuth: boolean): Promise<void> {\r\n await super.prepareRequest(withAuth);\r\n if (!withAuth) {\r\n return;\r\n }\r\n\r\n await this.ensureAuthenticatedRequestBootstrap();\r\n }\r\n\r\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async login(\r\n email: string,\r\n password: string,\r\n ): Promise<AuthLoginResponse> {\r\n await this.ensurePublicAuthBootstrap();\r\n\r\n const response = await entityRequest<AuthLoginResponse>(\r\n this.reqOpts,\r\n \"POST\",\r\n \"/v1/auth/login\",\r\n { email, passwd: password },\r\n false,\r\n {},\r\n { requireOkShape: false, allowStatuses: [403] },\r\n );\r\n\r\n if (isAuthLoginSuccessResponse(response)) {\r\n this.token = response.data.access_token;\r\n this.applyCsrfHealth();\r\n if (this.keepSession && this.healthTickTimer === null) {\r\n this.startHealthTick();\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async tokenRefresh(): Promise<{\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n }> {\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async refreshToken(refreshToken?: string): Promise<{\r\n access_token: string;\r\n refresh_token?: string;\r\n expires_in: number;\r\n }> {\r\n if (!refreshToken) {\r\n return this.tokenRefresh();\r\n }\r\n\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\r\n \"POST\",\r\n \"/v1/auth/refresh\",\r\n { refresh_token: refreshToken },\r\n false,\r\n );\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /**\r\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\r\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\r\n */\r\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\r\n this.stopKeepSession();\r\n this.stopHealthTick();\r\n this.disconnectRealtime(\"logout\");\r\n const data = await this.request<{ ok: boolean }>(\r\n \"POST\",\r\n \"/v1/auth/logout\",\r\n refreshToken ? { refresh_token: refreshToken } : undefined,\r\n false,\r\n );\r\n this.token = \"\";\r\n this.applyCsrfHealth();\r\n return data;\r\n }\r\n\r\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"GET\", \"/v1/auth/me\");\r\n }\r\n\r\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\r\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n \"/v1/auth/withdraw\",\r\n passwd ? { passwd } : {},\r\n );\r\n }\r\n };\r\n}\r\n"],
5
+ "mappings": "AAIA,OAAS,iBAAAA,MAAqB,0BAyCvB,SAASC,EACZC,EACoC,CACpC,OACIA,EAAS,KAAO,IAChBA,EAAS,eAAiB,IAC1B,OAAOA,EAAS,MAAS,UACzBA,EAAS,OAAS,MAClB,iBAAkBA,EAAS,IAEnC,CAEO,SAASC,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CACrC,qBAA6C,KAC7C,mBAAqB,GACrB,gCAAkC,GAGlC,cAAgB,IACZ,KAAK,YAAY,KAAK,WAAW,EAAE,KAAK,IAAM,CAAC,CAAC,EAcpD,MAAM,YAAYC,EAAgB,GAI/B,CACC,GAAI,CACA,MAAMC,EAAgB,KAAK,MACrBC,EAAkC,CAAC,EACrCF,IACAE,EAAQ,qBAAqB,EAAI,KAGrC,MAAMC,EAAM,MAAM,MAAM,GAAG,KAAK,OAAO,aAAc,CACjD,OAAQ,YAAY,QAAQ,GAAI,EAChC,YAAa,UACb,QAAAD,CACJ,CAAC,EACKE,EAAQ,MAAMD,EAAI,KAAK,EAMvBE,EAAcF,EAAI,QAAQ,IAAI,gBAAgB,EAChDE,IACA,KAAK,MAAQA,EACTL,GAAiBK,IAAgBJ,GACjC,KAAK,mBAAmBI,EAAa,CAAC,EAGtCL,GACAI,EAAK,gBAAkB,IACvB,KAAK,iBACL,KAAK,qBAEL,KAAK,gBAAgB,EAAE,MAAM,IAAM,CAAC,CAAC,GAK7C,MAAME,EAAY,KAAK,WAAW,YAAY,EAC9C,OAAIF,EAAK,oBAAsB,IAAQE,IACnC,KAAK,qBAAuBA,EAC5B,KAAK,gBAAkB,IAG3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAAI,EAEtBN,GACAI,EAAK,gBAAkB,IACvBH,IAEA,KAAK,mBAAmB,iBAAiB,EACzC,KAAK,mBAAmB,IAAI,MAAM,iBAAiB,CAAC,GAEjDG,CACX,OAASG,EAAO,CACZ,WAAK,iBAAiB,EAAK,EACrBA,CACV,CACJ,CAGA,WAAWC,EAA6B,CACpC,GAAI,OAAO,SAAa,IAAa,OAAO,KAC5C,MAAMC,EAAQ,SAAS,OAClB,MAAM,GAAG,EACT,IAAKC,GAAMA,EAAE,KAAK,CAAC,EACnB,KAAMA,GAAMA,EAAE,WAAW,GAAGF,CAAI,GAAG,CAAC,EACzC,GAAI,CAACC,EAAO,OAAO,KACnB,GAAI,CACA,OAAO,mBAAmBA,EAAM,MAAMD,EAAK,OAAS,CAAC,CAAC,CAC1D,MAAQ,CACJ,OAAOC,EAAM,MAAMD,EAAK,OAAS,CAAC,CACtC,CACJ,CAEA,MAAM,2BAA2C,CAK7C,GAJI,OAAO,SAAa,KAIpB,KAAK,QAAU,KAAK,WACpB,OAGJ,MAAMG,EACF,CAAC,CAAC,KAAK,sBAAwB,CAAC,CAAC,KAAK,WAAW,YAAY,EAC3DC,EAAgB,CAAC,CAAC,KAAK,WAAW,KAAK,cAAc,EAEvDD,GAA2BC,GAAiB,KAAK,aAIrD,MAAM,KAAK,YAAY,EAAK,CAChC,CAGA,MAAM,qCAAqD,CACvD,GAAI,SAAO,SAAa,MAIpB,OAAK,QAAU,KAAK,YAIxB,IAAI,KAAK,OACL,GAAI,KAAK,qBAAuB,KAAK,MACjC,eAEG,KAAK,gCACZ,OAGJ,OAAI,KAAK,qBACE,KAAK,sBAGhB,KAAK,qBAAuB,KAAK,YAAY,EAAI,EAC5C,KAAK,IAAM,CACJ,KAAK,MACL,KAAK,mBAAqB,KAAK,MAE/B,KAAK,gCAAkC,EAE/C,CAAC,EACA,QAAQ,IAAM,CACX,KAAK,qBAAuB,IAChC,CAAC,EAEE,KAAK,sBAChB,CAGA,MAAe,eAAeC,EAAkC,CAC5D,MAAM,MAAM,eAAeA,CAAQ,EAC9BA,GAIL,MAAM,KAAK,oCAAoC,CACnD,CAGA,MAAM,MACFC,EACAC,EAC0B,CAC1B,MAAM,KAAK,0BAA0B,EAErC,MAAMlB,EAAW,MAAMF,EACnB,KAAK,QACL,OACA,iBACA,CAAE,MAAAmB,EAAO,OAAQC,CAAS,EAC1B,GACA,CAAC,EACD,CAAE,eAAgB,GAAO,cAAe,CAAC,GAAG,CAAE,CAClD,EAEA,OAAInB,EAA2BC,CAAQ,IACnC,KAAK,MAAQA,EAAS,KAAK,aAC3B,KAAK,gBAAgB,EACjB,KAAK,aAAe,KAAK,kBAAoB,MAC7C,KAAK,gBAAgB,EAErB,KAAK,iBAAmB,KAAK,qBAC7B,KAAK,gBAAgB,EAAE,MAAM,IAAM,CAAC,CAAC,GAItCA,CACX,CAGA,MAAM,cAIH,CACC,MAAMO,EAAO,MAAM,KAAK,QAMrB,OAAQ,yBAA0B,OAAW,EAAK,EACrD,YAAK,MAAQA,EAAK,KAAK,aACvB,KAAK,gBAAgB,EACdA,EAAK,IAChB,CAGA,MAAM,aAAaY,EAIhB,CACC,GAAI,CAACA,EACD,OAAO,KAAK,aAAa,EAG7B,MAAMZ,EAAO,MAAM,KAAK,QAOpB,OACA,mBACA,CAAE,cAAeY,CAAa,EAC9B,EACJ,EACA,YAAK,MAAQZ,EAAK,KAAK,aACvB,KAAK,gBAAgB,EACdA,EAAK,IAChB,CAMA,MAAM,OAAOY,EAAiD,CAC1D,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,QAAQ,EAChC,MAAMZ,EAAO,MAAM,KAAK,QACpB,OACA,kBACAY,EAAe,CAAE,cAAeA,CAAa,EAAI,OACjD,EACJ,EACA,YAAK,MAAQ,GACb,KAAK,gBAAgB,EACdZ,CACX,CAGA,IAAqE,CACjE,OAAO,KAAK,QAAQ,MAAO,aAAa,CAC5C,CAGA,SAASa,EAA2C,CAChD,OAAO,KAAK,QACR,OACA,oBACAA,EAAS,CAAE,OAAAA,CAAO,EAAI,CAAC,CAC3B,CACJ,CACJ,CACJ",
6
+ "names": ["entityRequest", "isAuthLoginSuccessResponse", "response", "AuthMixin", "Base", "bootstrapAuth", "previousToken", "headers", "res", "data", "accessToken", "anonToken", "error", "name", "match", "c", "hasAnonymousPacketToken", "hasCsrfCookie", "withAuth", "email", "password", "refreshToken", "passwd"]
7
7
  }
@@ -162,6 +162,7 @@ export declare function EntityMixin<TBase extends GConstructor<EntityServerClien
162
162
  applyCsrfHealth(): void;
163
163
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
164
164
  get reqOpts(): import("../../client/request.js").RequestOptions;
165
+ prepareRequest(_withAuth: boolean): Promise<void>;
165
166
  get http(): {
166
167
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
167
168
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/entity.ts"],
4
- "sourcesContent": ["import type {\n EntityHistoryRecord,\n EntityListParams,\n EntityListResult,\n EntityQueryRequest,\n} from \"../../types.js\";\nimport { buildQuery } from \"../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class EntityMixinClass extends Base {\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async transStart(): Promise<string> {\n const res = await this.request<{\n ok: boolean;\n transaction_id: string;\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\n this.activeTxId = res.transaction_id;\n return this.activeTxId;\n }\n\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this.request(\"POST\", `/v1/transaction/rollback/${txId}`);\n }\n\n /**\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\n *\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\n */\n transCommit(transactionId?: string): Promise<{\n ok: boolean;\n results: Array<{ entity: string; action: string; seq: number }>;\n }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this.request(\"POST\", `/v1/transaction/commit/${txId}`);\n }\n\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\n return this.request(\"POST\", `/v1/entity/${entity}/meta`, {});\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\n validate<T = unknown>(\n entity: string,\n data: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(`/v1/entity/${entity}/validate`, data);\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n get<T = unknown>(\n entity: string,\n seq: number,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\n }\n\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\n find<T = unknown>(\n entity: string,\n conditions?: Record<string, unknown>,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/find${q}`,\n conditions ?? {},\n );\n }\n\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n list<T = unknown>(\n entity: string,\n params: EntityListParams = {},\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\n const queryObj: Record<string, unknown> = {\n page: 1,\n limit: 20,\n ...rest,\n };\n if (orderBy)\n queryObj.orderBy =\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\n if (fields?.length) queryObj.fields = fields.join(\",\");\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\n conditions ?? {},\n );\n }\n\n /**\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\n */\n count(\n entity: string,\n conditions?: Record<string, unknown>,\n ): Promise<{ ok: boolean; count: number }> {\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/count`,\n conditions ?? {},\n );\n }\n\n /**\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\n */\n query<T = unknown>(\n entity: string,\n req: EntityQueryRequest,\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\n return this.request(\"POST\", `/v1/entity/${entity}/query`, req);\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\n submit(\n entity: string,\n data: Record<string, unknown>,\n opts: { transactionId?: string; skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/submit${q}`,\n data,\n true,\n extraHeaders,\n );\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\n delete(\n entity: string,\n seq: number,\n opts: {\n transactionId?: string;\n hard?: boolean;\n skipHooks?: boolean;\n } = {},\n ): Promise<{ ok: boolean; deleted: number }> {\n const params = new URLSearchParams();\n if (opts.hard) params.set(\"hard\", \"true\");\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\n const q = params.size ? `?${params}` : \"\";\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/delete/${seq}${q}`,\n undefined,\n true,\n extraHeaders,\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n history<T = unknown>(\n entity: string,\n seq: number,\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\n ): Promise<{\n ok: boolean;\n data: EntityListResult<EntityHistoryRecord<T>>;\n }> {\n return this.request(\n \"GET\",\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\n );\n }\n\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/rollback/${historySeq}`,\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n EntityHistoryRecord,\r\n EntityListParams,\r\n EntityListResult,\r\n EntityQueryRequest,\r\n} from \"../../types.js\";\r\nimport { buildQuery } from \"../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class EntityMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async transStart(): Promise<string> {\r\n const res = await this.request<{\r\n ok: boolean;\r\n transaction_id: string;\r\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\r\n this.activeTxId = res.transaction_id;\r\n return this.activeTxId;\r\n }\r\n\r\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/rollback/${txId}`);\r\n }\r\n\r\n /**\r\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\r\n *\r\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\r\n */\r\n transCommit(transactionId?: string): Promise<{\r\n ok: boolean;\r\n results: Array<{ entity: string; action: string; seq: number }>;\r\n }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/commit/${txId}`);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/meta`, {});\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\r\n validate<T = unknown>(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(`/v1/entity/${entity}/validate`, data);\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n get<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\r\n }\r\n\r\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n find<T = unknown>(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/find${q}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n list<T = unknown>(\r\n entity: string,\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\r\n const queryObj: Record<string, unknown> = {\r\n page: 1,\r\n limit: 20,\r\n ...rest,\r\n };\r\n if (orderBy)\r\n queryObj.orderBy =\r\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\r\n if (fields?.length) queryObj.fields = fields.join(\",\");\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\r\n */\r\n count(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n ): Promise<{ ok: boolean; count: number }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/count`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\r\n */\r\n query<T = unknown>(\r\n entity: string,\r\n req: EntityQueryRequest,\r\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/query`, req);\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts: { transactionId?: string; skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/submit${q}`,\r\n data,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\r\n delete(\r\n entity: string,\r\n seq: number,\r\n opts: {\r\n transactionId?: string;\r\n hard?: boolean;\r\n skipHooks?: boolean;\r\n } = {},\r\n ): Promise<{ ok: boolean; deleted: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.hard) params.set(\"hard\", \"true\");\r\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\r\n const q = params.size ? `?${params}` : \"\";\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/delete/${seq}${q}`,\r\n undefined,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n history<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: EntityListResult<EntityHistoryRecord<T>>;\r\n }> {\r\n return this.request(\r\n \"GET\",\r\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\r\n );\r\n }\r\n\r\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/rollback/${historySeq}`,\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": ["buildQuery", "EntityMixin", "Base", "res", "transactionId", "txId", "entity", "data", "seq", "opts", "q", "conditions", "params", "fields", "orderDir", "orderBy", "rest", "queryObj", "req", "extraHeaders", "historySeq"]
7
7
  }
@@ -118,6 +118,7 @@ export declare function FileMixin<TBase extends GConstructor<EntityServerClientB
118
118
  applyCsrfHealth(): void;
119
119
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
120
120
  get reqOpts(): import("../../client/request.js").RequestOptions;
121
+ prepareRequest(_withAuth: boolean): Promise<void>;
121
122
  get http(): {
122
123
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
123
124
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/file.ts"],
4
- "sourcesContent": ["import type { FileMeta, FileUploadOptions } from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class FileMixinClass extends Base {\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\n *\n * ```ts\n * const input = document.querySelector('input[type=\"file\"]');\n * const result = await client.fileUpload(\"product\", input.files[0]);\n * console.log(result.data.uuid);\n * ```\n */\n async fileUpload(\n entity: string,\n file: File | Blob,\n opts: FileUploadOptions = {},\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\n const form = new FormData();\n form.append(\n \"file\",\n file,\n file instanceof File ? file.name : \"upload\",\n );\n if (opts.refSeq != null)\n form.append(\"ref_seq\", String(opts.refSeq));\n if (opts.isPublic != null)\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\n return this.requestForm(\n \"POST\",\n `/v1/files/${entity}/upload`,\n form,\n );\n }\n\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/files/${entity}/download/${uuid}`,\n {},\n );\n }\n\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n fileDelete(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/delete/${uuid}`,\n {},\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileList(\n entity: string,\n opts: { refSeq?: number } = {},\n ): Promise<{\n ok: boolean;\n data: { items: FileMeta[]; total: number };\n }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/list`,\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\n );\n }\n\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileMeta(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; data: FileMeta }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/meta/${uuid}`,\n {},\n );\n }\n\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\n const qs = opts.download ? \"?download=true\" : \"\";\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\n fileUrl(uuid: string): string {\n return `${this.baseUrl}/v1/files/${uuid}`;\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type { FileMeta, FileUploadOptions } from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class FileMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\r\n *\r\n * ```ts\r\n * const input = document.querySelector('input[type=\"file\"]');\r\n * const result = await client.fileUpload(\"product\", input.files[0]);\r\n * console.log(result.data.uuid);\r\n * ```\r\n */\r\n async fileUpload(\r\n entity: string,\r\n file: File | Blob,\r\n opts: FileUploadOptions = {},\r\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n file,\r\n file instanceof File ? file.name : \"upload\",\r\n );\r\n if (opts.refSeq != null)\r\n form.append(\"ref_seq\", String(opts.refSeq));\r\n if (opts.isPublic != null)\r\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\r\n return this.requestForm(\r\n \"POST\",\r\n `/v1/files/${entity}/upload`,\r\n form,\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/files/${entity}/download/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n fileDelete(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/delete/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileList(\r\n entity: string,\r\n opts: { refSeq?: number } = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: { items: FileMeta[]; total: number };\r\n }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/list`,\r\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileMeta(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; data: FileMeta }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/meta/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\r\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\r\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\r\n const qs = opts.download ? \"?download=true\" : \"\";\r\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\r\n fileUrl(uuid: string): string {\r\n return `${this.baseUrl}/v1/files/${uuid}`;\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAGO,SAASA,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CAYrC,MAAM,WACFC,EACAC,EACAC,EAA0B,CAAC,EAC2B,CACtD,MAAMC,EAAO,IAAI,SACjB,OAAAA,EAAK,OACD,OACAF,EACAA,aAAgB,KAAOA,EAAK,KAAO,QACvC,EACIC,EAAK,QAAU,MACfC,EAAK,OAAO,UAAW,OAAOD,EAAK,MAAM,CAAC,EAC1CA,EAAK,UAAY,MACjBC,EAAK,OAAO,YAAaD,EAAK,SAAW,OAAS,OAAO,EACtD,KAAK,YACR,OACA,aAAaF,CAAM,UACnBG,CACJ,CACJ,CAGA,aAAaH,EAAgBI,EAAoC,CAC7D,OAAO,KAAK,cACR,OACA,aAAaJ,CAAM,aAAaI,CAAI,GACpC,CAAC,CACL,CACJ,CAGA,WACIJ,EACAI,EACwD,CACxD,OAAO,KAAK,QACR,OACA,aAAaJ,CAAM,WAAWI,CAAI,GAClC,CAAC,CACL,CACJ,CAGA,SACIJ,EACAE,EAA4B,CAAC,EAI9B,CACC,OAAO,KAAK,QACR,OACA,aAAaF,CAAM,QACnBE,EAAK,OAAS,CAAE,QAASA,EAAK,MAAO,EAAI,CAAC,CAC9C,CACJ,CAGA,SACIF,EACAI,EACwC,CACxC,OAAO,KAAK,QACR,OACA,aAAaJ,CAAM,SAASI,CAAI,GAChC,CAAC,CACL,CACJ,CAGA,UAAUA,EAAuD,CAC7D,OAAO,KAAK,QAAQ,OAAQ,mBAAmBA,CAAI,GAAI,CAAC,CAAC,CAC7D,CAGA,YAAYA,EAAcF,EAA+B,CAAC,EAAW,CACjE,MAAMG,EAAKH,EAAK,SAAW,iBAAmB,GAC9C,MAAO,GAAG,KAAK,OAAO,aAAaE,CAAI,GAAGC,CAAE,EAChD,CAGA,QAAQD,EAAsB,CAC1B,MAAO,GAAG,KAAK,OAAO,aAAaA,CAAI,EAC3C,CACJ,CACJ",
6
6
  "names": ["FileMixin", "Base", "entity", "file", "opts", "form", "uuid", "qs"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/index.ts"],
4
- "sourcesContent": ["export { AuthMixin, isAuthLoginSuccessResponse } from \"./auth.js\";\nexport type {\n AuthLoginResponse,\n AuthLoginRequiresTwoFactorResponse,\n AuthLoginSetupRequiredResponse,\n AuthLoginSuccessData,\n AuthLoginSuccessResponse,\n} from \"./auth.js\";\nexport { EntityMixin } from \"./entity.js\";\nexport { FileMixin } from \"./file.js\";\nexport { PushMixin } from \"./push.js\";\nexport { SmtpMixin } from \"./smtp.js\";\nexport { TransactionMixin } from \"./transaction.js\";\nexport { UtilsMixin } from \"./utils.js\";\nexport { AdminMixin } from \"./admin.js\";\n"],
4
+ "sourcesContent": ["export { AuthMixin, isAuthLoginSuccessResponse } from \"./auth.js\";\r\nexport type {\r\n AuthLoginResponse,\r\n AuthLoginRequiresTwoFactorResponse,\r\n AuthLoginSetupRequiredResponse,\r\n AuthLoginSuccessData,\r\n AuthLoginSuccessResponse,\r\n} from \"./auth.js\";\r\nexport { EntityMixin } from \"./entity.js\";\r\nexport { FileMixin } from \"./file.js\";\r\nexport { PushMixin } from \"./push.js\";\r\nexport { SmtpMixin } from \"./smtp.js\";\r\nexport { TransactionMixin } from \"./transaction.js\";\r\nexport { UtilsMixin } from \"./utils.js\";\r\nexport { AdminMixin } from \"./admin.js\";\r\n"],
5
5
  "mappings": "AAAA,OAAS,aAAAA,EAAW,8BAAAC,MAAkC,YAQtD,OAAS,eAAAC,MAAmB,cAC5B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,oBAAAC,MAAwB,mBACjC,OAAS,cAAAC,MAAkB,aAC3B,OAAS,cAAAC,MAAkB",
6
6
  "names": ["AuthMixin", "isAuthLoginSuccessResponse", "EntityMixin", "FileMixin", "PushMixin", "SmtpMixin", "TransactionMixin", "UtilsMixin", "AdminMixin"]
7
7
  }
@@ -118,6 +118,7 @@ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base:
118
118
  applyCsrfHealth(): void;
119
119
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
120
120
  get reqOpts(): import("../../client/request.js").RequestOptions;
121
+ prepareRequest(_withAuth: boolean): Promise<void>;
121
122
  get http(): {
122
123
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
123
124
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/push.ts"],
4
- "sourcesContent": ["import type {\n EntityListParams,\n EntityListResult,\n RegisterPushDeviceOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\n// entity submit\uC744 \uAC00\uC9C4 base \uD0C0\uC785 (EntityMixin \uC801\uC6A9 \uD6C4)\ntype WithSubmit = EntityServerClientBase & {\n submit(\n entity: string,\n data: Record<string, unknown>,\n opts?: { transactionId?: string; skipHooks?: boolean },\n ): Promise<{ ok: boolean; seq: number }>;\n list<T = unknown>(\n entity: string,\n params?: EntityListParams,\n ): Promise<{ ok: boolean; data: EntityListResult<T> }>;\n};\n\nexport function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase) {\n return class PushMixinClass extends Base {\n // \u2500\u2500\u2500 \uD478\uC2DC submit \uB798\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uD478\uC2DC \uAD00\uB828 \uC5D4\uD2F0\uD2F0\uB85C payload\uB97C \uC804\uC1A1(Submit)\uD569\uB2C8\uB2E4.\n * \uB0B4\uBD80\uC801\uC73C\uB85C `submit()` \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.\n */\n push(\n pushEntity: string,\n payload: Record<string, unknown>,\n opts: { transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n return this.submit(pushEntity, payload, opts);\n }\n\n // \u2500\u2500\u2500 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD478\uC2DC \uB85C\uADF8 \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n pushLogList<T = unknown>(\n params: EntityListParams = {},\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\n return this.list<T>(\"push_log\", params);\n }\n\n /** \uACC4\uC815\uC758 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4\uB97C \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\n registerPushDevice(\n accountSeq: number,\n deviceId: string,\n pushToken: string,\n opts: RegisterPushDeviceOptions = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const {\n platform,\n deviceType,\n browser,\n browserVersion,\n pushEnabled = true,\n transactionId,\n } = opts;\n return this.submit(\n \"account_device\",\n {\n id: deviceId,\n account_seq: accountSeq,\n push_token: pushToken,\n push_enabled: pushEnabled,\n ...(platform ? { platform } : {}),\n ...(deviceType ? { device_type: deviceType } : {}),\n ...(browser ? { browser } : {}),\n ...(browserVersion\n ? { browser_version: browserVersion }\n : {}),\n },\n { transactionId },\n );\n }\n\n /** \uB514\uBC14\uC774\uC2A4 \uB808\uCF54\uB4DC\uC758 \uD478\uC2DC \uD1A0\uD070\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\n updatePushDeviceToken(\n deviceSeq: number,\n pushToken: string,\n opts: { pushEnabled?: boolean; transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const { pushEnabled = true, transactionId } = opts;\n return this.submit(\n \"account_device\",\n {\n seq: deviceSeq,\n push_token: pushToken,\n push_enabled: pushEnabled,\n },\n { transactionId },\n );\n }\n\n /** \uB514\uBC14\uC774\uC2A4\uC758 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\n disablePushDevice(\n deviceSeq: number,\n opts: { transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n return this.submit(\n \"account_device\",\n { seq: deviceSeq, push_enabled: false },\n { transactionId: opts.transactionId },\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n EntityListParams,\r\n EntityListResult,\r\n RegisterPushDeviceOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\n// entity submit\uC744 \uAC00\uC9C4 base \uD0C0\uC785 (EntityMixin \uC801\uC6A9 \uD6C4)\r\ntype WithSubmit = EntityServerClientBase & {\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts?: { transactionId?: string; skipHooks?: boolean },\r\n ): Promise<{ ok: boolean; seq: number }>;\r\n list<T = unknown>(\r\n entity: string,\r\n params?: EntityListParams,\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }>;\r\n};\r\n\r\nexport function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase) {\r\n return class PushMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD478\uC2DC submit \uB798\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD478\uC2DC \uAD00\uB828 \uC5D4\uD2F0\uD2F0\uB85C payload\uB97C \uC804\uC1A1(Submit)\uD569\uB2C8\uB2E4.\r\n * \uB0B4\uBD80\uC801\uC73C\uB85C `submit()` \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.\r\n */\r\n push(\r\n pushEntity: string,\r\n payload: Record<string, unknown>,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(pushEntity, payload, opts);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD478\uC2DC \uB85C\uADF8 \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n pushLogList<T = unknown>(\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n return this.list<T>(\"push_log\", params);\r\n }\r\n\r\n /** \uACC4\uC815\uC758 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4\uB97C \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\r\n registerPushDevice(\r\n accountSeq: number,\r\n deviceId: string,\r\n pushToken: string,\r\n opts: RegisterPushDeviceOptions = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const {\r\n platform,\r\n deviceType,\r\n browser,\r\n browserVersion,\r\n pushEnabled = true,\r\n transactionId,\r\n } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n id: deviceId,\r\n account_seq: accountSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n ...(platform ? { platform } : {}),\r\n ...(deviceType ? { device_type: deviceType } : {}),\r\n ...(browser ? { browser } : {}),\r\n ...(browserVersion\r\n ? { browser_version: browserVersion }\r\n : {}),\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4 \uB808\uCF54\uB4DC\uC758 \uD478\uC2DC \uD1A0\uD070\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n updatePushDeviceToken(\r\n deviceSeq: number,\r\n pushToken: string,\r\n opts: { pushEnabled?: boolean; transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const { pushEnabled = true, transactionId } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n seq: deviceSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4\uC758 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\r\n disablePushDevice(\r\n deviceSeq: number,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(\r\n \"account_device\",\r\n { seq: deviceSeq, push_enabled: false },\r\n { transactionId: opts.transactionId },\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAoBO,SAASA,EAAkDC,EAAa,CAC3E,OAAO,cAA6BA,CAAK,CAOrC,KACIC,EACAC,EACAC,EAAmC,CAAC,EACC,CACrC,OAAO,KAAK,OAAOF,EAAYC,EAASC,CAAI,CAChD,CAKA,YACIC,EAA2B,CAAC,EACuB,CACnD,OAAO,KAAK,KAAQ,WAAYA,CAAM,CAC1C,CAGA,mBACIC,EACAC,EACAC,EACAJ,EAAkC,CAAC,EACE,CACrC,KAAM,CACF,SAAAK,EACA,WAAAC,EACA,QAAAC,EACA,eAAAC,EACA,YAAAC,EAAc,GACd,cAAAC,CACJ,EAAIV,EACJ,OAAO,KAAK,OACR,iBACA,CACI,GAAIG,EACJ,YAAaD,EACb,WAAYE,EACZ,aAAcK,EACd,GAAIJ,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,EAC/B,GAAIC,EAAa,CAAE,YAAaA,CAAW,EAAI,CAAC,EAChD,GAAIC,EAAU,CAAE,QAAAA,CAAQ,EAAI,CAAC,EAC7B,GAAIC,EACE,CAAE,gBAAiBA,CAAe,EAClC,CAAC,CACX,EACA,CAAE,cAAAE,CAAc,CACpB,CACJ,CAGA,sBACIC,EACAP,EACAJ,EAA0D,CAAC,EACtB,CACrC,KAAM,CAAE,YAAAS,EAAc,GAAM,cAAAC,CAAc,EAAIV,EAC9C,OAAO,KAAK,OACR,iBACA,CACI,IAAKW,EACL,WAAYP,EACZ,aAAcK,CAClB,EACA,CAAE,cAAAC,CAAc,CACpB,CACJ,CAGA,kBACIC,EACAX,EAAmC,CAAC,EACC,CACrC,OAAO,KAAK,OACR,iBACA,CAAE,IAAKW,EAAW,aAAc,EAAM,EACtC,CAAE,cAAeX,EAAK,aAAc,CACxC,CACJ,CACJ,CACJ",
6
6
  "names": ["PushMixin", "Base", "pushEntity", "payload", "opts", "params", "accountSeq", "deviceId", "pushToken", "platform", "deviceType", "browser", "browserVersion", "pushEnabled", "transactionId", "deviceSeq"]
7
7
  }
@@ -82,6 +82,7 @@ export declare function SmtpMixin<TBase extends GConstructor<EntityServerClientB
82
82
  applyCsrfHealth(): void;
83
83
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
84
84
  get reqOpts(): import("../../client/request.js").RequestOptions;
85
+ prepareRequest(_withAuth: boolean): Promise<void>;
85
86
  get http(): {
86
87
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
87
88
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/smtp.ts"],
4
- "sourcesContent": ["import type { SmtpSendRequest } from \"../../types.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class SmtpMixinClass extends Base {\n // \u2500\u2500\u2500 SMTP \uBA54\uC77C \uBC1C\uC1A1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** SMTP\uB85C \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n smtpSend(req: SmtpSendRequest): Promise<{ ok: boolean; seq: number }> {\n return this.request(\"POST\", \"/v1/smtp/send\", req);\n }\n\n /** SMTP \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n smtpStatus(seq: number): Promise<{ ok: boolean; status: string }> {\n return this.request(\"POST\", `/v1/smtp/status/${seq}`, {});\n }\n\n /** SMTP \uD15C\uD50C\uB9BF \uBBF8\uB9AC\uBCF4\uAE30 HTML\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n smtpTemplatePreview(templatePath: string): Promise<string> {\n const encoded = templatePath\n .split(\"/\")\n .map(encodeURIComponent)\n .join(\"/\");\n return fetch(`${this.baseUrl}/v1/smtp/template/${encoded}`, {\n credentials: \"include\",\n }).then((r) => r.text());\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type { SmtpSendRequest } from \"../../types.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class SmtpMixinClass extends Base {\r\n // \u2500\u2500\u2500 SMTP \uBA54\uC77C \uBC1C\uC1A1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** SMTP\uB85C \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n smtpSend(req: SmtpSendRequest): Promise<{ ok: boolean; seq: number }> {\r\n return this.request(\"POST\", \"/v1/smtp/send\", req);\r\n }\r\n\r\n /** SMTP \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n smtpStatus(seq: number): Promise<{ ok: boolean; status: string }> {\r\n return this.request(\"POST\", `/v1/smtp/status/${seq}`, {});\r\n }\r\n\r\n /** SMTP \uD15C\uD50C\uB9BF \uBBF8\uB9AC\uBCF4\uAE30 HTML\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n smtpTemplatePreview(templatePath: string): Promise<string> {\r\n const encoded = templatePath\r\n .split(\"/\")\r\n .map(encodeURIComponent)\r\n .join(\"/\");\r\n return fetch(`${this.baseUrl}/v1/smtp/template/${encoded}`, {\r\n credentials: \"include\",\r\n }).then((r) => r.text());\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAMO,SAASA,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CAIrC,SAASC,EAA6D,CAClE,OAAO,KAAK,QAAQ,OAAQ,gBAAiBA,CAAG,CACpD,CAGA,WAAWC,EAAuD,CAC9D,OAAO,KAAK,QAAQ,OAAQ,mBAAmBA,CAAG,GAAI,CAAC,CAAC,CAC5D,CAGA,oBAAoBC,EAAuC,CACvD,MAAMC,EAAUD,EACX,MAAM,GAAG,EACT,IAAI,kBAAkB,EACtB,KAAK,GAAG,EACb,OAAO,MAAM,GAAG,KAAK,OAAO,qBAAqBC,CAAO,GAAI,CACxD,YAAa,SACjB,CAAC,EAAE,KAAMC,GAAMA,EAAE,KAAK,CAAC,CAC3B,CACJ,CACJ",
6
6
  "names": ["SmtpMixin", "Base", "req", "seq", "templatePath", "encoded", "r"]
7
7
  }
@@ -75,6 +75,7 @@ export declare function TransactionMixin<TBase extends GConstructor<EntityServer
75
75
  applyCsrfHealth(): void;
76
76
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
77
77
  get reqOpts(): import("../../client/request.js").RequestOptions;
78
+ prepareRequest(_withAuth: boolean): Promise<void>;
78
79
  get http(): {
79
80
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
80
81
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/transaction.ts"],
4
- "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function TransactionMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TransactionMixinClass extends Base {\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 transaction_id\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n transactionStart<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.request(\"POST\", \"/v1/transaction/start\", body ?? {});\n }\n\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4. */\n transactionCommit<T = unknown>(transactionId: string): Promise<T> {\n return this.request(\n \"POST\",\n `/v1/transaction/commit/${encodeURIComponent(transactionId)}`,\n {},\n );\n }\n\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\n transactionRollback<T = unknown>(transactionId: string): Promise<T> {\n return this.request(\n \"POST\",\n `/v1/transaction/rollback/${encodeURIComponent(transactionId)}`,\n {},\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function TransactionMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TransactionMixinClass extends Base {\r\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 transaction_id\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n transactionStart<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.request(\"POST\", \"/v1/transaction/start\", body ?? {});\r\n }\r\n\r\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4. */\r\n transactionCommit<T = unknown>(transactionId: string): Promise<T> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/transaction/commit/${encodeURIComponent(transactionId)}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n transactionRollback<T = unknown>(transactionId: string): Promise<T> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/transaction/rollback/${encodeURIComponent(transactionId)}`,\r\n {},\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAoCA,CAAK,CAE5C,iBACIC,EACU,CACV,OAAO,KAAK,QAAQ,OAAQ,wBAAyBA,GAAQ,CAAC,CAAC,CACnE,CAGA,kBAA+BC,EAAmC,CAC9D,OAAO,KAAK,QACR,OACA,0BAA0B,mBAAmBA,CAAa,CAAC,GAC3D,CAAC,CACL,CACJ,CAGA,oBAAiCA,EAAmC,CAChE,OAAO,KAAK,QACR,OACA,4BAA4B,mBAAmBA,CAAa,CAAC,GAC7D,CAAC,CACL,CACJ,CACJ,CACJ",
6
6
  "names": ["TransactionMixin", "Base", "body", "transactionId"]
7
7
  }
@@ -131,6 +131,7 @@ export declare function UtilsMixin<TBase extends GConstructor<EntityServerClient
131
131
  applyCsrfHealth(): void;
132
132
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
133
133
  get reqOpts(): import("../../client/request.js").RequestOptions;
134
+ prepareRequest(_withAuth: boolean): Promise<void>;
134
135
  get http(): {
135
136
  get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
136
137
  post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/utils.ts"],
4
- "sourcesContent": ["import type {\n QRCodeOptions,\n BarcodeOptions,\n Pdf2PngOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\nexport function UtilsMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class UtilsMixinClass extends Base {\n addressSido<T = unknown>(): Promise<T> {\n return this.http.get(\n \"/v1/utils/address/sido\",\n false,\n );\n }\n\n addressSigungu<T = unknown>(query: { sido: string }): Promise<T> {\n const qs = new URLSearchParams({ sido: query.sido }).toString();\n return this.http.get(\n `/v1/utils/address/sigungu?${qs}`,\n false,\n );\n }\n\n addressDong<T = unknown>(query: {\n sido: string;\n sigungu: string;\n }): Promise<T> {\n const qs = new URLSearchParams({\n sido: query.sido,\n sigungu: query.sigungu,\n }).toString();\n return this.http.get(\n `/v1/utils/address/dong?${qs}`,\n false,\n );\n }\n\n addressClean<T = unknown>(query: { q: string }): Promise<T> {\n const qs = new URLSearchParams({ q: query.q }).toString();\n return this.http.get(\n `/v1/utils/address/clean?${qs}`,\n false,\n );\n }\n\n // \u2500\u2500\u2500 Utils (QR / \uBC14\uCF54\uB4DC) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * QR \uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.qrcode(\"https://example.com\");\n * const blob = new Blob([buf], { type: \"image/png\" });\n * img.src = URL.createObjectURL(blob);\n * ```\n */\n qrcode(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\"POST\", \"/v1/utils/qrcode\", {\n content,\n ...opts,\n });\n }\n\n /**\n * QR \uCF54\uB4DC\uB97C base64/data URI JSON\uC73C\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const { data_uri } = await client.qrcodeBase64(\"https://example.com\");\n * img.src = data_uri;\n * ```\n */\n qrcodeBase64(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<{ ok: boolean; data: string; data_uri: string }> {\n return this.request(\"POST\", \"/v1/utils/qrcode/base64\", {\n content,\n ...opts,\n });\n }\n\n /** QR \uCF54\uB4DC\uB97C ASCII \uC544\uD2B8 \uD14D\uC2A4\uD2B8\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n qrcodeText(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<{ ok: boolean; text: string }> {\n return this.request(\"POST\", \"/v1/utils/qrcode/text\", {\n content,\n ...opts,\n });\n }\n\n /**\n * \uBC14\uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.barcode(\"1234567890128\", { type: \"ean13\" });\n * ```\n */\n barcode(\n content: string,\n opts: BarcodeOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\"POST\", \"/v1/utils/barcode\", {\n content,\n ...opts,\n });\n }\n\n /**\n * PDF\uB97C PNG \uC774\uBBF8\uC9C0\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n *\n * \uB2E8\uC77C \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `image/png` ArrayBuffer,\n * \uB2E4\uC911 \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `application/zip` ArrayBuffer\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.pdf2png(pdfArrayBuffer, { dpi: 200 });\n * ```\n */\n pdf2png(\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([pdfData], { type: \"application/pdf\" }),\n \"document.pdf\",\n );\n const params = new URLSearchParams();\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\n if (opts.firstPage != null)\n params.set(\"first_page\", String(opts.firstPage));\n if (opts.lastPage != null)\n params.set(\"last_page\", String(opts.lastPage));\n const qs = params.toString();\n const path = \"/v1/utils/pdf2png\" + (qs ? `?${qs}` : \"\");\n return this.requestFormBinary(\"POST\", path, form);\n }\n\n pdf2pngByFileSeq(\n fileSeq: number,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/utils/pdf2png/${fileSeq}`,\n opts,\n );\n }\n\n pdf2jpg(\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([pdfData], { type: \"application/pdf\" }),\n \"document.pdf\",\n );\n const params = new URLSearchParams();\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\n if (opts.firstPage != null)\n params.set(\"first_page\", String(opts.firstPage));\n if (opts.lastPage != null)\n params.set(\"last_page\", String(opts.lastPage));\n const qs = params.toString();\n const path = \"/v1/utils/pdf2jpg\" + (qs ? `?${qs}` : \"\");\n return this.requestFormBinary(\"POST\", path, form);\n }\n\n pdf2jpgByFileSeq(\n fileSeq: number,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/utils/pdf2jpg/${fileSeq}`,\n opts,\n );\n }\n };\n}\n"],
4
+ "sourcesContent": ["import type {\r\n QRCodeOptions,\r\n BarcodeOptions,\r\n Pdf2PngOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\nexport function UtilsMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class UtilsMixinClass extends Base {\r\n addressSido<T = unknown>(): Promise<T> {\r\n return this.http.get(\r\n \"/v1/utils/address/sido\",\r\n false,\r\n );\r\n }\r\n\r\n addressSigungu<T = unknown>(query: { sido: string }): Promise<T> {\r\n const qs = new URLSearchParams({ sido: query.sido }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/sigungu?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n addressDong<T = unknown>(query: {\r\n sido: string;\r\n sigungu: string;\r\n }): Promise<T> {\r\n const qs = new URLSearchParams({\r\n sido: query.sido,\r\n sigungu: query.sigungu,\r\n }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/dong?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n addressClean<T = unknown>(query: { q: string }): Promise<T> {\r\n const qs = new URLSearchParams({ q: query.q }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/clean?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n // \u2500\u2500\u2500 Utils (QR / \uBC14\uCF54\uB4DC) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * QR \uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.qrcode(\"https://example.com\");\r\n * const blob = new Blob([buf], { type: \"image/png\" });\r\n * img.src = URL.createObjectURL(blob);\r\n * ```\r\n */\r\n qrcode(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\"POST\", \"/v1/utils/qrcode\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * QR \uCF54\uB4DC\uB97C base64/data URI JSON\uC73C\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const { data_uri } = await client.qrcodeBase64(\"https://example.com\");\r\n * img.src = data_uri;\r\n * ```\r\n */\r\n qrcodeBase64(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<{ ok: boolean; data: string; data_uri: string }> {\r\n return this.request(\"POST\", \"/v1/utils/qrcode/base64\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /** QR \uCF54\uB4DC\uB97C ASCII \uC544\uD2B8 \uD14D\uC2A4\uD2B8\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n qrcodeText(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<{ ok: boolean; text: string }> {\r\n return this.request(\"POST\", \"/v1/utils/qrcode/text\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * \uBC14\uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.barcode(\"1234567890128\", { type: \"ean13\" });\r\n * ```\r\n */\r\n barcode(\r\n content: string,\r\n opts: BarcodeOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\"POST\", \"/v1/utils/barcode\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * PDF\uB97C PNG \uC774\uBBF8\uC9C0\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * \uB2E8\uC77C \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `image/png` ArrayBuffer,\r\n * \uB2E4\uC911 \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `application/zip` ArrayBuffer\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.pdf2png(pdfArrayBuffer, { dpi: 200 });\r\n * ```\r\n */\r\n pdf2png(\r\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n new Blob([pdfData], { type: \"application/pdf\" }),\r\n \"document.pdf\",\r\n );\r\n const params = new URLSearchParams();\r\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\r\n if (opts.firstPage != null)\r\n params.set(\"first_page\", String(opts.firstPage));\r\n if (opts.lastPage != null)\r\n params.set(\"last_page\", String(opts.lastPage));\r\n const qs = params.toString();\r\n const path = \"/v1/utils/pdf2png\" + (qs ? `?${qs}` : \"\");\r\n return this.requestFormBinary(\"POST\", path, form);\r\n }\r\n\r\n pdf2pngByFileSeq(\r\n fileSeq: number,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/utils/pdf2png/${fileSeq}`,\r\n opts,\r\n );\r\n }\r\n\r\n pdf2jpg(\r\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n new Blob([pdfData], { type: \"application/pdf\" }),\r\n \"document.pdf\",\r\n );\r\n const params = new URLSearchParams();\r\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\r\n if (opts.firstPage != null)\r\n params.set(\"first_page\", String(opts.firstPage));\r\n if (opts.lastPage != null)\r\n params.set(\"last_page\", String(opts.lastPage));\r\n const qs = params.toString();\r\n const path = \"/v1/utils/pdf2jpg\" + (qs ? `?${qs}` : \"\");\r\n return this.requestFormBinary(\"POST\", path, form);\r\n }\r\n\r\n pdf2jpgByFileSeq(\r\n fileSeq: number,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/utils/pdf2jpg/${fileSeq}`,\r\n opts,\r\n );\r\n }\r\n };\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": ["UtilsMixin", "Base", "query", "qs", "content", "opts", "pdfData", "form", "params", "path", "fileSeq"]
7
7
  }