1
1
'use client'
2
2
3
- import type { CodeFieldClientProps } from 'payload'
3
+ import type { CodeFieldClient , CodeFieldClientProps } from 'payload'
4
4
5
5
import { CodeField , useFormFields } from '@payloadcms/ui'
6
6
import React , { useMemo } from 'react'
@@ -13,21 +13,57 @@ const languageKeyToMonacoLanguageMap = {
13
13
tsx : 'typescript' ,
14
14
}
15
15
16
- export const Code : React . FC < CodeFieldClientProps > = ( { field } ) => {
16
+ export const Code : React . FC < CodeFieldClientProps > = ( {
17
+ autoComplete,
18
+ field,
19
+ forceRender,
20
+ path,
21
+ permissions,
22
+ readOnly,
23
+ renderedBlocks,
24
+ schemaPath,
25
+ validate,
26
+ } ) => {
17
27
const languageField = useFormFields ( ( [ fields ] ) => fields [ 'language' ] )
18
28
19
29
const language : string =
20
30
( languageField ?. value as string ) || ( languageField . initialValue as string ) || 'typescript'
21
31
22
32
const label = languages [ language as keyof typeof languages ]
23
33
24
- const props : typeof field = useMemo (
34
+ const props : CodeFieldClient = useMemo < CodeFieldClient > (
25
35
( ) => ( {
26
36
...field ,
37
+ type : 'code' ,
27
38
admin : {
28
39
...field . admin ,
29
- components : field . admin ?. components || { } ,
30
- editorOptions : field . admin ?. editorOptions || { } ,
40
+ description : 'test' ,
41
+ editorOptions : {
42
+ onMount : ( editor , monaco ) => {
43
+ // Set module resolution to NodeNext to enable autocompletion
44
+ monaco . languages . typescript . typescriptDefaults . setCompilerOptions ( {
45
+ allowNonTsExtensions : true ,
46
+ module : monaco . languages . typescript . ModuleKind . ESNext ,
47
+ moduleResolution : monaco . languages . typescript . ModuleResolutionKind . NodeJs ,
48
+ target : monaco . languages . typescript . ScriptTarget . ESNext ,
49
+ typeRoots : [ 'node_modules/@types' ] ,
50
+ } )
51
+
52
+ monaco . languages . typescript . typescriptDefaults . setDiagnosticsOptions ( {
53
+ noSemanticValidation : false ,
54
+ noSyntaxValidation : false ,
55
+ } )
56
+
57
+ const libUri = 'node_modules/@types/payload/index.d.ts'
58
+
59
+ const run = async ( ) => {
60
+ const types = await fetch ( 'https://unpkg.com/payload@latest/dist/index.d.ts' )
61
+ const libSource = await types . text ( )
62
+ monaco . languages . typescript . typescriptDefaults . addExtraLib ( libSource , libUri )
63
+ }
64
+ void run ( )
65
+ } ,
66
+ } as any ,
31
67
label,
32
68
language : languageKeyToMonacoLanguageMap [ language ] || language ,
33
69
} ,
@@ -37,5 +73,42 @@ export const Code: React.FC<CodeFieldClientProps> = ({ field }) => {
37
73
38
74
const key = `${ field . name } -${ language } -${ label } `
39
75
40
- return < CodeField field = { props } key = { key } />
76
+ return (
77
+ props && (
78
+ < CodeField
79
+ autoComplete = { autoComplete }
80
+ field = { props }
81
+ forceRender = { forceRender }
82
+ key = { key }
83
+ onMount = { ( editor , monaco ) => {
84
+ console . log ( 'editor mounted' )
85
+ // Set module resolution to NodeNext to enable autocompletion
86
+ monaco . languages . typescript . typescriptDefaults . setCompilerOptions ( {
87
+ allowNonTsExtensions : true ,
88
+ moduleResolution : monaco . languages . typescript . ModuleResolutionKind . NodeJs ,
89
+ paths : {
90
+ payload : [ 'file:///node_modules/payload/index.d.ts' ] ,
91
+ } ,
92
+ target : monaco . languages . typescript . ScriptTarget . ESNext ,
93
+ typeRoots : [ 'node_modules/@types' , 'node_modules/payload' ] ,
94
+ } )
95
+ const run = async ( ) => {
96
+ const types = await fetch ( 'https://unpkg.com/payload@latest/dist/index.d.ts' )
97
+ const typesText = await types . text ( )
98
+ monaco . languages . typescript . typescriptDefaults . addExtraLib (
99
+ typesText ,
100
+ 'file:///node_modules/payload/index.d.ts' ,
101
+ )
102
+ }
103
+ void run ( )
104
+ } }
105
+ path = { path }
106
+ permissions = { permissions }
107
+ readOnly = { readOnly }
108
+ renderedBlocks = { renderedBlocks }
109
+ schemaPath = { schemaPath }
110
+ validate = { validate }
111
+ />
112
+ )
113
+ )
41
114
}
0 commit comments