@stackframe/stack 2.7.21 → 2.7.23

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 (145) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +2 -2
  3. package/dist/admin-app-impl-CTQhv9tV.d.ts +395 -0
  4. package/dist/admin-app-impl-DpyRKp1e.d.mts +395 -0
  5. package/dist/components/selected-team-switcher.d.mts +18 -6
  6. package/dist/components/selected-team-switcher.d.ts +18 -6
  7. package/dist/components/team-icon.d.mts +18 -6
  8. package/dist/components/team-icon.d.ts +18 -6
  9. package/dist/components-page/stack-handler.d.mts +18 -6
  10. package/dist/components-page/stack-handler.d.ts +18 -6
  11. package/dist/esm/lib/stack-app/api-keys/index.js +14 -0
  12. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -0
  13. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +291 -0
  14. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  15. package/dist/esm/lib/{stack-app.js → stack-app/apps/implementations/client-app-impl.js} +37 -1109
  16. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  17. package/dist/esm/lib/stack-app/apps/implementations/common.js +142 -0
  18. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -0
  19. package/dist/esm/lib/stack-app/apps/implementations/index.js +24 -0
  20. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -0
  21. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +527 -0
  22. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  23. package/dist/esm/lib/stack-app/apps/index.js +16 -0
  24. package/dist/esm/lib/stack-app/apps/index.js.map +1 -0
  25. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +7 -0
  26. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  27. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +7 -0
  28. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  29. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +7 -0
  30. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  31. package/dist/esm/lib/stack-app/common.js +6 -0
  32. package/dist/esm/lib/stack-app/common.js.map +1 -0
  33. package/dist/esm/lib/stack-app/connected-accounts/index.js +1 -0
  34. package/dist/esm/lib/stack-app/connected-accounts/index.js.map +1 -0
  35. package/dist/esm/lib/stack-app/contact-channels/index.js +39 -0
  36. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -0
  37. package/dist/esm/lib/stack-app/email-templates/index.js +11 -0
  38. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -0
  39. package/dist/esm/lib/stack-app/index.js +16 -0
  40. package/dist/esm/lib/stack-app/index.js.map +1 -0
  41. package/dist/esm/lib/stack-app/permissions/index.js +20 -0
  42. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -0
  43. package/dist/esm/lib/stack-app/project-configs/index.js +1 -0
  44. package/dist/esm/lib/stack-app/project-configs/index.js.map +1 -0
  45. package/dist/esm/lib/stack-app/projects/index.js +57 -0
  46. package/dist/esm/lib/stack-app/projects/index.js.map +1 -0
  47. package/dist/esm/lib/stack-app/teams/index.js +38 -0
  48. package/dist/esm/lib/stack-app/teams/index.js.map +1 -0
  49. package/dist/esm/lib/stack-app/users/index.js +47 -0
  50. package/dist/esm/lib/stack-app/users/index.js.map +1 -0
  51. package/dist/generated/quetzal-translations.d.mts +2 -2
  52. package/dist/generated/quetzal-translations.d.ts +2 -2
  53. package/dist/{lib/stack-app.d.mts → index-C7D6Vt7X.d.mts} +138 -354
  54. package/dist/{lib/stack-app.d.ts → index-DQk7XJpU.d.ts} +138 -354
  55. package/dist/index.d.mts +17 -5
  56. package/dist/index.d.ts +17 -5
  57. package/dist/lib/hooks.d.mts +17 -5
  58. package/dist/lib/hooks.d.ts +17 -5
  59. package/dist/lib/stack-app/api-keys/index.d.mts +40 -0
  60. package/dist/lib/stack-app/api-keys/index.d.ts +40 -0
  61. package/dist/lib/stack-app/api-keys/index.js +39 -0
  62. package/dist/lib/stack-app/api-keys/index.js.map +1 -0
  63. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.mts +30 -0
  64. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +30 -0
  65. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +316 -0
  66. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  67. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.mts +30 -0
  68. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +30 -0
  69. package/dist/lib/{stack-app.js → stack-app/apps/implementations/client-app-impl.js} +75 -1152
  70. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  71. package/dist/lib/stack-app/apps/implementations/common.d.mts +45 -0
  72. package/dist/lib/stack-app/apps/implementations/common.d.ts +45 -0
  73. package/dist/lib/stack-app/apps/implementations/common.js +187 -0
  74. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -0
  75. package/dist/lib/stack-app/apps/implementations/index.d.mts +36 -0
  76. package/dist/lib/stack-app/apps/implementations/index.d.ts +36 -0
  77. package/dist/lib/stack-app/apps/implementations/index.js +51 -0
  78. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -0
  79. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.mts +30 -0
  80. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts +30 -0
  81. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +552 -0
  82. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  83. package/dist/lib/stack-app/apps/index.d.mts +23 -0
  84. package/dist/lib/stack-app/apps/index.d.ts +23 -0
  85. package/dist/lib/stack-app/apps/index.js +37 -0
  86. package/dist/lib/stack-app/apps/index.js.map +1 -0
  87. package/dist/lib/stack-app/apps/interfaces/admin-app.d.mts +23 -0
  88. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +23 -0
  89. package/dist/lib/stack-app/apps/interfaces/admin-app.js +32 -0
  90. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  91. package/dist/lib/stack-app/apps/interfaces/client-app.d.mts +23 -0
  92. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +23 -0
  93. package/dist/lib/stack-app/apps/interfaces/client-app.js +32 -0
  94. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  95. package/dist/lib/stack-app/apps/interfaces/server-app.d.mts +23 -0
  96. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +23 -0
  97. package/dist/lib/stack-app/apps/interfaces/server-app.js +32 -0
  98. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  99. package/dist/lib/stack-app/common.d.mts +63 -0
  100. package/dist/lib/stack-app/common.d.ts +63 -0
  101. package/dist/lib/stack-app/common.js +31 -0
  102. package/dist/lib/stack-app/common.js.map +1 -0
  103. package/dist/lib/stack-app/connected-accounts/index.d.mts +13 -0
  104. package/dist/lib/stack-app/connected-accounts/index.d.ts +13 -0
  105. package/dist/lib/stack-app/connected-accounts/index.js +19 -0
  106. package/dist/lib/stack-app/connected-accounts/index.js.map +1 -0
  107. package/dist/lib/stack-app/contact-channels/index.d.mts +38 -0
  108. package/dist/lib/stack-app/contact-channels/index.d.ts +38 -0
  109. package/dist/lib/stack-app/contact-channels/index.js +67 -0
  110. package/dist/lib/stack-app/contact-channels/index.js.map +1 -0
  111. package/dist/lib/stack-app/email-templates/index.d.mts +15 -0
  112. package/dist/lib/stack-app/email-templates/index.d.ts +15 -0
  113. package/dist/lib/stack-app/email-templates/index.js +36 -0
  114. package/dist/lib/stack-app/email-templates/index.js.map +1 -0
  115. package/dist/lib/stack-app/index.d.mts +23 -0
  116. package/dist/lib/stack-app/index.d.ts +23 -0
  117. package/dist/lib/stack-app/index.js +38 -0
  118. package/dist/lib/stack-app/index.js.map +1 -0
  119. package/dist/lib/stack-app/permissions/index.d.mts +21 -0
  120. package/dist/lib/stack-app/permissions/index.d.ts +21 -0
  121. package/dist/lib/stack-app/permissions/index.js +46 -0
  122. package/dist/lib/stack-app/permissions/index.js.map +1 -0
  123. package/dist/lib/stack-app/project-configs/index.d.mts +82 -0
  124. package/dist/lib/stack-app/project-configs/index.d.ts +82 -0
  125. package/dist/lib/stack-app/project-configs/index.js +19 -0
  126. package/dist/lib/stack-app/project-configs/index.js.map +1 -0
  127. package/dist/lib/stack-app/projects/index.d.mts +23 -0
  128. package/dist/lib/stack-app/projects/index.d.ts +23 -0
  129. package/dist/lib/stack-app/projects/index.js +83 -0
  130. package/dist/lib/stack-app/projects/index.js.map +1 -0
  131. package/dist/lib/stack-app/teams/index.d.mts +23 -0
  132. package/dist/lib/stack-app/teams/index.d.ts +23 -0
  133. package/dist/lib/stack-app/teams/index.js +66 -0
  134. package/dist/lib/stack-app/teams/index.js.map +1 -0
  135. package/dist/lib/stack-app/users/index.d.mts +23 -0
  136. package/dist/lib/stack-app/users/index.d.ts +23 -0
  137. package/dist/lib/stack-app/users/index.js +74 -0
  138. package/dist/lib/stack-app/users/index.js.map +1 -0
  139. package/dist/providers/stack-provider-client.d.mts +17 -5
  140. package/dist/providers/stack-provider-client.d.ts +17 -5
  141. package/dist/providers/stack-provider.d.mts +18 -6
  142. package/dist/providers/stack-provider.d.ts +18 -6
  143. package/package.json +4 -4
  144. package/dist/esm/lib/stack-app.js.map +0 -1
  145. package/dist/lib/stack-app.js.map +0 -1
