makepack 1.7.14 → 1.7.15

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.
@@ -1,65 +1,65 @@
1
- // import makepack from "./files/makepack.js";
2
- import packageJson from "./files/package-json.js";
3
- import gitignore from "./files/gitignore.js";
4
- import tsconfig from "./files/tsconfig.js";
5
- import projectJs from "./files/project-js.js";
6
- import projectJsx from "./files/project-jsx.js";
7
- import projectTs from "./files/project-ts.js";
8
- import projectTsx from "./files/project-tsx.js";
9
- import mainjs from "./files/main.js";
10
- import inquirer from 'inquirer'
11
- import fs from "fs-extra"
12
- import path from "path"
13
- import readmeMd from "./files/readme.md.js";
14
-
15
- export default async (info) => {
16
- const files = [
17
- await packageJson(info),
18
- await gitignore(info),
19
- await readmeMd(info),
20
- await mainjs(info),
21
- ];
22
-
23
- switch (info.template) {
24
- case "typescript":
25
- files.push(await projectTs(info))
26
- break
27
- case "react with typescript":
28
- files.push(await projectTsx(info))
29
- break;
30
- case "javascript":
31
- files.push(await projectJs(info))
32
- break
33
- case "react with javascript":
34
- files.push(await projectJsx(info))
35
- break;
36
- }
37
-
38
- // push ts config
39
- if (info.template.includes("typescript")) {
40
- files.push(await tsconfig(info))
41
- }
42
-
43
- const rootdir = path.join(process.cwd(), info.pdir)
44
-
45
- for (let file of files) {
46
- // check if the file exists
47
- if (fs.existsSync(path.join(rootdir, file.filename))) {
48
- const { overwrite } = await inquirer.prompt([
49
- {
50
- type: "confirm",
51
- name: 'overwrite',
52
- message: `The file ${file.filename} already exists, do you want to overwrite it?`,
53
- default: true
54
- }
55
- ])
56
- if (!overwrite) {
57
- continue
58
- } else {
59
- fs.removeSync(path.join(rootdir, file.filename))
60
- }
61
- }
62
-
63
- fs.writeFileSync(path.join(rootdir, file.filename), file.content)
64
- }
65
- }
1
+ // import makepack from "./files/makepack.js";
2
+ import packageJson from "./files/package-json.js";
3
+ import gitignore from "./files/gitignore.js";
4
+ import tsconfig from "./files/tsconfig.js";
5
+ import projectJs from "./files/project-js.js";
6
+ import projectJsx from "./files/project-jsx.js";
7
+ import projectTs from "./files/project-ts.js";
8
+ import projectTsx from "./files/project-tsx.js";
9
+ import mainjs from "./files/main.js";
10
+ import inquirer from 'inquirer'
11
+ import fs from "fs-extra"
12
+ import path from "path"
13
+ import readmeMd from "./files/readme.md.js";
14
+
15
+ export default async (info) => {
16
+ const files = [
17
+ await packageJson(info),
18
+ await gitignore(info),
19
+ await readmeMd(info),
20
+ await mainjs(info),
21
+ ];
22
+
23
+ switch (info.template) {
24
+ case "typescript":
25
+ files.push(await projectTs(info))
26
+ break
27
+ case "react with typescript":
28
+ files.push(await projectTsx(info))
29
+ break;
30
+ case "javascript":
31
+ files.push(await projectJs(info))
32
+ break
33
+ case "react with javascript":
34
+ files.push(await projectJsx(info))
35
+ break;
36
+ }
37
+
38
+ // push ts config
39
+ if (info.template.includes("typescript")) {
40
+ files.push(await tsconfig(info))
41
+ }
42
+
43
+ const rootdir = path.join(process.cwd(), info.pdir)
44
+
45
+ for (let file of files) {
46
+ // check if the file exists
47
+ if (fs.existsSync(path.join(rootdir, file.filename))) {
48
+ const { overwrite } = await inquirer.prompt([
49
+ {
50
+ type: "confirm",
51
+ name: 'overwrite',
52
+ message: `The file ${file.filename} already exists, do you want to overwrite it?`,
53
+ default: true
54
+ }
55
+ ])
56
+ if (!overwrite) {
57
+ continue
58
+ } else {
59
+ fs.removeSync(path.join(rootdir, file.filename))
60
+ }
61
+ }
62
+
63
+ fs.writeFileSync(path.join(rootdir, file.filename), file.content)
64
+ }
65
+ }
@@ -1,20 +1,20 @@
1
- import path from 'path'
2
- import { execSync, logger } from '../../helpers.js'
3
- import fs from 'fs-extra'
4
-
5
- const release = async () => {
6
- const buildDir = path.join(process.cwd(), '.mpack')
7
- const packageJsonPath = path.join(buildDir, 'package.json')
8
- const exists = fs.existsSync(buildDir)
9
- if (!exists || !fs.existsSync(packageJsonPath)) {
10
- logger.error(`Project is not built yet. Please build the project first.`)
11
- process.exit(1)
12
- }
13
-
14
- logger.info(`Releaseing the production build to the npm repository...`)
15
- execSync(`npm publish`, {
16
- cwd: buildDir
17
- })
18
- }
19
-
1
+ import path from 'path'
2
+ import { execSync, logger } from '../../helpers.js'
3
+ import fs from 'fs-extra'
4
+
5
+ const release = async () => {
6
+ const buildDir = path.join(process.cwd(), '.mpack')
7
+ const packageJsonPath = path.join(buildDir, 'package.json')
8
+ const exists = fs.existsSync(buildDir)
9
+ if (!exists || !fs.existsSync(packageJsonPath)) {
10
+ logger.error(`Project is not built yet. Please build the project first.`)
11
+ process.exit(1)
12
+ }
13
+
14
+ logger.info(`Releaseing the production build to the npm repository...`)
15
+ execSync(`npm publish`, {
16
+ cwd: buildDir
17
+ })
18
+ }
19
+
20
20
  export default release
