@jsenv/cli 0.0.3 → 0.0.6

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.
Files changed (90) hide show
  1. package/README.md +7 -0
  2. package/jsenv_cli.js +358 -0
  3. package/package.json +7 -5
  4. package/template-node-package/.eslintignore +2 -0
  5. package/template-node-package/.eslintrc.cjs +102 -0
  6. package/template-node-package/.jsenv/jsenv_tests_output.txt +8 -0
  7. package/template-node-package/.prettierrc.yml +2 -0
  8. package/template-node-package/package.json +23 -0
  9. package/template-node-package/scripts/test.mjs +25 -0
  10. package/template-node-package/src/main.js +8 -0
  11. package/template-node-package/src/message.js +11 -0
  12. package/template-node-package/tests/message.test.mjs +21 -0
  13. package/template-web/.eslintignore +3 -0
  14. package/template-web/.eslintrc.cjs +138 -0
  15. package/template-web/.prettierrc.yml +2 -0
  16. package/template-web/babel.config.cjs +3 -0
  17. package/template-web/package.json +33 -0
  18. package/template-web/scripts/build.mjs +21 -0
  19. package/template-web/scripts/build_serve.mjs +16 -0
  20. package/template-web/scripts/dev.mjs +15 -0
  21. package/template-web/scripts/test.mjs +29 -0
  22. package/template-web/src/app/animals.js +11 -0
  23. package/template-web/src/app/counter.js +11 -0
  24. package/template-web/src/index.html +27 -0
  25. package/template-web/src/jsenv_logo.svg +140 -0
  26. package/template-web/src/main.css +4 -0
  27. package/template-web/src/main.js +31 -0
  28. package/template-web/src/tests/animals.test.html +32 -0
  29. package/template-web/src/tests/app.test.mjs +26 -0
  30. package/template-web-components/.eslintignore +3 -0
  31. package/template-web-components/.eslintrc.cjs +138 -0
  32. package/template-web-components/.prettierrc.yml +2 -0
  33. package/template-web-components/babel.config.cjs +3 -0
  34. package/template-web-components/package.json +35 -0
  35. package/template-web-components/scripts/build.mjs +21 -0
  36. package/template-web-components/scripts/build_serve.mjs +16 -0
  37. package/template-web-components/scripts/dev.mjs +15 -0
  38. package/template-web-components/scripts/test.mjs +29 -0
  39. package/template-web-components/src/app/animals.js +11 -0
  40. package/template-web-components/src/app/app_custom_element.css +4 -0
  41. package/template-web-components/src/app/app_custom_element.js +31 -0
  42. package/template-web-components/src/app/counter.js +11 -0
  43. package/template-web-components/src/app/custom_elements_redefine.js +5 -0
  44. package/template-web-components/src/index.html +27 -0
  45. package/template-web-components/src/jsenv_logo.svg +140 -0
  46. package/template-web-components/src/main.js +11 -0
  47. package/template-web-components/src/tests/animals.test.html +32 -0
  48. package/template-web-components/src/tests/app.test.mjs +26 -0
  49. package/template-web-preact/.eslintignore +3 -0
  50. package/template-web-preact/.eslintrc.cjs +175 -0
  51. package/template-web-preact/.prettierrc.yml +2 -0
  52. package/template-web-preact/babel.config.cjs +11 -0
  53. package/template-web-preact/package.json +40 -0
  54. package/template-web-preact/scripts/build.mjs +23 -0
  55. package/template-web-preact/scripts/build_serve.mjs +16 -0
  56. package/template-web-preact/scripts/dev.mjs +21 -0
  57. package/template-web-preact/scripts/test.mjs +28 -0
  58. package/template-web-preact/src/app/animals.js +11 -0
  59. package/template-web-preact/src/app/app.css +42 -0
  60. package/template-web-preact/src/app/app.jsx +52 -0
  61. package/template-web-preact/src/app/counter.jsx +20 -0
  62. package/template-web-preact/src/index.html +28 -0
  63. package/template-web-preact/src/main.jsx +5 -0
  64. package/template-web-preact/src/preact_logo.svg +6 -0
  65. package/template-web-preact/src/tests/animals.test.html +32 -0
  66. package/template-web-preact/src/tests/app.test.mjs +26 -0
  67. package/template-web-react/.eslintignore +3 -0
  68. package/template-web-react/.eslintrc.cjs +175 -0
  69. package/template-web-react/.prettierrc.yml +2 -0
  70. package/template-web-react/babel.config.cjs +12 -0
  71. package/template-web-react/package.json +41 -0
  72. package/template-web-react/scripts/build.mjs +23 -0
  73. package/template-web-react/scripts/build_serve.mjs +16 -0
  74. package/template-web-react/scripts/dev.mjs +21 -0
  75. package/template-web-react/scripts/test.mjs +28 -0
  76. package/template-web-react/src/app/animals.js +11 -0
  77. package/template-web-react/src/app/app.css +42 -0
  78. package/template-web-react/src/app/app.jsx +55 -0
  79. package/template-web-react/src/app/counter.jsx +19 -0
  80. package/template-web-react/src/index.html +28 -0
  81. package/template-web-react/src/main.jsx +14 -0
  82. package/template-web-react/src/react_logo.svg +7 -0
  83. package/template-web-react/src/tests/animals.test.html +32 -0
  84. package/template-web-react/src/tests/app.test.mjs +26 -0
  85. package/src/command_build.mjs +0 -185
  86. package/src/command_dev.mjs +0 -38
  87. package/src/command_preview.mjs +0 -22
  88. package/src/command_test.mjs +0 -59
  89. package/src/jsenv_cli.mjs +0 -66
  90. package/src/package_installer.js +0 -122
