Skip to content

Commit 1870c1b

Browse files
committed
Fix effector 21 support
1 parent 0c81e48 commit 1870c1b

File tree

1 file changed

+135
-148
lines changed

1 file changed

+135
-148
lines changed

src/evaluator/index.tsx

Lines changed: 135 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -72,42 +72,40 @@ const cache = {
7272
'@effector/babel-plugin': new Map(),
7373
}
7474

75-
const fetchEffector = createEffect('fetch effector', {
76-
async handler(ver: string) {
77-
const url =
78-
ver === 'master'
79-
? 'https://effector--canary.s3-eu-west-1.amazonaws.com/effector/effector.cjs.js'
80-
: `https://unpkg.com/effector@${ver}/effector.cjs.js`
81-
return getLibraryCode(`effector.${ver}.js`, url)
82-
},
75+
const fetchEffectorFx = createEffect((ver: string) => {
76+
const url =
77+
ver === 'master'
78+
? 'https://effector--canary.s3-eu-west-1.amazonaws.com/effector/effector.cjs.js'
79+
: `https://unpkg.com/effector@${ver}/effector.cjs.js`
80+
return getLibraryCode(`effector.${ver}.js`, url)
8381
})
8482

85-
sample({clock: fetchEffector.fail, fn: () => 'master', target: selectVersion})
83+
sample({clock: fetchEffectorFx.fail, fn: () => 'master', target: selectVersion})
8684

87-
const fetchBabelPlugin = createEffect<string, {[key: string]: any}, any>({
88-
async handler(ver) {
89-
let url: string
90-
if (ver === 'master') {
91-
url =
92-
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector/babel-plugin.js'
85+
const fetchBabelPluginFx = createEffect((ver: string) => {
86+
let url: string
87+
if (ver === 'master') {
88+
url =
89+
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector/babel-plugin.js'
90+
} else {
91+
let [major, minor = '', patch = ''] = ver.split('.')
92+
patch = patch.split('-')[0]
93+
if (
94+
major === '0' &&
95+
(parseInt(minor) < 18 || (minor === '18' && parseInt(patch) < 7))
96+
) {
97+
url = `https://unpkg.com/@effector/babel-plugin@latest/index.js`
9398
} else {
94-
let [major, minor = '', patch = ''] = ver.split('.')
95-
patch = patch.split('-')[0]
96-
if (
97-
major === '0' &&
98-
(parseInt(minor) < 18 || (minor === '18' && parseInt(patch) < 7))
99-
) {
100-
url = `https://unpkg.com/@effector/babel-plugin@latest/index.js`
101-
} else {
102-
url = `https://unpkg.com/effector@${ver}/babel-plugin.js`
103-
}
99+
url = `https://unpkg.com/effector@${ver}/babel-plugin.js`
104100
}
105-
return getLibraryCode(`effector-babel-plugin.${ver}.js`, url)
106-
},
101+
}
102+
return getLibraryCode(`effector-babel-plugin.${ver}.js`, url) as {
103+
[key: string]: any
104+
}
107105
})
108106

109-
const fetchEffectorInspect = createEffect(
110-
async ({effector, ver}: {effector: any; ver: string}) => {
107+
const fetchEffectorInspectFx = createEffect(
108+
({effector, ver}: {effector: any; ver: string}) => {
111109
const url =
112110
ver === 'master'
113111
? 'https://effector--canary.s3-eu-west-1.amazonaws.com/effector/inspect.js'
@@ -131,102 +129,90 @@ function getShiSelectorDefinition(shimSelector: any) {
131129
return result
132130
}
133131

134-
const fetchEffectorSolid = createEffect<any, {[key: string]: any}, any>({
135-
async handler(effector) {
136-
const effectorSolidUrl =
137-
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-solid/effector-solid.cjs.js'
138-
const solidJsUrl = 'https://unpkg.com/solid-js/dist/dev.cjs'
139-
const solidJsWebUrl = 'https://unpkg.com/solid-js/web/dist/dev.cjs'
132+
const fetchEffectorSolidFx = createEffect(async effector => {
133+
const effectorSolidUrl =
134+
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-solid/effector-solid.cjs.js'
135+
const solidJsUrl = 'https://unpkg.com/solid-js/dist/dev.cjs'
136+
const solidJsWebUrl = 'https://unpkg.com/solid-js/web/dist/dev.cjs'
140137

141-
const solidJs = await getLibraryCode('solid-js', solidJsUrl)
142-
const solidJsWeb = await getLibraryCode('solid-js/web', solidJsWebUrl, {
143-
'solid-js': solidJs,
144-
})
138+
const solidJs = await getLibraryCode('solid-js', solidJsUrl)
139+
const solidJsWeb = await getLibraryCode('solid-js/web', solidJsWebUrl, {
140+
'solid-js': solidJs,
141+
})
145142

146-
const effectorSolid = await getLibraryCode(
147-
`effector-solid.cjs.js`,
148-
effectorSolidUrl,
149-
{
150-
effector,
151-
'solid-js': solidJs,
152-
'solid-js/web': solidJsWeb,
153-
},
154-
)
143+
const effectorSolid = await getLibraryCode(
144+
`effector-solid.cjs.js`,
145+
effectorSolidUrl,
146+
{
147+
effector,
148+
'solid-js': solidJs,
149+
'solid-js/web': solidJsWeb,
150+
},
151+
)
155152

156-
return {
157-
effectorSolid,
158-
solidJs,
159-
solidJsWeb,
160-
}
161-
},
153+
return {
154+
effectorSolid,
155+
solidJs,
156+
solidJsWeb,
157+
}
162158
})
163159

164-
const fetchEffectorReact = createEffect<any, {[key: string]: any}, any>({
165-
async handler(effector) {
166-
const effectorReactUrl =
167-
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-react/effector-react.cjs.js'
168-
const shimUrl =
169-
'https://unpkg.com/[email protected]/cjs/use-sync-external-store-shim.production.min.js'
170-
const withSelectorUrl =
171-
'https://unpkg.com/[email protected]/cjs/use-sync-external-store-shim/with-selector.production.min.js'
172-
const shimName = 'use-sync-external-store/shim/index.js'
173-
const shimSelectorName = 'use-sync-external-store/shim/with-selector.js'
174-
const shim = await getLibraryCode(shimName, shimUrl)
175-
const withSelector = await getLibraryCode(
176-
shimSelectorName,
177-
withSelectorUrl,
178-
getShimDefinition(shim),
179-
)
180-
const effectorReact = await getLibraryCode(
181-
`effector-react.cjs.js`,
182-
effectorReactUrl,
183-
{
184-
effector,
185-
...getShimDefinition(shim),
186-
...getShiSelectorDefinition(withSelector),
187-
},
188-
)
189-
return {effectorReact, shim, withSelector}
190-
},
160+
const fetchEffectorReactFx = createEffect(async effector => {
161+
const effectorReactUrl =
162+
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-react/effector-react.cjs.js'
163+
const shimUrl =
164+
'https://unpkg.com/[email protected]/cjs/use-sync-external-store-shim.production.min.js'
165+
const withSelectorUrl =
166+
'https://unpkg.com/[email protected]/cjs/use-sync-external-store-shim/with-selector.production.min.js'
167+
const shimName = 'use-sync-external-store/shim/index.js'
168+
const shimSelectorName = 'use-sync-external-store/shim/with-selector.js'
169+
const shim = await getLibraryCode(shimName, shimUrl)
170+
const withSelector = await getLibraryCode(
171+
shimSelectorName,
172+
withSelectorUrl,
173+
getShimDefinition(shim),
174+
)
175+
const effectorReact = await getLibraryCode(
176+
`effector-react.cjs.js`,
177+
effectorReactUrl,
178+
{
179+
effector,
180+
...getShimDefinition(shim),
181+
...getShiSelectorDefinition(withSelector),
182+
},
183+
)
184+
return {effectorReact, shim, withSelector}
191185
})
192186

193-
const fetchForest = createEffect({
194-
async handler(effector) {
195-
const url =
196-
'https://effector--canary.s3-eu-west-1.amazonaws.com/forest/forest.cjs.js'
197-
return getLibraryCode(`forest.cjs.js`, url, {effector})
198-
},
187+
const fetchForestFx = createEffect(effector => {
188+
const url =
189+
'https://effector--canary.s3-eu-west-1.amazonaws.com/forest/forest.cjs.js'
190+
return getLibraryCode(`forest.cjs.js`, url, {effector})
199191
})
200192

201-
const fetchEffectorReactSSR = createEffect({
202-
async handler(deps) {
203-
const url =
204-
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-react/scope.js'
205-
return getLibraryCode(`scope.js`, url, deps)
206-
},
193+
const fetchEffectorReactSSRFx = createEffect(deps => {
194+
const url =
195+
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-react/scope.js'
196+
return getLibraryCode(`scope.js`, url, deps)
207197
})
208198

209-
const fetchEffectorSolidSSR = createEffect({
210-
async handler(deps) {
211-
const url =
212-
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-solid/scope.js'
213-
return getLibraryCode(`scope.js`, url, deps)
214-
},
199+
const fetchEffectorSolidSSRFx = createEffect(deps => {
200+
const url =
201+
'https://effector--canary.s3-eu-west-1.amazonaws.com/effector-solid/scope.js'
202+
return getLibraryCode(`scope.js`, url, deps)
215203
})
216204

217-
const fetchPatronum = createEffect({
218-
async handler(effector) {
219-
const url = 'https://unpkg.com/patronum/patronum.cjs'
220-
return getLibraryCode(`patronum.js`, url, {effector})
221-
},
205+
const fetchPatronumFx = createEffect(effector => {
206+
const url = 'https://unpkg.com/patronum/patronum.cjs'
207+
return getLibraryCode(`patronum.js`, url, {effector})
222208
})
223209

224-
fetchBabelPlugin.fail.watch(() => selectVersion('master'))
210+
fetchBabelPluginFx.fail.watch(() => selectVersion('master'))
225211

226212
const api = {
227-
effector: fetchEffector,
228-
'@effector/babel-plugin': fetchBabelPlugin,
229-
forest: fetchForest,
213+
effector: fetchEffectorFx,
214+
'@effector/babel-plugin': fetchBabelPluginFx,
215+
forest: fetchForestFx,
230216
}
231217

232218
function cacher(v, cache, fetcher) {
@@ -247,51 +233,52 @@ export const versionLoader = $version.map(v => {
247233

248234
export async function evaluator(code: string) {
249235
realmStatusApi.init()
236+
const version = $version.getState()
237+
const viewLib = $viewLib.getState()
238+
const babelPluginOptions = $babelPluginSettings.getState()
239+
const isMaster = version === 'master'
240+
/** could be used in pair with `isMaster === false` check */
241+
const versionNumber = parseInt(version.slice(0, 2))
242+
const isVersionWithInspect = isMaster || versionNumber >= 22
243+
const isVersionWithScopeModule = !isMaster && versionNumber <= 22
250244
const [babelPlugin, effector] = await Promise.all([
251-
cache['@effector/babel-plugin'].get($version.getState()),
252-
cache.effector.get($version.getState()),
245+
cache['@effector/babel-plugin'].get(version),
246+
cache.effector.get(version),
247+
])
248+
const [
249+
effectorInspect,
250+
{effectorReact, shim, withSelector},
251+
{effectorSolid, solidJs, solidJsWeb},
252+
forest,
253+
patronum,
254+
] = await Promise.all([
255+
isVersionWithInspect
256+
? fetchEffectorInspectFx({effector, ver: version})
257+
: {},
258+
viewLib === 'react' ? fetchEffectorReactFx(effector) : ({} as any),
259+
viewLib === 'solid' ? fetchEffectorSolidFx(effector) : ({} as any),
260+
isMaster ? fetchForestFx(effector) : {},
261+
isMaster ? fetchPatronumFx(effector) : {},
253262
])
254-
const effectorInspect = await fetchEffectorInspect({
255-
effector,
256-
ver: $version.getState(),
257-
})
258-
const babelPluginOptions = $babelPluginSettings.getState()
259-
const {effectorReact, shim, withSelector} = await fetchEffectorReact(effector)
260-
const {effectorSolid, solidJs, solidJsWeb} = await fetchEffectorSolid(
261-
effector,
262-
)
263-
let forest
264263
let effectorBindingSSR
265-
let patronum
266-
if ($version.getState() === 'master') {
267-
const additionalLibs = await Promise.all([
268-
fetchForest(effector),
269-
fetchPatronum(effector),
270-
])
271-
forest = additionalLibs[0]
272-
patronum = additionalLibs[1]
273-
} else {
274-
const isVersionWithScopeModule =
275-
parseInt($version.getState().slice(0, 2)) <= 22
276-
if (isVersionWithScopeModule) {
277-
effectorBindingSSR = await ($viewLib.getState() === 'react'
278-
? fetchEffectorReactSSR({
279-
effector,
280-
...getShimDefinition(shim),
281-
...getShiSelectorDefinition(withSelector),
282-
})
283-
: fetchEffectorSolidSSR({
284-
effector,
285-
'solid-js': solidJs,
286-
'solid-js/web': solidJsWeb,
287-
}))
288-
}
264+
if (isVersionWithScopeModule) {
265+
effectorBindingSSR = await (viewLib === 'react'
266+
? fetchEffectorReactSSRFx({
267+
effector,
268+
...getShimDefinition(shim),
269+
...getShiSelectorDefinition(withSelector),
270+
})
271+
: fetchEffectorSolidSSRFx({
272+
effector,
273+
'solid-js': solidJs,
274+
'solid-js/web': solidJsWeb,
275+
}))
289276
}
290277
function initViewLib(apiMap, api) {
291278
let env
292279
let lib
293280

294-
switch ($viewLib.getState()) {
281+
switch (viewLib) {
295282
case 'react':
296283
env = {
297284
React,
@@ -320,7 +307,7 @@ export async function evaluator(code: string) {
320307
env,
321308
}
322309
}
323-
const env = prepareRuntime(effector, initViewLib, $version.getState())
310+
const env = prepareRuntime(effector, initViewLib, version)
324311
return exec({
325312
code,
326313
realmGlobal: getIframe().contentWindow,
@@ -342,7 +329,7 @@ export async function evaluator(code: string) {
342329
types: null,
343330
filename: 'file',
344331
babelPluginOptions,
345-
preset: $viewLib.getState(),
332+
preset: viewLib,
346333
})
347334
config.plugins = [
348335
'transform-strict-mode',
@@ -367,7 +354,7 @@ export async function evaluator(code: string) {
367354
],
368355
filename: filename.getState(),
369356
types: $typechecker.getState() || 'typescript',
370-
preset: $viewLib.getState() || 'react',
357+
preset: viewLib || 'react',
371358
pluginRegistry: {
372359
'effector/babel-plugin': babelPlugin,
373360
'effector/babel-plugin-react': PluginEffectorReact,

0 commit comments

Comments
 (0)