@fresh-editor/fresh-editor 0.2.18 → 0.2.20

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.
@@ -1,346 +1,511 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://raw.githubusercontent.com/sinelaw/fresh/main/crates/fresh-editor/plugins/schemas/package.schema.json",
4
3
  "title": "Fresh Package Manifest",
5
4
  "description": "Schema for Fresh plugin and theme package.json files",
6
5
  "type": "object",
7
- "required": ["name", "version", "description", "type"],
8
6
  "properties": {
9
7
  "name": {
8
+ "description": "Package name (lowercase, hyphens allowed)",
10
9
  "type": "string",
11
- "pattern": "^[a-z0-9-]+$",
12
- "description": "Package name (lowercase, hyphens allowed)"
10
+ "pattern": "^[a-z0-9-]+$"
13
11
  },
14
12
  "version": {
15
- "type": "string",
13
+ "description": "Semantic version (e.g., 1.0.0)",
14
+ "type": [
15
+ "string",
16
+ "null"
17
+ ],
16
18
  "pattern": "^\\d+\\.\\d+\\.\\d+",
17
- "description": "Semantic version (e.g., 1.0.0)"
19
+ "default": null
18
20
  },
19
21
  "description": {
20
- "type": "string",
21
- "description": "Short package description"
22
+ "description": "Short package description",
23
+ "type": [
24
+ "string",
25
+ "null"
26
+ ],
27
+ "default": null
22
28
  },
23
29
  "type": {
24
- "type": "string",
25
- "enum": ["plugin", "theme", "theme-pack", "language", "bundle"],
26
- "description": "Package type"
30
+ "description": "Package type",
31
+ "anyOf": [
32
+ {
33
+ "$ref": "#/$defs/PackageType"
34
+ },
35
+ {
36
+ "type": "null"
37
+ }
38
+ ]
39
+ },
40
+ "fresh": {
41
+ "description": "Fresh-specific configuration",
42
+ "anyOf": [
43
+ {
44
+ "$ref": "#/$defs/FreshManifestConfig"
45
+ },
46
+ {
47
+ "type": "null"
48
+ }
49
+ ]
27
50
  },
28
51
  "author": {
29
- "type": "string",
30
- "description": "Author name and optional email (e.g., 'Name <email>')"
52
+ "description": "Author name",
53
+ "type": [
54
+ "string",
55
+ "null"
56
+ ],
57
+ "default": null
31
58
  },
32
59
  "license": {
33
- "type": "string",
34
- "description": "SPDX license identifier"
60
+ "description": "SPDX license identifier",
61
+ "type": [
62
+ "string",
63
+ "null"
64
+ ],
65
+ "default": null
35
66
  },
36
67
  "repository": {
37
- "type": "string",
38
- "format": "uri",
39
- "description": "Git repository URL"
68
+ "description": "Git repository URL",
69
+ "type": [
70
+ "string",
71
+ "null"
72
+ ],
73
+ "default": null
40
74
  },
41
75
  "keywords": {
76
+ "description": "Search keywords",
42
77
  "type": "array",
43
- "items": { "type": "string" },
44
- "description": "Search keywords"
78
+ "items": {
79
+ "type": "string"
80
+ },
81
+ "default": []
45
82
  },
46
- "fresh": {
83
+ "dependencies": {
84
+ "description": "Package dependencies (reserved for future use)",
85
+ "type": "object",
86
+ "additionalProperties": {
87
+ "type": "string"
88
+ },
89
+ "default": {}
90
+ }
91
+ },
92
+ "required": [
93
+ "name"
94
+ ],
95
+ "$defs": {
96
+ "PackageType": {
97
+ "description": "Package type discriminator.",
98
+ "type": "string",
99
+ "enum": [
100
+ "plugin",
101
+ "theme",
102
+ "theme-pack",
103
+ "language",
104
+ "bundle"
105
+ ]
106
+ },
107
+ "FreshManifestConfig": {
108
+ "description": "The `fresh` configuration block inside a package manifest.",
47
109
  "type": "object",
48
- "description": "Fresh-specific configuration",
49
110
  "properties": {
50
111
  "min_version": {
51
- "type": "string",
52
- "pattern": "^\\d+\\.\\d+\\.\\d+",
53
- "description": "Minimum required Fresh version"
112
+ "description": "Minimum required Fresh version",
113
+ "type": [
114
+ "string",
115
+ "null"
116
+ ],
117
+ "default": null
54
118
  },
55
119
  "min_api_version": {
56
- "type": "integer",
57
- "minimum": 1,
58
- "description": "Minimum required plugin API version (integer, e.g. 2)"
120
+ "description": "Minimum required plugin API version",
121
+ "type": [
122
+ "integer",
123
+ "null"
124
+ ],
125
+ "format": "uint32",
126
+ "minimum": 0,
127
+ "default": null
59
128
  },
60
129
  "entry": {
61
- "type": "string",
62
- "description": "Plugin entry point file (for plugins)"
130
+ "description": "Plugin entry point file",
131
+ "type": [
132
+ "string",
133
+ "null"
134
+ ],
135
+ "default": null
136
+ },
137
+ "main": {
138
+ "description": "Plugin entry point file (alias for entry)",
139
+ "type": [
140
+ "string",
141
+ "null"
142
+ ],
143
+ "default": null
144
+ },
145
+ "theme": {
146
+ "description": "Single theme JSON file path (for theme packages)",
147
+ "type": [
148
+ "string",
149
+ "null"
150
+ ],
151
+ "default": null
63
152
  },
64
153
  "themes": {
154
+ "description": "Theme definitions (for theme packs and bundles)",
65
155
  "type": "array",
66
- "description": "Theme definitions (for theme packs)",
67
156
  "items": {
68
- "type": "object",
69
- "required": ["file", "name"],
70
- "properties": {
71
- "file": {
72
- "type": "string",
73
- "description": "Theme JSON file path"
74
- },
75
- "name": {
76
- "type": "string",
77
- "description": "Display name for the theme"
78
- },
79
- "variant": {
80
- "type": "string",
81
- "enum": ["dark", "light"],
82
- "description": "Theme variant (dark or light)"
83
- }
84
- }
157
+ "$ref": "#/$defs/BundleTheme"
85
158
  }
86
159
  },
87
160
  "config_schema": {
88
- "type": "object",
89
- "description": "JSON Schema for plugin configuration options"
90
- },
91
- "main": {
92
- "type": "string",
93
- "description": "Plugin entry point file (alias for entry)"
94
- },
95
- "theme": {
96
- "type": "string",
97
- "description": "Theme JSON file path (for single theme packages)"
161
+ "description": "JSON Schema for plugin configuration options",
162
+ "default": null
98
163
  },
99
164
  "grammar": {
100
- "type": "object",
101
165
  "description": "Grammar configuration (for language packs)",
102
- "required": ["file"],
103
- "properties": {
104
- "file": {
105
- "type": "string",
106
- "description": "Path to grammar file (.sublime-syntax recommended, or .tmLanguage)"
166
+ "anyOf": [
167
+ {
168
+ "$ref": "#/$defs/GrammarManifestConfig"
107
169
  },
108
- "extensions": {
109
- "type": "array",
110
- "items": { "type": "string" },
111
- "description": "File extensions this grammar handles (e.g., [\"rs\", \"rust\"])"
112
- },
113
- "firstLine": {
114
- "type": "string",
115
- "description": "Regex pattern for shebang detection"
170
+ {
171
+ "type": "null"
116
172
  }
117
- }
173
+ ]
118
174
  },
119
175
  "language": {
120
- "type": "object",
121
176
  "description": "Language configuration (for language packs)",
122
- "properties": {
123
- "commentPrefix": {
124
- "type": "string",
125
- "description": "Line comment prefix (e.g., \"//\" or \"#\")"
177
+ "anyOf": [
178
+ {
179
+ "$ref": "#/$defs/LanguageManifestConfig"
126
180
  },
127
- "blockCommentStart": {
128
- "type": "string",
129
- "description": "Block comment start marker (e.g., \"/*\")"
130
- },
131
- "blockCommentEnd": {
132
- "type": "string",
133
- "description": "Block comment end marker (e.g., \"*/\")"
134
- },
135
- "tabSize": {
136
- "type": "integer",
137
- "minimum": 1,
138
- "description": "Default tab size for this language"
139
- },
140
- "useTabs": {
141
- "type": "boolean",
142
- "description": "Use tabs instead of spaces"
143
- },
144
- "autoIndent": {
145
- "type": "boolean",
146
- "description": "Enable automatic indentation"
147
- },
148
- "showWhitespaceTabs": {
149
- "type": "boolean",
150
- "description": "Whether to show whitespace tab indicators (→). Defaults to true. Set to false for languages like Go/Hare that use tabs for indentation."
151
- },
152
- "formatter": {
153
- "type": "object",
154
- "required": ["command"],
155
- "properties": {
156
- "command": {
157
- "type": "string",
158
- "description": "Formatter command (e.g., \"rustfmt\")"
159
- },
160
- "args": {
161
- "type": "array",
162
- "items": { "type": "string" },
163
- "description": "Arguments to pass to the formatter"
164
- }
165
- }
181
+ {
182
+ "type": "null"
166
183
  }
167
- }
184
+ ]
168
185
  },
169
186
  "lsp": {
170
- "type": "object",
171
187
  "description": "LSP server configuration (for language packs)",
172
- "required": ["command"],
173
- "properties": {
174
- "command": {
175
- "type": "string",
176
- "description": "LSP server command"
177
- },
178
- "args": {
179
- "type": "array",
180
- "items": { "type": "string" },
181
- "description": "Arguments to pass to the server"
188
+ "anyOf": [
189
+ {
190
+ "$ref": "#/$defs/LspManifestConfig"
182
191
  },
183
- "autoStart": {
184
- "type": "boolean",
185
- "description": "Auto-start the server when a matching file is opened"
186
- },
187
- "initializationOptions": {
188
- "type": "object",
189
- "description": "LSP initialization options"
192
+ {
193
+ "type": "null"
190
194
  }
191
- }
195
+ ]
192
196
  },
193
197
  "languages": {
194
- "type": "array",
195
198
  "description": "Language definitions (for bundles)",
199
+ "type": "array",
196
200
  "items": {
197
- "type": "object",
198
- "required": ["id"],
199
- "properties": {
200
- "id": {
201
- "type": "string",
202
- "description": "Language identifier (e.g., 'elixir', 'heex')"
203
- },
204
- "grammar": {
205
- "type": "object",
206
- "description": "Grammar configuration",
207
- "required": ["file"],
208
- "properties": {
209
- "file": {
210
- "type": "string",
211
- "description": "Path to grammar file relative to package"
212
- },
213
- "extensions": {
214
- "type": "array",
215
- "items": { "type": "string" },
216
- "description": "File extensions this grammar handles"
217
- },
218
- "firstLine": {
219
- "type": "string",
220
- "description": "Regex pattern for shebang detection"
221
- }
222
- }
223
- },
224
- "language": {
225
- "type": "object",
226
- "description": "Language configuration",
227
- "properties": {
228
- "commentPrefix": {
229
- "type": "string",
230
- "description": "Line comment prefix"
231
- },
232
- "blockCommentStart": {
233
- "type": "string",
234
- "description": "Block comment start marker"
235
- },
236
- "blockCommentEnd": {
237
- "type": "string",
238
- "description": "Block comment end marker"
239
- },
240
- "tabSize": {
241
- "type": "integer",
242
- "minimum": 1,
243
- "description": "Default tab size for this language"
244
- },
245
- "useTabs": {
246
- "type": "boolean",
247
- "description": "Use tabs instead of spaces"
248
- },
249
- "autoIndent": {
250
- "type": "boolean",
251
- "description": "Enable automatic indentation"
252
- },
253
- "showWhitespaceTabs": {
254
- "type": "boolean",
255
- "description": "Whether to show whitespace tab indicators"
256
- },
257
- "formatter": {
258
- "type": "object",
259
- "required": ["command"],
260
- "properties": {
261
- "command": {
262
- "type": "string",
263
- "description": "Formatter command"
264
- },
265
- "args": {
266
- "type": "array",
267
- "items": { "type": "string" },
268
- "description": "Arguments to pass to the formatter"
269
- }
270
- }
271
- }
272
- }
273
- },
274
- "lsp": {
275
- "type": "object",
276
- "description": "LSP server configuration",
277
- "required": ["command"],
278
- "properties": {
279
- "command": {
280
- "type": "string",
281
- "description": "LSP server command"
282
- },
283
- "args": {
284
- "type": "array",
285
- "items": { "type": "string" },
286
- "description": "Arguments to pass to the server"
287
- },
288
- "autoStart": {
289
- "type": "boolean",
290
- "description": "Auto-start the server when a matching file is opened"
291
- },
292
- "initializationOptions": {
293
- "type": "object",
294
- "description": "LSP initialization options"
295
- }
296
- }
297
- }
298
- }
201
+ "$ref": "#/$defs/BundleLanguage"
299
202
  }
300
203
  },
301
204
  "plugins": {
302
- "type": "array",
303
205
  "description": "Plugin definitions (for bundles)",
206
+ "type": "array",
304
207
  "items": {
305
- "type": "object",
306
- "required": ["entry"],
307
- "properties": {
308
- "entry": {
309
- "type": "string",
310
- "description": "Plugin entry point file relative to package"
311
- }
312
- }
208
+ "$ref": "#/$defs/BundlePlugin"
313
209
  }
210
+ }
211
+ }
212
+ },
213
+ "BundleTheme": {
214
+ "description": "A theme entry within a package manifest.",
215
+ "type": "object",
216
+ "properties": {
217
+ "file": {
218
+ "description": "Theme JSON file path relative to package",
219
+ "type": "string"
314
220
  },
315
- "themes": {
221
+ "name": {
222
+ "description": "Display name for the theme",
223
+ "type": "string"
224
+ },
225
+ "variant": {
226
+ "description": "Theme variant (dark or light)",
227
+ "anyOf": [
228
+ {
229
+ "$ref": "#/$defs/ThemeVariant"
230
+ },
231
+ {
232
+ "type": "null"
233
+ }
234
+ ]
235
+ }
236
+ },
237
+ "required": [
238
+ "file",
239
+ "name"
240
+ ]
241
+ },
242
+ "ThemeVariant": {
243
+ "description": "Theme variant (dark or light).",
244
+ "type": "string",
245
+ "enum": [
246
+ "dark",
247
+ "light"
248
+ ]
249
+ },
250
+ "GrammarManifestConfig": {
251
+ "description": "Grammar file configuration within a package manifest.",
252
+ "type": "object",
253
+ "properties": {
254
+ "file": {
255
+ "description": "Path to grammar file (.sublime-syntax or .tmLanguage), relative to package",
256
+ "type": "string"
257
+ },
258
+ "extensions": {
259
+ "description": "File extensions this grammar handles (e.g., [\"rs\", \"rust\"])",
316
260
  "type": "array",
317
- "description": "Theme definitions (for bundles)",
318
261
  "items": {
319
- "type": "object",
320
- "required": ["file", "name"],
321
- "properties": {
322
- "file": {
323
- "type": "string",
324
- "description": "Theme JSON file path relative to package"
325
- },
326
- "name": {
327
- "type": "string",
328
- "description": "Display name for the theme"
329
- },
330
- "variant": {
331
- "type": "string",
332
- "enum": ["dark", "light"],
333
- "description": "Theme variant (dark or light)"
334
- }
262
+ "type": "string"
263
+ },
264
+ "default": []
265
+ },
266
+ "firstLine": {
267
+ "description": "Regex pattern for shebang/first-line detection",
268
+ "type": [
269
+ "string",
270
+ "null"
271
+ ],
272
+ "default": null
273
+ }
274
+ },
275
+ "required": [
276
+ "file"
277
+ ]
278
+ },
279
+ "LanguageManifestConfig": {
280
+ "description": "Language configuration within a package manifest (camelCase to match JSON schema).",
281
+ "type": "object",
282
+ "properties": {
283
+ "commentPrefix": {
284
+ "description": "Line comment prefix (e.g., \"//\" or \"#\")",
285
+ "type": [
286
+ "string",
287
+ "null"
288
+ ],
289
+ "default": null
290
+ },
291
+ "blockCommentStart": {
292
+ "description": "Block comment start marker (e.g., \"/*\")",
293
+ "type": [
294
+ "string",
295
+ "null"
296
+ ],
297
+ "default": null
298
+ },
299
+ "blockCommentEnd": {
300
+ "description": "Block comment end marker (e.g., \"*/\")",
301
+ "type": [
302
+ "string",
303
+ "null"
304
+ ],
305
+ "default": null
306
+ },
307
+ "tabSize": {
308
+ "description": "Default tab size for this language",
309
+ "type": [
310
+ "integer",
311
+ "null"
312
+ ],
313
+ "format": "uint",
314
+ "minimum": 0,
315
+ "default": null
316
+ },
317
+ "useTabs": {
318
+ "description": "Use tabs instead of spaces",
319
+ "type": [
320
+ "boolean",
321
+ "null"
322
+ ],
323
+ "default": null
324
+ },
325
+ "autoIndent": {
326
+ "description": "Enable automatic indentation",
327
+ "type": [
328
+ "boolean",
329
+ "null"
330
+ ],
331
+ "default": null
332
+ },
333
+ "showWhitespaceTabs": {
334
+ "description": "Whether to show whitespace tab indicators",
335
+ "type": [
336
+ "boolean",
337
+ "null"
338
+ ],
339
+ "default": null
340
+ },
341
+ "formatter": {
342
+ "description": "Formatter configuration",
343
+ "anyOf": [
344
+ {
345
+ "$ref": "#/$defs/FormatterManifestConfig"
346
+ },
347
+ {
348
+ "type": "null"
335
349
  }
336
- }
350
+ ]
337
351
  }
338
352
  }
339
353
  },
340
- "dependencies": {
354
+ "FormatterManifestConfig": {
355
+ "description": "Formatter configuration within a package manifest.",
341
356
  "type": "object",
342
- "description": "Package dependencies (reserved for future use)",
343
- "additionalProperties": { "type": "string" }
357
+ "properties": {
358
+ "command": {
359
+ "description": "Formatter command (e.g., \"rustfmt\", \"prettier\")",
360
+ "type": "string"
361
+ },
362
+ "args": {
363
+ "description": "Arguments to pass to the formatter",
364
+ "type": "array",
365
+ "items": {
366
+ "type": "string"
367
+ },
368
+ "default": []
369
+ }
370
+ },
371
+ "required": [
372
+ "command"
373
+ ]
374
+ },
375
+ "LspManifestConfig": {
376
+ "description": "LSP server configuration within a package manifest (camelCase to match JSON schema).",
377
+ "type": "object",
378
+ "properties": {
379
+ "command": {
380
+ "description": "LSP server command",
381
+ "type": "string"
382
+ },
383
+ "args": {
384
+ "description": "Arguments to pass to the server",
385
+ "type": "array",
386
+ "items": {
387
+ "type": "string"
388
+ },
389
+ "default": []
390
+ },
391
+ "autoStart": {
392
+ "description": "Auto-start the server when a matching file is opened",
393
+ "type": [
394
+ "boolean",
395
+ "null"
396
+ ],
397
+ "default": null
398
+ },
399
+ "initializationOptions": {
400
+ "description": "LSP initialization options",
401
+ "default": null
402
+ },
403
+ "processLimits": {
404
+ "description": "Process resource limits",
405
+ "anyOf": [
406
+ {
407
+ "$ref": "#/$defs/ProcessLimitsManifestConfig"
408
+ },
409
+ {
410
+ "type": "null"
411
+ }
412
+ ]
413
+ }
414
+ },
415
+ "required": [
416
+ "command"
417
+ ]
418
+ },
419
+ "ProcessLimitsManifestConfig": {
420
+ "description": "Process limits within a package manifest (camelCase to match JSON schema).",
421
+ "type": "object",
422
+ "properties": {
423
+ "maxMemoryPercent": {
424
+ "type": [
425
+ "integer",
426
+ "null"
427
+ ],
428
+ "format": "uint32",
429
+ "minimum": 0,
430
+ "default": null
431
+ },
432
+ "maxCpuPercent": {
433
+ "type": [
434
+ "integer",
435
+ "null"
436
+ ],
437
+ "format": "uint32",
438
+ "minimum": 0,
439
+ "default": null
440
+ },
441
+ "enabled": {
442
+ "type": [
443
+ "boolean",
444
+ "null"
445
+ ],
446
+ "default": null
447
+ }
448
+ }
449
+ },
450
+ "BundleLanguage": {
451
+ "description": "A language entry within a bundle manifest.",
452
+ "type": "object",
453
+ "properties": {
454
+ "id": {
455
+ "description": "Language identifier (e.g., \"elixir\", \"heex\")",
456
+ "type": "string"
457
+ },
458
+ "grammar": {
459
+ "description": "Grammar configuration for this language",
460
+ "anyOf": [
461
+ {
462
+ "$ref": "#/$defs/GrammarManifestConfig"
463
+ },
464
+ {
465
+ "type": "null"
466
+ }
467
+ ]
468
+ },
469
+ "language": {
470
+ "description": "Language configuration for this language",
471
+ "anyOf": [
472
+ {
473
+ "$ref": "#/$defs/LanguageManifestConfig"
474
+ },
475
+ {
476
+ "type": "null"
477
+ }
478
+ ]
479
+ },
480
+ "lsp": {
481
+ "description": "LSP server configuration for this language",
482
+ "anyOf": [
483
+ {
484
+ "$ref": "#/$defs/LspManifestConfig"
485
+ },
486
+ {
487
+ "type": "null"
488
+ }
489
+ ]
490
+ }
491
+ },
492
+ "required": [
493
+ "id"
494
+ ]
495
+ },
496
+ "BundlePlugin": {
497
+ "description": "A plugin entry within a bundle manifest.",
498
+ "type": "object",
499
+ "properties": {
500
+ "entry": {
501
+ "description": "Plugin entry point file relative to package",
502
+ "type": "string"
503
+ }
504
+ },
505
+ "required": [
506
+ "entry"
507
+ ]
344
508
  }
345
- }
509
+ },
510
+ "$id": "https://raw.githubusercontent.com/sinelaw/fresh/main/crates/fresh-editor/plugins/schemas/package.schema.json"
346
511
  }