@@ -21,6 +21,119 @@ const VSCODE_EXTENSIONS = {
2121 recommendations : [ 'VoidZero.vite-plus-extension-pack' ] ,
2222} as const ;
2323
24+ const ZED_SETTINGS = {
25+ lsp : {
26+ oxlint : {
27+ initialization_options : {
28+ settings : {
29+ configPath : './.oxlintrc.json' ,
30+ run : 'onType' ,
31+ disableNestedConfig : false ,
32+ fixKind : 'safe_fix' ,
33+ typeAware : true ,
34+ unusedDisableDirectives : 'deny' ,
35+ } ,
36+ } ,
37+ } ,
38+ oxfmt : {
39+ initialization_options : {
40+ settings : {
41+ configPath : './.oxfmtrc.jsonc' ,
42+ run : 'onSave' ,
43+ } ,
44+ } ,
45+ } ,
46+ } ,
47+ languages : {
48+ CSS : {
49+ format_on_save : 'on' ,
50+ prettier : { allowed : false } ,
51+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
52+ } ,
53+ GraphQL : {
54+ format_on_save : 'on' ,
55+ prettier : { allowed : false } ,
56+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
57+ } ,
58+ Handlebars : {
59+ format_on_save : 'on' ,
60+ prettier : { allowed : false } ,
61+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
62+ } ,
63+ HTML : {
64+ format_on_save : 'on' ,
65+ prettier : { allowed : false } ,
66+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
67+ } ,
68+ JavaScript : {
69+ format_on_save : 'on' ,
70+ prettier : { allowed : false } ,
71+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
72+ code_action : 'source.fixAll.oxc' ,
73+ } ,
74+ JSX : {
75+ format_on_save : 'on' ,
76+ prettier : { allowed : false } ,
77+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
78+ } ,
79+ JSON : {
80+ format_on_save : 'on' ,
81+ prettier : { allowed : false } ,
82+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
83+ } ,
84+ JSON5 : {
85+ format_on_save : 'on' ,
86+ prettier : { allowed : false } ,
87+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
88+ } ,
89+ JSONC : {
90+ format_on_save : 'on' ,
91+ prettier : { allowed : false } ,
92+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
93+ } ,
94+ Less : {
95+ format_on_save : 'on' ,
96+ prettier : { allowed : false } ,
97+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
98+ } ,
99+ Markdown : {
100+ format_on_save : 'on' ,
101+ prettier : { allowed : false } ,
102+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
103+ } ,
104+ MDX : {
105+ format_on_save : 'on' ,
106+ prettier : { allowed : false } ,
107+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
108+ } ,
109+ SCSS : {
110+ format_on_save : 'on' ,
111+ prettier : { allowed : false } ,
112+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
113+ } ,
114+ TypeScript : {
115+ format_on_save : 'on' ,
116+ prettier : { allowed : false } ,
117+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
118+ } ,
119+ TSX : {
120+ format_on_save : 'on' ,
121+ prettier : { allowed : false } ,
122+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
123+ } ,
124+ Vue : {
125+ format_on_save : 'on' ,
126+ prettier : { allowed : false } ,
127+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
128+ } ,
129+ YAML : {
130+ format_on_save : 'on' ,
131+ prettier : { allowed : false } ,
132+ formatter : [ { language_server : { name : 'oxfmt' } } ] ,
133+ } ,
134+ } ,
135+ } as const ;
136+
24137export const EDITORS = [
25138 {
26139 id : 'vscode' ,
@@ -31,6 +144,14 @@ export const EDITORS = [
31144 'extensions.json' : VSCODE_EXTENSIONS as Record < string , unknown > ,
32145 } ,
33146 } ,
147+ {
148+ id : 'zed' ,
149+ label : 'Zed' ,
150+ targetDir : '.zed' ,
151+ files : {
152+ 'settings.json' : ZED_SETTINGS as Record < string , unknown > ,
153+ } ,
154+ } ,
34155] as const ;
35156
36157export type EditorId = ( typeof EDITORS ) [ number ] [ 'id' ] ;
@@ -247,9 +368,15 @@ function mergeEditorConfigs(
247368 } ;
248369 }
249370
250- // settings.json: 2-level deep merge, preserving existing keys
251- const result = { ...existing } ;
252- for ( const [ key , value ] of Object . entries ( incoming ) ) {
371+ return deepMerge ( existing , incoming ) ;
372+ }
373+
374+ function deepMerge (
375+ target : Record < string , unknown > ,
376+ source : Record < string , unknown > ,
377+ ) : Record < string , unknown > {
378+ const result = { ...target } ;
379+ for ( const [ key , value ] of Object . entries ( source ) ) {
253380 if ( ! ( key in result ) ) {
254381 result [ key ] = value ;
255382 } else if (
@@ -260,13 +387,11 @@ function mergeEditorConfigs(
260387 value !== null &&
261388 ! Array . isArray ( value )
262389 ) {
263- // Nested object: merge preserving existing keys
264- result [ key ] = {
265- ...( value as Record < string , unknown > ) ,
266- ...( result [ key ] as Record < string , unknown > ) ,
267- } ;
390+ result [ key ] = deepMerge (
391+ result [ key ] as Record < string , unknown > ,
392+ value as Record < string , unknown > ,
393+ ) ;
268394 }
269- // else: existing key is preserved as-is
270395 }
271396 return result ;
272397}
0 commit comments