summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/merge.ts
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-02-06 15:03:07 +0900
committerGitHub <noreply@github.com>2024-02-06 15:03:07 +0900
commit16eccad49271b81282cdbd482d29e7a8bb048f4c (patch)
tree96f0b6f94f106de95ff8cb9af29b39b53fdeaece /packages/frontend/src/scripts/merge.ts
parent2024.2.0-beta.10 (diff)
downloadmisskey-16eccad49271b81282cdbd482d29e7a8bb048f4c.tar.gz
misskey-16eccad49271b81282cdbd482d29e7a8bb048f4c.tar.bz2
misskey-16eccad49271b81282cdbd482d29e7a8bb048f4c.zip
enhance(frontend): シンタックスハイライトにテーマを適用できるように (#13175)
* enhance(frontend): シンタックスハイライトにテーマを適用できるように * Update Changelog * こっちも * テーマの値がディープマージされるように * 常にテーマ設定に準じるように * テーマ更新時に新しいshikiテーマを読み込むように
Diffstat (limited to 'packages/frontend/src/scripts/merge.ts')
-rw-r--r--packages/frontend/src/scripts/merge.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/packages/frontend/src/scripts/merge.ts b/packages/frontend/src/scripts/merge.ts
new file mode 100644
index 0000000000..60097051fa
--- /dev/null
+++ b/packages/frontend/src/scripts/merge.ts
@@ -0,0 +1,31 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { deepClone } from './clone.js';
+import type { Cloneable } from './clone.js';
+
+function isPureObject(value: unknown): value is Record<string | number | symbol, unknown> {
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
+}
+
+/**
+ * valueにないキーをdefからもらう(再帰的)\
+ * nullはそのまま、undefinedはdefの値
+ **/
+export function deepMerge<X extends Record<string | number | symbol, unknown>>(value: X, def: X): X {
+ if (isPureObject(value) && isPureObject(def)) {
+ const result = deepClone(value as Cloneable) as X;
+ for (const [k, v] of Object.entries(def) as [keyof X, X[keyof X]][]) {
+ if (!Object.prototype.hasOwnProperty.call(value, k) || value[k] === undefined) {
+ result[k] = v;
+ } else if (isPureObject(v) && isPureObject(result[k])) {
+ const child = deepClone(result[k] as Cloneable) as X[keyof X] & Record<string | number | symbol, unknown>;
+ result[k] = deepMerge<typeof v>(child, v);
+ }
+ }
+ return result;
+ }
+ return value;
+}