Skip to content

Commit 5c15181

Browse files
committed
Make polyscript.js_modules crawable
1 parent 2f83165 commit 5c15181

File tree

11 files changed

+136
-73
lines changed

11 files changed

+136
-73
lines changed

docs/core.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/core.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

esm/custom.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import '@ungap/with-resolvers';
22
import { $$ } from 'basic-devtools';
33

4-
import { JSModules, assign, create, createOverload, createResolved, dedent, defineProperty, nodeInfo } from './utils.js';
4+
import { JSModules, assign, create, createOverload, createResolved, dedent, defineProperty, nodeInfo, registerJSModules } from './utils.js';
55
import { getDetails } from './script-handler.js';
66
import { registry as defaultRegistry, prefixes, configs } from './interpreters.js';
77
import { getRuntimeID } from './loader.js';
@@ -99,7 +99,7 @@ export const handleCustomType = (node) => {
9999
XWorker,
100100
};
101101

102-
module.registerJSModule(interpreter, 'polyscript.js_modules', JSModules);
102+
registerJSModules(module, interpreter, JSModules);
103103
module.registerJSModule(interpreter, 'polyscript', {
104104
js_modules: JSModules,
105105
XWorker,

esm/script-handler.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import $xworker from './worker/class.js';
44
import workerURL from './worker/url.js';
55
import { getRuntime, getRuntimeID } from './loader.js';
66
import { registry } from './interpreters.js';
7-
import { JSModules, all, dispatch, resolve, defineProperty, nodeInfo } from './utils.js';
7+
import { JSModules, all, dispatch, resolve, defineProperty, nodeInfo, registerJSModules } from './utils.js';
88
import { getText } from './fetch-utils.js';
99

1010
const getRoot = (script) => {
@@ -60,7 +60,7 @@ const execute = async (script, source, XWorker, isAsync) => {
6060
configurable: true,
6161
get: () => script,
6262
});
63-
module.registerJSModule(interpreter, 'polyscript.js_modules', JSModules);
63+
registerJSModules(module, interpreter, JSModules);
6464
module.registerJSModule(interpreter, 'polyscript', {
6565
js_modules: JSModules,
6666
XWorker,

esm/utils.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,34 @@ export const JSModules = new Proxy(jsModules, {
7272
ownKeys: map => [...map.keys()],
7373
});
7474

75+
const { ownKeys } = Reflect;
76+
class ModuleHandler {
77+
constructor(name) {
78+
this._ = name;
79+
}
80+
get(modules, field) {
81+
return modules[this._][field];
82+
}
83+
has(modules, field) {
84+
return field in modules[this._];
85+
}
86+
ownKeys(modules) {
87+
return ownKeys(modules[this._]);
88+
}
89+
}
90+
91+
export const registerJSModules = (module, interpreter, modules) => {
92+
const jsModules = 'polyscript.js_modules';
93+
for (const name of Reflect.ownKeys(modules)) {
94+
module.registerJSModule(
95+
interpreter,
96+
`${jsModules}.${name}`,
97+
new Proxy(modules, new ModuleHandler(name))
98+
);
99+
}
100+
module.registerJSModule(interpreter, jsModules, modules);
101+
};
102+
75103
export const importJS = (source, name) => import(source).then(esm => {
76104
jsModules.set(name, { ...esm });
77105
});

esm/worker/_template.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import * as JSON from '@ungap/structured-clone/json';
88
import coincident from 'coincident/window';
99

10-
import { assign, create, createFunction, createOverload, createResolved, dispatch } from '../utils.js';
10+
import { assign, create, createFunction, createOverload, createResolved, dispatch, registerJSModules } from '../utils.js';
1111
import createJSModules from './js_modules.js';
1212
import { configs, registry } from '../interpreters.js';
1313
import { getRuntime, getRuntimeID } from '../loader.js';
@@ -140,7 +140,7 @@ add('message', ({ data: { options, config: baseURL, code, hooks } }) => {
140140

141141
let target = '';
142142

143-
details.registerJSModule(interpreter, 'polyscript.js_modules', JSModules);
143+
registerJSModules(details, interpreter, JSModules);
144144
details.registerJSModule(interpreter, 'polyscript', {
145145
xworker,
146146
js_modules: JSModules,

esm/worker/js_modules.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ export default (window, sync, mainModules) => {
3535
// override the getter and make it no more configurable
3636
defineProperty(JSModules, name, { configurable: false, get: () => value });
3737
return value;
38-
}
38+
},
39+
// this is somehow needed in Pyodide but not in MicroPython
40+
// eslint-disable-next-line
41+
set(_) {},
3942
};
4043
}
4144
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@
8383
"sticky-module": "^0.1.1"
8484
},
8585
"worker": {
86-
"blob": "sha256-gFg6QJJiDmvnxzhq0SoEdF6pDhzuRcvFEbZVZRxImpU="
86+
"blob": "sha256-+Zdm9mbnlnfIooEtblZ50WlIqAQ9QD49jw7SQOPWTfQ="
8787
}
8888
}

test/leaflet.html

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
6+
<title>Polyscript JS Modules</title>
7+
<style>#main-map, #worker-map { height: 320px; } h3 { margin-bottom: 0; }</style>
8+
<link rel="stylesheet" href="style.css">
9+
<script type="module" src="../core.js"></script>
10+
</head>
11+
<body>
12+
<!--
13+
main only: npx static-handler .
14+
main/worker: npx static-handler --coop --coep .
15+
16+
Note: --corp breaks the tiles server
17+
-->
18+
19+
<h3>Main</h3>
20+
<div id="main-map"></div>
21+
<script type="pyodide" config="./modules.toml">
22+
# needed to fix pyodide proxies
23+
from pyodide.ffi import to_js
24+
25+
from polyscript import js_modules
26+
from polyscript.js_modules import leaflet as L
27+
28+
print(js_modules.random_js.default)
29+
30+
center = to_js([51.505, -0.09])
31+
mark = to_js([51.5, -0.09])
32+
map = L.map('main-map').setView(center, 13)
33+
34+
L.tileLayer(
35+
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
36+
to_js({"attribution": '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'})
37+
).addTo(map)
38+
39+
L.marker(mark).addTo(map).bindPopup('Modules on Main are a no brainer 👍').openPopup()
40+
</script>
41+
42+
<hr>
43+
44+
<h3>Worker</h3>
45+
<div id="worker-map"></div>
46+
<script type="pyodide" config="./modules.toml" worker>
47+
from polyscript.js_modules import random_js, leaflet as L
48+
49+
print(random_js.default)
50+
51+
center = [51.505, -0.09]
52+
mark = [51.5, -0.09]
53+
map = L.map('worker-map').setView(center, 13)
54+
55+
L.tileLayer(
56+
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
57+
{"attribution": '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}
58+
).addTo(map)
59+
60+
L.marker(mark).addTo(map).bindPopup('Modules on Worker are awesome 🥳').openPopup()
61+
</script>
62+
</body>
63+
</html>

test/modules-mpy.html

Lines changed: 0 additions & 35 deletions
This file was deleted.

test/modules.html

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<meta name="viewport" content="width=device-width,initial-scale=1.0">
66
<title>Polyscript JS Modules</title>
77
<style>#main-map, #worker-map { height: 320px; } h3 { margin-bottom: 0; }</style>
8-
<link rel="stylesheet" href="style.css">
98
<script type="module" src="../core.js"></script>
109
</head>
1110
<body>
@@ -17,47 +16,52 @@
1716
-->
1817

1918
<h3>Main</h3>
20-
<div id="main-map"></div>
21-
<script type="pyodide" config="./modules.toml">
22-
# needed to fix pyodide proxies
23-
from pyodide.ffi import to_js
19+
<script type="micropython" config="./modules.toml">
20+
from polyscript.js_modules import random_js
21+
print(random_js.default)
2422

2523
from polyscript import js_modules
26-
from polyscript.js_modules import leaflet as L
27-
2824
print(js_modules.random_js.default)
2925

30-
center = to_js([51.505, -0.09])
31-
mark = to_js([51.5, -0.09])
32-
map = L.map('main-map').setView(center, 13)
26+
from polyscript.js_modules.random_js import default as value
27+
print(value)
28+
</script>
3329

34-
L.tileLayer(
35-
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
36-
to_js({"attribution": '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'})
37-
).addTo(map)
30+
<script type="pyodide" config="./modules.toml">
31+
from polyscript.js_modules import random_js
32+
print(random_js.default)
3833

39-
L.marker(mark).addTo(map).bindPopup('Modules on Main are a no brainer 👍').openPopup()
34+
from polyscript import js_modules
35+
print(js_modules.random_js.default)
36+
37+
from polyscript.js_modules.random_js import default as value
38+
print(value)
4039
</script>
4140

4241
<hr>
4342

4443
<h3>Worker</h3>
45-
<div id="worker-map"></div>
46-
<script type="pyodide" config="./modules.toml" worker>
47-
from polyscript.js_modules import random_js, leaflet as L
48-
44+
<script type="micropython" config="./modules.toml" worker>
45+
from polyscript.js_modules import random_js
4946
print(random_js.default)
5047

51-
center = [51.505, -0.09]
52-
mark = [51.5, -0.09]
53-
map = L.map('worker-map').setView(center, 13)
48+
from polyscript import js_modules
49+
print(js_modules.random_js.default)
50+
51+
from polyscript.js_modules.random_js import default as value
52+
print(value)
53+
</script>
54+
55+
<script type="pyodide" config="./modules.toml" worker>
56+
from polyscript.js_modules import random_js
57+
print(random_js.default)
5458

55-
L.tileLayer(
56-
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
57-
{"attribution": '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}
58-
).addTo(map)
59+
from polyscript import js_modules
60+
print(js_modules.random_js.default)
5961

60-
L.marker(mark).addTo(map).bindPopup('Modules on Worker are awesome 🥳').openPopup()
62+
from polyscript.js_modules.random_js import default as value
63+
print(value)
6164
</script>
65+
6266
</body>
6367
</html>

0 commit comments

Comments
 (0)