@@ -0,0 +1,138 @@
1
+ /*
2
+ * This file uses "@jsenv/eslint-config" to configure ESLint
3
+ * https://github.com/jsenv/eslint-config#eslint-config----
4
+ */
5
+
6
+ const {
7
+ composeEslintConfig,
8
+ eslintConfigBase,
9
+ eslintConfigForPrettier,
10
+ eslintConfigToPreferExplicitGlobals,
11
+ jsenvEslintRules,
12
+ jsenvEslintRulesForImport,
13
+ } = require("@jsenv/eslint-config");
14
+
15
+ const eslintConfig = composeEslintConfig(
16
+ eslintConfigBase,
17
+
18
+ // By default files are meant to be executed in Node.js
19
+ // and we want to tell this to ESLint.
20
+ // As a result ESLint can consider `window` as undefined
21
+ // and `global` as an existing global variable.
22
+ {
23
+ env: {
24
+ node: true,
25
+ },
26
+ },
27
+
28
+ // enable top level await
29
+ {
30
+ parserOptions: {
31
+ ecmaVersion: 2022,
32
+ },
33
+ },
34
+
35
+ // use "@babel/eslint-parser" until import assertions is supported natively by ESLint
36
+ {
37
+ parser: "@babel/eslint-parser",
38
+ parserOptions: {
39
+ requireConfigFile: false,
40
+ },
41
+ },
42
+
43
+ // Reuse jsenv eslint rules
44
+ {
45
+ rules: {
46
+ ...jsenvEslintRules,
47
+ // Example of code changing the ESLint configuration to enable a rule:
48
+ // 'prefer-const': ['error']
49
+ },
50
+ },
51
+
52
+ // Enable import plugin
53
+ {
54
+ plugins: ["import"],
55
+ settings: {
56
+ "import/resolver": {
57
+ "@jsenv/eslint-import-resolver": {
58
+ rootDirectoryUrl: __dirname,
59
+ packageConditions: ["node", "import"],
60
+ },
61
+ },
62
+ },
63
+ rules: jsenvEslintRulesForImport,
64
+ },
65
+
66
+ // Enable HTML plugin
67
+ {
68
+ plugins: ["html"],
69
+ settings: {
70
+ extensions: [".html"],
71
+ },
72
+ },
73
+
74
+ // Configure which files are written for the web
75
+ {
76
+ overrides: [
77
+ {
78
+ files: ["./src/**"],
79
+ env: {
80
+ browser: true,
81
+ node: false,
82
+ },
83
+ settings: {
84
+ "import/resolver": {
85
+ "@jsenv/eslint-import-resolver": {
86
+ rootDirectoryUrl: `${__dirname}/src/`,
87
+ packageConditions: ["browser", "import"],
88
+ },
89
+ },
90
+ },
91
+ },
92
+ ],
93
+ },
94
+
95
+ // package is "type": "module" so:
96
+ // 1. disable commonjs globals by default
97
+ // 2. Re-enable commonjs into *.cjs files
98
+ {
99
+ globals: {
100
+ __filename: "off",
101
+ __dirname: "off",
102
+ require: "off",
103
+ exports: "off",
104
+ },
105
+ overrides: [
106
+ {
107
+ files: ["**/*.cjs"],
108
+ env: {
109
+ commonjs: true,
110
+ },
111
+ // inside *.cjs files. restore commonJS "globals"
112
+ globals: {
113
+ __filename: true,
114
+ __dirname: true,
115
+ require: true,
116
+ exports: true,
117
+ },
118
+ // inside *.cjs files, use commonjs module resolution
119
+ settings: {
120
+ "import/resolver": {
121
+ "@jsenv/eslint-import-resolver": {
122
+ rootDirectoryUrl: __dirname,
123
+ packageConditions: ["node", "require"],
124
+ },
125
+ },
126
+ },
127
+ },
128
+ ],
129
+ },
130
+
131
+ eslintConfigToPreferExplicitGlobals,
132
+
133
+ // We are using prettier, disable all eslint rules
134
+ // already handled by prettier.
135
+ eslintConfigForPrettier,
136
+ );
137
+
138
+ module.exports = eslintConfig;
@@ -0,0 +1,2 @@
1
+ trailingComma: "all"
2
+ quoteProps: "consistent"
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ plugins: ["@babel/plugin-syntax-import-assertions"],
3
+ };
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "jsenv-template-web",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "start": "npm run dev -- --open",
8
+ "dev": "node ./scripts/dev.mjs",
9
+ "test": "node ./scripts/test.mjs",
10
+ "test:coverage": "npm run test -- --coverage",
11
+ "build": "node ./scripts/build.mjs",
12
+ "build:serve": "node ./scripts/build_serve.mjs --open",
13
+ "eslint": "npx eslint . --ext=.html,.js,.mjs,.cjs",
14
+ "prettier": "prettier --write ."
15
+ },
16
+ "devDependencies": {
17
+ "@babel/eslint-parser": "7.24.8",
18
+ "@babel/plugin-syntax-import-assertions": "7.24.7",
19
+ "@jsenv/assert": "4.1.4",
20
+ "@jsenv/core": "39.2.1",
21
+ "@jsenv/eslint-config": "16.5.2",
22
+ "@jsenv/eslint-import-resolver": "8.1.2",
23
+ "@jsenv/plugin-bundling": "2.6.17",
24
+ "@jsenv/plugin-minification": "1.5.5",
25
+ "@jsenv/test": "3.3.11",
26
+ "eslint": "8.56.0",
27
+ "eslint-plugin-html": "8.1.1",
28
+ "eslint-plugin-import": "2.29.1",
29
+ "open": "10.1.0",
30
+ "@playwright/browser-chromium": "1.45.2",
31
+ "prettier": "3.3.3"
32
+ }
33
+ }
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Optimize source files and write them into "./dist/"
3
+ * Read more in https://github.com/jsenv/core/wiki
4
+ */
5
+
6
+ import { build } from "@jsenv/core";
7
+
8
+ await build({
9
+ sourceDirectoryUrl: new URL("../src/", import.meta.url),
10
+ buildDirectoryUrl: new URL("../dist/", import.meta.url),
11
+ entryPoints: {
12
+ "./index.html": "index.html",
13
+ },
14
+ bundling: {
15
+ js_module: {
16
+ chunks: {
17
+ vendors: { "file:///**/node_modules/": true },
18
+ },
19
+ },
20
+ },
21
+ });
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Start a server serving files into dist/.
3
+ * Useful to test the files generated during the build
4
+ * Read more in https://github.com/jsenv/core/wiki
5
+ */
6
+
7
+ import open from "open";
8
+ import { startBuildServer } from "@jsenv/core";
9
+
10
+ const buildServer = await startBuildServer({
11
+ buildDirectoryUrl: new URL("../dist/", import.meta.url),
12
+ port: 3500,
13
+ });
14
+ if (process.argv.includes("--open")) {
15
+ open(buildServer.origin);
16
+ }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Start a development server for files inside src/
3
+ * Read more in https://github.com/jsenv/core/wiki
4
+ */
5
+
6
+ import open from "open";
7
+ import { startDevServer } from "@jsenv/core";
8
+
9
+ export const devServer = await startDevServer({
10
+ sourceDirectoryUrl: new URL("../src/", import.meta.url),
11
+ port: 3400,
12
+ });
13
+ if (process.argv.includes("--open")) {
14
+ open(`${devServer.origin}`);
15
+ }
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Execute all test files
3
+ * Read more in https://github.com/jsenv/core/wiki
4
+ */
5
+
6
+ import { executeTestPlan, chromium, nodeWorkerThread } from "@jsenv/test";
7
+
8
+ await executeTestPlan({
9
+ rootDirectoryUrl: new URL("../", import.meta.url),
10
+ testPlan: {
11
+ "./src/**/*.test.html": {
12
+ chromium: {
13
+ runtime: chromium(),
14
+ },
15
+ },
16
+ "./src/**/*.test.mjs": {
17
+ node: {
18
+ runtime: nodeWorkerThread(),
19
+ },
20
+ },
21
+ },
22
+ webServer: {
23
+ origin: "http://localhost:3400",
24
+ rootDirectoryUrl: new URL("../src/", import.meta.url),
25
+ moduleUrl: new URL("./dev.mjs", import.meta.url),
26
+ },
27
+ coverage: process.argv.includes("--coverage"),
28
+ githubCheck: false,
29
+ });
@@ -0,0 +1,11 @@
1
+ /*
2
+ * This file exists to show code using the browser runtime to operate:
3
+ * code writes "countDogs" function on window
4
+ *
5
+ * As a result testing "countDogs" should be done in a browser.
6
+ * See "animals.test.html"
7
+ */
8
+
9
+ window.countDogs = (animals) => {
10
+ return animals.filter((animal) => animal === "dog").length;
11
+ };
@@ -0,0 +1,11 @@
1
+ let clicks = 0;
2
+
3
+ export const initCounter = () => {
4
+ const counterButton = document.querySelector("#counter_button");
5
+ const counterOutput = document.querySelector("#counter_output");
6
+ counterOutput.innerHTML = clicks;
7
+ counterButton.onclick = () => {
8
+ clicks++;
9
+ counterOutput.innerHTML = clicks;
10
+ };
11
+ };
@@ -0,0 +1,27 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="./jsenv_logo.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <style>
8
+ body {
9
+ background: lightblue;
10
+ }
11
+
12
+ #root {
13
+ font-family: Avenir, Helvetica, Arial, sans-serif;
14
+ -webkit-font-smoothing: antialiased;
15
+ -moz-osx-font-smoothing: grayscale;
16
+ text-align: center;
17
+ color: #2c3e50;
18
+ margin-top: 60px;
19
+ }
20
+ </style>
21
+ <title>Jsenv web page</title>
22
+ </head>
23
+ <body>
24
+ <div id="root"></div>
25
+ <script type="module" src="./main.js"></script>
26
+ </body>
27
+ </html>
@@ -0,0 +1,140 @@
1
+ <svg
2
+ xmlns="http://www.w3.org/2000/svg"
3
+ id="jsenv_logo"
4
+ viewBox="0 0 430 430"
5
+ enable-background="new 0 0 430 430"
6
+ >
7
+ <g id="letters">
8
+ <path
9
+ id="j"
10
+ fill="#F7931E"
11
+ d="M78.879,272.229c3.381-0.441,7.056-1.176,9.408-3.822c2.793-2.939,3.234-8.086,3.234-19.111v-63.064
12
+ h19.404v66.74c0,16.023-3.381,23.52-9.555,28.371c-5.292,4.264-14.112,6.174-21.021,6.174L78.879,272.229z M111.072,167.121
13
+ c0,6.174-4.41,10.438-10.143,10.438c-5.292,0-9.702-4.263-9.555-10.438c-0.147-6.468,4.41-10.437,9.849-10.437
14
+ S111.072,160.653,111.072,167.121z"
15
+ />
16
+ <path
17
+ id="s"
18
+ fill="#F7931E"
19
+ d="M123.714,240.77c2.793,1.764,8.085,3.822,12.936,3.822c4.998,0,7.791-2.205,7.791-6.469
20
+ c0-3.675-2.058-6.027-8.379-9.702c-11.76-6.615-14.553-14.112-14.553-20.727c0-12.937,9.261-22.639,23.667-22.639
21
+ c6.027,0,10.731,1.47,14.553,3.234l-3.381,14.112c-2.793-1.617-6.174-2.94-9.996-2.94c-4.851,0-7.203,2.94-7.203,6.174
22
+ c0,3.234,1.617,4.998,8.379,8.967c10.584,6.027,14.553,13.524,14.553,21.756c0,14.699-10.584,22.639-25.432,22.639
23
+ c-6.027,0-13.083-1.617-16.464-4.117L123.714,240.77z"
24
+ />
25
+ <path
26
+ id="e"
27
+ fill="#F7931E"
28
+ d="M204.414,223.57c0.148,21.756,8.674,26.461,16.906,26.461c4.852,0,8.967-1.176,11.76-2.793l1.764,8.379
29
+ c-3.969,2.205-9.996,3.381-15.582,3.381c-17.052,0-25.872-13.965-25.872-35.722c0-23.08,9.702-37.486,23.961-37.486
30
+ c14.553,0,20.285,15.289,20.285,31.459c0,2.646,0,4.557-0.146,6.321H204.414z M226.76,215.191
31
+ c0.293-14.259-5.145-20.581-10.584-20.581c-7.352,0-11.174,10.878-11.613,20.581H226.76z"
32
+ />
33
+ <path
34
+ id="n"
35
+ fill="#F7931E"
36
+ d="M249.836,205.342c0-8.379-0.441-12.643-0.588-18.375h9.85l0.588,8.526h0.293
37
+ c3.088-5.733,8.82-9.702,16.318-9.702c9.85,0,17.199,7.35,17.199,24.55v47.775h-11.318V212.25c0-8.379-1.617-16.905-9.85-16.905
38
+ c-4.705,0-9.262,3.969-10.732,11.613c-0.293,1.764-0.439,3.969-0.439,6.321v44.835h-11.32V205.342z"
39
+ />
40
+ <path
41
+ id="v"
42
+ fill="#F7931E"
43
+ d="M313.783,186.966l8.967,39.985c1.029,4.851,2.205,11.172,3.088,17.346h0.441
44
+ c0.734-5.879,1.91-11.907,2.939-17.346l8.82-39.985h11.172l-18.523,71.149h-10.143l-18.521-71.149H313.783z"
45
+ />
46
+ </g>
47
+ <g id="arcs">
48
+ <path
49
+ id="arc1"
50
+ fill="#F7931E"
51
+ d="M32.118,204.979c0,0,0.105,1.801,0.302,5.179c0.124,3.4,0.638,8.29,1.434,14.48
52
+ c0.249,1.546,0.511,3.174,0.786,4.882c0.137,0.853,0.278,1.725,0.421,2.617c0.154,0.89,0.376,1.789,0.558,2.712
53
+ c0.384,1.843,0.783,3.761,1.197,5.75c0.444,1.981,1.027,4.008,1.56,6.112c2.274,8.378,5.328,17.708,9.758,27.396
54
+ c4.406,9.688,10.04,19.776,17.062,29.673c7.003,9.901,15.393,19.609,25.102,28.499c9.702,8.888,20.652,17.025,32.581,23.85
55
+ c11.948,6.789,24.834,12.287,38.159,16.203c13.357,3.824,27.155,5.896,40.737,6.35l2.541,0.113l2.542-0.017
56
+ c1.689-0.012,3.376-0.142,5.059-0.152l1.259-0.126h0.157c-0.466,0-0.034,0.113-0.096,0.111l0.329,0.039l0.657-0.012l2.625-0.138
57
+ c1.748-0.094,3.492-0.181,5.229-0.274l2.599-0.14l2.399-0.292c1.596-0.203,3.188-0.354,4.772-0.526
58
+ c3.147-0.236,6.372-0.888,9.541-1.397c12.69-2.107,24.746-5.299,35.916-9.232c2.755-1.075,5.479-2.131,8.182-3.142
59
+ c2.655-1.114,5.222-2.329,7.782-3.459c2.6-1.056,4.984-2.43,7.407-3.636c1.206-0.616,2.401-1.228,3.584-1.832
60
+ c1.189-0.598,2.295-1.31,3.432-1.949c2.248-1.316,4.477-2.577,6.623-3.866c2.099-1.369,4.148-2.706,6.146-4.011
61
+ c2.042-1.258,3.901-2.66,5.735-3.997c1.822-1.352,3.646-2.613,5.355-3.907c1.669-1.351,3.284-2.656,4.843-3.918
62
+ c1.569-1.258,3.121-2.439,4.471-3.723c1.402-1.238,2.746-2.427,4.031-3.563c1.288-1.139,2.548-2.204,3.621-3.327
63
+ c2.193-2.203,4.225-4.131,5.979-5.831c1.697-1.744,3.063-3.304,4.243-4.516c2.34-2.456,3.588-3.767,3.588-3.767l0.026-0.028
64
+ c0.326-0.342,0.867-0.355,1.209-0.029c0.285,0.271,0.341,0.695,0.161,1.026c0,0-0.868,1.598-2.574,4.574
65
+ c-0.854,1.488-1.885,3.349-3.214,5.459c-1.387,2.064-2.967,4.465-4.816,7.108c-0.887,1.355-1.955,2.669-3.051,4.075
66
+ c-1.103,1.406-2.257,2.878-3.46,4.412c-1.185,1.56-2.571,3.036-3.979,4.607c-1.424,1.563-2.899,3.181-4.424,4.853
67
+ c-1.572,1.628-3.282,3.218-5.018,4.893c-1.745,1.662-3.502,3.432-5.49,5.023c-1.957,1.641-3.965,3.323-6.021,5.047
68
+ c-2.111,1.653-4.363,3.226-6.623,4.899c-9.169,6.472-19.718,12.805-31.671,17.869c-11.917,5.107-25.137,9.123-39.146,11.367
69
+ c-3.516,0.507-7.004,1.114-10.719,1.336c-1.834,0.148-3.674,0.319-5.521,0.438l-2.773,0.192l-2.611,0.027
70
+ c-1.74,0.015-3.486,0.03-5.237,0.045l-2.63,0.012l-1.585-0.006l-1.378-0.074c-1.836-0.101-3.676-0.201-5.521-0.302l-2.766-0.157
71
+ l-2.764-0.29c-14.755-1.437-29.532-4.559-43.748-9.26c-14.191-4.788-27.769-11.24-40.221-18.991
72
+ c-12.467-7.743-23.632-16.999-33.41-26.861c-9.758-9.893-18.135-20.455-24.833-31.222c-6.743-10.739-11.988-21.536-15.97-31.794
73
+ c-4.006-10.258-6.601-20.021-8.441-28.721c-1.917-8.698-2.688-16.429-3.245-22.764c-0.396-6.374-0.584-11.386-0.485-14.752
74
+ c0.026-3.383,0.04-5.188,0.04-5.188c0.003-0.47,0.387-0.848,0.857-0.844C31.725,204.181,32.091,204.536,32.118,204.979z"
75
+ />
76
+ <path
77
+ id="arc2"
78
+ fill="#F7931E"
79
+ d="M393.625,225.021c0,0-0.104-1.731-0.297-4.979c-0.049-0.812-0.103-1.718-0.162-2.716
80
+ c-0.029-0.499-0.061-1.021-0.093-1.565c-0.059-0.538-0.119-1.097-0.182-1.679c-0.269-2.323-0.534-4.99-0.906-7.966
81
+ c-0.241-1.486-0.496-3.051-0.763-4.693c-0.133-0.82-0.269-1.658-0.408-2.516c-0.126-0.859-0.286-1.731-0.487-2.616
82
+ c-0.778-3.54-1.458-7.393-2.614-11.413c-0.266-1.009-0.537-2.034-0.812-3.075c-0.264-1.043-0.553-2.096-0.908-3.147
83
+ c-0.672-2.11-1.362-4.281-2.071-6.509c-1.604-4.392-3.258-9.013-5.353-13.684c-4.077-9.377-9.302-19.173-15.844-28.827
84
+ c-6.541-9.647-14.329-19.197-23.385-28.038l-1.683-1.677l-1.766-1.605c-1.182-1.068-2.366-2.142-3.557-3.218
85
+ c-1.163-1.104-2.449-2.08-3.686-3.116c-1.246-1.024-2.496-2.052-3.75-3.083c-1.3-0.972-2.604-1.946-3.91-2.924
86
+ c-1.324-0.953-2.58-2.003-3.953-2.902c-1.354-0.92-2.714-1.843-4.075-2.768l-2.042-1.389l-2.112-1.291
87
+ c-11.209-6.99-23.347-12.819-35.961-17.193c-12.643-4.307-25.78-6.991-38.788-8.151c-1.628-0.128-3.24-0.356-4.867-0.403
88
+ c-1.623-0.068-3.243-0.136-4.858-0.205c-3.224-0.204-6.444-0.09-9.634-0.125l-2.151-0.002l-2.495,0.128
89
+ c-1.66,0.095-3.316,0.141-4.966,0.211l-2.47,0.097c-0.809,0.042-1.532,0.143-2.3,0.21c-1.513,0.146-3.021,0.293-4.522,0.438
90
+ c-2.979,0.166-6.046,0.719-9.053,1.084c-3.023,0.336-5.975,0.917-8.906,1.449c-1.462,0.28-2.93,0.501-4.374,0.794
91
+ c-1.436,0.332-2.863,0.661-4.282,0.989c-1.424,0.318-2.838,0.634-4.245,0.947c-1.396,0.353-2.766,0.767-4.137,1.143
92
+ c-2.735,0.781-5.465,1.47-8.073,2.398c-1.315,0.436-2.621,0.868-3.917,1.296c-1.3,0.42-2.588,0.844-3.827,1.363
93
+ c-2.513,0.967-4.983,1.917-7.408,2.85c-2.367,1.068-4.709,2.091-7.01,3.092c-1.163,0.477-2.267,1.042-3.361,1.598
94
+ c-1.1,0.548-2.188,1.091-3.263,1.627c-1.082,0.532-2.15,1.059-3.206,1.579c-1.025,0.576-2.039,1.145-3.039,1.706
95
+ c-1.992,1.14-4.003,2.158-5.868,3.29c-1.848,1.157-3.655,2.272-5.419,3.344c-1.792,1.037-3.405,2.208-5.008,3.287
96
+ c-1.605,1.084-3.153,2.13-4.64,3.135c-2.895,2.146-5.553,4.117-7.955,5.898c-2.294,1.916-4.409,3.579-6.239,5.05
97
+ c-0.934,0.718-1.729,1.45-2.471,2.111c-0.751,0.655-1.434,1.25-2.044,1.782c-2.474,2.127-3.793,3.262-3.793,3.262l-0.025,0.022
98
+ c-0.358,0.308-0.898,0.267-1.207-0.091c-0.256-0.297-0.271-0.721-0.063-1.032c0,0,0.969-1.457,2.861-4.161
99
+ c0.957-1.342,2.071-3.069,3.577-4.928c1.497-1.867,3.207-4.042,5.195-6.425c2.072-2.294,4.393-4.829,6.954-7.583
100
+ c1.353-1.299,2.761-2.652,4.222-4.055c1.466-1.404,2.982-2.873,4.665-4.248c1.653-1.413,3.373-2.863,5.158-4.347
101
+ c1.799-1.46,3.737-2.85,5.699-4.323c0.988-0.729,1.989-1.466,3.003-2.214c1.05-0.693,2.113-1.395,3.188-2.104
102
+ c1.082-0.705,2.176-1.418,3.282-2.14c1.107-0.723,2.227-1.456,3.411-2.104c9.235-5.625,19.942-10.626,31.724-14.697
103
+ c1.475-0.504,2.951-1.046,4.456-1.527c1.52-0.435,3.049-0.873,4.587-1.314c1.543-0.431,3.096-0.864,4.658-1.299
104
+ c1.57-0.402,3.17-0.716,4.772-1.065c1.604-0.341,3.218-0.685,4.839-1.029c0.808-0.191,1.629-0.319,2.454-0.433
105
+ c0.824-0.123,1.649-0.245,2.478-0.368c3.322-0.481,6.616-1.035,10.133-1.254c1.738-0.127,3.483-0.254,5.236-0.383
106
+ c0.866-0.054,1.775-0.143,2.61-0.166l2.472-0.042c1.65-0.022,3.307-0.069,4.97-0.067l2.497-0.011
107
+ c-0.163,0.003,0.397-0.005,0.4-0.001l0.164,0.008l0.327,0.015l0.655,0.031l1.311,0.062c3.497,0.194,7.019,0.236,10.533,0.702
108
+ c1.757,0.188,3.52,0.377,5.285,0.567c1.767,0.169,3.518,0.523,5.28,0.778c14.083,2.205,28.099,5.979,41.516,11.19
109
+ c13.397,5.272,26.146,12.065,37.788,20.016l2.192,1.471l2.117,1.569c1.408,1.045,2.813,2.087,4.215,3.127
110
+ c2.768,2.124,5.406,4.386,8.06,6.582c1.274,1.16,2.545,2.316,3.813,3.468c1.254,1.164,2.556,2.267,3.731,3.496
111
+ c1.2,1.201,2.396,2.398,3.587,3.591l1.775,1.789l1.689,1.859c9.061,9.819,16.775,20.217,23.014,30.685
112
+ c6.256,10.46,11.099,20.933,14.763,30.855c1.899,4.94,3.31,9.814,4.67,14.425c0.586,2.333,1.157,4.605,1.712,6.814
113
+ c0.297,1.098,0.526,2.196,0.731,3.282c0.215,1.083,0.427,2.15,0.636,3.2c0.923,4.179,1.378,8.165,1.943,11.813
114
+ c0.151,0.911,0.247,1.811,0.318,2.695c0.082,0.882,0.162,1.745,0.24,2.587c0.155,1.684,0.305,3.29,0.445,4.814
115
+ c0.173,3.065,0.257,5.808,0.365,8.183c0.022,0.594,0.045,1.165,0.066,1.714c-0.006,0.545-0.01,1.068-0.015,1.567
116
+ c-0.009,1-0.017,1.908-0.024,2.721c-0.029,3.252-0.045,4.987-0.045,4.987c-0.004,0.47-0.389,0.847-0.857,0.843
117
+ C394.018,225.817,393.652,225.463,393.625,225.021z"
118
+ />
119
+ </g>
120
+ <g id="circles">
121
+ <circle
122
+ id="circle2"
123
+ fill="#F7931E"
124
+ stroke-width="9"
125
+ stroke-miterlimit="10"
126
+ cx="70.536"
127
+ cy="110.694"
128
+ r="36.011"
129
+ />
130
+ <circle
131
+ id="circle1"
132
+ fill="#F7931E"
133
+ stroke-width="9"
134
+ stroke-miterlimit="10"
135
+ cx="362.721"
136
+ cy="309.694"
137
+ r="36.012"
138
+ />
139
+ </g>
140
+ </svg>
@@ -0,0 +1,4 @@
1
+ .logo {
2
+ height: 40vmin;
3
+ pointer-events: none;
4
+ }
@@ -0,0 +1,31 @@
1
+ import mainStyleSheet from "./main.css" with { type: "css" };
2
+ import { initCounter } from "./app/counter.js";
3
+
4
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, mainStyleSheet];
5
+
6
+ const jsenvLogoUrl = new URL("/jsenv_logo.svg", import.meta.url);
7
+
8
+ document.querySelector("#root").innerHTML = `<h1>Hello world!</h1>
9
+ <img class="logo" src=${jsenvLogoUrl} alt="logo" />
10
+ <p>
11
+ <button id="counter_button">Click me!</button>
12
+ <p>
13
+ Number of clicks: <span id="counter_output"></span>
14
+ </p>
15
+ </p>
16
+ <p>
17
+ Edit <a href="javascript:window.fetch('/__open_in_editor__/jsenv_logo.svg')">jsenv_logo.svg</a> and save to test HMR updates.
18
+ </p>
19
+ <a href="https://github.com/jsenv/core" target="_blank">Documentation</a>`;
20
+
21
+ initCounter();
22
+
23
+ if (import.meta.hot) {
24
+ import.meta.hot.accept();
25
+ import.meta.hot.dispose(() => {
26
+ document.querySelector("#root").innerHTML = "";
27
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter(
28
+ (s) => s !== mainStyleSheet,
29
+ );
30
+ });
31
+ }
@@ -0,0 +1,32 @@
1
+ <!--
2
+ This HTML file demo how to write a test using jsenv.
3
+ This file is testing a "countDogs" function implemented in "animals.js"
4
+ -->
5
+ <!doctype html>
6
+ <html>
7
+ <head>
8
+ <meta charset="utf-8" />
9
+ <link rel="icon" href="data:," />
10
+ </head>
11
+
12
+ <body>
13
+ <script type="module">
14
+ import { assert } from "@jsenv/assert";
15
+ import "/app/animals.js";
16
+
17
+ {
18
+ const actual = window.countDogs(["dog", "dog"]);
19
+ const expect = 2;
20
+ assert({ actual, expect });
21
+ }
22
+
23
+ {
24
+ const actual = window.countDogs(["dog", "cat"]);
25
+ const expect = 1;
26
+ assert({ actual, expect });
27
+ }
28
+
29
+ document.body.appendChild(document.createTextNode("ok"));
30
+ </script>
31
+ </body>
32
+ </html>
@@ -0,0 +1,26 @@
1
+ import { chromium } from "playwright";
2
+ import { assert } from "@jsenv/assert";
3
+
4
+ const browser = await chromium.launch();
5
+
6
+ try {
7
+ const browserContext = await browser.newContext({ ignoreHTTPSErrors: true });
8
+ const page = await browserContext.newPage();
9
+ await page.goto(`http://localhost:3400`);
10
+
11
+ const getCounterOutput = () => {
12
+ return page.locator("#counter_output").innerHTML();
13
+ };
14
+
15
+ assert({
16
+ actual: await getCounterOutput(),
17
+ expect: "0",
18
+ });
19
+ await page.locator("#counter_button").click();
20
+ assert({
21
+ actual: await getCounterOutput(),
22
+ expect: "1",
23
+ });
24
+ } finally {
25
+ browser.close();
26
+ }
@@ -0,0 +1,3 @@
1
+ .jsenv/
2
+ .coverage/
3
+ dist/