@metricinsights/pp-dev 1.5.0-beta.19 → 1.5.0-beta.20
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 +29 -0
- package/dist/README.md +29 -0
- package/dist/cjs/auth.provider-CnmH_J2r.js +2 -0
- package/dist/cjs/auth.provider-CnmH_J2r.js.map +1 -0
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/index-DFNyrsll.js +2 -0
- package/dist/cjs/index-DFNyrsll.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{migrate-MxrkBSEh.js → migrate-D_y8SIv9.js} +2 -2
- package/dist/cjs/{migrate-MxrkBSEh.js.map → migrate-D_y8SIv9.js.map} +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/request-capture.middleware-BUpxzWDS.js +2 -0
- package/dist/cjs/request-capture.middleware-BUpxzWDS.js.map +1 -0
- package/dist/cjs/{version-manifest-DjLJQWWa.js → version-manifest-DsHoDq-U.js} +2 -2
- package/dist/cjs/{version-manifest-DjLJQWWa.js.map → version-manifest-DsHoDq-U.js.map} +1 -1
- package/dist/cjs/{version-plugin-sUHrN2Jo.js → version-plugin-Cm56j0DZ.js} +2 -2
- package/dist/cjs/{version-plugin-sUHrN2Jo.js.map → version-plugin-Cm56j0DZ.js.map} +1 -1
- package/dist/esm/auth.provider-B9ybFjL5.js +2 -0
- package/dist/esm/auth.provider-B9ybFjL5.js.map +1 -0
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index-ypcJ5r5C.js +2 -0
- package/dist/esm/index-ypcJ5r5C.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/{migrate-Dm-PSAv7.js → migrate-BHq9PUZz.js} +2 -2
- package/dist/esm/{migrate-Dm-PSAv7.js.map → migrate-BHq9PUZz.js.map} +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/request-capture.middleware-VCmWYJoS.js +2 -0
- package/dist/esm/request-capture.middleware-VCmWYJoS.js.map +1 -0
- package/dist/esm/{version-manifest-D2Vzplem.js → version-manifest-CuZrGM-C.js} +2 -2
- package/dist/esm/{version-manifest-D2Vzplem.js.map → version-manifest-CuZrGM-C.js.map} +1 -1
- package/dist/esm/{version-plugin-A4qfBm0G.js → version-plugin-CbEJf2b3.js} +2 -2
- package/dist/esm/{version-plugin-A4qfBm0G.js.map → version-plugin-CbEJf2b3.js.map} +1 -1
- package/dist/types/index.d.ts +15 -0
- package/package.json +1 -1
- package/dist/cjs/auth.provider-CejYwjcG.js +0 -2
- package/dist/cjs/auth.provider-CejYwjcG.js.map +0 -1
- package/dist/cjs/index-Cev20Ede.js +0 -2
- package/dist/cjs/index-Cev20Ede.js.map +0 -1
- package/dist/cjs/request-capture.middleware-C99WIh5-.js +0 -2
- package/dist/cjs/request-capture.middleware-C99WIh5-.js.map +0 -1
- package/dist/esm/auth.provider-C3RNvaVR.js +0 -2
- package/dist/esm/auth.provider-C3RNvaVR.js.map +0 -1
- package/dist/esm/index-Dlv5DGp7.js +0 -2
- package/dist/esm/index-Dlv5DGp7.js.map +0 -1
- package/dist/esm/request-capture.middleware-DEQ-qw2b.js +0 -2
- package/dist/esm/request-capture.middleware-DEQ-qw2b.js.map +0 -1
package/README.md
CHANGED
|
@@ -219,6 +219,34 @@ section for the full feature description.
|
|
|
219
219
|
|
|
220
220
|
See [Working as other users](#working-as-other-users).
|
|
221
221
|
|
|
222
|
+
### `server` — The dev server
|
|
223
|
+
|
|
224
|
+
| Field | Type | Default | Description |
|
|
225
|
+
|----------------|--------------------|---------|-------------|
|
|
226
|
+
| `allowedHosts` | `string[] \| true` | `[]` | Host names the dev server answers besides `localhost`, `*.localhost` and IP addresses, as Vite's [`server.allowedHosts`](https://vite.dev/config/server-options#server-allowedhosts): `'my-app.ngrok.app'`, or `'.ngrok.app'` for the domain and its subdomains. `true` answers any host; avoid it |
|
|
227
|
+
|
|
228
|
+
A request whose `Host` is any other name gets 403: that is how DNS rebinding reaches a local server
|
|
229
|
+
(a page on `evil.example:3000` whose name is then pointed at `127.0.0.1`). `pp-dev` passes the list
|
|
230
|
+
to Vite, which checks `Host` itself; `pp-dev next` checks it for every request and WebSocket. The
|
|
231
|
+
`--host <name>` you start the server with is allowed too.
|
|
232
|
+
|
|
233
|
+
**Tunnels** (ngrok, cloudflared, an nginx in front):
|
|
234
|
+
|
|
235
|
+
- One that keeps the tunnel's name in `Host` (ngrok's default) needs that name in `allowedHosts`.
|
|
236
|
+
- One that rewrites `Host` to `localhost` (`ngrok --host-header=rewrite`, cloudflared's
|
|
237
|
+
`httpHostHeader`, nginx `proxy_set_header Host localhost`) is answered already, but the pages it
|
|
238
|
+
serves send the tunnel's name as `Origin`, which the dev server's own API (`/@api/*`, and the dev
|
|
239
|
+
panel's WebSocket under `pp-dev next`) refuses from other sites. List the tunnel's exact name (`'my-app.ngrok.app'`, not `'.ngrok.app'`) to allow its pages:
|
|
240
|
+
a `.domain` entry would let any page on that domain, someone else's tunnel too, act with your MI
|
|
241
|
+
token. `X-Forwarded-Host` is not trusted for either check: a rebinding page can send it.
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
export default defineConfig({
|
|
245
|
+
// ...
|
|
246
|
+
server: { allowedHosts: ['my-app.ngrok.app'] },
|
|
247
|
+
});
|
|
248
|
+
```
|
|
249
|
+
|
|
222
250
|
### Validation
|
|
223
251
|
|
|
224
252
|
pp-dev validates your config at startup and reports problems clearly:
|
|
@@ -232,6 +260,7 @@ pp-dev validates your config at startup and reports problems clearly:
|
|
|
232
260
|
| `app.type === 'page'` + `mi.mode === 'standalone'` without `app.id` | error |
|
|
233
261
|
| `app.name` missing and no `package.json#name` | error |
|
|
234
262
|
| `devPanel.position` not one of the four corners | error |
|
|
263
|
+
| `server.allowedHosts` neither a list of host names nor `true` | error |
|
|
235
264
|
|
|
236
265
|
### Environment Variables
|
|
237
266
|
|
package/dist/README.md
CHANGED
|
@@ -219,6 +219,34 @@ section for the full feature description.
|
|
|
219
219
|
|
|
220
220
|
See [Working as other users](#working-as-other-users).
|
|
221
221
|
|
|
222
|
+
### `server` — The dev server
|
|
223
|
+
|
|
224
|
+
| Field | Type | Default | Description |
|
|
225
|
+
|----------------|--------------------|---------|-------------|
|
|
226
|
+
| `allowedHosts` | `string[] \| true` | `[]` | Host names the dev server answers besides `localhost`, `*.localhost` and IP addresses, as Vite's [`server.allowedHosts`](https://vite.dev/config/server-options#server-allowedhosts): `'my-app.ngrok.app'`, or `'.ngrok.app'` for the domain and its subdomains. `true` answers any host; avoid it |
|
|
227
|
+
|
|
228
|
+
A request whose `Host` is any other name gets 403: that is how DNS rebinding reaches a local server
|
|
229
|
+
(a page on `evil.example:3000` whose name is then pointed at `127.0.0.1`). `pp-dev` passes the list
|
|
230
|
+
to Vite, which checks `Host` itself; `pp-dev next` checks it for every request and WebSocket. The
|
|
231
|
+
`--host <name>` you start the server with is allowed too.
|
|
232
|
+
|
|
233
|
+
**Tunnels** (ngrok, cloudflared, an nginx in front):
|
|
234
|
+
|
|
235
|
+
- One that keeps the tunnel's name in `Host` (ngrok's default) needs that name in `allowedHosts`.
|
|
236
|
+
- One that rewrites `Host` to `localhost` (`ngrok --host-header=rewrite`, cloudflared's
|
|
237
|
+
`httpHostHeader`, nginx `proxy_set_header Host localhost`) is answered already, but the pages it
|
|
238
|
+
serves send the tunnel's name as `Origin`, which the dev server's own API (`/@api/*`, and the dev
|
|
239
|
+
panel's WebSocket under `pp-dev next`) refuses from other sites. List the tunnel's exact name (`'my-app.ngrok.app'`, not `'.ngrok.app'`) to allow its pages:
|
|
240
|
+
a `.domain` entry would let any page on that domain, someone else's tunnel too, act with your MI
|
|
241
|
+
token. `X-Forwarded-Host` is not trusted for either check: a rebinding page can send it.
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
export default defineConfig({
|
|
245
|
+
// ...
|
|
246
|
+
server: { allowedHosts: ['my-app.ngrok.app'] },
|
|
247
|
+
});
|
|
248
|
+
```
|
|
249
|
+
|
|
222
250
|
### Validation
|
|
223
251
|
|
|
224
252
|
pp-dev validates your config at startup and reports problems clearly:
|
|
@@ -232,6 +260,7 @@ pp-dev validates your config at startup and reports problems clearly:
|
|
|
232
260
|
| `app.type === 'page'` + `mi.mode === 'standalone'` without `app.id` | error |
|
|
233
261
|
| `app.name` missing and no `package.json#name` | error |
|
|
234
262
|
| `devPanel.position` not one of the four corners | error |
|
|
263
|
+
| `server.allowedHosts` neither a list of host names nor `true` | error |
|
|
235
264
|
|
|
236
265
|
### Environment Variables
|
|
237
266
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("fs"),t=require("path"),i=require("url"),r=require("picocolors"),s=require("node:path"),o=require("vite");var n="undefined"!=typeof document?document.currentScript:null;const a=(e=>e&&"object"==typeof e&&"default"in e?e.default:e)(s),p=t.resolve("undefined"!=typeof __filename&&__filename||i.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("auth.provider-CnmH_J2r.js",document.baseURI).href),"../../.."),d=t.resolve("undefined"!=typeof __filename&&__filename||i.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("auth.provider-CnmH_J2r.js",document.baseURI).href),"../.."),l=e.existsSync(t.resolve(p,"package.json"))?p:d,c=t.resolve(l,"dist/client/client.js"),{version:u,name:m}=JSON.parse(e.readFileSync(t.resolve(l,"package.json")).toString()),f=u,h=m,v="info";let g,w;function E(){return g??={level:v,logger:o.createLogger(v)},g.logger}function y(e){return void 0!==e&&e!==g?.level&&(g={level:e,logger:o.createLogger(e)}),w??={info:(e,t)=>E().info(e,t),warn:(e,t)=>E().warn(e,t),warnOnce:(e,t)=>E().warnOnce(e,t),error:(e,t)=>E().error(e,t),clearScreen:e=>E().clearScreen(e),hasErrorLogged:e=>E().hasErrorLogged(e),get hasWarned(){return E().hasWarned},set hasWarned(e){E().hasWarned=e}},w}const b=r.createColors();function P(e,t){if(!e||e.includes("\0")||a.posix.isAbsolute(e)||a.win32.isAbsolute(e)||a.win32.parse(e).root)throw new Error(`[pp-dev] ${t} must be a relative path inside its output directory.`);const i=a.posix.normalize(e.replace(/\\/g,"/"));if("."===i||".."===i||i.startsWith("../"))throw new Error(`[pp-dev] ${t} must stay inside its output directory.`);return i}function _(e){return P(`${e.replace(/^@/,"").replace(/[\\/]+/g,"-")}.zip`,"default ZIP output file name")}const A=["top-left","top-right","bottom-left","bottom-right"],L=2147483647;class R{state={isAuthenticated:!1,isRedirected:!1,lastChecked:0};listeners=new Set;getState(){return{...this.state}}isAuthenticated(){return this.state.isAuthenticated}isRedirected(){return this.state.isRedirected}setAuthenticated(e){this.state.isAuthenticated=e,this.state.lastChecked=Date.now(),this.notifyListeners()}setRedirected(e){this.state.isRedirected=e,this.notifyListeners()}updateState(e){void 0!==e.isAuthenticated&&(this.state.isAuthenticated=e.isAuthenticated),void 0!==e.isRedirected&&(this.state.isRedirected=e.isRedirected),this.state.lastChecked=Date.now(),this.notifyListeners()}reset(){this.state={isAuthenticated:!1,isRedirected:!1,lastChecked:0},this.notifyListeners()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}notifyListeners(){this.listeners.forEach(e=>{try{e(this.getState())}catch(e){y().error(`Error in auth state listener: ${e instanceof Error?e.stack??e.message:String(e)}`)}})}}const x=new R;exports.AuthProvider=R,exports.PACKAGE_NAME=h,exports.PATH_PAGE_PREFIX="/p",exports.PATH_TEMPLATE_LOCAL_PREFIX="/pl",exports.PATH_TEMPLATE_PREFIX="/pt",exports.PP_DEV_CLIENT_ENTRY=c,exports.PP_DEV_CONFIG_NAMES=[".pp-dev.config.js",".pp-dev.config.cjs",".pp-dev.config.mjs",".pp-dev.config.ts",".pp-dev.config.cts",".pp-dev.config.mts",".pp-dev.config.json","pp-dev.config.js","pp-dev.config.cjs","pp-dev.config.mjs","pp-dev.config.ts","pp-dev.config.cts","pp-dev.config.mts","pp-dev.config.json"],exports.PP_DEV_NEXT_BUILD_ENV_VAR="PP_DEV_NEXT_BUILD",exports.PP_DEV_PACKAGE_DIR=l,exports.VERSION=f,exports.authProvider=x,exports.colors=b,exports.createDefaultZipFileName=_,exports.createLogger=y,exports.normalizePPDevConfig=function(e,t){const{mi:i={},app:r={},proxy:s={},build:o={},sync:n={},inspector:a={},devPanel:p={},users:d={},server:l={}}=e,c=i.mode??"standalone",u=r.type??"template",m=i.apiVersion??7,f="standalone"===c;let h=!1;"top-bar"===i.include?h=!0:"shared-components"===i.include&&(h={addSharedComponentsScripts:!0,addRootElement:!1});const v="page"===u,g=r.name??t;if(!g)throw new Error("[pp-dev] app.name is required (or set package.json#name)");const w="VERSION-v{packageversion}-{currentDate}.json";let E;const y=o.zip;let b;E=!1!==y&&(!0===y||void 0===y?{outFileName:_(g),outDir:"dist-zip"}:{outFileName:P(y.fileName??_(g),"build.zip.fileName"),outDir:y.outDir??"dist-zip",...y.inDir?{inDir:y.inDir}:{}});const A=o.versionFile;let L;b=!1!==A&&(!0===A||void 0===A?{versionFileTemplate:w,enabled:!0}:{versionFileTemplate:P(A.fileNameTemplate??w,"build.versionFile.fileNameTemplate"),enabled:A.enabled??!0});const R=o.imageOptimisations;return L=!1!==R&&(!0===R||void 0===R?{}:R),{templateName:g,backendBaseURL:i.url??process.env.MI_BACKEND_URL,appId:r.id,templateLess:v,miHudLess:f,integrateMiTopBar:h,enableProxyCache:s.cache??!0,proxyCacheTTL:s.cacheTtl??6e5,disableSSLValidation:s.tls?.allowSelfSigned??!1,imageOptimizer:L,outDir:o.outDir??"dist",distZip:E,versionPlugin:b,syncBackupsDir:n.backupsDir??"backups",syncMaxBackups:n.maxBackups,syncBuildTimeoutMs:n.buildTimeoutMs,v7Features:m>=7,personalAccessToken:i.token??process.env.MI_ACCESS_TOKEN,inspectorEnabled:a.enabled??!0,inspectorMaxMemory:a.maxMemory??1073741824,inspectorCaptureLimit:a.captureLimit??10485760,devPanelPosition:p.position??"bottom-right",devPanelHidden:p.hidden??!1,devPanelAutoHide:p.autoHide??!1,persistUsers:d.persist??!1,allowedHosts:!0===l.allowedHosts||(l.allowedHosts??[]).map(e=>e.trim().toLowerCase())}},exports.normalizeRelativeOutputPath=P,exports.resolveOutputFilePath=function(e,t,i){const r=P(t,i),s=a.resolve(e),o=a.resolve(s,...r.split("/")),n=a.relative(s,o);if(".."===n||n.startsWith(`..${a.sep}`)||a.isAbsolute(n))throw new Error(`[pp-dev] ${i} must resolve inside its output directory.`);return o},exports.validatePPDevConfig=function(e,t){const i=e.mi?.mode??"standalone",r=e.app?.type??"template",s=e.mi?.apiVersion??7,o=e.mi?.url??process.env.MI_BACKEND_URL;if(!(e.app?.name??t))throw new Error("[pp-dev] app.name is required (or set package.json#name)");const n=e.sync?.maxBackups;if(void 0!==n&&!1!==n&&!(Number.isInteger(n)&&n>=0))throw new Error(`[pp-dev] sync.maxBackups must be a whole number ≥ 0 or false (0 and false keep every backup), got ${JSON.stringify(n)}`);const a=e.sync?.buildTimeoutMs;if(void 0!==a&&!(Number.isInteger(a)&&a>0&&a<=L))throw new Error(`[pp-dev] sync.buildTimeoutMs must be a whole number of milliseconds between 1 and 2147483647, got ${JSON.stringify(a)}`);if(e.mi?.include&&"standalone"!==i)throw console.warn('[pp-dev] mi.include is only valid when mi.mode is "standalone"'),new Error('[pp-dev] mi.include requires mi.mode to be "standalone"');if(!o){if("embedding"===i||"template"===r)throw new Error('[pp-dev] mi.url is required when mi.mode is "embedding" or app.type is "template"');"standalone"===i&&"page"===r&&console.warn("[pp-dev] mi.url is not set — dev server will run without a backend proxy")}if("template"===r&&!e.app?.id)throw new Error('[pp-dev] app.id is required when app.type is "template"');if("page"===r&&o&&("standalone"===i||s>=7)&&!e.app?.id)throw new Error('[pp-dev] app.id is required when backend page data is loaded for app.type "page"');if(void 0!==e.devPanel?.position&&!A.includes(e.devPanel.position))throw new Error(`[pp-dev] devPanel.position must be one of: ${A.join(", ")}`);const p=e.server?.allowedHosts;if(!(void 0===p||!0===p||Array.isArray(p)&&p.every(e=>"string"==typeof e&&""!==e.trim())))throw new Error(`[pp-dev] server.allowedHosts must be a list of host names or true, got ${JSON.stringify(p)}`)};
|
|
2
|
+
//# sourceMappingURL=auth.provider-CnmH_J2r.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.provider-CnmH_J2r.js","sources":["../../../src/constants.ts","../../../src/lib/logger.ts","../../../src/lib/helpers/color.helper.ts","../../../src/lib/output-path.ts","../../../src/lib/pp-dev-config.ts","../../../src/lib/auth.provider.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["afterBundlePath","resolve","__filename","fileURLToPath","document","require","pathToFileURL","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","beforeBundlePath","PP_DEV_PACKAGE_DIR","existsSync","PP_DEV_CLIENT_ENTRY","version","name","JSON","parse","readFileSync","toString","VERSION","PACKAGE_NAME","DEFAULT_LEVEL","current","shared","active","level","logger","createViteLogger","createLogger","undefined","info","msg","options","warn","warnOnce","error","clearScreen","type","hasErrorLogged","hasWarned","value","colors","createColors","normalizeRelativeOutputPath","relativePath","optionName","includes","path","posix","isAbsolute","win32","root","Error","normalized","normalize","replace","startsWith","createDefaultZipFileName","appName","DEV_PANEL_POSITIONS","MAX_TIMER_DELAY_MS","AuthProvider","state","isAuthenticated","isRedirected","lastChecked","listeners","Set","getState","this","setAuthenticated","authenticated","Date","now","notifyListeners","setRedirected","redirected","updateState","updates","reset","subscribe","listener","add","delete","forEach","stack","message","String","authProvider","config","templateName","mi","app","proxy","build","sync","inspector","devPanel","users","server","miMode","mode","appType","apiVersion","miHudLess","integrateMiTopBar","include","addSharedComponentsScripts","addRootElement","templateLess","resolvedName","defaultVersionFileTemplate","distZip","zipCfg","zip","versionPlugin","outFileName","outDir","fileName","inDir","vfCfg","versionFile","imageOptimizer","versionFileTemplate","enabled","fileNameTemplate","imgCfg","imageOptimisations","backendBaseURL","url","process","env","MI_BACKEND_URL","appId","id","enableProxyCache","cache","proxyCacheTTL","cacheTtl","disableSSLValidation","tls","allowSelfSigned","syncBackupsDir","backupsDir","syncMaxBackups","maxBackups","syncBuildTimeoutMs","buildTimeoutMs","v7Features","personalAccessToken","token","MI_ACCESS_TOKEN","inspectorEnabled","inspectorMaxMemory","maxMemory","inspectorCaptureLimit","captureLimit","devPanelPosition","position","devPanelHidden","hidden","devPanelAutoHide","autoHide","persistUsers","persist","allowedHosts","map","host","trim","toLowerCase","directory","safeRelativePath","resolvedDirectory","resolvedFile","split","relativeToDirectory","relative","sep","miUrl","Number","isInteger","stringify","console","join","Array","isArray","every"],"mappings":"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"}
|
package/dist/cjs/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("cac"),t=require("./auth.provider-CejYwjcG.js"),o=require("path"),n=require("node:perf_hooks"),i=require("vite"),r=require("./request-capture.middleware-C99WIh5-.js"),s=require("chokidar"),a=require("./index-Cev20Ede.js"),l=require("fs"),c=require("node:events"),d=require("url"),p=require("ws"),f=require("dir-compare"),u=require("diff-match-patch"),g=require("isbinaryfile"),h=require("os"),m=require("crypto"),v=require("./version-manifest-DjLJQWWa.js");require("picocolors"),require("node:path"),require("zlib"),require("axios"),require("node:http"),require("node:https"),require("http-proxy-middleware"),require("node:string_decoder"),require("process"),require("jszip"),require("child_process"),require("module"),require("node:crypto"),require("node:fs"),require("node:os"),require("express"),require("node:module"),require("./helpers.js"),require("ejs"),require("fs/promises"),require("util");const b=e=>e&&"object"==typeof e&&"default"in e?e.default:e;function w(e){if(e&&"object"==typeof e&&"default"in e)return e;const t=Object.create(null);if(e)for(const o in e)t[o]=e[o];return t.default=e,Object.freeze(t)}const y=w(o),P=w(l),x=w(f),S=b(u),L=w(h),E=w(m);function T(e){return null!=e&&!1!==e}let k=null;const D=new WeakMap;function F(e,o){if(!e.httpServer||!process.stdin.isTTY||process.env.CI)return;D.set(e,o);const n=t.createLogger();o.print&&n.info(t.colors.dim(t.colors.green(" ➜"))+t.colors.dim(" press ")+t.colors.bold("h")+t.colors.dim(" to show help"));const i=(o.customShortcuts??[]).filter(T).concat(I);k?.(),k=null;let r=!1;const s=process.stdin.isPaused(),a=process.stdin,l=Boolean(a.isRaw),c=async o=>{if(""===o)return void function(e=process){"win32"===e.platform?e.emit("SIGINT","SIGINT"):e.kill(e.pid,"SIGINT")}();if(""===o)return void await e.close().finally(()=>process.exit(0));if(r)return;"h"===o&&n.info(["",t.colors.bold(" Shortcuts"),...i.map(e=>t.colors.dim(" press ")+t.colors.bold(e.key)+t.colors.dim(` to ${e.description}`))].join("\n"));const s=i.find(e=>e.key===o);s&&(r=!0,await s.action(e),r=!1)};process.stdin.setRawMode(!0),process.stdin.on("data",c).setEncoding("utf8").resume();const d=e.httpServer,p=()=>{k===p&&(d.removeListener("close",p),process.stdin.off("data",c),l||process.stdin.setRawMode(!1),s&&process.stdin.pause(),k=null)};k=p,d.on("close",p)}const I=[{key:"r",description:"restart the server",async action(e){const t=D.get(e);await e.restart(),t&&F(e,{...t,print:!1})}},{key:"u",description:"show server url",action(e){e.config.logger.info(""),e.printUrls()}},{key:"o",description:"open in browser",action(e){e.openBrowser()}},{key:"c",description:"clear console",action(e){e.config.logger.clearScreen("error")}},{key:"q",description:"quit",async action(e){await e.close().finally(()=>process.exit())}},{key:"C",description:"clear proxy cache",action(e){e.cache&&(e.cache.clear(),e.config.logger.info("Proxy cache cleared"))}}];function _(e){return e instanceof Error?e.stack??e.message:String(e)}function j({logger:e,knownRejections:o=[],shutdown:n,shutdownTimeoutMs:i=5e3,processRef:r=process}){let s=!1,a=0;const l=async(o,l)=>{if((e=>{a=Math.max(a,e)})(l),s)return void("SIGINT"!==o&&"SIGTERM"!==o&&"SIGHUP"!==o||(e.warn(t.colors.yellow(`\n⚠️ Received ${o} again, exiting without waiting for the shutdown`)),r.exit(a)));s=!0,e.info(t.colors.yellow(`\n🛑 Received ${o}, shutting down gracefully...`));const c=setTimeout(()=>{e.error(t.colors.red(`⏰ Shutdown did not finish within ${i} ms, forcing exit`)),r.exit(1)},i);try{await n(),clearTimeout(c),e.info(t.colors.green("✅ Graceful shutdown completed")),r.exit(a)}catch(o){clearTimeout(c),e.error(t.colors.red(`❌ Error during graceful shutdown: ${_(o)}`)),r.exit(1)}},c=()=>{l("SIGINT",0)},d=()=>{l("SIGTERM",0)},p=()=>{l("SIGHUP",0)},f=o=>{e.error(t.colors.red(`❌ Uncaught exception: ${_(o)}`)),l("uncaughtException",1)},u=n=>{const i=o.find(e=>e.matches(n));i?e.info(t.colors.dim(i.message)):e.error(t.colors.red(`❌ Unhandled promise rejection (the server keeps running): ${_(n)}`))};return r.on("SIGINT",c),r.on("SIGTERM",d),r.on("SIGHUP",p),r.on("uncaughtException",f),r.on("unhandledRejection",u),()=>{r.off("SIGINT",c),r.off("SIGTERM",d),r.off("SIGHUP",p),r.off("uncaughtException",f),r.off("unhandledRejection",u)}}const N=["--","c","config","base","l","logLevel","clearScreen","configLoader","profile","d","debug","f","filter","m","mode","force","w","changelog","distZip","distZipDir","distZipFilename","versionManifest","versionFileTemplate","webpack","turbopack"];function $(e){const t={...e};for(const e of N)delete t[e];return"sourcemap"in t&&(t.sourcemap="true"===t.sourcemap||"false"!==t.sourcemap&&t.sourcemap),"watch"in t&&(t.watch=t.watch?{}:void 0),t}const A=["https","open","cors","strictPort","force"];function C(e,o,n){const i=[...t.PP_DEV_CONFIG_NAMES,"package.json","next.config.js","next.config.mjs","next.config.ts","vite.config.js","vite.config.mjs","vite.config.ts",".env",".env.local",".env.development",".env.development.local"].map(t=>y.join(e,t)),r=s.watch(i,{ignored:e=>{const t=y.basename(e);return/(^|[\/\\])\../.test(e)&&!t.startsWith(".env")&&!t.startsWith(".pp-dev")&&!t.startsWith(".pp-watch")},persistent:!0,ignoreInitial:!0,followSymlinks:!1});let a=null;return r.on("change",i=>{n(t.colors.blue(`🔧 Config file changed: ${y.relative(e,i)}`)),a&&clearTimeout(a),a=setTimeout(async()=>{try{n(t.colors.yellow("🔄 Restarting dev server due to config change...")),await o()}catch(e){n(t.colors.red(`❌ Failed to restart dev server: ${e?.message}. Stack: ${e?.stack}`))}},500)}),r.on("error",e=>{n(t.colors.red(`❌ Config watcher error: ${e}`))}),{watcher:r}}function R(e){e.watcher&&e.watcher.close()}function M(e){if(!e||"object"!=typeof e||!("message"in e))return!1;const t=String(e.message);return/Turbopack is not supported/i.test(t)||/native bindings are not available/i.test(t)||/Only WebAssembly \(WASM\) bindings were loaded/i.test(t)}const q=e=>{for(const[t,o]of Object.entries(e))Array.isArray(o)&&(e[t]=o[o.length-1])};async function V(e){const{root:t,mode:o,command:n}=e,r=y.resolve(process.cwd(),t??".");a.loadPPDevEnv(o,r);const s=await i.loadConfigFromFile({mode:o,command:n},e.configFile,t,e.logLevel);let l=await a.getViteConfig(e.buildOverrides,{mode:o,root:r});if(s){const e={...s.config};delete e.plugins,l=i.mergeConfig(l,e)}return{config:l,envDir:r}}let O=global.__pp_dev_profile_session,H=0;const U=e=>{if(O)return new Promise((o,n)=>{O.post("Profiler.stop",(i,{profile:r})=>{if(i)n(i);else{const n=y.resolve(`./pp-dev-profile-${H++}.cpuprofile`);P.writeFileSync(n,JSON.stringify(r)),e(t.colors.yellow(`CPU profile written to ${t.colors.white(t.colors.dim(n))}`)),O=void 0,o()}})})};class z{wss;eventListeners=new Map;lifecycleListeners=new Map;clients=new Map;ws;constructor(){this.wss=new p.WebSocketServer({noServer:!0}),this.wss.on("connection",e=>this.onConnection(e)),this.wss.on("error",e=>this.fireLifecycle("error",e)),this.ws={on:(e,t)=>{"close"!==e&&"error"!==e?this.getEventSet(e).add(t):this.getLifecycleSet(e).add(t)},off:(e,t)=>{this.eventListeners.get(e)?.delete(t),"close"!==e&&"error"!==e||this.lifecycleListeners.get(e)?.delete(t)},send:(e,t)=>{if("string"==typeof e)for(const o of this.clients.keys())this.sendToSocket(o,e,t);else{const t=JSON.stringify(e);for(const e of this.clients.keys())e.readyState===p.WebSocket.OPEN&&e.send(t)}}}}handleUpgrade(e,t,o){if((e.url??"").split("?")[0]!==r.PP_DEV_HMR_WS_PATH)return!1;return r.crossOriginReason(e)?(t.once("error",()=>t.destroy()),t.end("HTTP/1.1 403 Forbidden\r\nConnection: close\r\nContent-Length: 0\r\n\r\n",()=>t.destroy()),!0):(this.wss.handleUpgrade(e,t,o,t=>{this.wss.emit("connection",t,e)}),!0)}async close(){this.fireLifecycle("close");for(const e of this.clients.keys())e.terminate();this.clients.clear(),await new Promise(e=>this.wss.close(()=>e()))}onConnection(e){const t={send:(t,o)=>this.sendToSocket(e,t,o),socket:e};this.clients.set(e,t),e.on("message",e=>this.onMessage(t,e)),e.on("close",()=>this.clients.delete(e)),e.on("error",()=>{})}onMessage(e,o){let n;try{n=JSON.parse(o.toString())}catch{return}if(!n||"custom"!==n.type||"string"!=typeof n.event)return;const i=this.eventListeners.get(n.event);if(i)for(const o of i)try{o(n.data,e)}catch(e){t.createLogger().error(`ws handler for "${n.event}" failed`,{error:e instanceof Error?e:new Error(String(e))})}}sendToSocket(e,t,o){e.readyState===p.WebSocket.OPEN&&e.send(JSON.stringify({type:"custom",event:t,data:o}))}fireLifecycle(e,t){for(const o of this.lifecycleListeners.get(e)??[])try{o(t)}catch{}}getEventSet(e){let t=this.eventListeners.get(e);return t||(t=new Set,this.eventListeners.set(e,t)),t}getLifecycleSet(e){let t=this.lifecycleListeners.get(e);return t||(t=new Set,this.lifecycleListeners.set(e,t)),t}}const B={matches:e=>e instanceof Error&&"Worker creator already registered"===e.message,message:"Next.js kept its Turbopack worker pool from before the restart ('Worker creator already registered')"};const W=/(.+)(-[a-f0-9]{6,20})(\.[a-z0-9]+)$/i;class Z{oldAssetsPath;newAssetsPath;destinationPath;changelogFilename;changelogTemplate='<!DOCTYPE html>\n <html lang="en">\n <head>\n <meta charset="UTF-8" />\n <title>Changelog Diff</title>\n <style>\n tr,\n td {\n padding: 0;\n }\n .diff-file {\n margin-top: 20px;\n border: 1px solid #e1e4e8;\n border-radius: 6px;\n }\n .diff-file-title {\n padding: 10px 20px;\n background-color: #f6f8fa;\n border-bottom: 1px solid #e1e4e8;\n border-radius: 6px 6px 0 0;\n font-weight: bold;\n }\n .diff-file-title .renamed {\n font-weight: normal;\n }\n .diff-file-title .renamed .from {\n color: #cb2431;\n }\n .diff-file-title .renamed .to {\n color: #22863a;\n }\n .diff-file-title .added {\n color: #22863a;\n }\n .diff-file-title .deleted {\n color: #cb2431;\n }\n .diff-file-content {\n }\n .diff-table {\n tab-size: 8;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n }\n .blob-num {\n position: relative;\n color: #1f2328;\n width: 1%;\n min-width: 50px;\n padding: 0 10px;\n font-family:\n ui-monospace,\n SFMono-Regular,\n SF Mono,\n Menlo,\n Consolas,\n Liberation Mono,\n monospace;\n font-size: 12px;\n line-height: 20px;\n text-align: right;\n white-space: nowrap;\n vertical-align: top;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n }\n .blob-num.addition {\n background-color: #ccffd8;\n border-color: #1f883e;\n }\n .blob-num.deletion {\n background-color: #ffd7d5;\n border-color: #cf222e;\n }\n .blob-num::before {\n content: attr(data-line-number);\n }\n .blob-code {\n position: relative;\n padding: 0 10px 0 22px;\n vertical-align: top;\n color: #1f2329;\n }\n .blob-code.code-addition {\n background-color: #e6ffec;\n }\n .blob-code.code-deletion {\n background-color: #ffebe9;\n }\n .blob-code.skip,\n .blob-code.message {\n text-align: center;\n }\n .blob-code.skip .blob-code-inner,\n .blob-code.message .blob-code-inner {\n font-weight: bold;\n color: #6a737d;\n padding: 10px 0;\n }\n .blob-code-inner {\n display: table-cell;\n overflow: visible;\n font-family:\n ui-monospace,\n SFMono-Regular,\n SF Mono,\n Menlo,\n Consolas,\n Liberation Mono,\n monospace;\n font-size: 12px;\n word-wrap: anywhere;\n white-space: pre-wrap;\n }\n .blob-code-inner::before {\n content: attr(data-code-prefix);\n position: absolute;\n top: 1px;\n left: 8px;\n padding-right: 8px;\n }\n </style>\n </head>\n <body>\n <h1>Changelog Diff</h1>\n\n %FILES%\n </body>\n </html>';diffFileTemplateHandler;diffLineTemplateHandler;contextLines=3;logger;constructor(e){const{oldAssetsPath:o,newAssetsPath:n,destinationPath:i,changelogTemplate:r,diffFileTemplateHandler:s,diffLineTemplateHandler:a,changelogFilename:l,contextLines:c}=e;if(this.logger=t.createLogger(),!o||!n||!i)throw new Error("Previous assets path, current assets path and destination path are required");if(o===n)throw new Error("Previous and current assets paths must be different");if(!this.isExists(o))throw new Error(`Previous assets path ${o} does not exist`);if(!this.isExists(n))throw new Error(`Current assets path ${n} does not exist`);if(this.isZipFile(o)){const e=y.resolve(L.tmpdir(),E.createHash("md5").update(o).digest("hex"));this.oldAssetsPath=this.unzipFile(o,e).then(()=>this.normalizeAssetFolderPath(e)).then(e=>{if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);return e})}else{if(!this.isFolder(o))throw new Error(`Invalid previous assets path ${o}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(o);if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);this.oldAssetsPath=Promise.resolve(e)}}if(this.isZipFile(n)){const e=y.resolve(L.tmpdir(),E.createHash("md5").update(n).digest("hex"));this.newAssetsPath=this.unzipFile(n,e).then(()=>this.normalizeAssetFolderPath(e)).then(e=>{if(this.isEmptyFolder(e))throw new Error(`Current assets path ${e} is empty`);return e})}else{if(!this.isFolder(n))throw new Error(`Invalid current assets path ${n}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(n);if(this.isEmptyFolder(e))throw new Error(`Current assets path ${n} is empty`);this.newAssetsPath=Promise.resolve(e)}}this.destinationPath=i,this.mkdirpSync(this.destinationPath),this.changelogFilename=l||"CHANGELOG.html",r&&(this.templateIsValid(r)?this.changelogTemplate=r:this.logger.warn(t.colors.yellow("Invalid changelog template, using default"))),"function"==typeof s&&(this.diffFileTemplateHandler=s),"function"==typeof a&&(this.diffLineTemplateHandler=a),c&&(this.contextLines=c)}templateIsValid(e){return e.includes("%FILES%")}isExists(e){return P.existsSync(e)}isZipFile(e){return e.endsWith(".zip")}isFolder(e){return P.lstatSync(e).isDirectory()}isEmptyFolder(e){return 0===P.readdirSync(e,{withFileTypes:!0}).length}mkdirpSync(e){P.existsSync(e)||P.mkdirSync(e,{recursive:!0})}async unzipFile(e,t){P.rmSync(t,{force:!0,recursive:!0}),await r.extractZipSafe(e,t)}normalizeAssetFolderPath(e){const t=P.readdirSync(e);return 1===t.length&&P.lstatSync(y.join(e,t[0])).isDirectory()?this.normalizeAssetFolderPath(y.join(e,t[0])):e}pathToPosix(e){return e.replace(/\\/g,"/")}diffTableTemplate(e){return`<table class="diff-table">\n <tbody>\n ${e}\n </tbody>\n </table>`}getDiffTableHTML(e){const t=e.filter((e,t,o)=>0!==e.lineType||(t>=0&&t<this.contextLines||t>o.length-(this.contextLines+1)&&t<=o.length-1||o.slice(t-this.contextLines,t+this.contextLines+1).some(e=>0!==e.lineType))).map((e,t,o)=>{if(t>0){const n=o[t-1];if(e.lineNumber-n.lineNumber>1)return[{lineNumber:-1,lineContent:"",lineType:0},e]}return[e]}).flat().map(e=>this.diffLineHTML(e)).join("");return this.diffTableTemplate(t)}diffLineMessageTemplate(e){return`<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code message">\n <span class="blob-code-inner">${e}</span>\n </td>\n </tr>`}diffLineSkipTemplate(){return'<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code skip">\n <span class="blob-code-inner">Skip</span>\n </td>\n </tr>'}diffLineTemplate(e){const{lineNumber:t,lineContent:o,lineType:n}=e,i=1===n?"addition":-1===n?"deletion":"";return`<tr>\n <td\n class="blob-num ${i}${"addition"===i?" empty":""}"\n ${"addition"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td\n class="blob-num ${i}${"deletion"===i?" empty":""}"\n ${"deletion"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td class="blob-code ${1===n?"code-addition":-1===n?"code-deletion":""}">\n <span class="blob-code-inner" data-code-prefix="${1===n?"+":-1===n?"-":" "}">${r=o??"",r.replace(/[\u00A0-\u9999<>&]/g,e=>"&#"+e.charCodeAt(0)+";")}</span>\n </td>\n </tr>`;var r}diffLineHTML(e){if(this.diffLineTemplateHandler)return this.diffLineTemplateHandler(e);const{lineNumber:t}=e;return-1===t?this.diffLineSkipTemplate():this.diffLineTemplate(e)}diffFileTemplate(e,t){return this.diffFileTemplateHandler?this.diffFileTemplateHandler(e,t):`<div class="diff-file">\n <div class="diff-file-title">${e}</div>\n <div class="diff-file-content">${t}</div>\n </div>`}async generateAssetFoldersDiff(){this.logger.info(t.colors.blue(`Comparing asset folders ${await this.oldAssetsPath} and ${await this.newAssetsPath}`));const e=await x.compare(await this.oldAssetsPath,await this.newAssetsPath,{compareContent:!0,skipSymlinks:!0,compareSize:!0,compareDate:!1,compareNameHandler:(e,t)=>(W.test(e)&&(e=e.replace(W,"$1$3")),W.test(t)&&(t=t.replace(W,"$1$3")),0===e.localeCompare(t)?0:e.localeCompare(t)>0?1:-1)});return e.diffSet?.filter(e=>"equal"!==e.state||e.name1!==e.name2)||[]}async generateAssetFilesDiff(e,t){const o=new S,n=o.diff_linesToChars_(e,t),i=o.diff_main(n.chars1,n.chars2,!1);o.diff_charsToLines_(i,n.lineArray);let r=0;return i.map(e=>{const[t,o]=e,n=o.endsWith("\n")?o.split("\n").length-1:o.split("\n").length,i=o.split("\n").map((e,o)=>({lineContent:e,lineNumber:r+o+1,lineType:t})).slice(0,n);return-1!==t&&(r+=n),i}).flat()}async generateFilesDiff(e){if("equal"===e.state){const t=this.pathToPosix(y.join(".",e.relativePath,e.name1??"")),o=this.pathToPosix(y.join(".",e.relativePath,e.name2??""));return this.diffFileTemplate(`<span class="renamed"\n >Renamed <span class="from">${t}</span> -> <span class="to">${o}</span></span\n >`,this.diffTableTemplate(this.diffLineMessageTemplate("No changes")))}const t=e.path1&&e.name1?y.join(e.path1,e.name1):null,o=e.path2&&e.name2?y.join(e.path2,e.name2):null,n=this.pathToPosix(y.join(".",e.relativePath,(e.name1||e.name2)??""));if("left"===e.state&&t)return this.diffFileTemplate(`<span class="removed">Removed ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File removed")));if("right"===e.state&&o)return this.diffFileTemplate(`<span class="added">Added ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File added")));if("distinct"===e.state&&t&&o){const i=this.pathToPosix(y.join(".",e.relativePath,e.name1??"")),r=this.pathToPosix(y.join(".",e.relativePath,e.name2??"")),s=e.name1!==e.name2?`<span class="renamed"\n >Renamed <span class="from">${i}</span> -> <span class="to">${r}</span></span\n >`:n;return this.diffFileTemplate(s,await g.isBinaryFile(t)||await g.isBinaryFile(o)?this.diffTableTemplate(this.diffLineMessageTemplate("Binary file")):this.getDiffTableHTML(await this.generateAssetFilesDiff(P.readFileSync(t,"utf-8"),P.readFileSync(o,"utf-8"))))}return""}async generateChangelog(){this.logger.info(t.colors.green("Generating changelog"));const e=await this.generateAssetFoldersDiff(),o=(await Promise.all(e.map(e=>this.generateFilesDiff(e)))).join("");this.logger.info(t.colors.green("Writing changelog file"));const n=this.changelogTemplate.split("%FILES%");n.splice(1,0,o);const i=n.join("");P.writeFileSync(y.join(this.destinationPath,this.changelogFilename),i),this.logger.info(t.colors.green(`Changelog file written to ${y.join(this.destinationPath,this.changelogFilename)}`))}}async function G(e){const{changelog:o,executionRoot:n,newAssetsPath:i,backupsDirPath:r,changelogDestinationPath:s,logLevel:a}=e;let l;if("string"==typeof o)l=y.resolve(n,o);else{if(!P.existsSync(r))return void t.createLogger(a).warn(t.colors.yellow("backups directory not found, skipping changelog generation"));const e=P.readdirSync(r,{withFileTypes:!0});if(!e.length)return void t.createLogger(a).warn(t.colors.yellow("no backups found, skipping changelog generation"));const o=e.filter(e=>e.isFile()&&e.name.endsWith(".zip"));if(!o.length)return void t.createLogger(a).warn(t.colors.yellow("no ZIP backups found, skipping changelog generation"));const n=o.reduce((e,t)=>P.statSync(y.resolve(r,e.name)).mtimeMs>P.statSync(y.resolve(r,t.name)).mtimeMs?e:t).name;l=y.resolve(r,n)}const c=new Z({oldAssetsPath:l,newAssetsPath:i,destinationPath:s});await c.generateChangelog()}class X{sourceDir;outputDir;fontName;constructor(e){this.sourceDir=e.sourceDir,this.outputDir=e.outputDir,this.fontName=e.fontName}async generate(){const{default:e}=await(import("svgtofont"));await e({src:this.sourceDir,dist:this.outputDir,fontName:this.fontName,css:!0,typescript:!0,startUnicode:59905,svgicons2svgfont:{fontHeight:1024}})}}const J=e.cac("pp-dev");J.option("-c, --config <file>","[string] use specified config file").option("--base <path>","[string] public base path (default: /)").option("-l, --logLevel <level>","[string] info | warn | error | silent").option("--clearScreen","[boolean] allow/disable clear screen when logging").option("-d, --debug [feat]","[string | boolean] show debug logs").option("-f, --filter <filter>","[string] filter debug logs").option("-m, --mode <mode>","[string] set env mode"),function(e){e.command("[root]","start dev server").alias("serve").alias("dev").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--cors","[boolean] enable CORS").option("--strictPort","[boolean] exit if specified port is already in use").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action(async(e,o)=>{q(o);let s=null,a=null,l=!1;const c=e?y.resolve(process.cwd(),e):process.cwd(),d=t.createLogger(o.logLevel),p=async()=>{if(!l){l=!0;try{s&&(d.info(t.colors.yellow("🛑 Stopping existing dev server...")),await s.close(),s=null);const{clearConfigCache:u,getConfig:g}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config);u();const{createServer:h}=await(import("vite")),m=o.mode||"development",{config:v,envDir:b}=await V({root:e,mode:m,command:"serve",configFile:o.config,logLevel:o.logLevel});if(s=await h(i.mergeConfig(v,{root:e,base:o.base,mode:o.mode,configFile:o.config,logLevel:o.logLevel,clearScreen:o.clearScreen,optimizeDeps:{force:o.force},server:$(o),customLogger:d},!0)),!s.config.base||"/"===s.config.base)throw new Error('base cannot be equal to "/" or empty string');if(!s.httpServer)throw new Error("HTTP server not available");await s.listen();const w=global.__pp_dev_start_time??!1,y=w?t.colors.dim(`ready in ${t.colors.reset(t.colors.bold(Math.ceil(n.performance.now()-w)))} ms`):"";d.info(`\n ${t.colors.green(`${t.colors.bold("PP-DEV")} v${t.VERSION}`)} ${y}\n`),s.printUrls();const P=await g(b);if(!1!==P.inspector?.enabled){const e=s.resolvedUrls?.local[0],o=e?new URL(e).origin:`http://localhost:${s.config.server.port??5173}`;d.info(`\n ${t.colors.cyan("🔍 Request Inspector")} ${t.colors.dim(o+r.INSPECTOR_PATH)}\n`)}F(s,{print:!0,customShortcuts:[...(f=d.info,O?[{key:"p",description:"start/stop the profiler",async action(){if(O)await U(f);else{const e=await import("node:inspector").then(e=>e.default);await new Promise(t=>{O=new e.Session,O.connect(),O.post("Profiler.enable",()=>{O?.post("Profiler.start",()=>{f("Profiler started"),t()})})})}}}]:[]),{key:"l",description:"proxy re-login",action(e){e.ws.send({type:"custom",event:"redirect",data:{url:`/auth/index/logout?proxyRedirect=${encodeURIComponent("/")}`}})}}]}),a||(a=C(c,p,d.info),d.info(t.colors.blue("🔧 Config file watcher started"))),l=!1}catch(e){l=!1,d.error(t.colors.red(`error when starting dev server:\n${e.stack}`),{error:e}),U(d.info),process.exit(1)}var f}};j({logger:d,shutdown:async()=>{a&&(R(a),a=null),s&&(await s.close(),s=null),U(d.info)}}),await p()})}(J),function(e){e.command("next [root]","start Next.js development server with pp-dev integration").alias("next-serve").alias("next-dev").option("--host [host]","[string] specify hostname; without a value, listen on all addresses").option("--port <port>","[number] specify port",{default:3e3}).option("--https","[boolean] no effect with pp-dev next (deprecated)").option("--open [path]","[boolean | string] no effect with pp-dev next (deprecated)").option("--cors","[boolean] no effect with pp-dev next (deprecated)").option("--strictPort","[boolean] no effect with pp-dev next (deprecated)").option("--force","[boolean] no effect with pp-dev next (deprecated)").option("--webpack","[boolean] use Webpack for Next dev (use when Turbopack/native SWC is unavailable)").option("--turbopack","[boolean] use Turbopack for Next dev when native bindings work").action(async(e,o)=>{q(o);const n=A.filter(e=>void 0!==o[e]);n.length>0&&t.createLogger(o.logLevel).warn(t.colors.yellow(`⚠️ ${n.map(e=>`--${e}`).join(", ")} ${1===n.length?"has":"have"} no effect with pp-dev next and will be removed.`));const{host:i,port:s}=function(e,t){let o="localhost";!0===e||""===e?o="0.0.0.0":"string"==typeof e?o=e:"number"==typeof e&&(o=String(e));const n="number"==typeof t?t:"string"==typeof t?Number.parseInt(t,10):NaN;return{host:o,port:Number.isInteger(n)&&n>=0?n:3e3}}(o.host,o.port);let l=null,p=null,f=null,u=null,g=null,h=!1;const m=new Set,v=t.createLogger(o.logLevel),b=function(e=["uncaughtException"],t=process){const o=e=>t.listeners(e);let n=null,i=null;return{beforeCreate(){n=new Map(e.map(e=>[e,new Set(o(e))]))},afterCreate(){if(!n)return 0;const r=n,s=new Map(e.map(e=>[e,o(e).filter(t=>!r.get(e).has(t))]));let a=0;if(i)for(const[e,o]of i){const n=new Set(s.get(e).map(e=>e.toString()));for(const i of o)n.has(i.toString())&&(t.off(e,i),a+=1)}return i=s,n=null,a}}}(),w=async()=>{l&&"function"==typeof l.close&&await l.close(),l=null},x=async()=>{const e=p;if(e){for(const e of m)e.destroy();m.clear(),await new Promise(t=>{e.close(()=>t())}),p===e&&(p=null)}},S=async()=>{if(!h){h=!0;try{const{next:n,constants:L}=await a.safeNextImport(),{PHASE_DEVELOPMENT_SERVER:E}=L;u?.dispose(),u=null,f&&(await f.close(),f=null),p&&(v.info(t.colors.yellow("🛑 Stopping existing Next.js server...")),await x()),await w();const{clearConfigCache:T}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config);T();const{join:k}=await(import("path")),{createServer:D}=await(import("http")),F=await(import("next/dist/server/config.js")),I=F.default.default||F["module.exports"].default||F.default,_=e?k(process.cwd(),e):process.cwd();a.loadPPDevEnv(o.mode||"development",_);const j=await I(E,_);let N=j?.ppDev||{};if(0===Object.keys(N).length)try{const{getConfig:e}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config),o=await e(_);Object.keys(o).length>0?(N=o,v.info(t.colors.blue("🔧 Loaded pp-dev config from standalone config file"))):v.info(t.colors.yellow("⚠️ No pp-dev config found in Next.js config or standalone file, using defaults"))}catch(e){v.warn(t.colors.yellow(`⚠️ Failed to load standalone pp-dev config, using defaults: ${e instanceof Error?e.message:String(e)}`))}else v.info(t.colors.blue("🔧 Loaded pp-dev config from Next.js config"));const{getPkg:$}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config),A=$(_).name;t.validatePPDevConfig(N,A);const R=t.normalizePPDevConfig(N,A),{templateName:q}=R,V=R.backendBaseURL,O=R.templateLess,H=R.v7Features,U=R.disableSSLValidation,B=R.enableProxyCache,W=R.proxyCacheTTL,Z=R.personalAccessToken,G=R.miHudLess,X=R.inspectorEnabled,J=R.inspectorMaxMemory,K=R.inspectorCaptureLimit,Y=R.appId,Q=j?.basePath;let ee="";Q?ee=Q:(ee=O?t.PATH_PAGE_PREFIX:H?t.PATH_TEMPLATE_LOCAL_PREFIX:t.PATH_TEMPLATE_PREFIX,ee+=`/${q}`);const te=function(e){const t="1"===process.env.PP_DEV_NEXT_WEBPACK||"true"===process.env.PP_DEV_NEXT_WEBPACK;if(t&&(e.webpack||e.turbopack))throw new Error("Do not combine PP_DEV_NEXT_WEBPACK with --webpack or --turbopack");if(t)return{webpack:!0};if(e.webpack&&e.turbopack)throw new Error("Use only one of --webpack or --turbopack");return e.webpack?{webpack:!0}:e.turbopack?{turbopack:!0}:{}}(o),oe=async e=>{delete process.env.TURBOPACK,await w();const t={dev:!0,customServer:!0,hostname:i,port:s,dir:_,conf:{...j,basePath:ee,assetPrefix:ee}};e.webpack?t.webpack=!0:e.turbopack&&(t.turbopack=!0),b.beforeCreate(),l=n(t),await l.prepare(),b.afterCreate()};if(te.webpack)await oe({webpack:!0});else if(te.turbopack)try{await oe({turbopack:!0})}catch(e){if(!M(e))throw e;v.warn(t.colors.yellow("⚠ Turbopack is unavailable (native bindings). Falling back to Webpack.")),await oe({webpack:!0})}else try{await oe({})}catch(e){if(!M(e))throw e;v.warn(t.colors.yellow("⚠ Turbopack cannot run (native Next.js bindings unavailable). Falling back to Webpack.")),await oe({webpack:!0})}if(!l)throw new Error("Next.js app failed to initialize");if(ee.endsWith("/")||(ee+="/"),"/"===ee)throw new Error('basePath cannot be equal to "/" or equal to empty string');v.info(t.colors.green("✅ Next.js app prepared successfully")),v.info(t.colors.blue(`🔧 pp-dev plugin configured for template: ${q}`)),v.info(t.colors.blue(`🔧 Base path configured: ${ee}`)),V&&(v.info(t.colors.blue(`🌐 Backend URL: ${V}`)),v.info(t.colors.blue(`🆔 Custom App ID: ${Y}`)));const ne=l.getRequestHandler(),ie=s,re=i;p=D(async(e,t)=>{try{const o=e.url||"/",n=o.split("?")[0];let i=d.parse(o,!0);if(ae.length>0){if(n.startsWith("/_next/")||"/favicon.ico"===n||n.startsWith("/__nextjs_")){if(le.length>0){let l=0;const c=()=>{if(l>=le.length)return void r();const o=le[l];l++,o(e,t,c)};return void c()}return void r()}let s=0;const a=()=>{if(s>=ae.length)return void r();const o=ae[s];s++,o(e,t,a)};return void a()}async function r(){if(n.startsWith(ee))i=d.parse(o,!0);else{if(n===ee.replace(/\/$/,"")){const e=o.replace(n,ee);return t.writeHead(302,{Location:e}),void t.end()}if(n.startsWith("/_next/")||"/favicon.ico"===n||n.startsWith("/__nextjs_"));else if("/"===n)return t.writeHead(302,{Location:ee}),void t.end()}await ne(e,t,i)}r()}catch(p){v.error(`Error handling request: ${p instanceof Error?p.message:String(p)}`,{error:p instanceof Error?p:void 0}),t.statusCode=500,t.end("Internal Server Error")}});let se=null;const ae=[],le=[];if(!1!==X){const e=new r.RequestStore(J);r.registerInspectorRoutes(r.internalServer,e,K);const t=r.createRequestCaptureMiddleware(e,K);ae.push(t)}const ce=(e,t,o)=>{if(e.url?.startsWith("/@api/")||e.url?.startsWith(r.INSPECTOR_PATH)||e.url?.startsWith(r.VARIABLES_EDITOR_PATH)){const o=()=>{};return void r.internalServer(e,t,o)}o()};if(V||!1===X||(le.push(ce),ae.push(ce)),V){const e=new URL(V).host,o=r.createUserHostGuard();le.unshift(o),ae.unshift(o),V.startsWith("https://")&&(c.EventEmitter.defaultMaxListeners=Math.max(c.EventEmitter.defaultMaxListeners,20));const n=r.getMiAPIOptions(V,{appId:Y,templateLess:O,disableSSLValidation:U,v7Features:H,personalAccessToken:Z});se=new r.MiAPI(V,n);const i=r.initPPRedirect(ee,q),s=(e,t,o)=>{i(e,t,o)};le.push(s),ae.push(s);const d=a.createDevPanelAssetMiddleware(ee);if(le.push(d),ae.push(d),B){const e=r.resolveProxyCacheTtl(W),o={devServer:{middlewares:{use:e=>e},config:{logger:console}},ttl:e},n=r.initProxyCache(o),i=(e,t,o)=>{n(e,t,o)};ae.push(i),v.info(t.colors.blue(`🔧 Proxy cache middleware added with TTL: ${e}ms`))}const g=r.getIndexPageRegExp(ee),h=r.initLoadPPData(g,se,Object.assign({base:ee},n,{miHudLess:G})),m=(e,t,o)=>{h(e,t,o)};ae.push(m);const b={middlewares:{use:e=>e},config:{logger:console}},w=r.initProxy({devServer:b,baseURL:V,proxyIgnore:[...r.getProxyIgnore(ee),"/_next","/favicon.ico","/__nextjs_","/installHook.js.map"],disableSSLValidation:U,miAPI:se,templateName:q}),x=(e,t,o)=>{w(e,t,o)};ae.push(x),le.push(ce),ae.push(ce);const S=r.initRewriteResponse(e=>{const t=e.split("?")[0];return t.startsWith(ee)&&!t.includes("/_next/")},(t,o)=>{const n=se.buildPage(t,G),i=a.injectDevPanel(n,ee,{backendBaseURL:V,templateLess:O,appId:Y,devPanelPosition:R.devPanelPosition,devPanelHidden:R.devPanelHidden,devPanelAutoHide:R.devPanelAutoHide});return Buffer.from(r.urlReplacer(e,o.headers.host??"",i))}),E=(e,t,o)=>{S(e,t,o)};ae.push(E),f=new z;let T=j?.distDir;const k=process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR];process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]="1";try{const e=await I(L.PHASE_PRODUCTION_BUILD,_);T=e?.distDir??T}catch{}finally{void 0===k?delete process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]:process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]=k}const D=(T??"").replace(/\\/g,"/").replace(/\/+$/,"").replace(/\/dev$/,""),F=D&&".next"!==D?D:"out";let N,$="0.0.0";try{const e=JSON.parse(P.readFileSync(y.join(_,"package.json"),"utf-8"));$="string"==typeof e.version?e.version:$,N="string"==typeof e.repository?e.repository:e.repository?.url}catch{}const A=new r.DistService(q,{root:_,backupFolder:y.resolve(_,R.syncBackupsDir),maxBackups:R.syncMaxBackups,buildTimeoutMs:R.syncBuildTimeoutMs,nextBuild:{projectRoot:_,distDir:F,packageVersion:$,packageRepositoryUrl:N}}),C={ws:f.ws,config:{clientInjectionPlugin:{v7Features:H}}};u=r.startSyncAndUsers({server:C,internalServer:r.internalServer,distService:A,miAPI:se,persistUsers:R.persistUsers,projectRoot:_,miUrl:V});const M="function"==typeof l?.getUpgradeHandler?l.getUpgradeHandler():null;p.on("upgrade",(e,t,o)=>{f?.handleUpgrade(e,t,o)||(M?M(e,t,o):t.destroy())}),v.info(t.colors.blue(`🔧 ${ae.length} pp-dev middlewares initialized`)),v.info(t.colors.blue(`🔧 ${le.length} essential middlewares for internal routes`)),v.info(t.colors.blue(`🔧 MiAPI initialized for backend: ${V}`)),v.info(t.colors.blue(`🔧 Custom App ID: ${Y}`))}p.listen(ie,re,()=>{v.info(t.colors.green(`✅ pp-dev Next.js server running at http://${re}:${ie}`)),v.info(t.colors.blue(`📱 Next.js app accessible at http://${re}:${ie}${ee}`)),!1!==X&&v.info(t.colors.cyan(`🔍 Request Inspector: http://${re}:${ie}${r.INSPECTOR_PATH}`)),v.info(t.colors.blue("🔧 Base path handling active")),g||(g=C(_,S,v.info),v.info(t.colors.blue("🔧 Config file watcher started"))),p.on("connection",e=>{m.add(e),e.on("close",()=>m.delete(e))})}),h=!1}catch(e){h=!1,v.error(t.colors.red(`❌ Failed to start Next.js server: ${e?.message}. Stack: ${e?.stack}`)),e instanceof Error&&e.message.includes("Next.js is required")&&(v.error(t.colors.red("❌ Next.js Peer Dependency Error:")),v.error(t.colors.red(e.message)),v.error(t.colors.yellow("\n💡 To fix this issue:")),v.error(t.colors.blue(" 1. Install Next.js in your project:")),v.error(t.colors.white(" npm install next@^16")),v.error(t.colors.blue(" 2. Or use yarn:")),v.error(t.colors.white(" yarn add next@^16")),v.error(t.colors.blue(" 3. Or use pnpm:")),v.error(t.colors.white(" pnpm add next@^16")),v.error(t.colors.yellow("\n📖 For more information, see:")),v.error(t.colors.blue(" https://nextjs.org/docs/getting-started"))),process.exit(1)}}};j({logger:v,knownRejections:[B],shutdown:async()=>{g&&(R(g),g=null),u?.dispose(),u=null,f&&(await f.close(),f=null),await x(),await w()}}),await S()})}(J),function(e){e.command("build [root]","build for production").option("--target <target>","[string] transpile target (default: 'modules')").option("--outDir <dir>","[string] output directory (default: dist)").option("--assetsDir <dir>","[string] directory under outDir to place assets in (default: assets)").option("--assetsInlineLimit <number>","[number] static asset base64 inline threshold in bytes (default: 4096)").option("--ssr [entry]","[string] build specified entry for server-side rendering").option("--sourcemap [output]",'[boolean | "inline" | "hidden"] output source maps for build (default: false)').option("--minify [minifier]",'[boolean | "terser" | "esbuild"] enable/disable minification, or specify minifier to use (default: esbuild)').option("--manifest [name]","[boolean | string] emit build manifest json").option("--ssrManifest [name]","[boolean | string] emit ssr manifest json").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle (experimental)").option("--emptyOutDir","[boolean] force empty outDir when it's outside of root").option("-w, --watch","[boolean] rebuilds when modules have changed on disk").option("--changelog [assetsFile]","[boolean | string] generate changelog between assetsFile and current build (default: false)").option("--distZip","[boolean] pack build output into a ZIP archive; use --no-distZip to disable (default: pp-dev config build.zip, or true). Env: PP_DEV_DIST_ZIP").option("--distZipDir <dir>","[string] override the ZIP output directory (default: 'dist-zip'). Env: PP_DEV_DIST_ZIP_DIR").option("--distZipFilename <filename>","[string] override the ZIP output file name (default: '<app-name>.zip'). Env: PP_DEV_DIST_ZIP_FILENAME").option("--versionManifest","[boolean] emit VERSION-*.json + BUILD-MANIFEST.json; use --no-versionManifest to disable (default: pp-dev config build.versionFile, or true). Env: PP_DEV_VERSION_MANIFEST").option("--versionFileTemplate <template>","[string] override the VERSION file name template (default: 'VERSION-v{packageversion}-{currentDate}.json'). Env: PP_DEV_VERSION_FILE_TEMPLATE").action(async(e,o)=>{q(o);const n=$(o),r=a.resolveBuildCliOverrides(o);try{const t=o.mode||"production",{config:s}=await V({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel,buildOverrides:r}),a=i.mergeConfig(s,{root:e,base:o.base,mode:o.mode,configFile:o.config,logLevel:o.logLevel,clearScreen:o.clearScreen,optimizeDeps:{force:o.force},build:n},!0);if(await i.build(a),o.changelog){const t=e||process.cwd(),n=a.build?.outDir||"dist";let i="dist-zip";a.ppDevConfig&&(!1===a.ppDevConfig.distZip?i=n:"object"==typeof a.ppDevConfig.distZip&&"string"==typeof a.ppDevConfig.distZip.outDir&&(i=a.ppDevConfig.distZip.outDir)),await G({changelog:o.changelog,executionRoot:t,newAssetsPath:y.resolve(t,n),backupsDirPath:y.resolve(t,a.ppDevConfig?.syncBackupsDir||"backups"),changelogDestinationPath:y.resolve(t,i),logLevel:o.logLevel})}}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error during build:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(J),function(e){e.command("next-build [root]","build a Next.js app for production (`next build`) and emit VERSION/BUILD-MANIFEST/zip in the same format as `pp-dev build`").option("--changelog [assetsFile]","[boolean | string] generate changelog between assetsFile and current build (default: false)").option("--distZip","[boolean] pack build output into a ZIP archive; use --no-distZip to disable (default: pp-dev config build.zip, or true). Env: PP_DEV_DIST_ZIP").option("--distZipDir <dir>","[string] override the ZIP output directory (default: 'dist-zip'). Env: PP_DEV_DIST_ZIP_DIR").option("--distZipFilename <filename>","[string] override the ZIP output file name (default: '<app-name>.zip'). Env: PP_DEV_DIST_ZIP_FILENAME").option("--versionManifest","[boolean] emit VERSION-*.json + BUILD-MANIFEST.json; use --no-versionManifest to disable (default: pp-dev config build.versionFile, or true). Env: PP_DEV_VERSION_MANIFEST").option("--versionFileTemplate <template>","[string] override the VERSION file name template (default: 'VERSION-v{packageversion}-{currentDate}.json'). Env: PP_DEV_VERSION_FILE_TEMPLATE").action(async(e,o)=>{q(o);const n=t.createLogger(o.logLevel),i=e?y.resolve(process.cwd(),e):process.cwd(),s=a.resolveBuildCliOverrides(o);process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]="1";try{a.loadPPDevEnv(o.mode||"production",i);const{constants:e}=await a.safeNextImport(),l=await(import("next/dist/server/config.js")),c=l.default.default||l["module.exports"].default||l.default,d=await c(e.PHASE_PRODUCTION_BUILD,i);let p=d?.ppDev||{};if(0===Object.keys(p).length){const{getConfig:e}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config);p=await e(i)}const{getPkg:f}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config),u=t.normalizePPDevConfig(p,f(i).name),g=a.applyDistZipOverride(u.distZip,s,t.createDefaultZipFileName(u.templateName)),h=a.applyVersionManifestOverride(u.versionPlugin,s),m=r.removeStaleDevTypes(i,d);m&&n.info(t.colors.dim(`[pp-dev] Removed stale dev route types: ${y.relative(i,m)}`)),n.info(t.colors.cyan("[pp-dev] Running `next build`...")),await r.runNextBuildProcess(i);const b="string"==typeof d?.distDir&&d.distDir?d.distDir:".next",w=".next"===b?"out":b,x=y.resolve(i,w);if(!P.existsSync(x)||!P.statSync(x).isDirectory())throw new Error(`Next.js build output directory not found: ${x}. "next-build" requires "output: 'export'" in next.config (static export).`);const S=JSON.parse(P.readFileSync(y.join(i,"package.json"),"utf-8"));if(!1!==h&&!1!==h.enabled&&(await v.writeBuildVersionManifest({outDir:x,packageVersion:"string"==typeof S.version?S.version:"0.0.0",versionFileTemplate:h.versionFileTemplate,packageRepositoryUrl:"string"==typeof S.repository?S.repository:S.repository?.url,enabled:h.enabled}),n.info(t.colors.green(`✅ VERSION / BUILD-MANIFEST written to ${y.relative(i,x)}`))),!1!==g){const e=y.resolve(i,g.outDir),o=g.inDir?y.resolve(x,g.inDir):x,s=t.resolveOutputFilePath(e,g.outFileName,"ZIP output file name");P.mkdirSync(y.dirname(s),{recursive:!0});const a=await r.zipDirectoryToBuffer(o);P.writeFileSync(s,a),n.info(t.colors.green(`✅ Zip archive written to ${y.relative(i,s)}`))}if(o.changelog){const e=!1!==g?g.outDir:w;await G({changelog:o.changelog,executionRoot:i,newAssetsPath:x,backupsDirPath:y.resolve(i,u.syncBackupsDir),changelogDestinationPath:y.resolve(i,e),logLevel:o.logLevel})}}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error during next-build:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(J),function(e){e.command("changelog [oldAssetPath] [newAssetPath]","generate changelog between two assets files/folders").option("--oldAssetsPath <oldAssetsPath>","[string] path to the old assets zip file or folder").option("--newAssetsPath <newAssetsPath>","[string] path to the new assets zip file or folder").option("--destination <destination>","[string] destination folder for the changelog (default: .)").option("--filename <filename>","[string] filename for the changelog (default: CHANGELOG.html)").action(async(e,o,n)=>{q(n);const{oldAssetsPath:i=e,newAssetsPath:r=o,destination:s=".",filename:a="CHANGELOG.html",logLevel:l}=n,c=process.cwd();i&&r||(t.createLogger(l).error(t.colors.red("error during changelog generation: oldAssetPath and newAssetPath are required")),process.exit(1));const d=y.resolve(c,i),p=y.resolve(c,r),f=y.resolve(c,s),u=new Z({oldAssetsPath:d,newAssetsPath:p,destinationPath:f,changelogFilename:a});await u.generateChangelog()})}(J),function(e){e.command("generate-icon-font [source] [destination]","generate icon font from SVG files").option("--source <source>","[string] path to the source directory with SVG files").option("--destination <destination>","[string] path to the destination directory to save the generated font files").option("--font-name, -n <fontName>","[string] name of the font to generate (default: 'icon-font')").action(async(e,o,n)=>{q(n);const{source:i=e,destination:r=o,fontName:s="icon-font"}=n,a=process.cwd(),l=y.resolve(a,i),c=y.resolve(a,r),d=new X({sourceDir:l,outputDir:c,fontName:s}),p=t.createLogger(n.logLevel);p.info(`Generating icon font from SVG files in ${t.colors.dim(l)}`),await d.generate(),p.info(`Icon font generated and saved to ${t.colors.dim(c)}`)})}(J),function(e){e.command("optimize [root]","pre-bundle dependencies").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action(async(e,o)=>{q(o);try{const t=o.mode||"production",{config:n}=await V({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel}),r=await i.resolveConfig(i.mergeConfig(n,{root:e,base:o.base,configFile:o.config,logLevel:o.logLevel,mode:o.mode}),"serve");await i.optimizeDeps(r,o.force,!0)}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error when optimizing deps:\n${e.stack}`),{error:e}),process.exit(1)}})}(J),function(e){e.command("preview [root]","locally preview production build").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--strictPort","[boolean] exit if specified port is already in use").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--outDir <dir>","[string] output directory (default: dist)").action(async(e,o)=>{q(o);try{const t=o.mode||"production",{config:n}=await V({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel});(await i.preview(i.mergeConfig(n,{root:e,base:o.base,configFile:o.config,logLevel:o.logLevel,mode:o.mode,build:{outDir:o.outDir},preview:{port:o.port,strictPort:o.strictPort,host:o.host,https:o.https,open:o.open}}))).printUrls()}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error when starting preview server:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(J),function(e){e.command("migrate [config]","migrate pp-dev config from 0.x flat format to 1.0 grouped format").option("--dry-run","[boolean] print migrated config without writing any files").option("--format <format>","[string] output format: ts (default), js, json").option("--output <file>","[string] output file path (default: pp-dev.config.ts)").option("--no-backup","[boolean] skip backup of original config file").action(async(e,o)=>{const n=t.createLogger(o.logLevel),{isLegacyFlatConfig:i,isLegacyPPWatchConfig:r,isAlreadyMigrated:s,migrateLegacyFlatConfig:a,migratePPWatchConfig:l,generateConfigFileContent:c,discoverMigrateSource:d,loadPackageJsonMigrateConfig:p}=await Promise.resolve().then(()=>require("./migrate-MxrkBSEh.js")),f=o.format??"ts",u=!1!==o.backup,g=process.cwd(),h=d(g,e);h||(n.warn(t.colors.yellow("No pp-dev or pp-watch config file found in the current directory.")),n.info(t.colors.blue('Supported files: pp-dev.config.{ts,js,cjs,mjs,json}, .pp-watch.config.{ts,js,json}, or a "pp-dev" field in package.json')),process.exit(1));const{sourceFile:m,isWatchConfig:v,isPackageJsonConfig:b}=h;n.info(t.colors.blue(`Found config: ${y.relative(g,m)}`));const{getPkg:w}=await Promise.resolve().then(()=>require("./index-Cev20Ede.js")).then(e=>e.config),x=w();let S,L={};try{if(/\.[cm]?ts$/i.test(m)){const e=await(import("esbuild")),{pathToFileURL:t}=await(import("url")),o=(await e.build({absWorkingDir:g,entryPoints:[m],outfile:"out.js",write:!1,target:"node24",platform:"node",bundle:!0,packages:"external",format:"esm",mainFields:["main"]})).outputFiles[0].text,n=`pp-migrate-tmp-${Date.now()}.mjs`;P.writeFileSync(n,o);try{const e=await(import(t(y.resolve(g,n)).toString()));L=e.default?.default??e.default??e}finally{P.existsSync(n)&&P.unlinkSync(n)}}else if(/\.[cm]?js$/i.test(m)){const{pathToFileURL:e}=await(import("url")),t=await(import(e(y.resolve(g,m)).toString()));L=t.default?.default??t.default??t}else b?L=p(m):m.endsWith(".json")&&(L=JSON.parse(P.readFileSync(m,"utf-8")))}catch(e){n.error(t.colors.red(`Failed to load config file: ${e.message}`)),process.exit(1)}L&&"object"==typeof L||(n.error(t.colors.red("Config file did not export a valid object.")),process.exit(1)),s(L)?(n.info(t.colors.green("Config is already in 1.0 format — nothing to migrate.")),process.exit(0)):v||r(L)?(n.info(t.colors.blue("Detected pp-watch config format → migrating to 1.0")),S=l(L)):i(L)?(n.info(t.colors.blue("Detected 0.x flat config format → migrating to 1.0")),S=a(L,x.name)):(n.warn(t.colors.yellow("Could not detect config format. No known keys found.")),process.exit(1));const E=c(S,f),T=o.output??y.join(g,`pp-dev.config.${f}`);if(o.dryRun&&(n.info(t.colors.green(`\n--- Migrated config (dry-run) → ${y.relative(g,T)} ---\n`)),process.exit(0)),u&&!b&&P.existsSync(m)){const e=`${m}.bak`;P.copyFileSync(m,e),n.info(t.colors.blue(`Backed up original to: ${y.relative(g,e)}`))}P.writeFileSync(T,E,"utf-8"),n.info(t.colors.green(`✅ Migration complete → ${y.relative(g,T)}`)),b?n.info(t.colors.yellow('You can now remove the "pp-dev" field from package.json.')):m!==T&&P.existsSync(m)&&n.info(t.colors.yellow(`You can now delete the old config: ${y.relative(g,m)}`))})}(J),J.help(),J.version(t.VERSION),J.parse(),exports.stopProfiler=U;
|
|
1
|
+
"use strict";const e=require("cac"),t=require("./auth.provider-CnmH_J2r.js"),o=require("path"),n=require("node:perf_hooks"),i=require("vite"),r=require("./request-capture.middleware-BUpxzWDS.js"),s=require("chokidar"),a=require("./index-DFNyrsll.js"),l=require("fs"),c=require("node:events"),d=require("url"),p=require("ws"),f=require("dir-compare"),u=require("diff-match-patch"),g=require("isbinaryfile"),h=require("os"),m=require("crypto"),v=require("./version-manifest-DsHoDq-U.js");require("picocolors"),require("node:path"),require("zlib"),require("axios"),require("node:http"),require("node:https"),require("http-proxy-middleware"),require("node:string_decoder"),require("process"),require("jszip"),require("child_process"),require("module"),require("node:crypto"),require("node:fs"),require("node:os"),require("express"),require("node:net"),require("node:module"),require("./helpers.js"),require("ejs"),require("fs/promises"),require("util");const w=e=>e&&"object"==typeof e&&"default"in e?e.default:e;function b(e){if(e&&"object"==typeof e&&"default"in e)return e;const t=Object.create(null);if(e)for(const o in e)t[o]=e[o];return t.default=e,Object.freeze(t)}const y=b(o),P=b(l),x=b(f),S=w(u),L=b(h),E=b(m);function T(e){return null!=e&&!1!==e}let k=null;const D=new WeakMap;function F(e,o){if(!e.httpServer||!process.stdin.isTTY||process.env.CI)return;D.set(e,o);const n=t.createLogger();o.print&&n.info(t.colors.dim(t.colors.green(" ➜"))+t.colors.dim(" press ")+t.colors.bold("h")+t.colors.dim(" to show help"));const i=(o.customShortcuts??[]).filter(T).concat(I);k?.(),k=null;let r=!1;const s=process.stdin.isPaused(),a=process.stdin,l=Boolean(a.isRaw),c=async o=>{if(""===o)return void function(e=process){"win32"===e.platform?e.emit("SIGINT","SIGINT"):e.kill(e.pid,"SIGINT")}();if(""===o)return void await e.close().finally(()=>process.exit(0));if(r)return;"h"===o&&n.info(["",t.colors.bold(" Shortcuts"),...i.map(e=>t.colors.dim(" press ")+t.colors.bold(e.key)+t.colors.dim(` to ${e.description}`))].join("\n"));const s=i.find(e=>e.key===o);s&&(r=!0,await s.action(e),r=!1)};process.stdin.setRawMode(!0),process.stdin.on("data",c).setEncoding("utf8").resume();const d=e.httpServer,p=()=>{k===p&&(d.removeListener("close",p),process.stdin.off("data",c),l||process.stdin.setRawMode(!1),s&&process.stdin.pause(),k=null)};k=p,d.on("close",p)}const I=[{key:"r",description:"restart the server",async action(e){const t=D.get(e);await e.restart(),t&&F(e,{...t,print:!1})}},{key:"u",description:"show server url",action(e){e.config.logger.info(""),e.printUrls()}},{key:"o",description:"open in browser",action(e){e.openBrowser()}},{key:"c",description:"clear console",action(e){e.config.logger.clearScreen("error")}},{key:"q",description:"quit",async action(e){await e.close().finally(()=>process.exit())}},{key:"C",description:"clear proxy cache",action(e){e.cache&&(e.cache.clear(),e.config.logger.info("Proxy cache cleared"))}}];function _(e){return e instanceof Error?e.stack??e.message:String(e)}function N({logger:e,knownRejections:o=[],shutdown:n,shutdownTimeoutMs:i=5e3,processRef:r=process}){let s=!1,a=0;const l=async(o,l)=>{if((e=>{a=Math.max(a,e)})(l),s)return void("SIGINT"!==o&&"SIGTERM"!==o&&"SIGHUP"!==o||(e.warn(t.colors.yellow(`\n⚠️ Received ${o} again, exiting without waiting for the shutdown`)),r.exit(a)));s=!0,e.info(t.colors.yellow(`\n🛑 Received ${o}, shutting down gracefully...`));const c=setTimeout(()=>{e.error(t.colors.red(`⏰ Shutdown did not finish within ${i} ms, forcing exit`)),r.exit(1)},i);try{await n(),clearTimeout(c),e.info(t.colors.green("✅ Graceful shutdown completed")),r.exit(a)}catch(o){clearTimeout(c),e.error(t.colors.red(`❌ Error during graceful shutdown: ${_(o)}`)),r.exit(1)}},c=()=>{l("SIGINT",0)},d=()=>{l("SIGTERM",0)},p=()=>{l("SIGHUP",0)},f=o=>{e.error(t.colors.red(`❌ Uncaught exception: ${_(o)}`)),l("uncaughtException",1)},u=n=>{const i=o.find(e=>e.matches(n));i?e.info(t.colors.dim(i.message)):e.error(t.colors.red(`❌ Unhandled promise rejection (the server keeps running): ${_(n)}`))};return r.on("SIGINT",c),r.on("SIGTERM",d),r.on("SIGHUP",p),r.on("uncaughtException",f),r.on("unhandledRejection",u),()=>{r.off("SIGINT",c),r.off("SIGTERM",d),r.off("SIGHUP",p),r.off("uncaughtException",f),r.off("unhandledRejection",u)}}const j=["--","c","config","base","l","logLevel","clearScreen","configLoader","profile","d","debug","f","filter","m","mode","force","w","changelog","distZip","distZipDir","distZipFilename","versionManifest","versionFileTemplate","webpack","turbopack"];function $(e){const t={...e};for(const e of j)delete t[e];return"sourcemap"in t&&(t.sourcemap="true"===t.sourcemap||"false"!==t.sourcemap&&t.sourcemap),"watch"in t&&(t.watch=t.watch?{}:void 0),t}const A=["https","open","cors","strictPort","force"];function C(e,o,n){const i=[...t.PP_DEV_CONFIG_NAMES,"package.json","next.config.js","next.config.mjs","next.config.ts","vite.config.js","vite.config.mjs","vite.config.ts",".env",".env.local",".env.development",".env.development.local"].map(t=>y.join(e,t)),r=s.watch(i,{ignored:e=>{const t=y.basename(e);return/(^|[\/\\])\../.test(e)&&!t.startsWith(".env")&&!t.startsWith(".pp-dev")&&!t.startsWith(".pp-watch")},persistent:!0,ignoreInitial:!0,followSymlinks:!1});let a=null;return r.on("change",i=>{n(t.colors.blue(`🔧 Config file changed: ${y.relative(e,i)}`)),a&&clearTimeout(a),a=setTimeout(async()=>{try{n(t.colors.yellow("🔄 Restarting dev server due to config change...")),await o()}catch(e){n(t.colors.red(`❌ Failed to restart dev server: ${e?.message}. Stack: ${e?.stack}`))}},500)}),r.on("error",e=>{n(t.colors.red(`❌ Config watcher error: ${e}`))}),{watcher:r}}function R(e){e.watcher&&e.watcher.close()}function M(e){if(!e||"object"!=typeof e||!("message"in e))return!1;const t=String(e.message);return/Turbopack is not supported/i.test(t)||/native bindings are not available/i.test(t)||/Only WebAssembly \(WASM\) bindings were loaded/i.test(t)}const H=e=>{for(const[t,o]of Object.entries(e))Array.isArray(o)&&(e[t]=o[o.length-1])};async function q(e){const{root:t,mode:o,command:n}=e,r=y.resolve(process.cwd(),t??".");a.loadPPDevEnv(o,r);const s=await i.loadConfigFromFile({mode:o,command:n},e.configFile,t,e.logLevel);let l=await a.getViteConfig(e.buildOverrides,{mode:o,root:r});if(s){const e={...s.config};delete e.plugins,l=i.mergeConfig(l,e)}return{config:l,envDir:r}}let V=global.__pp_dev_profile_session,O=0;const U=e=>{if(V)return new Promise((o,n)=>{V.post("Profiler.stop",(i,{profile:r})=>{if(i)n(i);else{const n=y.resolve(`./pp-dev-profile-${O++}.cpuprofile`);P.writeFileSync(n,JSON.stringify(r)),e(t.colors.yellow(`CPU profile written to ${t.colors.white(t.colors.dim(n))}`)),V=void 0,o()}})})};function z(e){e.once("error",()=>e.destroy()),e.end("HTTP/1.1 403 Forbidden\r\nConnection: close\r\nContent-Length: 0\r\n\r\n",()=>e.destroy())}class B{wss;eventListeners=new Map;lifecycleListeners=new Map;clients=new Map;ws;allowedHosts;constructor({allowedHosts:e=[]}={}){this.allowedHosts=e,this.wss=new p.WebSocketServer({noServer:!0}),this.wss.on("connection",e=>this.onConnection(e)),this.wss.on("error",e=>this.fireLifecycle("error",e)),this.ws={on:(e,t)=>{"close"!==e&&"error"!==e?this.getEventSet(e).add(t):this.getLifecycleSet(e).add(t)},off:(e,t)=>{this.eventListeners.get(e)?.delete(t),"close"!==e&&"error"!==e||this.lifecycleListeners.get(e)?.delete(t)},send:(e,t)=>{if("string"==typeof e)for(const o of this.clients.keys())this.sendToSocket(o,e,t);else{const t=JSON.stringify(e);for(const e of this.clients.keys())e.readyState===p.WebSocket.OPEN&&e.send(t)}}}}handleUpgrade(e,t,o){return(e.url??"").split("?")[0]===r.PP_DEV_HMR_WS_PATH&&(r.crossOriginReason(e,this.allowedHosts)?(z(t),!0):(this.wss.handleUpgrade(e,t,o,t=>{this.wss.emit("connection",t,e)}),!0))}async close(){this.fireLifecycle("close");for(const e of this.clients.keys())e.terminate();this.clients.clear(),await new Promise(e=>this.wss.close(()=>e()))}onConnection(e){const t={send:(t,o)=>this.sendToSocket(e,t,o),socket:e};this.clients.set(e,t),e.on("message",e=>this.onMessage(t,e)),e.on("close",()=>this.clients.delete(e)),e.on("error",()=>{})}onMessage(e,o){let n;try{n=JSON.parse(o.toString())}catch{return}if(!n||"custom"!==n.type||"string"!=typeof n.event)return;const i=this.eventListeners.get(n.event);if(i)for(const o of i)try{o(n.data,e)}catch(e){t.createLogger().error(`ws handler for "${n.event}" failed`,{error:e instanceof Error?e:new Error(String(e))})}}sendToSocket(e,t,o){e.readyState===p.WebSocket.OPEN&&e.send(JSON.stringify({type:"custom",event:t,data:o}))}fireLifecycle(e,t){for(const o of this.lifecycleListeners.get(e)??[])try{o(t)}catch{}}getEventSet(e){let t=this.eventListeners.get(e);return t||(t=new Set,this.eventListeners.set(e,t)),t}getLifecycleSet(e){let t=this.lifecycleListeners.get(e);return t||(t=new Set,this.lifecycleListeners.set(e,t)),t}}const W={matches:e=>e instanceof Error&&"Worker creator already registered"===e.message,message:"Next.js kept its Turbopack worker pool from before the restart ('Worker creator already registered')"};const Z=/(.+)(-[a-f0-9]{6,20})(\.[a-z0-9]+)$/i;class G{oldAssetsPath;newAssetsPath;destinationPath;changelogFilename;changelogTemplate='<!DOCTYPE html>\n <html lang="en">\n <head>\n <meta charset="UTF-8" />\n <title>Changelog Diff</title>\n <style>\n tr,\n td {\n padding: 0;\n }\n .diff-file {\n margin-top: 20px;\n border: 1px solid #e1e4e8;\n border-radius: 6px;\n }\n .diff-file-title {\n padding: 10px 20px;\n background-color: #f6f8fa;\n border-bottom: 1px solid #e1e4e8;\n border-radius: 6px 6px 0 0;\n font-weight: bold;\n }\n .diff-file-title .renamed {\n font-weight: normal;\n }\n .diff-file-title .renamed .from {\n color: #cb2431;\n }\n .diff-file-title .renamed .to {\n color: #22863a;\n }\n .diff-file-title .added {\n color: #22863a;\n }\n .diff-file-title .deleted {\n color: #cb2431;\n }\n .diff-file-content {\n }\n .diff-table {\n tab-size: 8;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n }\n .blob-num {\n position: relative;\n color: #1f2328;\n width: 1%;\n min-width: 50px;\n padding: 0 10px;\n font-family:\n ui-monospace,\n SFMono-Regular,\n SF Mono,\n Menlo,\n Consolas,\n Liberation Mono,\n monospace;\n font-size: 12px;\n line-height: 20px;\n text-align: right;\n white-space: nowrap;\n vertical-align: top;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n }\n .blob-num.addition {\n background-color: #ccffd8;\n border-color: #1f883e;\n }\n .blob-num.deletion {\n background-color: #ffd7d5;\n border-color: #cf222e;\n }\n .blob-num::before {\n content: attr(data-line-number);\n }\n .blob-code {\n position: relative;\n padding: 0 10px 0 22px;\n vertical-align: top;\n color: #1f2329;\n }\n .blob-code.code-addition {\n background-color: #e6ffec;\n }\n .blob-code.code-deletion {\n background-color: #ffebe9;\n }\n .blob-code.skip,\n .blob-code.message {\n text-align: center;\n }\n .blob-code.skip .blob-code-inner,\n .blob-code.message .blob-code-inner {\n font-weight: bold;\n color: #6a737d;\n padding: 10px 0;\n }\n .blob-code-inner {\n display: table-cell;\n overflow: visible;\n font-family:\n ui-monospace,\n SFMono-Regular,\n SF Mono,\n Menlo,\n Consolas,\n Liberation Mono,\n monospace;\n font-size: 12px;\n word-wrap: anywhere;\n white-space: pre-wrap;\n }\n .blob-code-inner::before {\n content: attr(data-code-prefix);\n position: absolute;\n top: 1px;\n left: 8px;\n padding-right: 8px;\n }\n </style>\n </head>\n <body>\n <h1>Changelog Diff</h1>\n\n %FILES%\n </body>\n </html>';diffFileTemplateHandler;diffLineTemplateHandler;contextLines=3;logger;constructor(e){const{oldAssetsPath:o,newAssetsPath:n,destinationPath:i,changelogTemplate:r,diffFileTemplateHandler:s,diffLineTemplateHandler:a,changelogFilename:l,contextLines:c}=e;if(this.logger=t.createLogger(),!o||!n||!i)throw new Error("Previous assets path, current assets path and destination path are required");if(o===n)throw new Error("Previous and current assets paths must be different");if(!this.isExists(o))throw new Error(`Previous assets path ${o} does not exist`);if(!this.isExists(n))throw new Error(`Current assets path ${n} does not exist`);if(this.isZipFile(o)){const e=y.resolve(L.tmpdir(),E.createHash("md5").update(o).digest("hex"));this.oldAssetsPath=this.unzipFile(o,e).then(()=>this.normalizeAssetFolderPath(e)).then(e=>{if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);return e})}else{if(!this.isFolder(o))throw new Error(`Invalid previous assets path ${o}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(o);if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);this.oldAssetsPath=Promise.resolve(e)}}if(this.isZipFile(n)){const e=y.resolve(L.tmpdir(),E.createHash("md5").update(n).digest("hex"));this.newAssetsPath=this.unzipFile(n,e).then(()=>this.normalizeAssetFolderPath(e)).then(e=>{if(this.isEmptyFolder(e))throw new Error(`Current assets path ${e} is empty`);return e})}else{if(!this.isFolder(n))throw new Error(`Invalid current assets path ${n}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(n);if(this.isEmptyFolder(e))throw new Error(`Current assets path ${n} is empty`);this.newAssetsPath=Promise.resolve(e)}}this.destinationPath=i,this.mkdirpSync(this.destinationPath),this.changelogFilename=l||"CHANGELOG.html",r&&(this.templateIsValid(r)?this.changelogTemplate=r:this.logger.warn(t.colors.yellow("Invalid changelog template, using default"))),"function"==typeof s&&(this.diffFileTemplateHandler=s),"function"==typeof a&&(this.diffLineTemplateHandler=a),c&&(this.contextLines=c)}templateIsValid(e){return e.includes("%FILES%")}isExists(e){return P.existsSync(e)}isZipFile(e){return e.endsWith(".zip")}isFolder(e){return P.lstatSync(e).isDirectory()}isEmptyFolder(e){return 0===P.readdirSync(e,{withFileTypes:!0}).length}mkdirpSync(e){P.existsSync(e)||P.mkdirSync(e,{recursive:!0})}async unzipFile(e,t){P.rmSync(t,{force:!0,recursive:!0}),await r.extractZipSafe(e,t)}normalizeAssetFolderPath(e){const t=P.readdirSync(e);return 1===t.length&&P.lstatSync(y.join(e,t[0])).isDirectory()?this.normalizeAssetFolderPath(y.join(e,t[0])):e}pathToPosix(e){return e.replace(/\\/g,"/")}diffTableTemplate(e){return`<table class="diff-table">\n <tbody>\n ${e}\n </tbody>\n </table>`}getDiffTableHTML(e){const t=e.filter((e,t,o)=>0!==e.lineType||(t>=0&&t<this.contextLines||t>o.length-(this.contextLines+1)&&t<=o.length-1||o.slice(t-this.contextLines,t+this.contextLines+1).some(e=>0!==e.lineType))).map((e,t,o)=>{if(t>0){const n=o[t-1];if(e.lineNumber-n.lineNumber>1)return[{lineNumber:-1,lineContent:"",lineType:0},e]}return[e]}).flat().map(e=>this.diffLineHTML(e)).join("");return this.diffTableTemplate(t)}diffLineMessageTemplate(e){return`<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code message">\n <span class="blob-code-inner">${e}</span>\n </td>\n </tr>`}diffLineSkipTemplate(){return'<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code skip">\n <span class="blob-code-inner">Skip</span>\n </td>\n </tr>'}diffLineTemplate(e){const{lineNumber:t,lineContent:o,lineType:n}=e,i=1===n?"addition":-1===n?"deletion":"";return`<tr>\n <td\n class="blob-num ${i}${"addition"===i?" empty":""}"\n ${"addition"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td\n class="blob-num ${i}${"deletion"===i?" empty":""}"\n ${"deletion"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td class="blob-code ${1===n?"code-addition":-1===n?"code-deletion":""}">\n <span class="blob-code-inner" data-code-prefix="${1===n?"+":-1===n?"-":" "}">${r=o??"",r.replace(/[\u00A0-\u9999<>&]/g,e=>"&#"+e.charCodeAt(0)+";")}</span>\n </td>\n </tr>`;var r}diffLineHTML(e){if(this.diffLineTemplateHandler)return this.diffLineTemplateHandler(e);const{lineNumber:t}=e;return-1===t?this.diffLineSkipTemplate():this.diffLineTemplate(e)}diffFileTemplate(e,t){return this.diffFileTemplateHandler?this.diffFileTemplateHandler(e,t):`<div class="diff-file">\n <div class="diff-file-title">${e}</div>\n <div class="diff-file-content">${t}</div>\n </div>`}async generateAssetFoldersDiff(){this.logger.info(t.colors.blue(`Comparing asset folders ${await this.oldAssetsPath} and ${await this.newAssetsPath}`));const e=await x.compare(await this.oldAssetsPath,await this.newAssetsPath,{compareContent:!0,skipSymlinks:!0,compareSize:!0,compareDate:!1,compareNameHandler:(e,t)=>(Z.test(e)&&(e=e.replace(Z,"$1$3")),Z.test(t)&&(t=t.replace(Z,"$1$3")),0===e.localeCompare(t)?0:e.localeCompare(t)>0?1:-1)});return e.diffSet?.filter(e=>"equal"!==e.state||e.name1!==e.name2)||[]}async generateAssetFilesDiff(e,t){const o=new S,n=o.diff_linesToChars_(e,t),i=o.diff_main(n.chars1,n.chars2,!1);o.diff_charsToLines_(i,n.lineArray);let r=0;return i.map(e=>{const[t,o]=e,n=o.endsWith("\n")?o.split("\n").length-1:o.split("\n").length,i=o.split("\n").map((e,o)=>({lineContent:e,lineNumber:r+o+1,lineType:t})).slice(0,n);return-1!==t&&(r+=n),i}).flat()}async generateFilesDiff(e){if("equal"===e.state){const t=this.pathToPosix(y.join(".",e.relativePath,e.name1??"")),o=this.pathToPosix(y.join(".",e.relativePath,e.name2??""));return this.diffFileTemplate(`<span class="renamed"\n >Renamed <span class="from">${t}</span> -> <span class="to">${o}</span></span\n >`,this.diffTableTemplate(this.diffLineMessageTemplate("No changes")))}const t=e.path1&&e.name1?y.join(e.path1,e.name1):null,o=e.path2&&e.name2?y.join(e.path2,e.name2):null,n=this.pathToPosix(y.join(".",e.relativePath,(e.name1||e.name2)??""));if("left"===e.state&&t)return this.diffFileTemplate(`<span class="removed">Removed ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File removed")));if("right"===e.state&&o)return this.diffFileTemplate(`<span class="added">Added ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File added")));if("distinct"===e.state&&t&&o){const i=this.pathToPosix(y.join(".",e.relativePath,e.name1??"")),r=this.pathToPosix(y.join(".",e.relativePath,e.name2??"")),s=e.name1!==e.name2?`<span class="renamed"\n >Renamed <span class="from">${i}</span> -> <span class="to">${r}</span></span\n >`:n;return this.diffFileTemplate(s,await g.isBinaryFile(t)||await g.isBinaryFile(o)?this.diffTableTemplate(this.diffLineMessageTemplate("Binary file")):this.getDiffTableHTML(await this.generateAssetFilesDiff(P.readFileSync(t,"utf-8"),P.readFileSync(o,"utf-8"))))}return""}async generateChangelog(){this.logger.info(t.colors.green("Generating changelog"));const e=await this.generateAssetFoldersDiff(),o=(await Promise.all(e.map(e=>this.generateFilesDiff(e)))).join("");this.logger.info(t.colors.green("Writing changelog file"));const n=this.changelogTemplate.split("%FILES%");n.splice(1,0,o);const i=n.join("");P.writeFileSync(y.join(this.destinationPath,this.changelogFilename),i),this.logger.info(t.colors.green(`Changelog file written to ${y.join(this.destinationPath,this.changelogFilename)}`))}}async function X(e){const{changelog:o,executionRoot:n,newAssetsPath:i,backupsDirPath:r,changelogDestinationPath:s,logLevel:a}=e;let l;if("string"==typeof o)l=y.resolve(n,o);else{if(!P.existsSync(r))return void t.createLogger(a).warn(t.colors.yellow("backups directory not found, skipping changelog generation"));const e=P.readdirSync(r,{withFileTypes:!0});if(!e.length)return void t.createLogger(a).warn(t.colors.yellow("no backups found, skipping changelog generation"));const o=e.filter(e=>e.isFile()&&e.name.endsWith(".zip"));if(!o.length)return void t.createLogger(a).warn(t.colors.yellow("no ZIP backups found, skipping changelog generation"));const n=o.reduce((e,t)=>P.statSync(y.resolve(r,e.name)).mtimeMs>P.statSync(y.resolve(r,t.name)).mtimeMs?e:t).name;l=y.resolve(r,n)}const c=new G({oldAssetsPath:l,newAssetsPath:i,destinationPath:s});await c.generateChangelog()}class J{sourceDir;outputDir;fontName;constructor(e){this.sourceDir=e.sourceDir,this.outputDir=e.outputDir,this.fontName=e.fontName}async generate(){const{default:e}=await(import("svgtofont"));await e({src:this.sourceDir,dist:this.outputDir,fontName:this.fontName,css:!0,typescript:!0,startUnicode:59905,svgicons2svgfont:{fontHeight:1024}})}}const K=e.cac("pp-dev");K.option("-c, --config <file>","[string] use specified config file").option("--base <path>","[string] public base path (default: /)").option("-l, --logLevel <level>","[string] info | warn | error | silent").option("--clearScreen","[boolean] allow/disable clear screen when logging").option("-d, --debug [feat]","[string | boolean] show debug logs").option("-f, --filter <filter>","[string] filter debug logs").option("-m, --mode <mode>","[string] set env mode"),function(e){e.command("[root]","start dev server").alias("serve").alias("dev").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--cors","[boolean] enable CORS").option("--strictPort","[boolean] exit if specified port is already in use").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action(async(e,o)=>{H(o);let s=null,a=null,l=!1;const c=e?y.resolve(process.cwd(),e):process.cwd(),d=t.createLogger(o.logLevel),p=async()=>{if(!l){l=!0;try{s&&(d.info(t.colors.yellow("🛑 Stopping existing dev server...")),await s.close(),s=null);const{clearConfigCache:u,getConfig:g}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config);u();const{createServer:h}=await(import("vite")),m=o.mode||"development",{config:v,envDir:w}=await q({root:e,mode:m,command:"serve",configFile:o.config,logLevel:o.logLevel});if(s=await h(i.mergeConfig(v,{root:e,base:o.base,mode:o.mode,configFile:o.config,logLevel:o.logLevel,clearScreen:o.clearScreen,optimizeDeps:{force:o.force},server:$(o),customLogger:d},!0)),!s.config.base||"/"===s.config.base)throw new Error('base cannot be equal to "/" or empty string');if(!s.httpServer)throw new Error("HTTP server not available");await s.listen();const b=global.__pp_dev_start_time??!1,y=b?t.colors.dim(`ready in ${t.colors.reset(t.colors.bold(Math.ceil(n.performance.now()-b)))} ms`):"";d.info(`\n ${t.colors.green(`${t.colors.bold("PP-DEV")} v${t.VERSION}`)} ${y}\n`),s.printUrls();const P=await g(w);if(!1!==P.inspector?.enabled){const e=s.resolvedUrls?.local[0],o=e?new URL(e).origin:`http://localhost:${s.config.server.port??5173}`;d.info(`\n ${t.colors.cyan("🔍 Request Inspector")} ${t.colors.dim(o+r.INSPECTOR_PATH)}\n`)}F(s,{print:!0,customShortcuts:[...(f=d.info,V?[{key:"p",description:"start/stop the profiler",async action(){if(V)await U(f);else{const e=await import("node:inspector").then(e=>e.default);await new Promise(t=>{V=new e.Session,V.connect(),V.post("Profiler.enable",()=>{V?.post("Profiler.start",()=>{f("Profiler started"),t()})})})}}}]:[]),{key:"l",description:"proxy re-login",action(e){e.ws.send({type:"custom",event:"redirect",data:{url:`/auth/index/logout?proxyRedirect=${encodeURIComponent("/")}`}})}}]}),a||(a=C(c,p,d.info),d.info(t.colors.blue("🔧 Config file watcher started"))),l=!1}catch(e){l=!1,d.error(t.colors.red(`error when starting dev server:\n${e.stack}`),{error:e}),U(d.info),process.exit(1)}var f}};N({logger:d,shutdown:async()=>{a&&(R(a),a=null),s&&(await s.close(),s=null),U(d.info)}}),await p()})}(K),function(e){e.command("next [root]","start Next.js development server with pp-dev integration").alias("next-serve").alias("next-dev").option("--host [host]","[string] specify hostname; without a value, listen on all addresses").option("--port <port>","[number] specify port",{default:3e3}).option("--https","[boolean] no effect with pp-dev next (deprecated)").option("--open [path]","[boolean | string] no effect with pp-dev next (deprecated)").option("--cors","[boolean] no effect with pp-dev next (deprecated)").option("--strictPort","[boolean] no effect with pp-dev next (deprecated)").option("--force","[boolean] no effect with pp-dev next (deprecated)").option("--webpack","[boolean] use Webpack for Next dev (use when Turbopack/native SWC is unavailable)").option("--turbopack","[boolean] use Turbopack for Next dev when native bindings work").action(async(e,o)=>{H(o);const n=A.filter(e=>void 0!==o[e]);n.length>0&&t.createLogger(o.logLevel).warn(t.colors.yellow(`⚠️ ${n.map(e=>`--${e}`).join(", ")} ${1===n.length?"has":"have"} no effect with pp-dev next and will be removed.`));const{host:i,port:s}=function(e,t){let o="localhost";!0===e||""===e?o="0.0.0.0":"string"==typeof e?o=e:"number"==typeof e&&(o=String(e));const n="number"==typeof t?t:"string"==typeof t?Number.parseInt(t,10):NaN;return{host:o,port:Number.isInteger(n)&&n>=0?n:3e3}}(o.host,o.port);let l=null,p=null,f=null,u=null,g=null,h=!1;const m=new Set,v=t.createLogger(o.logLevel),w=function(e=["uncaughtException"],t=process){const o=e=>t.listeners(e);let n=null,i=null;return{beforeCreate(){n=new Map(e.map(e=>[e,new Set(o(e))]))},afterCreate(){if(!n)return 0;const r=n,s=new Map(e.map(e=>[e,o(e).filter(t=>!r.get(e).has(t))]));let a=0;if(i)for(const[e,o]of i){const n=new Set(s.get(e).map(e=>e.toString()));for(const i of o)n.has(i.toString())&&(t.off(e,i),a+=1)}return i=s,n=null,a}}}(),b=async()=>{l&&"function"==typeof l.close&&await l.close(),l=null},x=async()=>{const e=p;if(e){for(const e of m)e.destroy();m.clear(),await new Promise(t=>{e.close(()=>t())}),p===e&&(p=null)}},S=async()=>{if(!h){h=!0;try{const{next:n,constants:L}=await a.safeNextImport(),{PHASE_DEVELOPMENT_SERVER:E}=L;u?.dispose(),u=null,f&&(await f.close(),f=null),p&&(v.info(t.colors.yellow("🛑 Stopping existing Next.js server...")),await x()),await b();const{clearConfigCache:T}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config);T();const{join:k}=await(import("path")),{createServer:D}=await(import("http")),F=await(import("next/dist/server/config.js")),I=F.default.default||F["module.exports"].default||F.default,_=e?k(process.cwd(),e):process.cwd();a.loadPPDevEnv(o.mode||"development",_);const N=await I(E,_);let j=N?.ppDev||{};if(0===Object.keys(j).length)try{const{getConfig:e}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config),o=await e(_);Object.keys(o).length>0?(j=o,v.info(t.colors.blue("🔧 Loaded pp-dev config from standalone config file"))):v.info(t.colors.yellow("⚠️ No pp-dev config found in Next.js config or standalone file, using defaults"))}catch(e){v.warn(t.colors.yellow(`⚠️ Failed to load standalone pp-dev config, using defaults: ${e instanceof Error?e.message:String(e)}`))}else v.info(t.colors.blue("🔧 Loaded pp-dev config from Next.js config"));const{getPkg:$}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config),A=$(_).name;t.validatePPDevConfig(j,A);const R=t.normalizePPDevConfig(j,A),{templateName:H}=R,q=R.backendBaseURL,V=R.templateLess,O=R.v7Features,U=R.disableSSLValidation,W=R.enableProxyCache,Z=R.proxyCacheTTL,G=R.personalAccessToken,X=R.miHudLess,J=R.inspectorEnabled,K=R.inspectorMaxMemory,Y=R.inspectorCaptureLimit,Q=R.appId,ee=!0===R.allowedHosts||[...R.allowedHosts,i.toLowerCase()],te=r.createInternalServer({allowedHosts:R.allowedHosts}),oe=N?.basePath;let ne="";oe?ne=oe:(ne=V?t.PATH_PAGE_PREFIX:O?t.PATH_TEMPLATE_LOCAL_PREFIX:t.PATH_TEMPLATE_PREFIX,ne+=`/${H}`);const ie=function(e){const t="1"===process.env.PP_DEV_NEXT_WEBPACK||"true"===process.env.PP_DEV_NEXT_WEBPACK;if(t&&(e.webpack||e.turbopack))throw new Error("Do not combine PP_DEV_NEXT_WEBPACK with --webpack or --turbopack");if(t)return{webpack:!0};if(e.webpack&&e.turbopack)throw new Error("Use only one of --webpack or --turbopack");return e.webpack?{webpack:!0}:e.turbopack?{turbopack:!0}:{}}(o),re=async e=>{delete process.env.TURBOPACK,await b();const t={dev:!0,customServer:!0,hostname:i,port:s,dir:_,conf:{...N,basePath:ne,assetPrefix:ne}};e.webpack?t.webpack=!0:e.turbopack&&(t.turbopack=!0),w.beforeCreate(),l=n(t),await l.prepare(),w.afterCreate()};if(ie.webpack)await re({webpack:!0});else if(ie.turbopack)try{await re({turbopack:!0})}catch(e){if(!M(e))throw e;v.warn(t.colors.yellow("⚠ Turbopack is unavailable (native bindings). Falling back to Webpack.")),await re({webpack:!0})}else try{await re({})}catch(e){if(!M(e))throw e;v.warn(t.colors.yellow("⚠ Turbopack cannot run (native Next.js bindings unavailable). Falling back to Webpack.")),await re({webpack:!0})}if(!l)throw new Error("Next.js app failed to initialize");if(ne.endsWith("/")||(ne+="/"),"/"===ne)throw new Error('basePath cannot be equal to "/" or equal to empty string');v.info(t.colors.green("✅ Next.js app prepared successfully")),v.info(t.colors.blue(`🔧 pp-dev plugin configured for template: ${H}`)),v.info(t.colors.blue(`🔧 Base path configured: ${ne}`)),q&&(v.info(t.colors.blue(`🌐 Backend URL: ${q}`)),v.info(t.colors.blue(`🆔 Custom App ID: ${Q}`)));const se=l.getRequestHandler(),ae=s,le=i;p=D(async(e,t)=>{const o=e.headers.host;if(!r.isHostAllowed(o,ee))return t.writeHead(403,{"Content-Type":"text/plain; charset=utf-8"}),void t.end(r.hostNotAllowedMessage(o));try{const n=e.url||"/",i=n.split("?")[0];let s=d.parse(n,!0);if(fe.length>0){if(i.startsWith("/_next/")||"/favicon.ico"===i||i.startsWith("/__nextjs_")){if(ue.length>0){let p=0;const f=()=>{if(p>=ue.length)return void a();const o=ue[p];p++,o(e,t,f)};return void f()}return void a()}let l=0;const c=()=>{if(l>=fe.length)return void a();const o=fe[l];l++,o(e,t,c)};return void c()}async function a(){if(i.startsWith(ne))s=d.parse(n,!0);else{if(i===ne.replace(/\/$/,"")){const e=n.replace(i,ne);return t.writeHead(302,{Location:e}),void t.end()}if(i.startsWith("/_next/")||"/favicon.ico"===i||i.startsWith("/__nextjs_"));else if("/"===i)return t.writeHead(302,{Location:ne}),void t.end()}await se(e,t,s)}a()}catch(u){v.error(`Error handling request: ${u instanceof Error?u.message:String(u)}`,{error:u instanceof Error?u:void 0}),t.statusCode=500,t.end("Internal Server Error")}});let ce=null;const de=(e,t,o)=>{r.isHostAllowed(e.headers.host,ee)?ce?ce(e,t,o):p.listeners("upgrade").every(e=>e===de)&&t.destroy():z(t)};p.on("upgrade",de);let pe=null;const fe=[],ue=[];if(!1!==J){const e=new r.RequestStore(K);r.registerInspectorRoutes(te,e,Y);const t=r.createRequestCaptureMiddleware(e,Y);fe.push(t)}const ge=(e,t,o)=>{if(e.url?.startsWith("/@api/")||e.url?.startsWith(r.INSPECTOR_PATH)||e.url?.startsWith(r.VARIABLES_EDITOR_PATH)){return void te(e,t,()=>{})}o()};if(q||!1===J||(ue.push(ge),fe.push(ge)),q){const e=new URL(q).host,o=r.createUserHostGuard();ue.unshift(o),fe.unshift(o),q.startsWith("https://")&&(c.EventEmitter.defaultMaxListeners=Math.max(c.EventEmitter.defaultMaxListeners,20));const n=r.getMiAPIOptions(q,{appId:Q,templateLess:V,disableSSLValidation:U,v7Features:O,personalAccessToken:G});pe=new r.MiAPI(q,n);const i=r.initPPRedirect(ne,H),s=(e,t,o)=>{i(e,t,o)};ue.push(s),fe.push(s);const d=a.createDevPanelAssetMiddleware(ne);if(ue.push(d),fe.push(d),W){const e=r.resolveProxyCacheTtl(Z),o={devServer:{middlewares:{use:e=>e},config:{logger:console}},ttl:e},n=r.initProxyCache(o),i=(e,t,o)=>{n(e,t,o)};fe.push(i),v.info(t.colors.blue(`🔧 Proxy cache middleware added with TTL: ${e}ms`))}const p=r.getIndexPageRegExp(ne),g=r.initLoadPPData(p,pe,Object.assign({base:ne},n,{miHudLess:X})),h=(e,t,o)=>{g(e,t,o)};fe.push(h);const m={middlewares:{use:e=>e},config:{logger:console}},w=r.initProxy({devServer:m,baseURL:q,proxyIgnore:[...r.getProxyIgnore(ne),"/_next","/favicon.ico","/__nextjs_","/installHook.js.map"],disableSSLValidation:U,miAPI:pe,templateName:H}),b=(e,t,o)=>{w(e,t,o)};fe.push(b),ue.push(ge),fe.push(ge);const x=r.initRewriteResponse(e=>{const t=e.split("?")[0];return t.startsWith(ne)&&!t.includes("/_next/")},(t,o)=>{const n=pe.buildPage(t,X),i=a.injectDevPanel(n,ne,{backendBaseURL:q,templateLess:V,appId:Q,devPanelPosition:R.devPanelPosition,devPanelHidden:R.devPanelHidden,devPanelAutoHide:R.devPanelAutoHide});return Buffer.from(r.urlReplacer(e,o.headers.host??"",i))}),S=(e,t,o)=>{x(e,t,o)};fe.push(S),f=new B({allowedHosts:R.allowedHosts});let E=N?.distDir;const T=process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR];process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]="1";try{const e=await I(L.PHASE_PRODUCTION_BUILD,_);E=e?.distDir??E}catch{}finally{void 0===T?delete process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]:process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]=T}const k=(E??"").replace(/\\/g,"/").replace(/\/+$/,"").replace(/\/dev$/,""),D=k&&".next"!==k?k:"out";let F,j="0.0.0";try{const e=JSON.parse(P.readFileSync(y.join(_,"package.json"),"utf-8"));j="string"==typeof e.version?e.version:j,F="string"==typeof e.repository?e.repository:e.repository?.url}catch{}const $=new r.DistService(H,{root:_,backupFolder:y.resolve(_,R.syncBackupsDir),maxBackups:R.syncMaxBackups,buildTimeoutMs:R.syncBuildTimeoutMs,nextBuild:{projectRoot:_,distDir:D,packageVersion:j,packageRepositoryUrl:F}}),A={ws:f.ws,config:{clientInjectionPlugin:{v7Features:O}}};u=r.startSyncAndUsers({server:A,internalServer:te,distService:$,miAPI:pe,persistUsers:R.persistUsers,projectRoot:_,miUrl:q});const C="function"==typeof l?.getUpgradeHandler?l.getUpgradeHandler():null;ce=(e,t,o)=>{f?.handleUpgrade(e,t,o)||(C?C(e,t,o):t.destroy())},v.info(t.colors.blue(`🔧 ${fe.length} pp-dev middlewares initialized`)),v.info(t.colors.blue(`🔧 ${ue.length} essential middlewares for internal routes`)),v.info(t.colors.blue(`🔧 MiAPI initialized for backend: ${q}`)),v.info(t.colors.blue(`🔧 Custom App ID: ${Q}`))}p.listen(ae,le,()=>{v.info(t.colors.green(`✅ pp-dev Next.js server running at http://${le}:${ae}`)),v.info(t.colors.blue(`📱 Next.js app accessible at http://${le}:${ae}${ne}`)),!1!==J&&v.info(t.colors.cyan(`🔍 Request Inspector: http://${le}:${ae}${r.INSPECTOR_PATH}`)),v.info(t.colors.blue("🔧 Base path handling active")),g||(g=C(_,S,v.info),v.info(t.colors.blue("🔧 Config file watcher started"))),p.on("connection",e=>{m.add(e),e.on("close",()=>m.delete(e))})}),h=!1}catch(e){h=!1,v.error(t.colors.red(`❌ Failed to start Next.js server: ${e?.message}. Stack: ${e?.stack}`)),e instanceof Error&&e.message.includes("Next.js is required")&&(v.error(t.colors.red("❌ Next.js Peer Dependency Error:")),v.error(t.colors.red(e.message)),v.error(t.colors.yellow("\n💡 To fix this issue:")),v.error(t.colors.blue(" 1. Install Next.js in your project:")),v.error(t.colors.white(" npm install next@^16")),v.error(t.colors.blue(" 2. Or use yarn:")),v.error(t.colors.white(" yarn add next@^16")),v.error(t.colors.blue(" 3. Or use pnpm:")),v.error(t.colors.white(" pnpm add next@^16")),v.error(t.colors.yellow("\n📖 For more information, see:")),v.error(t.colors.blue(" https://nextjs.org/docs/getting-started"))),process.exit(1)}}};N({logger:v,knownRejections:[W],shutdown:async()=>{g&&(R(g),g=null),u?.dispose(),u=null,f&&(await f.close(),f=null),await x(),await b()}}),await S()})}(K),function(e){e.command("build [root]","build for production").option("--target <target>","[string] transpile target (default: 'modules')").option("--outDir <dir>","[string] output directory (default: dist)").option("--assetsDir <dir>","[string] directory under outDir to place assets in (default: assets)").option("--assetsInlineLimit <number>","[number] static asset base64 inline threshold in bytes (default: 4096)").option("--ssr [entry]","[string] build specified entry for server-side rendering").option("--sourcemap [output]",'[boolean | "inline" | "hidden"] output source maps for build (default: false)').option("--minify [minifier]",'[boolean | "terser" | "esbuild"] enable/disable minification, or specify minifier to use (default: esbuild)').option("--manifest [name]","[boolean | string] emit build manifest json").option("--ssrManifest [name]","[boolean | string] emit ssr manifest json").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle (experimental)").option("--emptyOutDir","[boolean] force empty outDir when it's outside of root").option("-w, --watch","[boolean] rebuilds when modules have changed on disk").option("--changelog [assetsFile]","[boolean | string] generate changelog between assetsFile and current build (default: false)").option("--distZip","[boolean] pack build output into a ZIP archive; use --no-distZip to disable (default: pp-dev config build.zip, or true). Env: PP_DEV_DIST_ZIP").option("--distZipDir <dir>","[string] override the ZIP output directory (default: 'dist-zip'). Env: PP_DEV_DIST_ZIP_DIR").option("--distZipFilename <filename>","[string] override the ZIP output file name (default: '<app-name>.zip'). Env: PP_DEV_DIST_ZIP_FILENAME").option("--versionManifest","[boolean] emit VERSION-*.json + BUILD-MANIFEST.json; use --no-versionManifest to disable (default: pp-dev config build.versionFile, or true). Env: PP_DEV_VERSION_MANIFEST").option("--versionFileTemplate <template>","[string] override the VERSION file name template (default: 'VERSION-v{packageversion}-{currentDate}.json'). Env: PP_DEV_VERSION_FILE_TEMPLATE").action(async(e,o)=>{H(o);const n=$(o),r=a.resolveBuildCliOverrides(o);try{const t=o.mode||"production",{config:s}=await q({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel,buildOverrides:r}),a=i.mergeConfig(s,{root:e,base:o.base,mode:o.mode,configFile:o.config,logLevel:o.logLevel,clearScreen:o.clearScreen,optimizeDeps:{force:o.force},build:n},!0);if(await i.build(a),o.changelog){const t=e||process.cwd(),n=a.build?.outDir||"dist";let i="dist-zip";a.ppDevConfig&&(!1===a.ppDevConfig.distZip?i=n:"object"==typeof a.ppDevConfig.distZip&&"string"==typeof a.ppDevConfig.distZip.outDir&&(i=a.ppDevConfig.distZip.outDir)),await X({changelog:o.changelog,executionRoot:t,newAssetsPath:y.resolve(t,n),backupsDirPath:y.resolve(t,a.ppDevConfig?.syncBackupsDir||"backups"),changelogDestinationPath:y.resolve(t,i),logLevel:o.logLevel})}}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error during build:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(K),function(e){e.command("next-build [root]","build a Next.js app for production (`next build`) and emit VERSION/BUILD-MANIFEST/zip in the same format as `pp-dev build`").option("--changelog [assetsFile]","[boolean | string] generate changelog between assetsFile and current build (default: false)").option("--distZip","[boolean] pack build output into a ZIP archive; use --no-distZip to disable (default: pp-dev config build.zip, or true). Env: PP_DEV_DIST_ZIP").option("--distZipDir <dir>","[string] override the ZIP output directory (default: 'dist-zip'). Env: PP_DEV_DIST_ZIP_DIR").option("--distZipFilename <filename>","[string] override the ZIP output file name (default: '<app-name>.zip'). Env: PP_DEV_DIST_ZIP_FILENAME").option("--versionManifest","[boolean] emit VERSION-*.json + BUILD-MANIFEST.json; use --no-versionManifest to disable (default: pp-dev config build.versionFile, or true). Env: PP_DEV_VERSION_MANIFEST").option("--versionFileTemplate <template>","[string] override the VERSION file name template (default: 'VERSION-v{packageversion}-{currentDate}.json'). Env: PP_DEV_VERSION_FILE_TEMPLATE").action(async(e,o)=>{H(o);const n=t.createLogger(o.logLevel),i=e?y.resolve(process.cwd(),e):process.cwd(),s=a.resolveBuildCliOverrides(o);process.env[t.PP_DEV_NEXT_BUILD_ENV_VAR]="1";try{a.loadPPDevEnv(o.mode||"production",i);const{constants:e}=await a.safeNextImport(),l=await(import("next/dist/server/config.js")),c=l.default.default||l["module.exports"].default||l.default,d=await c(e.PHASE_PRODUCTION_BUILD,i);let p=d?.ppDev||{};if(0===Object.keys(p).length){const{getConfig:e}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config);p=await e(i)}const{getPkg:f}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config),u=t.normalizePPDevConfig(p,f(i).name),g=a.applyDistZipOverride(u.distZip,s,t.createDefaultZipFileName(u.templateName)),h=a.applyVersionManifestOverride(u.versionPlugin,s),m=r.removeStaleDevTypes(i,d);m&&n.info(t.colors.dim(`[pp-dev] Removed stale dev route types: ${y.relative(i,m)}`)),n.info(t.colors.cyan("[pp-dev] Running `next build`...")),await r.runNextBuildProcess(i);const w="string"==typeof d?.distDir&&d.distDir?d.distDir:".next",b=".next"===w?"out":w,x=y.resolve(i,b);if(!P.existsSync(x)||!P.statSync(x).isDirectory())throw new Error(`Next.js build output directory not found: ${x}. "next-build" requires "output: 'export'" in next.config (static export).`);const S=JSON.parse(P.readFileSync(y.join(i,"package.json"),"utf-8"));if(!1!==h&&!1!==h.enabled&&(await v.writeBuildVersionManifest({outDir:x,packageVersion:"string"==typeof S.version?S.version:"0.0.0",versionFileTemplate:h.versionFileTemplate,packageRepositoryUrl:"string"==typeof S.repository?S.repository:S.repository?.url,enabled:h.enabled}),n.info(t.colors.green(`✅ VERSION / BUILD-MANIFEST written to ${y.relative(i,x)}`))),!1!==g){const e=y.resolve(i,g.outDir),o=g.inDir?y.resolve(x,g.inDir):x,s=t.resolveOutputFilePath(e,g.outFileName,"ZIP output file name");P.mkdirSync(y.dirname(s),{recursive:!0});const a=await r.zipDirectoryToBuffer(o);P.writeFileSync(s,a),n.info(t.colors.green(`✅ Zip archive written to ${y.relative(i,s)}`))}if(o.changelog){const e=!1!==g?g.outDir:b;await X({changelog:o.changelog,executionRoot:i,newAssetsPath:x,backupsDirPath:y.resolve(i,u.syncBackupsDir),changelogDestinationPath:y.resolve(i,e),logLevel:o.logLevel})}}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error during next-build:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(K),function(e){e.command("changelog [oldAssetPath] [newAssetPath]","generate changelog between two assets files/folders").option("--oldAssetsPath <oldAssetsPath>","[string] path to the old assets zip file or folder").option("--newAssetsPath <newAssetsPath>","[string] path to the new assets zip file or folder").option("--destination <destination>","[string] destination folder for the changelog (default: .)").option("--filename <filename>","[string] filename for the changelog (default: CHANGELOG.html)").action(async(e,o,n)=>{H(n);const{oldAssetsPath:i=e,newAssetsPath:r=o,destination:s=".",filename:a="CHANGELOG.html",logLevel:l}=n,c=process.cwd();i&&r||(t.createLogger(l).error(t.colors.red("error during changelog generation: oldAssetPath and newAssetPath are required")),process.exit(1));const d=y.resolve(c,i),p=y.resolve(c,r),f=y.resolve(c,s),u=new G({oldAssetsPath:d,newAssetsPath:p,destinationPath:f,changelogFilename:a});await u.generateChangelog()})}(K),function(e){e.command("generate-icon-font [source] [destination]","generate icon font from SVG files").option("--source <source>","[string] path to the source directory with SVG files").option("--destination <destination>","[string] path to the destination directory to save the generated font files").option("--font-name, -n <fontName>","[string] name of the font to generate (default: 'icon-font')").action(async(e,o,n)=>{H(n);const{source:i=e,destination:r=o,fontName:s="icon-font"}=n,a=process.cwd(),l=y.resolve(a,i),c=y.resolve(a,r),d=new J({sourceDir:l,outputDir:c,fontName:s}),p=t.createLogger(n.logLevel);p.info(`Generating icon font from SVG files in ${t.colors.dim(l)}`),await d.generate(),p.info(`Icon font generated and saved to ${t.colors.dim(c)}`)})}(K),function(e){e.command("optimize [root]","pre-bundle dependencies").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action(async(e,o)=>{H(o);try{const t=o.mode||"production",{config:n}=await q({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel}),r=await i.resolveConfig(i.mergeConfig(n,{root:e,base:o.base,configFile:o.config,logLevel:o.logLevel,mode:o.mode}),"serve");await i.optimizeDeps(r,o.force,!0)}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error when optimizing deps:\n${e.stack}`),{error:e}),process.exit(1)}})}(K),function(e){e.command("preview [root]","locally preview production build").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--strictPort","[boolean] exit if specified port is already in use").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--outDir <dir>","[string] output directory (default: dist)").action(async(e,o)=>{H(o);try{const t=o.mode||"production",{config:n}=await q({root:e,mode:t,command:"build",configFile:o.config,logLevel:o.logLevel});(await i.preview(i.mergeConfig(n,{root:e,base:o.base,configFile:o.config,logLevel:o.logLevel,mode:o.mode,build:{outDir:o.outDir},preview:{port:o.port,strictPort:o.strictPort,host:o.host,https:o.https,open:o.open}}))).printUrls()}catch(e){t.createLogger(o.logLevel).error(t.colors.red(`error when starting preview server:\n${e.stack}`),{error:e}),process.exit(1)}finally{U(e=>t.createLogger(o.logLevel).info(e))}})}(K),function(e){e.command("migrate [config]","migrate pp-dev config from 0.x flat format to 1.0 grouped format").option("--dry-run","[boolean] print migrated config without writing any files").option("--format <format>","[string] output format: ts (default), js, json").option("--output <file>","[string] output file path (default: pp-dev.config.ts)").option("--no-backup","[boolean] skip backup of original config file").action(async(e,o)=>{const n=t.createLogger(o.logLevel),{isLegacyFlatConfig:i,isLegacyPPWatchConfig:r,isAlreadyMigrated:s,migrateLegacyFlatConfig:a,migratePPWatchConfig:l,generateConfigFileContent:c,discoverMigrateSource:d,loadPackageJsonMigrateConfig:p}=await Promise.resolve().then(()=>require("./migrate-D_y8SIv9.js")),f=o.format??"ts",u=!1!==o.backup,g=process.cwd(),h=d(g,e);h||(n.warn(t.colors.yellow("No pp-dev or pp-watch config file found in the current directory.")),n.info(t.colors.blue('Supported files: pp-dev.config.{ts,js,cjs,mjs,json}, .pp-watch.config.{ts,js,json}, or a "pp-dev" field in package.json')),process.exit(1));const{sourceFile:m,isWatchConfig:v,isPackageJsonConfig:w}=h;n.info(t.colors.blue(`Found config: ${y.relative(g,m)}`));const{getPkg:b}=await Promise.resolve().then(()=>require("./index-DFNyrsll.js")).then(e=>e.config),x=b();let S,L={};try{if(/\.[cm]?ts$/i.test(m)){const e=await(import("esbuild")),{pathToFileURL:t}=await(import("url")),o=(await e.build({absWorkingDir:g,entryPoints:[m],outfile:"out.js",write:!1,target:"node24",platform:"node",bundle:!0,packages:"external",format:"esm",mainFields:["main"]})).outputFiles[0].text,n=`pp-migrate-tmp-${Date.now()}.mjs`;P.writeFileSync(n,o);try{const e=await(import(t(y.resolve(g,n)).toString()));L=e.default?.default??e.default??e}finally{P.existsSync(n)&&P.unlinkSync(n)}}else if(/\.[cm]?js$/i.test(m)){const{pathToFileURL:e}=await(import("url")),t=await(import(e(y.resolve(g,m)).toString()));L=t.default?.default??t.default??t}else w?L=p(m):m.endsWith(".json")&&(L=JSON.parse(P.readFileSync(m,"utf-8")))}catch(e){n.error(t.colors.red(`Failed to load config file: ${e.message}`)),process.exit(1)}L&&"object"==typeof L||(n.error(t.colors.red("Config file did not export a valid object.")),process.exit(1)),s(L)?(n.info(t.colors.green("Config is already in 1.0 format — nothing to migrate.")),process.exit(0)):v||r(L)?(n.info(t.colors.blue("Detected pp-watch config format → migrating to 1.0")),S=l(L)):i(L)?(n.info(t.colors.blue("Detected 0.x flat config format → migrating to 1.0")),S=a(L,x.name)):(n.warn(t.colors.yellow("Could not detect config format. No known keys found.")),process.exit(1));const E=c(S,f),T=o.output??y.join(g,`pp-dev.config.${f}`);if(o.dryRun&&(n.info(t.colors.green(`\n--- Migrated config (dry-run) → ${y.relative(g,T)} ---\n`)),process.exit(0)),u&&!w&&P.existsSync(m)){const e=`${m}.bak`;P.copyFileSync(m,e),n.info(t.colors.blue(`Backed up original to: ${y.relative(g,e)}`))}P.writeFileSync(T,E,"utf-8"),n.info(t.colors.green(`✅ Migration complete → ${y.relative(g,T)}`)),w?n.info(t.colors.yellow('You can now remove the "pp-dev" field from package.json.')):m!==T&&P.existsSync(m)&&n.info(t.colors.yellow(`You can now delete the old config: ${y.relative(g,m)}`))})}(K),K.help(),K.version(t.VERSION),K.parse(),exports.stopProfiler=U;
|
|
2
2
|
//# sourceMappingURL=cli.js.map
|