Skip to content

Commit 51aa80c

Browse files
Merge pull request #496 from appwrite/1.4.x
1.4.x
2 parents 9a9bc97 + 1da1041 commit 51aa80c

463 files changed

Lines changed: 25332 additions & 4388 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintrc.cjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,8 @@ module.exports = {
2424
browser: true,
2525
es2017: true,
2626
node: true
27+
},
28+
globals: {
29+
globalThis: false // false means it is not writeable
2730
}
2831
};

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ node_modules
1313
node_modules/
1414
dist/
1515
.vercel
16+
17+
*.swp

package-lock.json

Lines changed: 8249 additions & 1772 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
},
2020
"dependencies": {
2121
"@analytics/google-analytics": "^1.0.5",
22-
"@appwrite.io/pink": "^0.0.6-rc.14",
23-
"@appwrite.io/console": "0.2.0",
2422
"@analytics/google-tag-manager": "^0.5.3",
23+
"@appwrite.io/console": "npm:matej-appwrite-console@7.1.130",
24+
"@appwrite.io/pink": "0.1.0-next.8",
25+
"@appwrite.io/pink-icons": "^0.1.0-next.8",
2526
"@popperjs/core": "^2.11.6",
2627
"@sentry/svelte": "^7.44.2",
2728
"@sentry/tracing": "^7.44.2",
29+
"ai": "^2.1.15",
2830
"analytics": "^0.8.1",
31+
"dayjs": "^1.11.9",
32+
"deep-equal": "^2.2.2",
2933
"dotenv": "^16.0.3",
3034
"echarts": "^5.4.1",
3135
"logrocket": "^3.0.1",
36+
"nanoid": "^4.0.2",
3237
"pretty-bytes": "^6.1.0",
3338
"prismjs": "^1.29.0",
3439
"svelte-confetti": "^1.2.2",
@@ -44,6 +49,7 @@
4449
"@testing-library/jest-dom": "^5.16.5",
4550
"@testing-library/svelte": "^3.2.2",
4651
"@testing-library/user-event": "^14.4.3",
52+
"@types/deep-equal": "^1.0.1",
4753
"@types/prismjs": "^1.26.0",
4854
"@typescript-eslint/eslint-plugin": "^5.56.0",
4955
"@typescript-eslint/parser": "^5.56.0",

src/app.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
%sveltekit.head%
4949
</head>
50-
<body>
50+
<body data-sveltekit-preload-data="hover">
5151
<div id="svelte">%sveltekit.body%</div>
5252
</body>
5353
</html>

src/lib/actions/analytics.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export enum Submit {
142142
ProjectUpdateName = 'submit_project_update_name',
143143
ProjectUpdateTeam = 'submit_project_update_team',
144144
ProjectService = 'submit_project_service',
145+
ProjectUpdateSMTP = 'submit_project_update_smtp',
145146
MemberCreate = 'submit_member_create',
146147
MemberDelete = 'submit_member_delete',
147148
MembershipUpdateStatus = 'submit_membership_update_status',
@@ -153,6 +154,7 @@ export enum Submit {
153154
AuthStatusUpdate = 'submit_auth_status_update',
154155
AuthPasswordHistoryUpdate = 'submit_auth_password_history_limit_update',
155156
AuthPasswordDictionaryUpdate = 'submit_auth_password_dictionary_update',
157+
AuthPersonalDataCheckUpdate = 'submit_auth_personal_data_check_update',
156158
SessionsLengthUpdate = 'submit_sessions_length_update',
157159
SessionsLimitUpdate = 'submit_sessions_limit_update',
158160
SessionDelete = 'submit_session_delete',
@@ -181,15 +183,21 @@ export enum Submit {
181183
FunctionUpdateName = 'submit_function_update_name',
182184
FunctionUpdatePermissions = 'submit_function_update_permissions',
183185
FunctionUpdateSchedule = 'submit_function_update_schedule',
186+
FunctionUpdateConfiguration = 'submit_function_update_configuration',
187+
FunctionUpdateLogging = 'submit_function_update_logging',
184188
FunctionUpdateTimeout = 'submit_function_update_timeout',
185189
FunctionUpdateEvents = 'submit_function_update_events',
190+
FunctionConnectRepo = 'submit_function_disconnect_repo',
191+
FunctionDisconnectRepo = 'submit_function_disconnect_repo',
192+
FunctionRedeploy = 'submit_function_redeploy',
186193
DeploymentCreate = 'submit_deployment_create',
187194
DeploymentDelete = 'submit_deployment_delete',
188195
DeploymentUpdate = 'submit_deployment_update',
189196
ExecutionCreate = 'submit_execution_create',
190197
VariableCreate = 'submit_variable_create',
191198
VariableDelete = 'submit_variable_delete',
192199
VariableUpdate = 'submit_variable_update',
200+
VariableEditor = 'submit_variable_editor',
193201
KeyCreate = 'submit_key_create',
194202
KeyDelete = 'submit_key_delete',
195203
KeyUpdateName = 'submit_key_update_name',
@@ -220,5 +228,18 @@ export enum Submit {
220228
BucketUpdateExtensions = 'submit_bucket_update_extensions',
221229
FileCreate = 'submit_file_create',
222230
FileDelete = 'submit_file_delete',
223-
FileUpdatePermissions = 'submit_file_update_permissions'
231+
FileUpdatePermissions = 'submit_file_update_permissions',
232+
InstallationCreate = 'submit_installation_create',
233+
InstallationDelete = 'submit_installation_delete',
234+
EmailChangeLocale = 'submit_email_change_locale',
235+
EmailResetTemplate = 'submit_email_reset_template',
236+
EmailUpdateInviteTemplate = 'submit_email_update_invite_template',
237+
EmailUpdateMagicUrlTemplate = 'submit_email_update_magic_url_template',
238+
EmailUpdateRecoveryTemplate = 'submit_email_update_recovery_template',
239+
EmailUpdateVerificationTemplate = 'submit_email_update_verification_template',
240+
SmsChangeLocale = 'submit_sms_change_locale',
241+
SmsResetTemplate = 'submit_sms_reset_template',
242+
SmsUpdateInviteTemplate = 'submit_sms_update_invite_template',
243+
SmsUpdateLoginTemplate = 'submit_sms_update_login_template',
244+
SmsUpdateVerificationTemplate = 'submit_sms_update_verification_template'
224245
}

src/lib/actions/multi-actions.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { Action } from 'svelte/action';
2+
3+
export type MultiActionArray = Array<(node: HTMLElement) => ReturnType<Action>>;
4+
5+
export function multiAction(node: HTMLElement, arr: MultiActionArray) {
6+
const destroyFns = arr.map((fn) => {
7+
const actionReturn = fn(node);
8+
9+
return actionReturn
10+
? actionReturn.destroy
11+
: () => {
12+
/* noop */
13+
};
14+
});
15+
return {
16+
destroy() {
17+
destroyFns.forEach((fn) => fn());
18+
}
19+
};
20+
}

src/lib/actions/portal.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { tick } from 'svelte';
2+
import type { Action } from 'svelte/action';
3+
4+
export type PortalConfig = string | HTMLElement | undefined;
5+
6+
export const portal: Action<HTMLElement, PortalConfig> = (el, target = 'body') => {
7+
let targetEl;
8+
9+
async function update(newTarget: PortalConfig) {
10+
target = newTarget;
11+
if (typeof target === 'string') {
12+
targetEl = document.querySelector(target);
13+
if (targetEl === null) {
14+
await tick();
15+
targetEl = document.querySelector(target);
16+
}
17+
if (targetEl === null) {
18+
throw new Error(`No element found matching css selector: "${target}"`);
19+
}
20+
} else if (target instanceof HTMLElement) {
21+
targetEl = target;
22+
} else {
23+
throw new TypeError(
24+
`Unknown portal target type: ${
25+
target === null ? 'null' : typeof target
26+
}. Allowed types: string (CSS selector) or HTMLElement.`
27+
);
28+
}
29+
targetEl.appendChild(el);
30+
el.hidden = false;
31+
}
32+
33+
function destroy() {
34+
el.remove();
35+
}
36+
37+
update(target);
38+
return {
39+
update,
40+
destroy
41+
};
42+
};
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<script lang="ts" context="module">
2+
type Context = Readable<{
3+
isInitialPanel: boolean;
4+
open: boolean;
5+
}>;
6+
type ReadableValue<T> = T extends Readable<infer U> ? U : never;
7+
8+
const contextKey = 'command-center';
9+
export const getCommandCenterCtx = () => getContext<Context>(contextKey);
10+
const setCommandCenterCtx = (value: ReadableValue<Context>) => {
11+
const store = writable(value);
12+
setContext(contextKey, store);
13+
return store;
14+
};
15+
16+
export const toggleCommandCenter = () => {
17+
if (get(subPanels).length > 0) {
18+
clearSubPanels();
19+
} else {
20+
addSubPanel(RootPanel);
21+
}
22+
};
23+
</script>
24+
25+
<script lang="ts">
26+
import { dev } from '$app/environment';
27+
import { portal } from '$lib/actions/portal';
28+
import { last } from '$lib/helpers/array';
29+
import { debounce } from '$lib/helpers/debounce';
30+
import { getContext, setContext } from 'svelte';
31+
import { get, writable, type Readable } from 'svelte/store';
32+
import { fade } from 'svelte/transition';
33+
import { commandCenterKeyDownHandler, disableCommands, registerCommands } from './commands';
34+
import { RootPanel } from './panels';
35+
import { addSubPanel, clearSubPanels, subPanels } from './subPanels';
36+
import { addNotification } from '$lib/stores/notifications';
37+
38+
let debugOverlayEnabled = false;
39+
40+
$: $registerCommands([
41+
{
42+
callback: toggleCommandCenter,
43+
keys: ['k'],
44+
ctrl: true,
45+
forceEnable: true
46+
},
47+
{
48+
label: 'Toggle debug overlay',
49+
callback: () => {
50+
debugOverlayEnabled = !debugOverlayEnabled;
51+
addNotification({
52+
title: 'Debug overlay',
53+
message: debugOverlayEnabled ? 'Enabled' : 'Disabled',
54+
type: 'info'
55+
});
56+
},
57+
keys: ['d', 'o'],
58+
group: 'misc',
59+
disabled: !dev
60+
}
61+
]);
62+
63+
$: openSubPanel = last($subPanels) ?? null;
64+
$: $disableCommands(!!openSubPanel);
65+
66+
$: if (openSubPanel) {
67+
document.documentElement.classList.add('u-overflow-hidden');
68+
} else {
69+
document.documentElement.classList.remove('u-overflow-hidden');
70+
}
71+
72+
let dialog: HTMLDivElement;
73+
74+
function handleBlur(event: MouseEvent) {
75+
if (event.target === dialog) {
76+
clearSubPanels();
77+
}
78+
}
79+
80+
const ctx = setCommandCenterCtx({
81+
isInitialPanel: true,
82+
open: false
83+
});
84+
85+
$: if (!openSubPanel) {
86+
$ctx.isInitialPanel = true;
87+
}
88+
$: $subPanels.length > 1 && ($ctx.isInitialPanel = false);
89+
90+
$: $ctx.open = !!openSubPanel;
91+
92+
let keys: string[] = [];
93+
94+
const resetKeys = debounce(() => {
95+
keys = [];
96+
}, 1000);
97+
98+
function isInputEvent(event: KeyboardEvent) {
99+
return ['INPUT', 'TEXTAREA', 'SELECT'].includes((event.target as HTMLElement).tagName);
100+
}
101+
102+
const handleKeydown = (e) => {
103+
if (!$subPanels.length) {
104+
if (isInputEvent(e)) return;
105+
keys = [...keys, e.key].slice(-10);
106+
resetKeys();
107+
}
108+
$commandCenterKeyDownHandler(e);
109+
};
110+
</script>
111+
112+
<svelte:window on:mousedown={handleBlur} on:keydown={handleKeydown} />
113+
114+
{#if openSubPanel}
115+
<div class="dialog" bind:this={dialog} transition:fade={{ duration: 100 }}>
116+
<svelte:component this={openSubPanel.component} />
117+
</div>
118+
{/if}
119+
120+
{#if dev && debugOverlayEnabled}
121+
<div class="debug-keys" use:portal>
122+
{#each keys as key, i (i)}
123+
<kbd class="kbd" transition:fade|local={{ duration: 150 }}>
124+
{key.length === 1 ? key.toUpperCase() : key}
125+
</kbd>
126+
{/each}
127+
</div>
128+
{/if}
129+
130+
<style lang="scss">
131+
.dialog {
132+
padding: 0.5rem;
133+
position: fixed;
134+
inset: 0;
135+
136+
background-color: hsl(var(--color-neutral-500) / 0.5);
137+
z-index: 9999;
138+
}
139+
140+
.debug-keys {
141+
position: fixed;
142+
bottom: 10%;
143+
left: 50%;
144+
transform: translateX(-50%);
145+
padding: 0.5rem;
146+
z-index: 9999;
147+
148+
display: flex;
149+
gap: 1rem;
150+
151+
font-size: 2rem;
152+
153+
.kbd {
154+
padding-inline: 0.5rem;
155+
padding-block: 1.5rem;
156+
}
157+
}
158+
</style>

0 commit comments

Comments
 (0)