@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
@@ -1,185 +0,0 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
-
3
- import { urlToRelativeUrl } from "@jsenv/urls";
4
- import { installPackagesIfMissing } from "./package_installer.js";
5
-
6
- export const runBuildCommand = async (src, dist) => {
7
- const cwdUrl = new URL(`${process.cwd()}/`, import.meta.url);
8
- const packagesRequired = ["@jsenv/core"];
9
- await installPackagesIfMissing(packagesRequired, cwdUrl);
10
- const [{ build }] = await Promise.all([import("@jsenv/core")]);
11
- const packageJson = readPackageJson(cwdUrl);
12
- if (packageJson?.environment === "browser") {
13
- const browserParams = getBuildParamsToBuildForBrowser({
14
- cwdUrl,
15
- src,
16
- dist,
17
- packageJson,
18
- });
19
- if (!browserParams) {
20
- throw new Error("cannot find entry point to build");
21
- }
22
- await build(browserParams);
23
- return;
24
- }
25
- if (packageJson?.environment === "node") {
26
- const nodeParams = getBuildParamsToBuildForNode({
27
- cwdUrl,
28
- src,
29
- dist,
30
- packageJson,
31
- });
32
- if (!nodeParams) {
33
- throw new Error("cannot find entry point to build");
34
- }
35
- await build(nodeParams);
36
- return;
37
- }
38
- const browserParams = getBuildParamsToBuildForBrowser({
39
- cwdUrl,
40
- src,
41
- dist,
42
- packageJson,
43
- });
44
- const nodeParams = getBuildParamsToBuildForNode(
45
- {
46
- cwdUrl,
47
- src,
48
- dist,
49
- packageJson,
50
- },
51
- {
52
- hasBrowserEntryPoint: Boolean(browserParams),
53
- },
54
- );
55
- if (!browserParams && !nodeParams) {
56
- throw new Error("found nothing to build");
57
- }
58
- if (browserParams) {
59
- await build(browserParams);
60
- }
61
- if (nodeParams) {
62
- await build(nodeParams);
63
- }
64
- };
65
-
66
- const getBuildParamsToBuildForBrowser = ({ cwdUrl, src, dist }) => {
67
- let sourceDirectoryUrl;
68
- if (src) {
69
- sourceDirectoryUrl = new URL(src, cwdUrl);
70
- } else {
71
- const defaultSourceDirectoryUrl = new URL("./src/", cwdUrl);
72
- if (existsSync(defaultSourceDirectoryUrl)) {
73
- sourceDirectoryUrl = defaultSourceDirectoryUrl;
74
- } else {
75
- sourceDirectoryUrl = cwdUrl;
76
- }
77
- }
78
- let buildDirectoryUrl;
79
- if (dist) {
80
- buildDirectoryUrl = new URL(dist, cwdUrl);
81
- } else {
82
- buildDirectoryUrl = new URL("./dist/", cwdUrl);
83
- }
84
-
85
- // search for html file in source directory
86
- if (existsSync(new URL("./index.html", sourceDirectoryUrl))) {
87
- return {
88
- sourceDirectoryUrl,
89
- buildDirectoryUrl,
90
- entryPoints: {
91
- "./index.html": "index.html",
92
- },
93
- bundling: {
94
- js_module: {
95
- chunks: {
96
- vendors: { "file:///**/node_modules/": true },
97
- },
98
- },
99
- },
100
- };
101
- }
102
- if (existsSync(new URL("./main.html", sourceDirectoryUrl))) {
103
- return {
104
- sourceDirectoryUrl,
105
- buildDirectoryUrl,
106
- entryPoints: {
107
- "./index.html": "index.html",
108
- },
109
- bundling: {
110
- js_module: {
111
- chunks: {
112
- vendors: { "file:///**/node_modules/": true },
113
- },
114
- },
115
- },
116
- };
117
- }
118
- return null;
119
- };
120
-
121
- const getBuildParamsToBuildForNode = (
122
- { cwdUrl, src, dist, packageJson },
123
- { hasBrowserEntryPoint } = {},
124
- ) => {
125
- let sourceDirectoryUrl;
126
- if (src) {
127
- sourceDirectoryUrl = new URL(src, cwdUrl);
128
- }
129
- let buildDirectoryUrl;
130
- if (dist) {
131
- buildDirectoryUrl = new URL(dist, cwdUrl);
132
- } else {
133
- buildDirectoryUrl = new URL("./dist/", cwdUrl);
134
- }
135
- if (packageJson?.main) {
136
- const { main } = packageJson;
137
- if (main.endsWith(".html")) {
138
- return null;
139
- }
140
- const mainFileUrl = new URL(packageJson.main, cwdUrl);
141
- const mainFileRelativeUrl = urlToRelativeUrl(
142
- mainFileUrl,
143
- sourceDirectoryUrl,
144
- );
145
- return {
146
- sourceDirectoryUrl,
147
- buildDirectoryUrl,
148
- entryPoints: {
149
- [`./${mainFileRelativeUrl}`]: mainFileRelativeUrl,
150
- },
151
- runtimeCompat: {
152
- node: process.version.slice(1),
153
- },
154
- };
155
- }
156
- if (hasBrowserEntryPoint) {
157
- return null;
158
- }
159
- const mainFileUrl = new URL("./main.js", sourceDirectoryUrl);
160
- if (existsSync(mainFileUrl)) {
161
- return {
162
- sourceDirectoryUrl,
163
- buildDirectoryUrl,
164
- entryPoints: {
165
- "./main.js": "main.js",
166
- },
167
- runtimeCompat: {
168
- node: process.version.slice(1),
169
- },
170
- };
171
- }
172
- return null;
173
- };
174
-
175
- const readPackageJson = (directoryUrl) => {
176
- const packageJsonFileUrl = new URL("./package.json", directoryUrl);
177
- try {
178
- return JSON.parse(String(readFileSync(packageJsonFileUrl)));
179
- } catch (e) {
180
- if (e && e.code === "ENOENT") {
181
- return null;
182
- }
183
- throw e;
184
- }
185
- };
@@ -1,38 +0,0 @@
1
- import { existsSync } from "node:fs";
2
-
3
- import { installPackagesIfMissing } from "./package_installer.js";
4
-
5
- export const runDevCommand = async (
6
- src,
7
- { open, keepProcessAlive = true, logLevel } = {},
8
- ) => {
9
- const cwdUrl = new URL(`${process.cwd()}/`, import.meta.url);
10
- const packagesRequired = ["@jsenv/core", "open"];
11
- await installPackagesIfMissing(packagesRequired, cwdUrl);
12
- const [{ startDevServer }, openModule] = await Promise.all([
13
- import("@jsenv/core"),
14
- import("open"),
15
- ]);
16
- let sourceDirectoryUrl;
17
-
18
- if (src) {
19
- sourceDirectoryUrl = new URL(src, cwdUrl);
20
- } else {
21
- const defaultSourceDirectoryUrl = new URL("./src/", cwdUrl);
22
- if (existsSync(defaultSourceDirectoryUrl)) {
23
- sourceDirectoryUrl = defaultSourceDirectoryUrl;
24
- } else {
25
- sourceDirectoryUrl = cwdUrl;
26
- }
27
- }
28
- const devServer = await startDevServer({
29
- sourceDirectoryUrl,
30
- port: 3456,
31
- keepProcessAlive,
32
- logLevel,
33
- });
34
- if (open) {
35
- openModule.default(`${devServer.origin}`);
36
- }
37
- return devServer;
38
- };
@@ -1,22 +0,0 @@
1
- import { installPackagesIfMissing } from "./package_installer.js";
2
-
3
- export const runPreviewCommand = async (dist) => {
4
- const cwdUrl = new URL(`${process.cwd()}/`, import.meta.url);
5
- const packagesRequired = ["@jsenv/core", "open"];
6
- await installPackagesIfMissing(packagesRequired, cwdUrl);
7
- const [{ startBuildServer }, openModule] = await Promise.all([
8
- import("@jsenv/core"),
9
- import("open"),
10
- ]);
11
- let buildDirectoryUrl;
12
- if (dist) {
13
- buildDirectoryUrl = new URL(dist, cwdUrl);
14
- } else {
15
- buildDirectoryUrl = new URL("./dist/", cwdUrl);
16
- }
17
- const buildServer = await startBuildServer({
18
- buildDirectoryUrl,
19
- port: 4567,
20
- });
21
- openModule.default(`${buildServer.origin}`);
22
- };
@@ -1,59 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { installPackagesIfMissing } from "./package_installer.js";
3
- import { runDevCommand } from "./command_dev.mjs";
4
-
5
- export const runTestCommand = async () => {
6
- const cwdUrl = new URL(`${process.cwd()}/`, import.meta.url);
7
- const packagesRequired = ["@jsenv/test"];
8
- await installPackagesIfMissing(packagesRequired, cwdUrl);
9
- const [{ executeTestPlan, nodeWorkerThread, chromium }] = await Promise.all([
10
- import("@jsenv/test"),
11
- ]);
12
- let sourceDirectoryUrl;
13
- const defaultSourceDirectoryUrl = new URL("./src/", cwdUrl);
14
- if (existsSync(defaultSourceDirectoryUrl)) {
15
- sourceDirectoryUrl = defaultSourceDirectoryUrl;
16
- } else {
17
- sourceDirectoryUrl = cwdUrl;
18
- }
19
-
20
- await executeTestPlan({
21
- rootDirectoryUrl: cwdUrl,
22
- testPlan: {
23
- [sourceDirectoryUrl === cwdUrl
24
- ? "./**/*.test.html"
25
- : "./src/**/*.test.html"]: {
26
- chromium: {
27
- runtime: chromium(),
28
- },
29
- },
30
- "./**/*.test.js": {
31
- node: {
32
- runtime: nodeWorkerThread(),
33
- },
34
- },
35
- "./**/*.test.mjs": {
36
- node: {
37
- runtime: nodeWorkerThread(),
38
- },
39
- },
40
- "./packages/": null,
41
- },
42
- webServer: {
43
- start: async () => {
44
- await installPackagesIfMissing(
45
- ["@playwright/browser-chromium"],
46
- cwdUrl,
47
- );
48
- const devServer = await runDevCommand(sourceDirectoryUrl, {
49
- keepProcessAlive: false,
50
- logLevel: "warn",
51
- });
52
- return {
53
- origin: devServer.origin,
54
- rootDirectoryUrl: sourceDirectoryUrl,
55
- };
56
- },
57
- },
58
- });
59
- };
package/src/jsenv_cli.mjs DELETED
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /*
4
- * Il me faut en dépendence @jsenv/core et @jsenv/test
5
- * idéalement il faudrait qu'on demande a l'utilisateur son accord
6
- * pour installer les dependance lorsqu'elle ne sont pas la (genre playwright chromium)
7
- *
8
- * PLEIN DE CHOSE A FAIRE OMG
9
- *
10
- * (si y'a pas de dossier src dev se fera dans le dossier courant)
11
- */
12
-
13
- import { parseArgs } from "node:util";
14
-
15
- const options = {
16
- help: {
17
- type: "boolean",
18
- },
19
- };
20
- const { values, positionals } = parseArgs({ options, allowPositionals: true });
21
-
22
- if (values.help || positionals.length === 0) {
23
- console.log(`jsenv: dev build and test.
24
-
25
- Usage:
26
-
27
- npx @jsenv/cli dev <src> start a dev server for files in <src>
28
- npx @jsenv/cli build <src> <dist> generate an optimized version of files in <src> into <dist>
29
- npx @jsenv/cli preview <dist> start a server for files in <dist>
30
- npx @jsenv/cli test run test files
31
-
32
- <src> defaults to cwd()/src/ if exists otherwise cwd()
33
- <dist> defaults to cwd()/dist/
34
-
35
- https://github.com/jsenv/core
36
-
37
- For more advanced options, see the API.`);
38
- process.exit(0);
39
- }
40
-
41
- const commandHandlers = {
42
- dev: async (src) => {
43
- const { runDevCommand } = await import("./command_dev.mjs");
44
- await runDevCommand(src, { open: true });
45
- },
46
- build: async (src, dist) => {
47
- const { runBuildCommand } = await import("./command_build.mjs");
48
- await runBuildCommand(src, dist);
49
- },
50
- preview: async (dist) => {
51
- const { runPreviewCommand } = await import("./command_preview.mjs");
52
- await runPreviewCommand(dist);
53
- },
54
- test: async () => {
55
- const { runTestCommand } = await import("./command_test.mjs");
56
- await runTestCommand();
57
- },
58
- };
59
-
60
- const [command] = positionals;
61
- const commandHandler = commandHandlers[command];
62
- if (!commandHandler) {
63
- console.error(`Error: unknown command ${command}.`);
64
- process.exit(1);
65
- }
66
- await commandHandler(...positionals.slice(1));
@@ -1,122 +0,0 @@
1
- import { fileURLToPath } from "node:url";
2
- import { execSync } from "node:child_process";
3
-
4
- import prompts from "prompts";
5
-
6
- import { UNICODE } from "@jsenv/humanize";
7
-
8
- export const installPackagesIfMissing = async (packageNames, directoryUrl) => {
9
- const isAvailable = createPackageDetector(directoryUrl);
10
- const missingPackageNameArray = [];
11
- await Promise.all(
12
- packageNames.map(async (packageName) => {
13
- const isAvailableResult = await isAvailable(packageName);
14
- if (!isAvailableResult) {
15
- missingPackageNameArray.push(packageName);
16
- }
17
- }),
18
- );
19
- const missingCount = missingPackageNameArray.length;
20
- if (missingCount === 0) {
21
- return;
22
- }
23
- if (missingCount === 1) {
24
- const missingPackageName = missingPackageNameArray[0];
25
- console.log(
26
- `${UNICODE.INFO} "${missingPackageName}" package needs to be installed`,
27
- );
28
- // https://github.com/terkelg/prompts?tab=readme-ov-file#-prompt-objects
29
- const { value } = await prompts({
30
- type: "confirm",
31
- name: "value",
32
- message: `Do you want to install "${missingPackageName}"`,
33
- initial: true,
34
- });
35
- if (!value) {
36
- console.log(`${UNICODE.INFO} aborted due to missing package`);
37
- process.exit(0);
38
- }
39
- await installPackage(missingPackageName, directoryUrl);
40
- return;
41
- }
42
-
43
- console.log(`${UNICODE.INFO} ${missingCount} packages needs to be installed:
44
- - ${missingPackageNameArray.join("\n - ")}`);
45
- const { value } = await prompts({
46
- type: "confirm",
47
- name: "value",
48
- message: "Do you want to install them?",
49
- initial: true,
50
- });
51
- if (!value) {
52
- console.log(`${UNICODE.INFO} aborted due to missing package`);
53
- process.exit(0);
54
- }
55
- for (const missingPackageName of missingPackageNameArray) {
56
- await installPackage(missingPackageName, directoryUrl);
57
- }
58
- };
59
-
60
- const createPackageDetector = (directoryUrl) => {
61
- const localPackageNameSet = new Set();
62
- const globalPackageNameSet = new Set();
63
- const npmListCommandOutput = getCommandOutputSyncCatchingFailure(
64
- `npm list --depth=0 --json`,
65
- {
66
- cwd: fileURLToPath(directoryUrl),
67
- },
68
- );
69
- const npmListResult = JSON.parse(npmListCommandOutput);
70
- for (const dependencyName of Object.keys(npmListResult.dependencies)) {
71
- localPackageNameSet.add(dependencyName);
72
- }
73
- const npmListGlobalCommandOutput = getCommandOutputSyncCatchingFailure(
74
- `npm list --global --depth=0 --json`,
75
- {
76
- cwd: fileURLToPath(directoryUrl),
77
- },
78
- );
79
- const npmListGlobalResult = JSON.parse(npmListGlobalCommandOutput);
80
- for (const dependencyName of Object.keys(npmListGlobalResult.dependencies)) {
81
- globalPackageNameSet.add(dependencyName);
82
- }
83
- return (packageName) => {
84
- return (
85
- localPackageNameSet.has(packageName) ||
86
- globalPackageNameSet.has(packageName)
87
- );
88
- };
89
- };
90
-
91
- const getCommandOutputSyncCatchingFailure = (command, options) => {
92
- try {
93
- const output = execSync(`npm list --depth=0 --json`, {
94
- stdio: "pipe",
95
- ...options,
96
- });
97
- return String(output);
98
- } catch (e) {
99
- return String(e.stdout);
100
- }
101
- };
102
-
103
- // const isPackageAvailable = async (packageName) => {
104
- // try {
105
- // await import.meta.resolve(packageName);
106
- // return true;
107
- // } catch (e) {
108
- // if (e && e.code === "ERR_MODULE_NOT_FOUND") {
109
- // return false;
110
- // }
111
- // return true;
112
- // }
113
- // };
114
-
115
- const installPackage = async (packageName, directoryUrl) => {
116
- const installCommand = `npm install ${packageName}`;
117
- console.log(installCommand);
118
- execSync(`npm install ${packageName}`, {
119
- stdio: [0, 1, 2],
120
- cwd: fileURLToPath(directoryUrl),
121
- });
122
- };