@@ -0,0 +1,552 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/stack-app/apps/implementations/server-app-impl.ts
21
+ var server_app_impl_exports = {};
22
+ __export(server_app_impl_exports, {
23
+ _StackServerAppImplIncomplete: () => _StackServerAppImplIncomplete
24
+ });
25
+ module.exports = __toCommonJS(server_app_impl_exports);
26
+ var import_stack_shared = require("@stackframe/stack-shared");
27
+ var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
28
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
29
+ var import_react = require("@stackframe/stack-shared/dist/utils/react");
30
+ var import_results = require("@stackframe/stack-shared/dist/utils/results");
31
+ var import_react2 = require("react");
32
+ var import_url = require("../../../../utils/url");
33
+ var import_contact_channels = require("../../contact-channels");
34
+ var import_teams = require("../../teams");
35
+ var import_users = require("../../users");
36
+ var import_client_app_impl = require("./client-app-impl");
37
+ var import_common = require("./common");
38
+ var import_common2 = require("./common");
39
+ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackClientAppImplIncomplete {
40
+ constructor(options) {
41
+ super("interface" in options ? {
42
+ interface: options.interface,
43
+ tokenStore: options.tokenStore,
44
+ urls: options.urls,
45
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn
46
+ } : {
47
+ interface: new import_stack_shared.StackServerInterface({
48
+ getBaseUrl: () => (0, import_common.getBaseUrl)(options.baseUrl),
49
+ projectId: options.projectId ?? (0, import_common.getDefaultProjectId)(),
50
+ clientVersion: import_common.clientVersion,
51
+ publishableClientKey: options.publishableClientKey ?? (0, import_common.getDefaultPublishableClientKey)(),
52
+ secretServerKey: options.secretServerKey ?? (0, import_common.getDefaultSecretServerKey)()
53
+ }),
54
+ baseUrl: options.baseUrl,
55
+ projectId: options.projectId,
56
+ publishableClientKey: options.publishableClientKey,
57
+ tokenStore: options.tokenStore,
58
+ urls: options.urls ?? {},
59
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {},
60
+ redirectMethod: options.redirectMethod
61
+ });
62
+ // TODO override the client user cache to use the server user cache, so we save some requests
63
+ this._currentServerUserCache = (0, import_common.createCacheBySession)(async (session) => {
64
+ if (session.isKnownToBeInvalid()) {
65
+ return null;
66
+ }
67
+ return await this._interface.getServerUserByToken(session);
68
+ });
69
+ this._serverUsersCache = (0, import_common.createCache)(async ([cursor, limit, orderBy, desc, query]) => {
70
+ return await this._interface.listServerUsers({ cursor, limit, orderBy, desc, query });
71
+ });
72
+ this._serverUserCache = (0, import_common.createCache)(async ([userId]) => {
73
+ const user = await this._interface.getServerUserById(userId);
74
+ return import_results.Result.or(user, null);
75
+ });
76
+ this._serverTeamsCache = (0, import_common.createCache)(async ([userId]) => {
77
+ return await this._interface.listServerTeams({ userId });
78
+ });
79
+ this._serverTeamUserPermissionsCache = (0, import_common.createCache)(async ([teamId, userId, recursive]) => {
80
+ return await this._interface.listServerTeamPermissions({ teamId, userId, recursive }, null);
81
+ });
82
+ this._serverUserOAuthConnectionAccessTokensCache = (0, import_common.createCache)(
83
+ async ([userId, providerId, scope]) => {
84
+ try {
85
+ const result = await this._interface.createServerProviderAccessToken(userId, providerId, scope || "");
86
+ return { accessToken: result.access_token };
87
+ } catch (err) {
88
+ if (!(err instanceof import_stack_shared.KnownErrors.OAuthConnectionDoesNotHaveRequiredScope || err instanceof import_stack_shared.KnownErrors.OAuthConnectionNotConnectedToUser)) {
89
+ throw err;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ );
95
+ this._serverUserOAuthConnectionCache = (0, import_common.createCache)(
96
+ async ([userId, providerId, scope, redirect]) => {
97
+ return await this._getUserOAuthConnectionCacheFn({
98
+ getUser: async () => import_results.Result.orThrow(await this._serverUserCache.getOrWait([userId], "write-only")),
99
+ getOrWaitOAuthToken: async () => import_results.Result.orThrow(await this._serverUserOAuthConnectionAccessTokensCache.getOrWait([userId, providerId, scope || ""], "write-only")),
100
+ useOAuthToken: () => (0, import_common2.useAsyncCache)(this._serverUserOAuthConnectionAccessTokensCache, [userId, providerId, scope || ""], "user.useConnectedAccount()"),
101
+ providerId,
102
+ scope,
103
+ redirect,
104
+ session: null
105
+ });
106
+ }
107
+ );
108
+ this._serverTeamMemberProfilesCache = (0, import_common.createCache)(
109
+ async ([teamId]) => {
110
+ return await this._interface.listServerTeamMemberProfiles({ teamId });
111
+ }
112
+ );
113
+ this._serverTeamInvitationsCache = (0, import_common.createCache)(
114
+ async ([teamId]) => {
115
+ return await this._interface.listServerTeamInvitations({ teamId });
116
+ }
117
+ );
118
+ this._serverUserTeamProfileCache = (0, import_common.createCache)(
119
+ async ([teamId, userId]) => {
120
+ return await this._interface.getServerTeamMemberProfile({ teamId, userId });
121
+ }
122
+ );
123
+ this._serverContactChannelsCache = (0, import_common.createCache)(
124
+ async ([userId]) => {
125
+ return await this._interface.listServerContactChannels(userId);
126
+ }
127
+ );
128
+ }
129
+ async _updateServerUser(userId, update) {
130
+ const result = await this._interface.updateServerUser(userId, (0, import_users.serverUserUpdateOptionsToCrud)(update));
131
+ await this._refreshUsers();
132
+ return result;
133
+ }
134
+ _serverEditableTeamProfileFromCrud(crud) {
135
+ const app = this;
136
+ return {
137
+ displayName: crud.display_name,
138
+ profileImageUrl: crud.profile_image_url,
139
+ async update(update) {
140
+ await app._interface.updateServerTeamMemberProfile({
141
+ teamId: crud.team_id,
142
+ userId: crud.user_id,
143
+ profile: {
144
+ display_name: update.displayName,
145
+ profile_image_url: update.profileImageUrl
146
+ }
147
+ });
148
+ await app._serverUserTeamProfileCache.refresh([crud.team_id, crud.user_id]);
149
+ }
150
+ };
151
+ }
152
+ _serverContactChannelFromCrud(userId, crud) {
153
+ const app = this;
154
+ return {
155
+ id: crud.id,
156
+ value: crud.value,
157
+ type: crud.type,
158
+ isVerified: crud.is_verified,
159
+ isPrimary: crud.is_primary,
160
+ usedForAuth: crud.used_for_auth,
161
+ async sendVerificationEmail(options) {
162
+ if (!options?.callbackUrl && !await app._getCurrentUrl()) {
163
+ throw new Error("Cannot send verification email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendVerificationEmail({ callbackUrl: ... })`");
164
+ }
165
+ await app._interface.sendServerContactChannelVerificationEmail(userId, crud.id, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.emailVerification));
166
+ },
167
+ async update(data) {
168
+ await app._interface.updateServerContactChannel(userId, crud.id, (0, import_contact_channels.serverContactChannelUpdateOptionsToCrud)(data));
169
+ },
170
+ async delete() {
171
+ await app._interface.deleteServerContactChannel(userId, crud.id);
172
+ }
173
+ };
174
+ }
175
+ _serverUserFromCrud(crud) {
176
+ const app = this;
177
+ async function getConnectedAccount(id, options) {
178
+ const scopeString = options?.scopes?.join(" ");
179
+ return import_results.Result.orThrow(await app._serverUserOAuthConnectionCache.getOrWait([crud.id, id, scopeString || "", options?.or === "redirect"], "write-only"));
180
+ }
181
+ function useConnectedAccount(id, options) {
182
+ const scopeString = options?.scopes?.join(" ");
183
+ return (0, import_common2.useAsyncCache)(app._serverUserOAuthConnectionCache, [crud.id, id, scopeString || "", options?.or === "redirect"], "user.useConnectedAccount()");
184
+ }
185
+ return {
186
+ ...super._createBaseUser(crud),
187
+ lastActiveAt: new Date(crud.last_active_at_millis),
188
+ serverMetadata: crud.server_metadata,
189
+ async setPrimaryEmail(email, options) {
190
+ await app._updateServerUser(crud.id, { primaryEmail: email, primaryEmailVerified: options?.verified });
191
+ },
192
+ async grantPermission(scope, permissionId) {
193
+ await app._interface.grantServerTeamUserPermission(scope.id, crud.id, permissionId);
194
+ for (const recursive of [true, false]) {
195
+ await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);
196
+ }
197
+ },
198
+ async revokePermission(scope, permissionId) {
199
+ await app._interface.revokeServerTeamUserPermission(scope.id, crud.id, permissionId);
200
+ for (const recursive of [true, false]) {
201
+ await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);
202
+ }
203
+ },
204
+ async delete() {
205
+ const res = await app._interface.deleteServerUser(crud.id);
206
+ await app._refreshUsers();
207
+ return res;
208
+ },
209
+ async createSession(options) {
210
+ const tokens = await app._interface.createServerUserSession(crud.id, options.expiresInMillis ?? 1e3 * 60 * 60 * 24 * 365);
211
+ return {
212
+ async getTokens() {
213
+ return tokens;
214
+ }
215
+ };
216
+ },
217
+ async setDisplayName(displayName) {
218
+ return await this.update({ displayName });
219
+ },
220
+ async setClientMetadata(metadata) {
221
+ return await this.update({ clientMetadata: metadata });
222
+ },
223
+ async setClientReadOnlyMetadata(metadata) {
224
+ return await this.update({ clientReadOnlyMetadata: metadata });
225
+ },
226
+ async setServerMetadata(metadata) {
227
+ return await this.update({ serverMetadata: metadata });
228
+ },
229
+ async setSelectedTeam(team) {
230
+ return await this.update({ selectedTeamId: team?.id ?? null });
231
+ },
232
+ getConnectedAccount,
233
+ useConnectedAccount,
234
+ selectedTeam: crud.selected_team ? app._serverTeamFromCrud(crud.selected_team) : null,
235
+ async getTeam(teamId) {
236
+ const teams = await this.listTeams();
237
+ return teams.find((t) => t.id === teamId) ?? null;
238
+ },
239
+ useTeam(teamId) {
240
+ const teams = this.useTeams();
241
+ return (0, import_react2.useMemo)(() => {
242
+ return teams.find((t) => t.id === teamId) ?? null;
243
+ }, [teams, teamId]);
244
+ },
245
+ async listTeams() {
246
+ const teams = import_results.Result.orThrow(await app._serverTeamsCache.getOrWait([crud.id], "write-only"));
247
+ return teams.map((t) => app._serverTeamFromCrud(t));
248
+ },
249
+ useTeams() {
250
+ const teams = (0, import_common2.useAsyncCache)(app._serverTeamsCache, [crud.id], "user.useTeams()");
251
+ return (0, import_react2.useMemo)(() => teams.map((t) => app._serverTeamFromCrud(t)), [teams]);
252
+ },
253
+ createTeam: async (data) => {
254
+ const team = await app._interface.createServerTeam((0, import_teams.serverTeamCreateOptionsToCrud)({
255
+ creatorUserId: crud.id,
256
+ ...data
257
+ }));
258
+ await app._serverTeamsCache.refresh([void 0]);
259
+ return app._serverTeamFromCrud(team);
260
+ },
261
+ leaveTeam: async (team) => {
262
+ await app._interface.leaveServerTeam({ teamId: team.id, userId: crud.id });
263
+ },
264
+ async listPermissions(scope, options) {
265
+ const recursive = options?.recursive ?? true;
266
+ const permissions = import_results.Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], "write-only"));
267
+ return permissions.map((crud2) => app._serverPermissionFromCrud(crud2));
268
+ },
269
+ usePermissions(scope, options) {
270
+ const recursive = options?.recursive ?? true;
271
+ const permissions = (0, import_common2.useAsyncCache)(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive], "user.usePermissions()");
272
+ return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._serverPermissionFromCrud(crud2)), [permissions]);
273
+ },
274
+ async getPermission(scope, permissionId) {
275
+ const permissions = await this.listPermissions(scope);
276
+ return permissions.find((p) => p.id === permissionId) ?? null;
277
+ },
278
+ usePermission(scope, permissionId) {
279
+ const permissions = this.usePermissions(scope);
280
+ return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
281
+ },
282
+ async hasPermission(scope, permissionId) {
283
+ return await this.getPermission(scope, permissionId) !== null;
284
+ },
285
+ async update(update) {
286
+ await app._updateServerUser(crud.id, update);
287
+ },
288
+ async sendVerificationEmail() {
289
+ return await app._checkFeatureSupport("sendVerificationEmail() on ServerUser", {});
290
+ },
291
+ async updatePassword(options) {
292
+ const result = await this.update({ password: options.newPassword });
293
+ await app._serverUserCache.refresh([crud.id]);
294
+ return result;
295
+ },
296
+ async setPassword(options) {
297
+ const result = await this.update(options);
298
+ await app._serverUserCache.refresh([crud.id]);
299
+ return result;
300
+ },
301
+ async getTeamProfile(team) {
302
+ const result = import_results.Result.orThrow(await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], "write-only"));
303
+ return app._serverEditableTeamProfileFromCrud(result);
304
+ },
305
+ useTeamProfile(team) {
306
+ const result = (0, import_common2.useAsyncCache)(app._serverUserTeamProfileCache, [team.id, crud.id], "user.useTeamProfile()");
307
+ return (0, import_react2.useMemo)(() => app._serverEditableTeamProfileFromCrud(result), [result]);
308
+ },
309
+ async listContactChannels() {
310
+ const result = import_results.Result.orThrow(await app._serverContactChannelsCache.getOrWait([crud.id], "write-only"));
311
+ return result.map((data) => app._serverContactChannelFromCrud(crud.id, data));
312
+ },
313
+ useContactChannels() {
314
+ const result = (0, import_common2.useAsyncCache)(app._serverContactChannelsCache, [crud.id], "user.useContactChannels()");
315
+ return (0, import_react2.useMemo)(() => result.map((data) => app._serverContactChannelFromCrud(crud.id, data)), [result]);
316
+ },
317
+ createContactChannel: async (data) => {
318
+ const contactChannel = await app._interface.createServerContactChannel((0, import_contact_channels.serverContactChannelCreateOptionsToCrud)(crud.id, data));
319
+ await app._serverContactChannelsCache.refresh([crud.id]);
320
+ return app._serverContactChannelFromCrud(crud.id, contactChannel);
321
+ }
322
+ };
323
+ }
324
+ _serverTeamUserFromCrud(crud) {
325
+ return {
326
+ ...this._serverUserFromCrud(crud.user),
327
+ teamProfile: {
328
+ displayName: crud.display_name,
329
+ profileImageUrl: crud.profile_image_url
330
+ }
331
+ };
332
+ }
333
+ _serverTeamInvitationFromCrud(crud) {
334
+ return {
335
+ id: crud.id,
336
+ recipientEmail: crud.recipient_email,
337
+ expiresAt: new Date(crud.expires_at_millis),
338
+ revoke: async () => {
339
+ await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);
340
+ }
341
+ };
342
+ }
343
+ _currentUserFromCrud(crud, session) {
344
+ const app = this;
345
+ const currentUser = {
346
+ ...this._serverUserFromCrud(crud),
347
+ ...this._createAuth(session),
348
+ ...this._isInternalProject() ? this._createInternalUserExtra(session) : {}
349
+ };
350
+ Object.freeze(currentUser);
351
+ return currentUser;
352
+ }
353
+ _serverTeamFromCrud(crud) {
354
+ const app = this;
355
+ return {
356
+ id: crud.id,
357
+ displayName: crud.display_name,
358
+ profileImageUrl: crud.profile_image_url,
359
+ createdAt: new Date(crud.created_at_millis),
360
+ clientMetadata: crud.client_metadata,
361
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
362
+ serverMetadata: crud.server_metadata,
363
+ async update(update) {
364
+ await app._interface.updateServerTeam(crud.id, (0, import_teams.serverTeamUpdateOptionsToCrud)(update));
365
+ await app._serverTeamsCache.refresh([void 0]);
366
+ },
367
+ async delete() {
368
+ await app._interface.deleteServerTeam(crud.id);
369
+ await app._serverTeamsCache.refresh([void 0]);
370
+ },
371
+ async listUsers() {
372
+ const result = import_results.Result.orThrow(await app._serverTeamMemberProfilesCache.getOrWait([crud.id], "write-only"));
373
+ return result.map((u) => app._serverTeamUserFromCrud(u));
374
+ },
375
+ useUsers() {
376
+ const result = (0, import_common2.useAsyncCache)(app._serverTeamMemberProfilesCache, [crud.id], "team.useUsers()");
377
+ return (0, import_react2.useMemo)(() => result.map((u) => app._serverTeamUserFromCrud(u)), [result]);
378
+ },
379
+ async addUser(userId) {
380
+ await app._interface.addServerUserToTeam({
381
+ teamId: crud.id,
382
+ userId
383
+ });
384
+ await app._serverTeamMemberProfilesCache.refresh([crud.id]);
385
+ },
386
+ async removeUser(userId) {
387
+ await app._interface.removeServerUserFromTeam({
388
+ teamId: crud.id,
389
+ userId
390
+ });
391
+ await app._serverTeamMemberProfilesCache.refresh([crud.id]);
392
+ },
393
+ async inviteUser(options) {
394
+ if (!options.callbackUrl && !await app._getCurrentUrl()) {
395
+ throw new Error("Cannot invite user without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `inviteUser({ email, callbackUrl: ... })`");
396
+ }
397
+ await app._interface.sendServerTeamInvitation({
398
+ teamId: crud.id,
399
+ email: options.email,
400
+ callbackUrl: options.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.teamInvitation)
401
+ });
402
+ await app._serverTeamInvitationsCache.refresh([crud.id]);
403
+ },
404
+ async listInvitations() {
405
+ const result = import_results.Result.orThrow(await app._serverTeamInvitationsCache.getOrWait([crud.id], "write-only"));
406
+ return result.map((crud2) => app._serverTeamInvitationFromCrud(crud2));
407
+ },
408
+ useInvitations() {
409
+ const result = (0, import_common2.useAsyncCache)(app._serverTeamInvitationsCache, [crud.id], "team.useInvitations()");
410
+ return (0, import_react2.useMemo)(() => result.map((crud2) => app._serverTeamInvitationFromCrud(crud2)), [result]);
411
+ }
412
+ };
413
+ }
414
+ async createUser(options) {
415
+ const crud = await this._interface.createServerUser((0, import_users.serverUserCreateOptionsToCrud)(options));
416
+ await this._refreshUsers();
417
+ return this._serverUserFromCrud(crud);
418
+ }
419
+ async getUser(options) {
420
+ if (typeof options === "string") {
421
+ return await this.getServerUserById(options);
422
+ } else {
423
+ this._ensurePersistentTokenStore(options?.tokenStore);
424
+ const session = await this._getSession(options?.tokenStore);
425
+ const crud = import_results.Result.orThrow(await this._currentServerUserCache.getOrWait([session], "write-only"));
426
+ if (crud === null) {
427
+ switch (options?.or) {
428
+ case "redirect": {
429
+ await this.redirectToSignIn({ replace: true });
430
+ break;
431
+ }
432
+ case "throw": {
433
+ throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
434
+ }
435
+ default: {
436
+ return null;
437
+ }
438
+ }
439
+ }
440
+ return crud && this._currentUserFromCrud(crud, session);
441
+ }
442
+ }
443
+ async getServerUser() {
444
+ console.warn("stackServerApp.getServerUser is deprecated; use stackServerApp.getUser instead");
445
+ return await this.getUser();
446
+ }
447
+ async getServerUserById(userId) {
448
+ const crud = import_results.Result.orThrow(await this._serverUserCache.getOrWait([userId], "write-only"));
449
+ return crud && this._serverUserFromCrud(crud);
450
+ }
451
+ useUser(options) {
452
+ if (typeof options === "string") {
453
+ return this.useUserById(options);
454
+ } else {
455
+ this._ensurePersistentTokenStore(options?.tokenStore);
456
+ const session = this._useSession(options?.tokenStore);
457
+ const crud = (0, import_common2.useAsyncCache)(this._currentServerUserCache, [session], "useUser()");
458
+ if (crud === null) {
459
+ switch (options?.or) {
460
+ case "redirect": {
461
+ (0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
462
+ (0, import_react.suspend)();
463
+ throw new import_errors.StackAssertionError("suspend should never return");
464
+ }
465
+ case "throw": {
466
+ throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
467
+ }
468
+ case void 0:
469
+ case "return-null": {
470
+ }
471
+ }
472
+ }
473
+ return (0, import_react2.useMemo)(() => {
474
+ return crud && this._currentUserFromCrud(crud, session);
475
+ }, [crud, session, options?.or]);
476
+ }
477
+ }
478
+ useUserById(userId) {
479
+ const crud = (0, import_common2.useAsyncCache)(this._serverUserCache, [userId], "useUserById()");
480
+ return (0, import_react2.useMemo)(() => {
481
+ return crud && this._serverUserFromCrud(crud);
482
+ }, [crud]);
483
+ }
484
+ async listUsers(options) {
485
+ const crud = import_results.Result.orThrow(await this._serverUsersCache.getOrWait([options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query], "write-only"));
486
+ const result = crud.items.map((j) => this._serverUserFromCrud(j));
487
+ result.nextCursor = crud.pagination?.next_cursor ?? null;
488
+ return result;
489
+ }
490
+ useUsers(options) {
491
+ const crud = (0, import_common2.useAsyncCache)(this._serverUsersCache, [options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query], "useServerUsers()");
492
+ const result = crud.items.map((j) => this._serverUserFromCrud(j));
493
+ result.nextCursor = crud.pagination?.next_cursor ?? null;
494
+ return result;
495
+ }
496
+ _serverPermissionFromCrud(crud) {
497
+ return {
498
+ id: crud.id
499
+ };
500
+ }
501
+ _serverTeamPermissionDefinitionFromCrud(crud) {
502
+ return {
503
+ id: crud.id,
504
+ description: crud.description,
505
+ containedPermissionIds: crud.contained_permission_ids
506
+ };
507
+ }
508
+ async listTeams() {
509
+ const teams = import_results.Result.orThrow(await this._serverTeamsCache.getOrWait([void 0], "write-only"));
510
+ return teams.map((t) => this._serverTeamFromCrud(t));
511
+ }
512
+ async createTeam(data) {
513
+ const team = await this._interface.createServerTeam((0, import_teams.serverTeamCreateOptionsToCrud)(data));
514
+ await this._serverTeamsCache.refresh([void 0]);
515
+ return this._serverTeamFromCrud(team);
516
+ }
517
+ useTeams() {
518
+ const teams = (0, import_common2.useAsyncCache)(this._serverTeamsCache, [void 0], "useServerTeams()");
519
+ return (0, import_react2.useMemo)(() => {
520
+ return teams.map((t) => this._serverTeamFromCrud(t));
521
+ }, [teams]);
522
+ }
523
+ async getTeam(teamId) {
524
+ const teams = await this.listTeams();
525
+ return teams.find((t) => t.id === teamId) ?? null;
526
+ }
527
+ useTeam(teamId) {
528
+ const teams = this.useTeams();
529
+ return (0, import_react2.useMemo)(() => {
530
+ return teams.find((t) => t.id === teamId) ?? null;
531
+ }, [teams, teamId]);
532
+ }
533
+ async _refreshSession(session) {
534
+ await Promise.all([
535
+ super._refreshUser(session),
536
+ this._currentServerUserCache.refresh([session])
537
+ ]);
538
+ }
539
+ async _refreshUsers() {
540
+ await Promise.all([
541
+ super._refreshUsers(),
542
+ this._serverUserCache.refreshWhere(() => true),
543
+ this._serverUsersCache.refreshWhere(() => true),
544
+ this._serverContactChannelsCache.refreshWhere(() => true)
545
+ ]);
546
+ }
547
+ };
548
+ // Annotate the CommonJS export names for ESM import in node:
549
+ 0 && (module.exports = {
550
+ _StackServerAppImplIncomplete
551
+ });
552
+ //# sourceMappingURL=server-app-impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/lib/stack-app/apps/implementations/server-app-impl.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownErrors, StackServerInterface } from \"@stackframe/stack-shared\";\nimport { ContactChannelsCrud } from \"@stackframe/stack-shared/dist/interface/crud/contact-channels\";\nimport { TeamInvitationCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-invitation\";\nimport { TeamMemberProfilesCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-member-profiles\";\nimport { TeamPermissionDefinitionsCrud, TeamPermissionsCrud } from \"@stackframe/stack-shared/dist/interface/crud/team-permissions\";\nimport { TeamsCrud } from \"@stackframe/stack-shared/dist/interface/crud/teams\";\nimport { UsersCrud } from \"@stackframe/stack-shared/dist/interface/crud/users\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { ProviderType } from \"@stackframe/stack-shared/dist/utils/oauth\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspend } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { useMemo } from \"react\";\nimport { constructRedirectUrl } from \"../../../../utils/url\";\nimport { GetUserOptions, HandlerUrls, OAuthScopesOnSignIn, TokenStoreInit } from \"../../common\";\nimport { OAuthConnection } from \"../../connected-accounts\";\nimport { ServerContactChannel, ServerContactChannelCreateOptions, ServerContactChannelUpdateOptions, serverContactChannelCreateOptionsToCrud, serverContactChannelUpdateOptionsToCrud } from \"../../contact-channels\";\nimport { AdminTeamPermission, AdminTeamPermissionDefinition } from \"../../permissions\";\nimport { EditableTeamMemberProfile, ServerListUsersOptions, ServerTeam, ServerTeamCreateOptions, ServerTeamUpdateOptions, ServerTeamUser, Team, TeamInvitation, serverTeamCreateOptionsToCrud, serverTeamUpdateOptionsToCrud } from \"../../teams\";\nimport { ProjectCurrentServerUser, ServerUser, ServerUserCreateOptions, ServerUserUpdateOptions, serverUserCreateOptionsToCrud, serverUserUpdateOptionsToCrud } from \"../../users\";\nimport { StackServerAppConstructorOptions } from \"../interfaces/server-app\";\nimport { _StackClientAppImplIncomplete } from \"./client-app-impl\";\nimport { clientVersion, createCache, createCacheBySession, getBaseUrl, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey } from \"./common\";\nimport { useAsyncCache } from \"./common\";\n\n\nexport class _StackServerAppImplIncomplete<HasTokenStore extends boolean, ProjectId extends string> extends _StackClientAppImplIncomplete<HasTokenStore, ProjectId>\n{\n declare protected _interface: StackServerInterface;\n\n // TODO override the client user cache to use the server user cache, so we save some requests\n private readonly _currentServerUserCache = createCacheBySession(async (session) => {\n if (session.isKnownToBeInvalid()) {\n // see comment in _currentUserCache for more details on why we do this\n return null;\n }\n return await this._interface.getServerUserByToken(session);\n });\n private readonly _serverUsersCache = createCache<[\n cursor?: string,\n limit?: number,\n orderBy?: 'signedUpAt',\n desc?: boolean,\n query?: string,\n ], UsersCrud['Server']['List']>(async ([cursor, limit, orderBy, desc, query]) => {\n return await this._interface.listServerUsers({ cursor, limit, orderBy, desc, query });\n });\n private readonly _serverUserCache = createCache<string[], UsersCrud['Server']['Read'] | null>(async ([userId]) => {\n const user = await this._interface.getServerUserById(userId);\n return Result.or(user, null);\n });\n private readonly _serverTeamsCache = createCache<[string | undefined], TeamsCrud['Server']['Read'][]>(async ([userId]) => {\n return await this._interface.listServerTeams({ userId });\n });\n private readonly _serverTeamUserPermissionsCache = createCache<\n [string, string, boolean],\n TeamPermissionsCrud['Server']['Read'][]\n >(async ([teamId, userId, recursive]) => {\n return await this._interface.listServerTeamPermissions({ teamId, userId, recursive }, null);\n });\n private readonly _serverUserOAuthConnectionAccessTokensCache = createCache<[string, string, string], { accessToken: string } | null>(\n async ([userId, providerId, scope]) => {\n try {\n const result = await this._interface.createServerProviderAccessToken(userId, providerId, scope || \"\");\n return { accessToken: result.access_token };\n } catch (err) {\n if (!(err instanceof KnownErrors.OAuthConnectionDoesNotHaveRequiredScope || err instanceof KnownErrors.OAuthConnectionNotConnectedToUser)) {\n throw err;\n }\n }\n return null;\n }\n );\n private readonly _serverUserOAuthConnectionCache = createCache<[string, ProviderType, string, boolean], OAuthConnection | null>(\n async ([userId, providerId, scope, redirect]) => {\n return await this._getUserOAuthConnectionCacheFn({\n getUser: async () => Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\")),\n getOrWaitOAuthToken: async () => Result.orThrow(await this._serverUserOAuthConnectionAccessTokensCache.getOrWait([userId, providerId, scope || \"\"] as const, \"write-only\")),\n useOAuthToken: () => useAsyncCache(this._serverUserOAuthConnectionAccessTokensCache, [userId, providerId, scope || \"\"] as const, \"user.useConnectedAccount()\"),\n providerId,\n scope,\n redirect,\n session: null,\n });\n }\n );\n private readonly _serverTeamMemberProfilesCache = createCache<[string], TeamMemberProfilesCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamMemberProfiles({ teamId });\n }\n );\n private readonly _serverTeamInvitationsCache = createCache<[string], TeamInvitationCrud['Server']['Read'][]>(\n async ([teamId]) => {\n return await this._interface.listServerTeamInvitations({ teamId });\n }\n );\n private readonly _serverUserTeamProfileCache = createCache<[string, string], TeamMemberProfilesCrud['Client']['Read']>(\n async ([teamId, userId]) => {\n return await this._interface.getServerTeamMemberProfile({ teamId, userId });\n }\n );\n private readonly _serverContactChannelsCache = createCache<[string], ContactChannelsCrud['Server']['Read'][]>(\n async ([userId]) => {\n return await this._interface.listServerContactChannels(userId);\n }\n );\n\n private async _updateServerUser(userId: string, update: ServerUserUpdateOptions): Promise<UsersCrud['Server']['Read']> {\n const result = await this._interface.updateServerUser(userId, serverUserUpdateOptionsToCrud(update));\n await this._refreshUsers();\n return result;\n }\n\n protected _serverEditableTeamProfileFromCrud(crud: TeamMemberProfilesCrud['Client']['Read']): EditableTeamMemberProfile {\n const app = this;\n return {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n async update(update: { displayName?: string, profileImageUrl?: string }) {\n await app._interface.updateServerTeamMemberProfile({\n teamId: crud.team_id,\n userId: crud.user_id,\n profile: {\n display_name: update.displayName,\n profile_image_url: update.profileImageUrl,\n },\n });\n await app._serverUserTeamProfileCache.refresh([crud.team_id, crud.user_id]);\n }\n };\n }\n\n protected _serverContactChannelFromCrud(userId: string, crud: ContactChannelsCrud['Server']['Read']): ServerContactChannel {\n const app = this;\n return {\n id: crud.id,\n value: crud.value,\n type: crud.type,\n isVerified: crud.is_verified,\n isPrimary: crud.is_primary,\n usedForAuth: crud.used_for_auth,\n async sendVerificationEmail(options?: { callbackUrl?: string }) {\n if (!options?.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot send verification email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendVerificationEmail({ callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerContactChannelVerificationEmail(userId, crud.id, options?.callbackUrl ?? constructRedirectUrl(app.urls.emailVerification));\n },\n async update(data: ServerContactChannelUpdateOptions) {\n await app._interface.updateServerContactChannel(userId, crud.id, serverContactChannelUpdateOptionsToCrud(data));\n },\n async delete() {\n await app._interface.deleteServerContactChannel(userId, crud.id);\n },\n };\n }\n\n constructor(options:\n | StackServerAppConstructorOptions<HasTokenStore, ProjectId>\n | {\n interface: StackServerInterface,\n tokenStore: TokenStoreInit<HasTokenStore>,\n urls: Partial<HandlerUrls> | undefined,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn> | undefined,\n }\n ) {\n super(\"interface\" in options ? {\n interface: options.interface,\n tokenStore: options.tokenStore,\n urls: options.urls,\n oauthScopesOnSignIn: options.oauthScopesOnSignIn,\n } : {\n interface: new StackServerInterface({\n getBaseUrl: () => getBaseUrl(options.baseUrl),\n projectId: options.projectId ?? getDefaultProjectId(),\n clientVersion,\n publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),\n secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey(),\n }),\n baseUrl: options.baseUrl,\n projectId: options.projectId,\n publishableClientKey: options.publishableClientKey,\n tokenStore: options.tokenStore,\n urls: options.urls ?? {},\n oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {},\n redirectMethod: options.redirectMethod,\n });\n }\n\n protected _serverUserFromCrud(crud: UsersCrud['Server']['Read']): ServerUser {\n const app = this;\n\n async function getConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): Promise<OAuthConnection | null>;\n async function getConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): Promise<OAuthConnection>;\n async function getConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): Promise<OAuthConnection | null> {\n const scopeString = options?.scopes?.join(\" \");\n return Result.orThrow(await app._serverUserOAuthConnectionCache.getOrWait([crud.id, id, scopeString || \"\", options?.or === 'redirect'], \"write-only\"));\n }\n\n function useConnectedAccount(id: ProviderType, options?: { scopes?: string[] }): OAuthConnection | null;\n function useConnectedAccount(id: ProviderType, options: { or: 'redirect', scopes?: string[] }): OAuthConnection;\n function useConnectedAccount(id: ProviderType, options?: { or?: 'redirect', scopes?: string[] }): OAuthConnection | null {\n const scopeString = options?.scopes?.join(\" \");\n return useAsyncCache(app._serverUserOAuthConnectionCache, [crud.id, id, scopeString || \"\", options?.or === 'redirect'] as const, \"user.useConnectedAccount()\");\n }\n\n return {\n ...super._createBaseUser(crud),\n lastActiveAt: new Date(crud.last_active_at_millis),\n serverMetadata: crud.server_metadata,\n async setPrimaryEmail(email: string | null, options?: { verified?: boolean }) {\n await app._updateServerUser(crud.id, { primaryEmail: email, primaryEmailVerified: options?.verified });\n },\n async grantPermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.grantServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async revokePermission(scope: Team, permissionId: string): Promise<void> {\n await app._interface.revokeServerTeamUserPermission(scope.id, crud.id, permissionId);\n for (const recursive of [true, false]) {\n await app._serverTeamUserPermissionsCache.refresh([scope.id, crud.id, recursive]);\n }\n },\n async delete() {\n const res = await app._interface.deleteServerUser(crud.id);\n await app._refreshUsers();\n return res;\n },\n async createSession(options: { expiresInMillis?: number }) {\n // TODO this should also refresh the access token when it expires (like InternalSession)\n const tokens = await app._interface.createServerUserSession(crud.id, options.expiresInMillis ?? 1000 * 60 * 60 * 24 * 365);\n return {\n async getTokens() {\n return tokens;\n },\n };\n },\n async setDisplayName(displayName: string) {\n return await this.update({ displayName });\n },\n async setClientMetadata(metadata: Record<string, any>) {\n return await this.update({ clientMetadata: metadata });\n },\n async setClientReadOnlyMetadata(metadata: Record<string, any>) {\n return await this.update({ clientReadOnlyMetadata: metadata });\n },\n async setServerMetadata(metadata: Record<string, any>) {\n return await this.update({ serverMetadata: metadata });\n },\n async setSelectedTeam(team: Team | null) {\n return await this.update({ selectedTeamId: team?.id ?? null });\n },\n getConnectedAccount,\n useConnectedAccount,\n selectedTeam: crud.selected_team ? app._serverTeamFromCrud(crud.selected_team) : null,\n async getTeam(teamId: string) {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n },\n useTeam(teamId: string) {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n },\n async listTeams() {\n const teams = Result.orThrow(await app._serverTeamsCache.getOrWait([crud.id], \"write-only\"));\n return teams.map((t) => app._serverTeamFromCrud(t));\n },\n useTeams() {\n const teams = useAsyncCache(app._serverTeamsCache, [crud.id], \"user.useTeams()\");\n return useMemo(() => teams.map((t) => app._serverTeamFromCrud(t)), [teams]);\n },\n createTeam: async (data: Omit<ServerTeamCreateOptions, \"creatorUserId\">) => {\n const team = await app._interface.createServerTeam(serverTeamCreateOptionsToCrud({\n creatorUserId: crud.id,\n ...data,\n }));\n await app._serverTeamsCache.refresh([undefined]);\n return app._serverTeamFromCrud(team);\n },\n leaveTeam: async (team: Team) => {\n await app._interface.leaveServerTeam({ teamId: team.id, userId: crud.id });\n // TODO: refresh cache\n },\n async listPermissions(scope: Team, options?: { recursive?: boolean }): Promise<AdminTeamPermission[]> {\n const recursive = options?.recursive ?? true;\n const permissions = Result.orThrow(await app._serverTeamUserPermissionsCache.getOrWait([scope.id, crud.id, recursive], \"write-only\"));\n return permissions.map((crud) => app._serverPermissionFromCrud(crud));\n },\n usePermissions(scope: Team, options?: { recursive?: boolean }): AdminTeamPermission[] {\n const recursive = options?.recursive ?? true;\n const permissions = useAsyncCache(app._serverTeamUserPermissionsCache, [scope.id, crud.id, recursive] as const, \"user.usePermissions()\");\n return useMemo(() => permissions.map((crud) => app._serverPermissionFromCrud(crud)), [permissions]);\n },\n async getPermission(scope: Team, permissionId: string): Promise<AdminTeamPermission | null> {\n const permissions = await this.listPermissions(scope);\n return permissions.find((p) => p.id === permissionId) ?? null;\n },\n usePermission(scope: Team, permissionId: string): AdminTeamPermission | null {\n const permissions = this.usePermissions(scope);\n return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);\n },\n async hasPermission(scope: Team, permissionId: string): Promise<boolean> {\n return await this.getPermission(scope, permissionId) !== null;\n },\n async update(update: ServerUserUpdateOptions) {\n await app._updateServerUser(crud.id, update);\n },\n async sendVerificationEmail() {\n return await app._checkFeatureSupport(\"sendVerificationEmail() on ServerUser\", {});\n },\n async updatePassword(options: { oldPassword?: string, newPassword: string}) {\n const result = await this.update({ password: options.newPassword });\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async setPassword(options: { password: string }) {\n const result = await this.update(options);\n await app._serverUserCache.refresh([crud.id]);\n return result;\n },\n async getTeamProfile(team: Team) {\n const result = Result.orThrow(await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], \"write-only\"));\n return app._serverEditableTeamProfileFromCrud(result);\n },\n useTeamProfile(team: Team) {\n const result = useAsyncCache(app._serverUserTeamProfileCache, [team.id, crud.id] as const, \"user.useTeamProfile()\");\n return useMemo(() => app._serverEditableTeamProfileFromCrud(result), [result]);\n },\n async listContactChannels() {\n const result = Result.orThrow(await app._serverContactChannelsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((data) => app._serverContactChannelFromCrud(crud.id, data));\n },\n useContactChannels() {\n const result = useAsyncCache(app._serverContactChannelsCache, [crud.id] as const, \"user.useContactChannels()\");\n return useMemo(() => result.map((data) => app._serverContactChannelFromCrud(crud.id, data)), [result]);\n },\n createContactChannel: async (data: ServerContactChannelCreateOptions) => {\n const contactChannel = await app._interface.createServerContactChannel(serverContactChannelCreateOptionsToCrud(crud.id, data));\n await app._serverContactChannelsCache.refresh([crud.id]);\n return app._serverContactChannelFromCrud(crud.id, contactChannel);\n },\n };\n }\n\n protected _serverTeamUserFromCrud(crud: TeamMemberProfilesCrud[\"Server\"][\"Read\"]): ServerTeamUser {\n return {\n ...this._serverUserFromCrud(crud.user),\n teamProfile: {\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n },\n };\n }\n\n protected _serverTeamInvitationFromCrud(crud: TeamInvitationCrud['Server']['Read']): TeamInvitation {\n return {\n id: crud.id,\n recipientEmail: crud.recipient_email,\n expiresAt: new Date(crud.expires_at_millis),\n revoke: async () => {\n await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);\n },\n };\n }\n\n protected override _currentUserFromCrud(crud: UsersCrud['Server']['Read'], session: InternalSession): ProjectCurrentServerUser<ProjectId> {\n const app = this;\n const currentUser = {\n ...this._serverUserFromCrud(crud),\n ...this._createAuth(session),\n ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},\n } satisfies ServerUser;\n\n Object.freeze(currentUser);\n return currentUser as ProjectCurrentServerUser<ProjectId>;\n }\n\n protected _serverTeamFromCrud(crud: TeamsCrud['Server']['Read']): ServerTeam {\n const app = this;\n return {\n id: crud.id,\n displayName: crud.display_name,\n profileImageUrl: crud.profile_image_url,\n createdAt: new Date(crud.created_at_millis),\n clientMetadata: crud.client_metadata,\n clientReadOnlyMetadata: crud.client_read_only_metadata,\n serverMetadata: crud.server_metadata,\n async update(update: Partial<ServerTeamUpdateOptions>) {\n await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));\n await app._serverTeamsCache.refresh([undefined]);\n },\n async delete() {\n await app._interface.deleteServerTeam(crud.id);\n await app._serverTeamsCache.refresh([undefined]);\n },\n async listUsers() {\n const result = Result.orThrow(await app._serverTeamMemberProfilesCache.getOrWait([crud.id], \"write-only\"));\n return result.map(u => app._serverTeamUserFromCrud(u));\n },\n useUsers() {\n const result = useAsyncCache(app._serverTeamMemberProfilesCache, [crud.id] as const, \"team.useUsers()\");\n return useMemo(() => result.map(u => app._serverTeamUserFromCrud(u)), [result]);\n },\n async addUser(userId) {\n await app._interface.addServerUserToTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async removeUser(userId) {\n await app._interface.removeServerUserFromTeam({\n teamId: crud.id,\n userId,\n });\n await app._serverTeamMemberProfilesCache.refresh([crud.id]);\n },\n async inviteUser(options: { email: string, callbackUrl?: string }) {\n if (!options.callbackUrl && !await app._getCurrentUrl()) {\n throw new Error(\"Cannot invite user without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `inviteUser({ email, callbackUrl: ... })`\");\n }\n\n await app._interface.sendServerTeamInvitation({\n teamId: crud.id,\n email: options.email,\n callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation),\n });\n await app._serverTeamInvitationsCache.refresh([crud.id]);\n },\n async listInvitations() {\n const result = Result.orThrow(await app._serverTeamInvitationsCache.getOrWait([crud.id], \"write-only\"));\n return result.map((crud) => app._serverTeamInvitationFromCrud(crud));\n },\n useInvitations() {\n const result = useAsyncCache(app._serverTeamInvitationsCache, [crud.id] as const, \"team.useInvitations()\");\n return useMemo(() => result.map((crud) => app._serverTeamInvitationFromCrud(crud)), [result]);\n },\n };\n }\n\n async createUser(options: ServerUserCreateOptions): Promise<ServerUser> {\n const crud = await this._interface.createServerUser(serverUserCreateOptionsToCrud(options));\n await this._refreshUsers();\n return this._serverUserFromCrud(crud);\n }\n\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentServerUser<ProjectId>>;\n async getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | null>;\n async getUser(id: string): Promise<ServerUser | null>;\n async getUser(options?: string | GetUserOptions<HasTokenStore>): Promise<ProjectCurrentServerUser<ProjectId> | ServerUser | null> {\n if (typeof options === \"string\") {\n return await this.getServerUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n const session = await this._getSession(options?.tokenStore);\n const crud = Result.orThrow(await this._currentServerUserCache.getOrWait([session], \"write-only\"));\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n await this.redirectToSignIn({ replace: true });\n break;\n }\n case 'throw': {\n throw new Error(\"User is not signed in but getUser was called with { or: 'throw' }\");\n }\n default: {\n return null;\n }\n }\n }\n\n return crud && this._currentUserFromCrud(crud, session);\n }\n }\n\n async getServerUser(): Promise<ProjectCurrentServerUser<ProjectId> | null> {\n console.warn(\"stackServerApp.getServerUser is deprecated; use stackServerApp.getUser instead\");\n return await this.getUser();\n }\n\n async getServerUserById(userId: string): Promise<ServerUser | null> {\n const crud = Result.orThrow(await this._serverUserCache.getOrWait([userId], \"write-only\"));\n return crud && this._serverUserFromCrud(crud);\n }\n\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options: GetUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentServerUser<ProjectId>;\n useUser(options?: GetUserOptions<HasTokenStore>): ProjectCurrentServerUser<ProjectId> | null;\n useUser(id: string): ServerUser | null;\n useUser(options?: GetUserOptions<HasTokenStore> | string): ProjectCurrentServerUser<ProjectId> | ServerUser | null {\n if (typeof options === \"string\") {\n return this.useUserById(options);\n } else {\n // TODO this code is duplicated from the client app; fix that\n this._ensurePersistentTokenStore(options?.tokenStore);\n\n const session = this._useSession(options?.tokenStore);\n const crud = useAsyncCache(this._currentServerUserCache, [session], \"useUser()\");\n\n if (crud === null) {\n switch (options?.or) {\n case 'redirect': {\n runAsynchronously(this.redirectToSignIn({ replace: true }));\n suspend();\n throw new StackAssertionError(\"suspend should never return\");\n }\n case 'throw': {\n throw new Error(\"User is not signed in but useUser was called with { or: 'throw' }\");\n }\n case undefined:\n case \"return-null\": {\n // do nothing\n }\n }\n }\n\n return useMemo(() => {\n return crud && this._currentUserFromCrud(crud, session);\n }, [crud, session, options?.or]);\n }\n }\n useUserById(userId: string): ServerUser | null {\n const crud = useAsyncCache(this._serverUserCache, [userId], \"useUserById()\");\n return useMemo(() => {\n return crud && this._serverUserFromCrud(crud);\n }, [crud]);\n }\n\n async listUsers(options?: ServerListUsersOptions): Promise<ServerUser[] & { nextCursor: string | null }> {\n const crud = Result.orThrow(await this._serverUsersCache.getOrWait([options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query], \"write-only\"));\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n useUsers(options?: ServerListUsersOptions): ServerUser[] & { nextCursor: string | null } {\n const crud = useAsyncCache(this._serverUsersCache, [options?.cursor, options?.limit, options?.orderBy, options?.desc, options?.query] as const, \"useServerUsers()\");\n const result: any = crud.items.map((j) => this._serverUserFromCrud(j));\n result.nextCursor = crud.pagination?.next_cursor ?? null;\n return result as any;\n }\n\n _serverPermissionFromCrud(crud: TeamPermissionsCrud['Server']['Read']): AdminTeamPermission {\n return {\n id: crud.id,\n };\n }\n\n _serverTeamPermissionDefinitionFromCrud(crud: TeamPermissionDefinitionsCrud['Admin']['Read']): AdminTeamPermissionDefinition {\n return {\n id: crud.id,\n description: crud.description,\n containedPermissionIds: crud.contained_permission_ids,\n };\n }\n\n async listTeams(): Promise<ServerTeam[]> {\n const teams = Result.orThrow(await this._serverTeamsCache.getOrWait([undefined], \"write-only\"));\n return teams.map((t) => this._serverTeamFromCrud(t));\n }\n\n async createTeam(data: ServerTeamCreateOptions): Promise<ServerTeam> {\n const team = await this._interface.createServerTeam(serverTeamCreateOptionsToCrud(data));\n await this._serverTeamsCache.refresh([undefined]);\n return this._serverTeamFromCrud(team);\n }\n\n useTeams(): ServerTeam[] {\n const teams = useAsyncCache(this._serverTeamsCache, [undefined], \"useServerTeams()\");\n return useMemo(() => {\n return teams.map((t) => this._serverTeamFromCrud(t));\n }, [teams]);\n }\n\n async getTeam(teamId: string): Promise<ServerTeam | null> {\n const teams = await this.listTeams();\n return teams.find((t) => t.id === teamId) ?? null;\n }\n\n useTeam(teamId: string): ServerTeam | null {\n const teams = this.useTeams();\n return useMemo(() => {\n return teams.find((t) => t.id === teamId) ?? null;\n }, [teams, teamId]);\n }\n\n protected override async _refreshSession(session: InternalSession) {\n await Promise.all([\n super._refreshUser(session),\n this._currentServerUserCache.refresh([session]),\n ]);\n }\n\n protected override async _refreshUsers() {\n await Promise.all([\n super._refreshUsers(),\n this._serverUserCache.refreshWhere(() => true),\n this._serverUsersCache.refreshWhere(() => true),\n this._serverContactChannelsCache.refreshWhere(() => true),\n ]);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAkD;AAQlD,oBAAoC;AAEpC,sBAAkC;AAClC,mBAAwB;AACxB,qBAAuB;AACvB,IAAAA,gBAAwB;AACxB,iBAAqC;AAGrC,8BAA6L;AAE7L,mBAAoO;AACpO,mBAAqK;AAErK,6BAA8C;AAC9C,oBAA6J;AAC7J,IAAAC,iBAA8B;AAGvB,IAAM,gCAAN,cAAqG,qDAC5G;AAAA,EAkIE,YAAY,SAQV;AACA,UAAM,eAAe,UAAU;AAAA,MAC7B,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd,qBAAqB,QAAQ;AAAA,IAC/B,IAAI;AAAA,MACF,WAAW,IAAI,yCAAqB;AAAA,QAClC,YAAY,UAAM,0BAAW,QAAQ,OAAO;AAAA,QAC5C,WAAW,QAAQ,iBAAa,mCAAoB;AAAA,QACpD;AAAA,QACA,sBAAsB,QAAQ,4BAAwB,8CAA+B;AAAA,QACrF,iBAAiB,QAAQ,uBAAmB,yCAA0B;AAAA,MACxE,CAAC;AAAA,MACD,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,sBAAsB,QAAQ;AAAA,MAC9B,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvB,qBAAqB,QAAQ,uBAAuB,CAAC;AAAA,MACrD,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AA3JH;AAAA,SAAiB,8BAA0B,oCAAqB,OAAO,YAAY;AACjF,UAAI,QAAQ,mBAAmB,GAAG;AAEhC,eAAO;AAAA,MACT;AACA,aAAO,MAAM,KAAK,WAAW,qBAAqB,OAAO;AAAA,IAC3D,CAAC;AACD,SAAiB,wBAAoB,2BAML,OAAO,CAAC,QAAQ,OAAO,SAAS,MAAM,KAAK,MAAM;AAC/E,aAAO,MAAM,KAAK,WAAW,gBAAgB,EAAE,QAAQ,OAAO,SAAS,MAAM,MAAM,CAAC;AAAA,IACtF,CAAC;AACD,SAAiB,uBAAmB,2BAA0D,OAAO,CAAC,MAAM,MAAM;AAChH,YAAM,OAAO,MAAM,KAAK,WAAW,kBAAkB,MAAM;AAC3D,aAAO,sBAAO,GAAG,MAAM,IAAI;AAAA,IAC7B,CAAC;AACD,SAAiB,wBAAoB,2BAAiE,OAAO,CAAC,MAAM,MAAM;AACxH,aAAO,MAAM,KAAK,WAAW,gBAAgB,EAAE,OAAO,CAAC;AAAA,IACzD,CAAC;AACD,SAAiB,sCAAkC,2BAGjD,OAAO,CAAC,QAAQ,QAAQ,SAAS,MAAM;AACvC,aAAO,MAAM,KAAK,WAAW,0BAA0B,EAAE,QAAQ,QAAQ,UAAU,GAAG,IAAI;AAAA,IAC5F,CAAC;AACD,SAAiB,kDAA8C;AAAA,MAC7D,OAAO,CAAC,QAAQ,YAAY,KAAK,MAAM;AACrC,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,WAAW,gCAAgC,QAAQ,YAAY,SAAS,EAAE;AACpG,iBAAO,EAAE,aAAa,OAAO,aAAa;AAAA,QAC5C,SAAS,KAAK;AACZ,cAAI,EAAE,eAAe,gCAAY,2CAA2C,eAAe,gCAAY,oCAAoC;AACzI,kBAAM;AAAA,UACR;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,SAAiB,sCAAkC;AAAA,MACjD,OAAO,CAAC,QAAQ,YAAY,OAAO,QAAQ,MAAM;AAC/C,eAAO,MAAM,KAAK,+BAA+B;AAAA,UAC/C,SAAS,YAAY,sBAAO,QAAQ,MAAM,KAAK,iBAAiB,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,UACjG,qBAAqB,YAAY,sBAAO,QAAQ,MAAM,KAAK,4CAA4C,UAAU,CAAC,QAAQ,YAAY,SAAS,EAAE,GAAY,YAAY,CAAC;AAAA,UAC1K,eAAe,UAAM,8BAAc,KAAK,6CAA6C,CAAC,QAAQ,YAAY,SAAS,EAAE,GAAY,4BAA4B;AAAA,UAC7J;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AACA,SAAiB,qCAAiC;AAAA,MAChD,OAAO,CAAC,MAAM,MAAM;AAClB,eAAO,MAAM,KAAK,WAAW,6BAA6B,EAAE,OAAO,CAAC;AAAA,MACtE;AAAA,IACF;AACA,SAAiB,kCAA8B;AAAA,MAC7C,OAAO,CAAC,MAAM,MAAM;AAClB,eAAO,MAAM,KAAK,WAAW,0BAA0B,EAAE,OAAO,CAAC;AAAA,MACnE;AAAA,IACF;AACA,SAAiB,kCAA8B;AAAA,MAC7C,OAAO,CAAC,QAAQ,MAAM,MAAM;AAC1B,eAAO,MAAM,KAAK,WAAW,2BAA2B,EAAE,QAAQ,OAAO,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,SAAiB,kCAA8B;AAAA,MAC7C,OAAO,CAAC,MAAM,MAAM;AAClB,eAAO,MAAM,KAAK,WAAW,0BAA0B,MAAM;AAAA,MAC/D;AAAA,IACF;AAAA,EAkFA;AAAA,EAhFA,MAAc,kBAAkB,QAAgB,QAAuE;AACrH,UAAM,SAAS,MAAM,KAAK,WAAW,iBAAiB,YAAQ,4CAA8B,MAAM,CAAC;AACnG,UAAM,KAAK,cAAc;AACzB,WAAO;AAAA,EACT;AAAA,EAEU,mCAAmC,MAA2E;AACtH,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,iBAAiB,KAAK;AAAA,MACtB,MAAM,OAAO,QAA4D;AACvE,cAAM,IAAI,WAAW,8BAA8B;AAAA,UACjD,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,YACP,cAAc,OAAO;AAAA,YACrB,mBAAmB,OAAO;AAAA,UAC5B;AAAA,QACF,CAAC;AACD,cAAM,IAAI,4BAA4B,QAAQ,CAAC,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAAA,EAEU,8BAA8B,QAAgB,MAAmE;AACzH,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,MAAM,sBAAsB,SAAoC;AAC9D,YAAI,CAAC,SAAS,eAAe,CAAC,MAAM,IAAI,eAAe,GAAG;AACxD,gBAAM,IAAI,MAAM,gMAAgM;AAAA,QAClN;AAEA,cAAM,IAAI,WAAW,0CAA0C,QAAQ,KAAK,IAAI,SAAS,mBAAe,iCAAqB,IAAI,KAAK,iBAAiB,CAAC;AAAA,MAC1J;AAAA,MACA,MAAM,OAAO,MAAyC;AACpD,cAAM,IAAI,WAAW,2BAA2B,QAAQ,KAAK,QAAI,iEAAwC,IAAI,CAAC;AAAA,MAChH;AAAA,MACA,MAAM,SAAS;AACb,cAAM,IAAI,WAAW,2BAA2B,QAAQ,KAAK,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAkCU,oBAAoB,MAA+C;AAC3E,UAAM,MAAM;AAIZ,mBAAe,oBAAoB,IAAkB,SAAmF;AACtI,YAAM,cAAc,SAAS,QAAQ,KAAK,GAAG;AAC7C,aAAO,sBAAO,QAAQ,MAAM,IAAI,gCAAgC,UAAU,CAAC,KAAK,IAAI,IAAI,eAAe,IAAI,SAAS,OAAO,UAAU,GAAG,YAAY,CAAC;AAAA,IACvJ;AAIA,aAAS,oBAAoB,IAAkB,SAA0E;AACvH,YAAM,cAAc,SAAS,QAAQ,KAAK,GAAG;AAC7C,iBAAO,8BAAc,IAAI,iCAAiC,CAAC,KAAK,IAAI,IAAI,eAAe,IAAI,SAAS,OAAO,UAAU,GAAY,4BAA4B;AAAA,IAC/J;AAEA,WAAO;AAAA,MACL,GAAG,MAAM,gBAAgB,IAAI;AAAA,MAC7B,cAAc,IAAI,KAAK,KAAK,qBAAqB;AAAA,MACjD,gBAAgB,KAAK;AAAA,MACrB,MAAM,gBAAgB,OAAsB,SAAkC;AAC5E,cAAM,IAAI,kBAAkB,KAAK,IAAI,EAAE,cAAc,OAAO,sBAAsB,SAAS,SAAS,CAAC;AAAA,MACvG;AAAA,MACA,MAAM,gBAAgB,OAAa,cAAqC;AACtE,cAAM,IAAI,WAAW,8BAA8B,MAAM,IAAI,KAAK,IAAI,YAAY;AAClF,mBAAW,aAAa,CAAC,MAAM,KAAK,GAAG;AACrC,gBAAM,IAAI,gCAAgC,QAAQ,CAAC,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,MACA,MAAM,iBAAiB,OAAa,cAAqC;AACvE,cAAM,IAAI,WAAW,+BAA+B,MAAM,IAAI,KAAK,IAAI,YAAY;AACnF,mBAAW,aAAa,CAAC,MAAM,KAAK,GAAG;AACrC,gBAAM,IAAI,gCAAgC,QAAQ,CAAC,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,MACA,MAAM,SAAS;AACb,cAAM,MAAM,MAAM,IAAI,WAAW,iBAAiB,KAAK,EAAE;AACzD,cAAM,IAAI,cAAc;AACxB,eAAO;AAAA,MACT;AAAA,MACA,MAAM,cAAc,SAAuC;AAEzD,cAAM,SAAS,MAAM,IAAI,WAAW,wBAAwB,KAAK,IAAI,QAAQ,mBAAmB,MAAO,KAAK,KAAK,KAAK,GAAG;AACzH,eAAO;AAAA,UACL,MAAM,YAAY;AAChB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,eAAe,aAAqB;AACxC,eAAO,MAAM,KAAK,OAAO,EAAE,YAAY,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,kBAAkB,UAA+B;AACrD,eAAO,MAAM,KAAK,OAAO,EAAE,gBAAgB,SAAS,CAAC;AAAA,MACvD;AAAA,MACA,MAAM,0BAA0B,UAA+B;AAC7D,eAAO,MAAM,KAAK,OAAO,EAAE,wBAAwB,SAAS,CAAC;AAAA,MAC/D;AAAA,MACA,MAAM,kBAAkB,UAA+B;AACrD,eAAO,MAAM,KAAK,OAAO,EAAE,gBAAgB,SAAS,CAAC;AAAA,MACvD;AAAA,MACA,MAAM,gBAAgB,MAAmB;AACvC,eAAO,MAAM,KAAK,OAAO,EAAE,gBAAgB,MAAM,MAAM,KAAK,CAAC;AAAA,MAC/D;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,KAAK,gBAAgB,IAAI,oBAAoB,KAAK,aAAa,IAAI;AAAA,MACjF,MAAM,QAAQ,QAAgB;AAC5B,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,eAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK;AAAA,MAC/C;AAAA,MACA,QAAQ,QAAgB;AACtB,cAAM,QAAQ,KAAK,SAAS;AAC5B,mBAAO,uBAAQ,MAAM;AACnB,iBAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK;AAAA,QAC/C,GAAG,CAAC,OAAO,MAAM,CAAC;AAAA,MACpB;AAAA,MACA,MAAM,YAAY;AAChB,cAAM,QAAQ,sBAAO,QAAQ,MAAM,IAAI,kBAAkB,UAAU,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC;AAC3F,eAAO,MAAM,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC;AAAA,MACpD;AAAA,MACA,WAAW;AACT,cAAM,YAAQ,8BAAc,IAAI,mBAAmB,CAAC,KAAK,EAAE,GAAG,iBAAiB;AAC/E,mBAAO,uBAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAAA,MAC5E;AAAA,MACA,YAAY,OAAO,SAAyD;AAC1E,cAAM,OAAO,MAAM,IAAI,WAAW,qBAAiB,4CAA8B;AAAA,UAC/E,eAAe,KAAK;AAAA,UACpB,GAAG;AAAA,QACL,CAAC,CAAC;AACF,cAAM,IAAI,kBAAkB,QAAQ,CAAC,MAAS,CAAC;AAC/C,eAAO,IAAI,oBAAoB,IAAI;AAAA,MACrC;AAAA,MACA,WAAW,OAAO,SAAe;AAC/B,cAAM,IAAI,WAAW,gBAAgB,EAAE,QAAQ,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC;AAAA,MAE3E;AAAA,MACA,MAAM,gBAAgB,OAAa,SAAmE;AACpG,cAAM,YAAY,SAAS,aAAa;AACxC,cAAM,cAAc,sBAAO,QAAQ,MAAM,IAAI,gCAAgC,UAAU,CAAC,MAAM,IAAI,KAAK,IAAI,SAAS,GAAG,YAAY,CAAC;AACpI,eAAO,YAAY,IAAI,CAACC,UAAS,IAAI,0BAA0BA,KAAI,CAAC;AAAA,MACtE;AAAA,MACA,eAAe,OAAa,SAA0D;AACpF,cAAM,YAAY,SAAS,aAAa;AACxC,cAAM,kBAAc,8BAAc,IAAI,iCAAiC,CAAC,MAAM,IAAI,KAAK,IAAI,SAAS,GAAY,uBAAuB;AACvI,mBAAO,uBAAQ,MAAM,YAAY,IAAI,CAACA,UAAS,IAAI,0BAA0BA,KAAI,CAAC,GAAG,CAAC,WAAW,CAAC;AAAA,MACpG;AAAA,MACA,MAAM,cAAc,OAAa,cAA2D;AAC1F,cAAM,cAAc,MAAM,KAAK,gBAAgB,KAAK;AACpD,eAAO,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,KAAK;AAAA,MAC3D;AAAA,MACA,cAAc,OAAa,cAAkD;AAC3E,cAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,mBAAO,uBAAQ,MAAM,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,KAAK,MAAM,CAAC,aAAa,YAAY,CAAC;AAAA,MAC1G;AAAA,MACA,MAAM,cAAc,OAAa,cAAwC;AACvE,eAAO,MAAM,KAAK,cAAc,OAAO,YAAY,MAAM;AAAA,MAC3D;AAAA,MACA,MAAM,OAAO,QAAiC;AAC5C,cAAM,IAAI,kBAAkB,KAAK,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA,MAAM,wBAAwB;AAC5B,eAAO,MAAM,IAAI,qBAAqB,yCAAyC,CAAC,CAAC;AAAA,MACnF;AAAA,MACA,MAAM,eAAe,SAAuD;AAC1E,cAAM,SAAS,MAAM,KAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,CAAC;AAClE,cAAM,IAAI,iBAAiB,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC5C,eAAO;AAAA,MACT;AAAA,MACA,MAAM,YAAY,SAA+B;AAC/C,cAAM,SAAS,MAAM,KAAK,OAAO,OAAO;AACxC,cAAM,IAAI,iBAAiB,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC5C,eAAO;AAAA,MACT;AAAA,MACA,MAAM,eAAe,MAAY;AAC/B,cAAM,SAAS,sBAAO,QAAQ,MAAM,IAAI,4BAA4B,UAAU,CAAC,KAAK,IAAI,KAAK,EAAE,GAAG,YAAY,CAAC;AAC/G,eAAO,IAAI,mCAAmC,MAAM;AAAA,MACtD;AAAA,MACA,eAAe,MAAY;AACzB,cAAM,aAAS,8BAAc,IAAI,6BAA6B,CAAC,KAAK,IAAI,KAAK,EAAE,GAAY,uBAAuB;AAClH,mBAAO,uBAAQ,MAAM,IAAI,mCAAmC,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,MAC/E;AAAA,MACA,MAAM,sBAAsB;AAC1B,cAAM,SAAS,sBAAO,QAAQ,MAAM,IAAI,4BAA4B,UAAU,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC;AACtG,eAAO,OAAO,IAAI,CAAC,SAAS,IAAI,8BAA8B,KAAK,IAAI,IAAI,CAAC;AAAA,MAC9E;AAAA,MACA,qBAAqB;AACnB,cAAM,aAAS,8BAAc,IAAI,6BAA6B,CAAC,KAAK,EAAE,GAAY,2BAA2B;AAC7G,mBAAO,uBAAQ,MAAM,OAAO,IAAI,CAAC,SAAS,IAAI,8BAA8B,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAAA,MACvG;AAAA,MACA,sBAAsB,OAAO,SAA4C;AACvE,cAAM,iBAAiB,MAAM,IAAI,WAAW,+BAA2B,iEAAwC,KAAK,IAAI,IAAI,CAAC;AAC7H,cAAM,IAAI,4BAA4B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACvD,eAAO,IAAI,8BAA8B,KAAK,IAAI,cAAc;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEU,wBAAwB,MAAgE;AAChG,WAAO;AAAA,MACL,GAAG,KAAK,oBAAoB,KAAK,IAAI;AAAA,MACrC,aAAa;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,iBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEU,8BAA8B,MAA4D;AAClG,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,WAAW,IAAI,KAAK,KAAK,iBAAiB;AAAA,MAC1C,QAAQ,YAAY;AAClB,cAAM,KAAK,WAAW,2BAA2B,KAAK,IAAI,KAAK,OAAO;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEmB,qBAAqB,MAAmC,SAA+D;AACxI,UAAM,MAAM;AACZ,UAAM,cAAc;AAAA,MAClB,GAAG,KAAK,oBAAoB,IAAI;AAAA,MAChC,GAAG,KAAK,YAAY,OAAO;AAAA,MAC3B,GAAG,KAAK,mBAAmB,IAAI,KAAK,yBAAyB,OAAO,IAAI,CAAC;AAAA,IAC3E;AAEA,WAAO,OAAO,WAAW;AACzB,WAAO;AAAA,EACT;AAAA,EAEU,oBAAoB,MAA+C;AAC3E,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,aAAa,KAAK;AAAA,MAClB,iBAAiB,KAAK;AAAA,MACtB,WAAW,IAAI,KAAK,KAAK,iBAAiB;AAAA,MAC1C,gBAAgB,KAAK;AAAA,MACrB,wBAAwB,KAAK;AAAA,MAC7B,gBAAgB,KAAK;AAAA,MACrB,MAAM,OAAO,QAA0C;AACrD,cAAM,IAAI,WAAW,iBAAiB,KAAK,QAAI,4CAA8B,MAAM,CAAC;AACpF,cAAM,IAAI,kBAAkB,QAAQ,CAAC,MAAS,CAAC;AAAA,MACjD;AAAA,MACA,MAAM,SAAS;AACb,cAAM,IAAI,WAAW,iBAAiB,KAAK,EAAE;AAC7C,cAAM,IAAI,kBAAkB,QAAQ,CAAC,MAAS,CAAC;AAAA,MACjD;AAAA,MACA,MAAM,YAAY;AAChB,cAAM,SAAS,sBAAO,QAAQ,MAAM,IAAI,+BAA+B,UAAU,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC;AACzG,eAAO,OAAO,IAAI,OAAK,IAAI,wBAAwB,CAAC,CAAC;AAAA,MACvD;AAAA,MACA,WAAW;AACT,cAAM,aAAS,8BAAc,IAAI,gCAAgC,CAAC,KAAK,EAAE,GAAY,iBAAiB;AACtG,mBAAO,uBAAQ,MAAM,OAAO,IAAI,OAAK,IAAI,wBAAwB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAAA,MAChF;AAAA,MACA,MAAM,QAAQ,QAAQ;AACpB,cAAM,IAAI,WAAW,oBAAoB;AAAA,UACvC,QAAQ,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AACD,cAAM,IAAI,+BAA+B,QAAQ,CAAC,KAAK,EAAE,CAAC;AAAA,MAC5D;AAAA,MACA,MAAM,WAAW,QAAQ;AACvB,cAAM,IAAI,WAAW,yBAAyB;AAAA,UAC5C,QAAQ,KAAK;AAAA,UACb;AAAA,QACF,CAAC;AACD,cAAM,IAAI,+BAA+B,QAAQ,CAAC,KAAK,EAAE,CAAC;AAAA,MAC5D;AAAA,MACA,MAAM,WAAW,SAAkD;AACjE,YAAI,CAAC,QAAQ,eAAe,CAAC,MAAM,IAAI,eAAe,GAAG;AACvD,gBAAM,IAAI,MAAM,gLAAgL;AAAA,QAClM;AAEA,cAAM,IAAI,WAAW,yBAAyB;AAAA,UAC5C,QAAQ,KAAK;AAAA,UACb,OAAO,QAAQ;AAAA,UACf,aAAa,QAAQ,mBAAe,iCAAqB,IAAI,KAAK,cAAc;AAAA,QAClF,CAAC;AACD,cAAM,IAAI,4BAA4B,QAAQ,CAAC,KAAK,EAAE,CAAC;AAAA,MACzD;AAAA,MACA,MAAM,kBAAkB;AACtB,cAAM,SAAS,sBAAO,QAAQ,MAAM,IAAI,4BAA4B,UAAU,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC;AACtG,eAAO,OAAO,IAAI,CAACA,UAAS,IAAI,8BAA8BA,KAAI,CAAC;AAAA,MACrE;AAAA,MACA,iBAAiB;AACf,cAAM,aAAS,8BAAc,IAAI,6BAA6B,CAAC,KAAK,EAAE,GAAY,uBAAuB;AACzG,mBAAO,uBAAQ,MAAM,OAAO,IAAI,CAACA,UAAS,IAAI,8BAA8BA,KAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAuD;AACtE,UAAM,OAAO,MAAM,KAAK,WAAW,qBAAiB,4CAA8B,OAAO,CAAC;AAC1F,UAAM,KAAK,cAAc;AACzB,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACtC;AAAA,EAMA,MAAM,QAAQ,SAAoH;AAChI,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,MAAM,KAAK,kBAAkB,OAAO;AAAA,IAC7C,OAAO;AAEL,WAAK,4BAA4B,SAAS,UAAU;AACpD,YAAM,UAAU,MAAM,KAAK,YAAY,SAAS,UAAU;AAC1D,YAAM,OAAO,sBAAO,QAAQ,MAAM,KAAK,wBAAwB,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;AAEjG,UAAI,SAAS,MAAM;AACjB,gBAAQ,SAAS,IAAI;AAAA,UACnB,KAAK,YAAY;AACf,kBAAM,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAC7C;AAAA,UACF;AAAA,UACA,KAAK,SAAS;AACZ,kBAAM,IAAI,MAAM,mEAAmE;AAAA,UACrF;AAAA,UACA,SAAS;AACP,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO,QAAQ,KAAK,qBAAqB,MAAM,OAAO;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,gBAAqE;AACzE,YAAQ,KAAK,gFAAgF;AAC7F,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,kBAAkB,QAA4C;AAClE,UAAM,OAAO,sBAAO,QAAQ,MAAM,KAAK,iBAAiB,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC;AACzF,WAAO,QAAQ,KAAK,oBAAoB,IAAI;AAAA,EAC9C;AAAA,EAMA,QAAQ,SAA2G;AACjH,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,KAAK,YAAY,OAAO;AAAA,IACjC,OAAO;AAEL,WAAK,4BAA4B,SAAS,UAAU;AAEpD,YAAM,UAAU,KAAK,YAAY,SAAS,UAAU;AACpD,YAAM,WAAO,8BAAc,KAAK,yBAAyB,CAAC,OAAO,GAAG,WAAW;AAE/E,UAAI,SAAS,MAAM;AACjB,gBAAQ,SAAS,IAAI;AAAA,UACnB,KAAK,YAAY;AACf,mDAAkB,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,CAAC;AAC1D,sCAAQ;AACR,kBAAM,IAAI,kCAAoB,6BAA6B;AAAA,UAC7D;AAAA,UACA,KAAK,SAAS;AACZ,kBAAM,IAAI,MAAM,mEAAmE;AAAA,UACrF;AAAA,UACA,KAAK;AAAA,UACL,KAAK,eAAe;AAAA,UAEpB;AAAA,QACF;AAAA,MACF;AAEA,iBAAO,uBAAQ,MAAM;AACnB,eAAO,QAAQ,KAAK,qBAAqB,MAAM,OAAO;AAAA,MACxD,GAAG,CAAC,MAAM,SAAS,SAAS,EAAE,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EACA,YAAY,QAAmC;AAC7C,UAAM,WAAO,8BAAc,KAAK,kBAAkB,CAAC,MAAM,GAAG,eAAe;AAC3E,eAAO,uBAAQ,MAAM;AACnB,aAAO,QAAQ,KAAK,oBAAoB,IAAI;AAAA,IAC9C,GAAG,CAAC,IAAI,CAAC;AAAA,EACX;AAAA,EAEA,MAAM,UAAU,SAAyF;AACvG,UAAM,OAAO,sBAAO,QAAQ,MAAM,KAAK,kBAAkB,UAAU,CAAC,SAAS,QAAQ,SAAS,OAAO,SAAS,SAAS,SAAS,MAAM,SAAS,KAAK,GAAG,YAAY,CAAC;AACpK,UAAM,SAAc,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC;AACrE,WAAO,aAAa,KAAK,YAAY,eAAe;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,SAAgF;AACvF,UAAM,WAAO,8BAAc,KAAK,mBAAmB,CAAC,SAAS,QAAQ,SAAS,OAAO,SAAS,SAAS,SAAS,MAAM,SAAS,KAAK,GAAY,kBAAkB;AAClK,UAAM,SAAc,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC;AACrE,WAAO,aAAa,KAAK,YAAY,eAAe;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,0BAA0B,MAAkE;AAC1F,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,IACX;AAAA,EACF;AAAA,EAEA,wCAAwC,MAAqF;AAC3H,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,aAAa,KAAK;AAAA,MAClB,wBAAwB,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,YAAmC;AACvC,UAAM,QAAQ,sBAAO,QAAQ,MAAM,KAAK,kBAAkB,UAAU,CAAC,MAAS,GAAG,YAAY,CAAC;AAC9F,WAAO,MAAM,IAAI,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,WAAW,MAAoD;AACnE,UAAM,OAAO,MAAM,KAAK,WAAW,qBAAiB,4CAA8B,IAAI,CAAC;AACvF,UAAM,KAAK,kBAAkB,QAAQ,CAAC,MAAS,CAAC;AAChD,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACtC;AAAA,EAEA,WAAyB;AACvB,UAAM,YAAQ,8BAAc,KAAK,mBAAmB,CAAC,MAAS,GAAG,kBAAkB;AACnF,eAAO,uBAAQ,MAAM;AACnB,aAAO,MAAM,IAAI,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC;AAAA,IACrD,GAAG,CAAC,KAAK,CAAC;AAAA,EACZ;AAAA,EAEA,MAAM,QAAQ,QAA4C;AACxD,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,WAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK;AAAA,EAC/C;AAAA,EAEA,QAAQ,QAAmC;AACzC,UAAM,QAAQ,KAAK,SAAS;AAC5B,eAAO,uBAAQ,MAAM;AACnB,aAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK;AAAA,IAC/C,GAAG,CAAC,OAAO,MAAM,CAAC;AAAA,EACpB;AAAA,EAEA,MAAyB,gBAAgB,SAA0B;AACjE,UAAM,QAAQ,IAAI;AAAA,MAChB,MAAM,aAAa,OAAO;AAAA,MAC1B,KAAK,wBAAwB,QAAQ,CAAC,OAAO,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,MAAyB,gBAAgB;AACvC,UAAM,QAAQ,IAAI;AAAA,MAChB,MAAM,cAAc;AAAA,MACpB,KAAK,iBAAiB,aAAa,MAAM,IAAI;AAAA,MAC7C,KAAK,kBAAkB,aAAa,MAAM,IAAI;AAAA,MAC9C,KAAK,4BAA4B,aAAa,MAAM,IAAI;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;","names":["import_react","import_common","crud"]}