@pyscript/core 0.1.21 → 0.1.22

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyscript/core",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "type": "module",
5
5
  "description": "PyScript",
6
6
  "module": "./index.js",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@ungap/with-resolvers": "^0.1.0",
35
35
  "basic-devtools": "^0.1.6",
36
- "polyscript": "^0.3.8"
36
+ "polyscript": "^0.3.10"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@rollup/plugin-node-resolve": "^15.2.1",
package/src/config.js CHANGED
@@ -107,4 +107,4 @@ for (const [key, value] of Object.entries(allPlugins)) {
107
107
  // assign plugins as Promise.all only if needed
108
108
  if (toBeAwaited.length) plugins = Promise.all(toBeAwaited);
109
109
 
110
- export { config, plugins, error };
110
+ export { parsed as config, plugins, error };
package/src/core.js CHANGED
@@ -9,6 +9,7 @@ import { queryTarget } from "../node_modules/polyscript/esm/script-handler.js";
9
9
  import { dedent, dispatch } from "../node_modules/polyscript/esm/utils.js";
10
10
  import { Hook } from "../node_modules/polyscript/esm/worker/hooks.js";
11
11
 
12
+ import { ErrorCode } from "./exceptions.js";
12
13
  import sync from "./sync.js";
13
14
  import stdlib from "./stdlib.js";
14
15
  import { config, plugins, error } from "./config.js";
@@ -40,6 +41,36 @@ const after = () => {
40
41
  delete document.currentScript;
41
42
  };
42
43
 
44
+ /**
45
+ * Some content that might contain Python/JS comments only.
46
+ * @param {string} text some content to evaluate
47
+ * @returns {boolean}
48
+ */
49
+ const hasCommentsOnly = (text) =>
50
+ !text
51
+ .replace(/\/\*[\s\S]*?\*\//g, "")
52
+ .replace(/^\s*(?:\/\/|#).*/gm, "")
53
+ .trim();
54
+
55
+ /**
56
+ *
57
+ * @param {Element} scriptOrPyScript the element with possible `src` or `worker` content
58
+ * @returns {boolean}
59
+ */
60
+ const hasAmbiguousContent = (
61
+ io,
62
+ { localName, textContent, attributes: { src, worker } },
63
+ ) => {
64
+ // any `src` or a non-empty `worker` attribute + not just comments
65
+ if ((src || worker?.value) && !hasCommentsOnly(textContent)) {
66
+ io.stderr(
67
+ `(${ErrorCode.CONFLICTING_CODE}) a ${localName} tag has content shadowed by attributes`,
68
+ );
69
+ return true;
70
+ }
71
+ return false;
72
+ };
73
+
43
74
  /**
44
75
  * Given a generic DOM Element, tries to fetch the 'src' attribute, if present.
45
76
  * It either throws an error if the 'src' can't be fetched or it returns a fallback
@@ -172,6 +203,7 @@ error ||
172
203
  callback(pyodide, element);
173
204
 
174
205
  if (isScript(element)) {
206
+ if (hasAmbiguousContent(pyodide.io, element)) return;
175
207
  const {
176
208
  attributes: { async: isAsync, target },
177
209
  } = element;
@@ -222,6 +254,7 @@ class PyScriptElement extends HTMLElement {
222
254
  if (!this.executed) {
223
255
  this.executed = true;
224
256
  const { io, run, runAsync } = await this._pyodide.promise;
257
+ if (hasAmbiguousContent(io, this)) return;
225
258
  const runner = this.hasAttribute("async") ? runAsync : run;
226
259
  this.srcCode = await fetchSource(this, io, !this.childElementCount);
227
260
  this.replaceChildren();
package/src/exceptions.js CHANGED
@@ -7,19 +7,20 @@ const CLOSEBUTTON =
7
7
  */
8
8
  export const ErrorCode = {
9
9
  GENERIC: "PY0000", // Use this only for development then change to a more specific error code
10
+ CONFLICTING_CODE: "PY0409",
11
+ BAD_CONFIG: "PY1000",
12
+ MICROPIP_INSTALL_ERROR: "PY1001",
13
+ BAD_PLUGIN_FILE_EXTENSION: "PY2000",
14
+ NO_DEFAULT_EXPORT: "PY2001",
15
+ TOP_LEVEL_AWAIT: "PY9000",
16
+ // Currently these are created depending on error code received from fetching
10
17
  FETCH_ERROR: "PY0001",
11
18
  FETCH_NAME_ERROR: "PY0002",
12
- // Currently these are created depending on error code received from fetching
13
19
  FETCH_UNAUTHORIZED_ERROR: "PY0401",
14
20
  FETCH_FORBIDDEN_ERROR: "PY0403",
15
21
  FETCH_NOT_FOUND_ERROR: "PY0404",
16
22
  FETCH_SERVER_ERROR: "PY0500",
17
23
  FETCH_UNAVAILABLE_ERROR: "PY0503",
18
- BAD_CONFIG: "PY1000",
19
- MICROPIP_INSTALL_ERROR: "PY1001",
20
- BAD_PLUGIN_FILE_EXTENSION: "PY2000",
21
- NO_DEFAULT_EXPORT: "PY2001",
22
- TOP_LEVEL_AWAIT: "PY9000",
23
24
  };
24
25
 
25
26
  export class UserError extends Error {
package/types/config.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export let config: any;
1
+ declare let parsed: any;
2
2
  export let plugins: any;
3
3
  export let error: any;
4
+ export { parsed as config };
@@ -1,6 +1,12 @@
1
1
  export function _createAlertBanner(message: any, level: any, messageType?: string, logMessage?: boolean): void;
2
2
  export namespace ErrorCode {
3
3
  let GENERIC: string;
4
+ let CONFLICTING_CODE: string;
5
+ let BAD_CONFIG: string;
6
+ let MICROPIP_INSTALL_ERROR: string;
7
+ let BAD_PLUGIN_FILE_EXTENSION: string;
8
+ let NO_DEFAULT_EXPORT: string;
9
+ let TOP_LEVEL_AWAIT: string;
4
10
  let FETCH_ERROR: string;
5
11
  let FETCH_NAME_ERROR: string;
6
12
  let FETCH_UNAUTHORIZED_ERROR: string;
@@ -8,11 +14,6 @@ export namespace ErrorCode {
8
14
  let FETCH_NOT_FOUND_ERROR: string;
9
15
  let FETCH_SERVER_ERROR: string;
10
16
  let FETCH_UNAVAILABLE_ERROR: string;
11
- let BAD_CONFIG: string;
12
- let MICROPIP_INSTALL_ERROR: string;
13
- let BAD_PLUGIN_FILE_EXTENSION: string;
14
- let NO_DEFAULT_EXPORT: string;
15
- let TOP_LEVEL_AWAIT: string;
16
17
  }
17
18
  export class UserError extends Error {
18
19
  constructor(errorCode: any, message?: string, messageType?: string);