@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.
- package/README.md +7 -0
- package/jsenv_cli.js +358 -0
- package/package.json +7 -5
- package/template-node-package/.eslintignore +2 -0
- package/template-node-package/.eslintrc.cjs +102 -0
- package/template-node-package/.jsenv/jsenv_tests_output.txt +8 -0
- package/template-node-package/.prettierrc.yml +2 -0
- package/template-node-package/package.json +23 -0
- package/template-node-package/scripts/test.mjs +25 -0
- package/template-node-package/src/main.js +8 -0
- package/template-node-package/src/message.js +11 -0
- package/template-node-package/tests/message.test.mjs +21 -0
- package/template-web/.eslintignore +3 -0
- package/template-web/.eslintrc.cjs +138 -0
- package/template-web/.prettierrc.yml +2 -0
- package/template-web/babel.config.cjs +3 -0
- package/template-web/package.json +33 -0
- package/template-web/scripts/build.mjs +21 -0
- package/template-web/scripts/build_serve.mjs +16 -0
- package/template-web/scripts/dev.mjs +15 -0
- package/template-web/scripts/test.mjs +29 -0
- package/template-web/src/app/animals.js +11 -0
- package/template-web/src/app/counter.js +11 -0
- package/template-web/src/index.html +27 -0
- package/template-web/src/jsenv_logo.svg +140 -0
- package/template-web/src/main.css +4 -0
- package/template-web/src/main.js +31 -0
- package/template-web/src/tests/animals.test.html +32 -0
- package/template-web/src/tests/app.test.mjs +26 -0
- package/template-web-components/.eslintignore +3 -0
- package/template-web-components/.eslintrc.cjs +138 -0
- package/template-web-components/.prettierrc.yml +2 -0
- package/template-web-components/babel.config.cjs +3 -0
- package/template-web-components/package.json +35 -0
- package/template-web-components/scripts/build.mjs +21 -0
- package/template-web-components/scripts/build_serve.mjs +16 -0
- package/template-web-components/scripts/dev.mjs +15 -0
- package/template-web-components/scripts/test.mjs +29 -0
- package/template-web-components/src/app/animals.js +11 -0
- package/template-web-components/src/app/app_custom_element.css +4 -0
- package/template-web-components/src/app/app_custom_element.js +31 -0
- package/template-web-components/src/app/counter.js +11 -0
- package/template-web-components/src/app/custom_elements_redefine.js +5 -0
- package/template-web-components/src/index.html +27 -0
- package/template-web-components/src/jsenv_logo.svg +140 -0
- package/template-web-components/src/main.js +11 -0
- package/template-web-components/src/tests/animals.test.html +32 -0
- package/template-web-components/src/tests/app.test.mjs +26 -0
- package/template-web-preact/.eslintignore +3 -0
- package/template-web-preact/.eslintrc.cjs +175 -0
- package/template-web-preact/.prettierrc.yml +2 -0
- package/template-web-preact/babel.config.cjs +11 -0
- package/template-web-preact/package.json +40 -0
- package/template-web-preact/scripts/build.mjs +23 -0
- package/template-web-preact/scripts/build_serve.mjs +16 -0
- package/template-web-preact/scripts/dev.mjs +21 -0
- package/template-web-preact/scripts/test.mjs +28 -0
- package/template-web-preact/src/app/animals.js +11 -0
- package/template-web-preact/src/app/app.css +42 -0
- package/template-web-preact/src/app/app.jsx +52 -0
- package/template-web-preact/src/app/counter.jsx +20 -0
- package/template-web-preact/src/index.html +28 -0
- package/template-web-preact/src/main.jsx +5 -0
- package/template-web-preact/src/preact_logo.svg +6 -0
- package/template-web-preact/src/tests/animals.test.html +32 -0
- package/template-web-preact/src/tests/app.test.mjs +26 -0
- package/template-web-react/.eslintignore +3 -0
- package/template-web-react/.eslintrc.cjs +175 -0
- package/template-web-react/.prettierrc.yml +2 -0
- package/template-web-react/babel.config.cjs +12 -0
- package/template-web-react/package.json +41 -0
- package/template-web-react/scripts/build.mjs +23 -0
- package/template-web-react/scripts/build_serve.mjs +16 -0
- package/template-web-react/scripts/dev.mjs +21 -0
- package/template-web-react/scripts/test.mjs +28 -0
- package/template-web-react/src/app/animals.js +11 -0
- package/template-web-react/src/app/app.css +42 -0
- package/template-web-react/src/app/app.jsx +55 -0
- package/template-web-react/src/app/counter.jsx +19 -0
- package/template-web-react/src/index.html +28 -0
- package/template-web-react/src/main.jsx +14 -0
- package/template-web-react/src/react_logo.svg +7 -0
- package/template-web-react/src/tests/animals.test.html +32 -0
- package/template-web-react/src/tests/app.test.mjs +26 -0
- package/src/command_build.mjs +0 -185
- package/src/command_dev.mjs +0 -38
- package/src/command_preview.mjs +0 -22
- package/src/command_test.mjs +0 -59
- package/src/jsenv_cli.mjs +0 -66
- 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,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,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
|
+
}
|