@@ -1,216 +1,216 @@
1
- import express from 'express';
2
- import path from 'path';
3
- import fs from 'fs';
4
- import { pathToFileURL } from 'url';
5
- import { createRequire } from 'module';
6
- import chokidar from 'chokidar';
7
- import madge from 'madge';
8
- import viteSetup from './vite.js';
9
- import * as esbuild from 'esbuild';
10
- import { randomUUID } from 'crypto';
11
- import debounce from 'lodash.debounce';
12
- import { logger, concolor, loadViteConfig } from '../../helpers.js';
13
-
14
- const projectRoot = process.cwd();
15
- const requireFn = createRequire(import.meta.url);
16
- const mpack = path.join(projectRoot, '.mpack');
17
-
18
- let server = null;
19
- let app = null;
20
- let viteServer = null;
21
-
22
- const pkg = path.join(process.cwd(), 'package.json');
23
- const pkgjson = JSON.parse(fs.readFileSync(pkg, 'utf-8'));
24
- let isEsmProject = pkgjson.type === 'module';
25
-
26
- const uxpfileJS = path.resolve(projectRoot, 'express.js');
27
- const uxpfileTS = path.resolve(projectRoot, 'express.ts');
28
- const expExists = fs.existsSync(uxpfileJS) || fs.existsSync(uxpfileTS);
29
- let uxpfile = expExists ? (fs.existsSync(uxpfileJS) ? uxpfileJS : uxpfileTS) : null;
30
-
31
- const connections = new Set();
32
-
33
- function safeHandler(fn) {
34
- return (req, res, next) => {
35
- try {
36
- const result = fn(req, res, next);
37
- if (result && typeof result.catch === 'function') {
38
- result.catch(next);
39
- }
40
- } catch (err) {
41
- logger.error(`Error in request handler: ${err.message || err}`);
42
- res.status(500).send('Internal Server Error');
43
- // next();
44
- }
45
- };
46
- }
47
-
48
- function trackConnections(srv) {
49
- srv.on('connection', (conn) => {
50
- connections.add(conn);
51
- conn.on('close', () => connections.delete(conn));
52
- });
53
- }
54
-
55
- async function bootServer(args) {
56
- let wasServer = !!server;
57
- if (server) {
58
- for (const conn of connections) {
59
- conn.destroy();
60
- }
61
- await new Promise((resolve, reject) => {
62
- server.close(err => {
63
- if (err) {
64
- logger.error(`while closing server: ${err.message || err}`);
65
- reject(err);
66
- } else {
67
- resolve();
68
- }
69
- });
70
- });
71
- server = null;
72
- }
73
-
74
- if (viteServer) {
75
- await viteServer.close();
76
- }
77
-
78
- app = express();
79
-
80
- try {
81
- const middleware = await loadExp();
82
- if (typeof middleware === 'function') {
83
- const _get = app.get.bind(app);
84
- const _post = app.post.bind(app);
85
- const _delete = app.delete.bind(app);
86
- const _put = app.put.bind(app);
87
-
88
- app.get = (path, ...handlers) => {
89
- handlers = handlers.map(h => safeHandler(h));
90
- return _get(path, ...handlers);
91
- };
92
-
93
- app.post = (path, ...handlers) => {
94
- handlers = handlers.map(h => safeHandler(h));
95
- return _post(path, ...handlers);
96
- };
97
-
98
- app.put = (path, ...handlers) => {
99
- handlers = handlers.map(h => safeHandler(h));
100
- return _put(path, ...handlers);
101
- };
102
-
103
- app.delete = (path, ...handlers) => {
104
- handlers = handlers.map(h => safeHandler(h));
105
- return _delete(path, ...handlers);
106
- };
107
- middleware(app);
108
- }
109
- const config = await loadViteConfig() || {}
110
- viteServer = await viteSetup(app);
111
- const port = args.port || config?.server?.port || 4000;
112
- server = app.listen(port, () => {
113
- if (!wasServer) {
114
- logger.success(`Server running on: ${concolor.green(concolor.bold(`http://localhost:${port}`))}`, '')
115
- }
116
- trackConnections(server);
117
- })
118
- } catch (err) {
119
- logger.error(`Failed to start server: ${err.message || err}`);
120
- }
121
- }
122
-
123
- let esbuildCtx = null;
124
-
125
- const buildFile = path.join(mpack, `${randomUUID().substring(0, 15)}.js`);
126
-
127
- async function loadExp() {
128
- if (!expExists) return null
129
-
130
- const cacheKeys = Object.keys(requireFn.cache || {});
131
- if (!isEsmProject) {
132
- for (const key of cacheKeys) {
133
- if (key.startsWith(process.cwd())) {
134
- delete requireFn.cache[key];
135
- }
136
- }
137
- }
138
-
139
- const ext = path.extname(uxpfile);
140
- const isTs = ext === '.ts' || ext === '.tsx';
141
-
142
- if (isTs) {
143
- if (esbuildCtx) {
144
- await esbuildCtx.rebuild();
145
- } else {
146
- esbuildCtx = await esbuild.context({
147
- entryPoints: [uxpfile],
148
- outfile: buildFile,
149
- format: isEsmProject ? 'esm' : 'cjs',
150
- platform: 'node',
151
- sourcemap: 'inline',
152
- bundle: true,
153
- packages: 'external',
154
- });
155
- await esbuildCtx.rebuild();
156
- }
157
-
158
- if (isEsmProject) {
159
- const mod = await import(pathToFileURL(buildFile).href + `?update=${Date.now()}`);
160
- return mod.default || mod;
161
- } else {
162
- return requireFn(buildFile);
163
- }
164
- }
165
-
166
- if (isEsmProject) {
167
- const mod = await import(pathToFileURL(uxpfile).href + `?update=${Date.now()}`);
168
- return mod.default || mod;
169
- } else {
170
- return requireFn(uxpfile);
171
- }
172
- }
173
-
174
- async function getAllDependencies() {
175
- try {
176
- if (!expExists) {
177
- return [];
178
- }
179
- const result = await madge(uxpfile, { fileExtensions: ['ts', 'js'] });
180
- const deps = Object.keys(result.obj());
181
- // const circular = await result.circular();
182
- // if (circular.length) {
183
- // logger.warning(`Circular dependencies detected: ${circular.map(c => c.join(' -> ')).join(', ')}`);
184
- // }
185
- return deps.map(dep => path.resolve(path.dirname(uxpfile), dep));
186
- } catch (err) {
187
- logger.error(`Failed to analyze dependencies with madge: ${err.message || err}`);
188
- return [uxpfile];
189
- }
190
- }
191
-
192
-
193
- let watcher;
194
- async function startDevServer(args) {
195
- if (fs.existsSync(mpack)) {
196
- fs.rmSync(mpack, { recursive: true, force: true });
197
- }
198
- fs.mkdirSync(mpack, { recursive: true });
199
-
200
- await bootServer(args);
201
- const filesToWatch = await getAllDependencies();
202
- if (watcher) watcher.close();
203
- watcher = chokidar.watch(filesToWatch, { ignoreInitial: true });
204
-
205
- const reload = debounce(async (f) => {
206
- await bootServer(args);
207
- const prettyPath = concolor.dim(path.relative(process.cwd(), f));
208
- logger.info(`${concolor.green('server reload')} ${prettyPath}`);
209
- }, 100);
210
-
211
- watcher.on('change', reload);
212
- watcher.on('add', reload);
213
- watcher.on('unlink', reload);
214
- }
215
-
1
+ import express from 'express';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { pathToFileURL } from 'url';
5
+ import { createRequire } from 'module';
6
+ import chokidar from 'chokidar';
7
+ import madge from 'madge';
8
+ import viteSetup from './vite.js';
9
+ import * as esbuild from 'esbuild';
10
+ import { randomUUID } from 'crypto';
11
+ import debounce from 'lodash.debounce';
12
+ import { logger, concolor, loadViteConfig } from '../../helpers.js';
13
+
14
+ const projectRoot = process.cwd();
15
+ const requireFn = createRequire(import.meta.url);
16
+ const mpack = path.join(projectRoot, '.mpack');
17
+
18
+ let server = null;
19
+ let app = null;
20
+ let viteServer = null;
21
+
22
+ const pkg = path.join(process.cwd(), 'package.json');
23
+ const pkgjson = JSON.parse(fs.readFileSync(pkg, 'utf-8'));
24
+ let isEsmProject = pkgjson.type === 'module';
25
+
26
+ const uxpfileJS = path.resolve(projectRoot, 'express.js');
27
+ const uxpfileTS = path.resolve(projectRoot, 'express.ts');
28
+ const expExists = fs.existsSync(uxpfileJS) || fs.existsSync(uxpfileTS);
29
+ let uxpfile = expExists ? (fs.existsSync(uxpfileJS) ? uxpfileJS : uxpfileTS) : null;
30
+
31
+ const connections = new Set();
32
+
33
+ function safeHandler(fn) {
34
+ return (req, res, next) => {
35
+ try {
36
+ const result = fn(req, res, next);
37
+ if (result && typeof result.catch === 'function') {
38
+ result.catch(next);
39
+ }
40
+ } catch (err) {
41
+ logger.error(`Error in request handler: ${err.message || err}`);
42
+ res.status(500).send('Internal Server Error');
43
+ // next();
44
+ }
45
+ };
46
+ }
47
+
48
+ function trackConnections(srv) {
49
+ srv.on('connection', (conn) => {
50
+ connections.add(conn);
51
+ conn.on('close', () => connections.delete(conn));
52
+ });
53
+ }
54
+
55
+ async function bootServer(args) {
56
+ let wasServer = !!server;
57
+ if (server) {
58
+ for (const conn of connections) {
59
+ conn.destroy();
60
+ }
61
+ await new Promise((resolve, reject) => {
62
+ server.close(err => {
63
+ if (err) {
64
+ logger.error(`while closing server: ${err.message || err}`);
65
+ reject(err);
66
+ } else {
67
+ resolve();
68
+ }
69
+ });
70
+ });
71
+ server = null;
72
+ }
73
+
74
+ if (viteServer) {
75
+ await viteServer.close();
76
+ }
77
+
78
+ app = express();
79
+
80
+ try {
81
+ const middleware = await loadExp();
82
+ if (typeof middleware === 'function') {
83
+ const _get = app.get.bind(app);
84
+ const _post = app.post.bind(app);
85
+ const _delete = app.delete.bind(app);
86
+ const _put = app.put.bind(app);
87
+
88
+ app.get = (path, ...handlers) => {
89
+ handlers = handlers.map(h => safeHandler(h));
90
+ return _get(path, ...handlers);
91
+ };
92
+
93
+ app.post = (path, ...handlers) => {
94
+ handlers = handlers.map(h => safeHandler(h));
95
+ return _post(path, ...handlers);
96
+ };
97
+
98
+ app.put = (path, ...handlers) => {
99
+ handlers = handlers.map(h => safeHandler(h));
100
+ return _put(path, ...handlers);
101
+ };
102
+
103
+ app.delete = (path, ...handlers) => {
104
+ handlers = handlers.map(h => safeHandler(h));
105
+ return _delete(path, ...handlers);
106
+ };
107
+ middleware(app);
108
+ }
109
+ const config = await loadViteConfig() || {}
110
+ viteServer = await viteSetup(app);
111
+ const port = args.port || config?.server?.port || 4000;
112
+ server = app.listen(port, () => {
113
+ if (!wasServer) {
114
+ logger.success(`Server running on: ${concolor.green(concolor.bold(`http://localhost:${port}`))}`, '')
115
+ }
116
+ trackConnections(server);
117
+ })
118
+ } catch (err) {
119
+ logger.error(`Failed to start server: ${err.message || err}`);
120
+ }
121
+ }
122
+
123
+ let esbuildCtx = null;
124
+
125
+ const buildFile = path.join(mpack, `${randomUUID().substring(0, 15)}.js`);
126
+
127
+ async function loadExp() {
128
+ if (!expExists) return null
129
+
130
+ const cacheKeys = Object.keys(requireFn.cache || {});
131
+ if (!isEsmProject) {
132
+ for (const key of cacheKeys) {
133
+ if (key.startsWith(process.cwd())) {
134
+ delete requireFn.cache[key];
135
+ }
136
+ }
137
+ }
138
+
139
+ const ext = path.extname(uxpfile);
140
+ const isTs = ext === '.ts' || ext === '.tsx';
141
+
142
+ if (isTs) {
143
+ if (esbuildCtx) {
144
+ await esbuildCtx.rebuild();
145
+ } else {
146
+ esbuildCtx = await esbuild.context({
147
+ entryPoints: [uxpfile],
148
+ outfile: buildFile,
149
+ format: isEsmProject ? 'esm' : 'cjs',
150
+ platform: 'node',
151
+ sourcemap: 'inline',
152
+ bundle: true,
153
+ packages: 'external',
154
+ });
155
+ await esbuildCtx.rebuild();
156
+ }
157
+
158
+ if (isEsmProject) {
159
+ const mod = await import(pathToFileURL(buildFile).href + `?update=${Date.now()}`);
160
+ return mod.default || mod;
161
+ } else {
162
+ return requireFn(buildFile);
163
+ }
164
+ }
165
+
166
+ if (isEsmProject) {
167
+ const mod = await import(pathToFileURL(uxpfile).href + `?update=${Date.now()}`);
168
+ return mod.default || mod;
169
+ } else {
170
+ return requireFn(uxpfile);
171
+ }
172
+ }
173
+
174
+ async function getAllDependencies() {
175
+ try {
176
+ if (!expExists) {
177
+ return [];
178
+ }
179
+ const result = await madge(uxpfile, { fileExtensions: ['ts', 'js'] });
180
+ const deps = Object.keys(result.obj());
181
+ // const circular = await result.circular();
182
+ // if (circular.length) {
183
+ // logger.warning(`Circular dependencies detected: ${circular.map(c => c.join(' -> ')).join(', ')}`);
184
+ // }
185
+ return deps.map(dep => path.resolve(path.dirname(uxpfile), dep));
186
+ } catch (err) {
187
+ logger.error(`Failed to analyze dependencies with madge: ${err.message || err}`);
188
+ return [uxpfile];
189
+ }
190
+ }
191
+
192
+
193
+ let watcher;
194
+ async function startDevServer(args) {
195
+ if (fs.existsSync(mpack)) {
196
+ fs.rmSync(mpack, { recursive: true, force: true });
197
+ }
198
+ fs.mkdirSync(mpack, { recursive: true });
199
+
200
+ await bootServer(args);
201
+ const filesToWatch = await getAllDependencies();
202
+ if (watcher) watcher.close();
203
+ watcher = chokidar.watch(filesToWatch, { ignoreInitial: true });
204
+
205
+ const reload = debounce(async (f) => {
206
+ await bootServer(args);
207
+ const prettyPath = concolor.dim(path.relative(process.cwd(), f));
208
+ logger.info(`${concolor.green('server reload')} ${prettyPath}`);
209
+ }, 100);
210
+
211
+ watcher.on('change', reload);
212
+ watcher.on('add', reload);
213
+ watcher.on('unlink', reload);
214
+ }
215
+
216
216
  export default startDevServer