1+ type compilerVersion = {
2+ versionId : string ,
3+ versionLabel : string ,
4+ versionRoot : option <string >,
5+ }
6+
17module Version = {
28 type t = {
39 id : string ,
@@ -10,12 +16,28 @@ module Version = {
1016 | _ => None
1117 }
1218
19+ let normalizeRoot = root =>
20+ if root -> String .endsWith ("/" ) {
21+ root -> String .slice (~start = 0 , ~end = root -> String .length - 1 )
22+ } else {
23+ root
24+ }
25+
26+ let toPublic = (version : compilerVersion ): t => {
27+ id : version .versionId ,
28+ label : version .versionLabel ,
29+ }
30+
1331 let fromJson = json =>
1432 switch json {
1533 | JSON .Object (item ) =>
1634 let ? Some (id ) = item -> jsonStringField ("id" )
1735 let ? Some (label ) = item -> jsonStringField ("label" )
18- Some ({id , label })
36+ Some ({
37+ versionId : id ,
38+ versionLabel : label ,
39+ versionRoot : item -> jsonStringField ("root" )-> Option .map (normalizeRoot ),
40+ })
1941 | _ => None
2042 }
2143}
@@ -86,7 +108,7 @@ let pathFromBase = relativePath => {
86108}
87109
88110let parseCompilerVersions = defaultVersion => {
89- let fallback = [{Version . id : defaultVersion , label : defaultVersion }]
111+ let fallback = [{versionId : defaultVersion , versionLabel : defaultVersion , versionRoot : None }]
90112 switch Env .viteCompilerVersions {
91113 | None | Some ("" ) => fallback
92114 | Some (versionJson ) =>
@@ -100,8 +122,13 @@ let parseCompilerVersions = defaultVersion => {
100122 }
101123}
102124
103- let availableCompilerVersions = parseCompilerVersions (defaultConfig .compilerVersion )
125+ let compilerVersions = parseCompilerVersions (defaultConfig .compilerVersion )
126+ let availableCompilerVersions = compilerVersions -> Array .map (Version .toPublic )
104127let compilerRoot = pathFromBase ("playground-bundles" )
128+ let compilerPreviewRoot = switch Env .viteCompilerPreviewRoot {
129+ | Some (root ) => root === "" ? None : Some (root -> Version .normalizeRoot )
130+ | None => None
131+ }
105132let loadedScripts : Map .t <string , promise <unit >> = Map .make ()
106133let compilerApis : Map .t <string , compilerApi > = Map .make ()
107134let compilers : Map .t <string , compilerInstance > = Map .make ()
@@ -116,6 +143,41 @@ let hasFunction = (value, name) =>
116143
117144let versionOrDefault = version => version === "" ? defaultConfig .compilerVersion : version
118145
146+ let isPreviewVersion = version => version -> String .search (/^ pr - [0 - 9 ]+ $/ ) === 0
147+
148+ let previewVersionRoot = version =>
149+ switch compilerPreviewRoot {
150+ | Some (root ) if version -> isPreviewVersion => Some (` ${root}/${version}/bundle` )
151+ | _ => None
152+ }
153+
154+ let versionRoot = version => {
155+ let selectedVersion = versionOrDefault (version )
156+ switch compilerVersions -> Array .findMap (version =>
157+ version .versionId === selectedVersion ? version .versionRoot : None
158+ ) {
159+ | Some (root ) => root
160+ | None =>
161+ switch selectedVersion -> previewVersionRoot {
162+ | Some (root ) => root
163+ | None => ` ${compilerRoot}/${selectedVersion}`
164+ }
165+ }
166+ }
167+
168+ let isConfiguredVersion = version =>
169+ compilerVersions -> Array .some (compilerVersion => compilerVersion .versionId === version )
170+
171+ let isLoadableVersion = version =>
172+ version -> isConfiguredVersion || version -> previewVersionRoot -> Option .isSome
173+
174+ let selectableCompilerVersions = activeVersion =>
175+ if activeVersion -> isConfiguredVersion || ! (activeVersion -> previewVersionRoot -> Option .isSome ) {
176+ availableCompilerVersions
177+ } else {
178+ Array .concat (availableCompilerVersions , [{Version .id : activeVersion , label : activeVersion }])
179+ }
180+
119181let createScriptLoadPromise = src =>
120182 Promise .make ((resolve , reject ) => {
121183 let document = Document .current
@@ -140,8 +202,6 @@ let loadScript = (src, ~cache=true) =>
140202 createScriptLoadPromise (src )
141203 }
142204
143- let versionRoot = version => ` ${compilerRoot}/${versionOrDefault(version)}`
144-
145205let applyConfig = (
146206 instance ,
147207 ~moduleSystem : PlaygroundConfig .moduleSystem ,
0 commit comments