create-web-kit 25.728.953 → 25.728.1412

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,8 @@
1
- const i=b;(function(c,d){const h=b,e=c();while(!![]){try{const f=parseInt(h(0xd2))/0x1*(-parseInt(h(0xcf))/0x2)+parseInt(h(0xd7))/0x3+parseInt(h(0xd3))/0x4+parseInt(h(0xd0))/0x5+-parseInt(h(0xce))/0x6+-parseInt(h(0xd4))/0x7+-parseInt(h(0xd1))/0x8*(-parseInt(h(0xd6))/0x9);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xc5445));import{copyTemplateFiles}from'../utils/template.js';function a(){const j=['1160032iNemcv','4463823TTzNfH','electron-vue','89982GMhkGz','1771710qukpEg','.eslintrc.js','8696274yQUBfz','2654564TbmdKm','2861655pATCeU','2216ITQEBI','1zsdYDm'];a=function(){return j;};return a();}const TEMPLATE_NAME=i(0xd5),TEMPLATE_FILES=[{'source':'eslint.config.js','destination':i(0xcd)}];function b(c,d){const e=a();return b=function(f,g){f=f-0xcd;let h=e[f];return h;},b(c,d);}export function createElectronVueFiles(c){copyTemplateFiles(TEMPLATE_NAME,TEMPLATE_FILES,c);}
1
+ import { copyTemplateFiles } from "../utils/template.js";
2
+ const TEMPLATE_NAME = "electron-vue";
3
+ const TEMPLATE_FILES = [
4
+ { source: "eslint.config.js", destination: ".eslintrc.js" },
5
+ ];
6
+ export function createElectronVueFiles(root) {
7
+ copyTemplateFiles(TEMPLATE_NAME, TEMPLATE_FILES, root);
8
+ }
@@ -5,12 +5,8 @@ const TEMPLATE_NAME = "nextjs-csr";
5
5
  const TEMPLATE_FILES = [
6
6
  // Config files
7
7
  { source: "prettier.config.json", destination: ".prettierrc", isJson: true },
8
- { source: "eslint.config.js", destination: ".eslintrc.js" },
8
+ { source: "eslint.config.js", destination: "eslint.config.js" },
9
9
  { source: "next.config.js", destination: "next.config.js" },
10
- // Environment files
11
- { source: ".env", destination: ".env.development" },
12
- { source: ".env", destination: ".env.production" },
13
- { source: ".env", destination: ".env.test" },
14
10
  // DevContainer
15
11
  {
16
12
  source: "devcontainer.json",
@@ -1 +1,9 @@
1
- function a(){const j=['.env.local','5274azzNiZ','81ZhUTxK','nextjs-ssr','649883dkQZcg','32106DHrRJt','20888rWdiFH','7131625dhbKsg','9WlnZhD','11skdGuy','11244770VeACVy','406kcgQNs','15882XUKNYu','876GOAxpv','5972baDZEz'];a=function(){return j;};return a();}const i=b;(function(c,d){const h=b,e=c();while(!![]){try{const f=-parseInt(h(0x112))/0x1*(-parseInt(h(0x116))/0x2)+-parseInt(h(0x11b))/0x3*(parseInt(h(0x118))/0x4)+parseInt(h(0x111))/0x5+-parseInt(h(0x11e))/0x6*(-parseInt(h(0x115))/0x7)+-parseInt(h(0x110))/0x8*(-parseInt(h(0x11a))/0x9)+-parseInt(h(0x114))/0xa*(-parseInt(h(0x113))/0xb)+parseInt(h(0x117))/0xc*(-parseInt(h(0x11d))/0xd);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xbcb9d));import{copyTemplateFiles}from'../utils/template.js';const TEMPLATE_NAME=i(0x11c),TEMPLATE_FILES=[{'source':i(0x119),'destination':'.env.local'},{'source':'.env.local','destination':'.env.example'}];function b(c,d){const e=a();return b=function(f,g){f=f-0x110;let h=e[f];return h;},b(c,d);}export function createNextjsSSRFiles(c){copyTemplateFiles(TEMPLATE_NAME,TEMPLATE_FILES,c);}
1
+ import { copyTemplateFiles } from "../utils/template.js";
2
+ const TEMPLATE_NAME = "nextjs-ssr";
3
+ const TEMPLATE_FILES = [
4
+ { source: ".env.local", destination: ".env.local" },
5
+ { source: ".env.local", destination: ".env.example" },
6
+ ];
7
+ export function createNextjsSSRFiles(root) {
8
+ copyTemplateFiles(TEMPLATE_NAME, TEMPLATE_FILES, root);
9
+ }
@@ -1 +1,44 @@
1
- function a(){const u=['11368189ViVSWX','\x0a\x20\x20yarn\x20dev','log','step','2BKqNgo','stringify','Done.\x20Now\x20run:\x0a','url','4RlJODg','10075680kibMYl','2570109fUBFgK','package.json','1467IdmUVK','6809742grAJOm','7424425UVggIb','42190UkSewT','\x20install','1515118NcBGhM'];a=function(){return u;};return a();}(function(f,g){const s=b,h=f();while(!![]){try{const i=-parseInt(s(0x136))/0x1+-parseInt(s(0x13b))/0x2*(parseInt(s(0x141))/0x3)+parseInt(s(0x13f))/0x4*(-parseInt(s(0x133))/0x5)+parseInt(s(0x144))/0x6+parseInt(s(0x137))/0x7+parseInt(s(0x140))/0x8+parseInt(s(0x143))/0x9*(parseInt(s(0x134))/0xa);if(i===g)break;else h['push'](h['shift']());}catch(j){h['push'](h['shift']());}}}(a,0xcf61b));import c from'node:fs';function b(c,d){const e=a();return b=function(f,g){f=f-0x133;let h=e[f];return h;},b(c,d);}import d from'node:path';import{fileURLToPath}from'node:url';import*as e from'@clack/prompts';import{copy}from'../utils/file.js';import{renameFiles}from'../config/frameworks.js';export function generateTemplateProject(f,g,h,i,cwd){const t=b;c['mkdirSync'](g,{'recursive':!![]}),e[t(0x139)][t(0x13a)]('Scaffolding\x20project\x20in\x20'+g+'...');const j=d['resolve'](fileURLToPath(import.meta[t(0x13e)]),'../../..','template-'+f),k=(p,q)=>{const r=d['join'](g,renameFiles[p]??p);q?c['writeFileSync'](r,q):copy(d['join'](j,p),r);},l=c['readdirSync'](j);for(const p of l['filter'](q=>q!=='package.json')){k(p);}const m=JSON['parse'](c['readFileSync'](d['join'](j,'package.json'),'utf-8'));m['name']=h,k(t(0x142),JSON[t(0x13c)](m,null,0x2)+'\x0a');let n='';const o=d['relative'](cwd,g);n+=t(0x13d);g!==cwd&&(n+='\x0a\x20\x20cd\x20'+(o['includes']('\x20')?'\x22'+o+'\x22':o));switch(i){case'yarn':n+='\x0a\x20\x20yarn',n+=t(0x138);break;default:n+='\x0a\x20\x20'+i+t(0x135),n+='\x0a\x20\x20'+i+'\x20run\x20dev';break;}e['outro'](n);}
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import * as prompts from "@clack/prompts";
5
+ import { copy } from "../utils/file.js";
6
+ import { renameFiles } from "../config/frameworks.js";
7
+ export function generateTemplateProject(template, root, packageName, pkgManager, cwd) {
8
+ fs.mkdirSync(root, { recursive: true });
9
+ prompts.log.step(`Scaffolding project in ${root}...`);
10
+ const templateDir = path.resolve(fileURLToPath(import.meta.url), "../../..", `template-${template}`);
11
+ const write = (file, content) => {
12
+ const targetPath = path.join(root, renameFiles[file] ?? file);
13
+ if (content) {
14
+ fs.writeFileSync(targetPath, content);
15
+ }
16
+ else {
17
+ copy(path.join(templateDir, file), targetPath);
18
+ }
19
+ };
20
+ const files = fs.readdirSync(templateDir);
21
+ for (const file of files.filter((f) => f !== "package.json")) {
22
+ write(file);
23
+ }
24
+ const pkg = JSON.parse(fs.readFileSync(path.join(templateDir, `package.json`), "utf-8"));
25
+ pkg.name = packageName;
26
+ write("package.json", JSON.stringify(pkg, null, 2) + "\n");
27
+ let doneMessage = "";
28
+ const cdProjectName = path.relative(cwd, root);
29
+ doneMessage += `Done. Now run:\n`;
30
+ if (root !== cwd) {
31
+ doneMessage += `\n cd ${cdProjectName.includes(" ") ? `"${cdProjectName}"` : cdProjectName}`;
32
+ }
33
+ switch (pkgManager) {
34
+ case "yarn":
35
+ doneMessage += "\n yarn";
36
+ doneMessage += "\n yarn dev";
37
+ break;
38
+ default:
39
+ doneMessage += `\n ${pkgManager} install`;
40
+ doneMessage += `\n ${pkgManager} run dev`;
41
+ break;
42
+ }
43
+ prompts.outro(doneMessage);
44
+ }
@@ -1 +1,8 @@
1
- function a(){const i=['2098716gJUJkN','331436lmOnTi','708076gFotBV','25NFKeis','5957344THVsGo','262452PEdNyk','1013388NIajiV','6070323DAjFoo'];a=function(){return i;};return a();}function b(c,d){const e=a();return b=function(f,g){f=f-0x1d2;let h=e[f];return h;},b(c,d);}(function(c,d){const h=b,e=c();while(!![]){try{const f=-parseInt(h(0x1d5))/0x1+-parseInt(h(0x1d4))/0x2+parseInt(h(0x1d8))/0x3+parseInt(h(0x1d3))/0x4+parseInt(h(0x1d6))/0x5*(-parseInt(h(0x1d9))/0x6)+parseInt(h(0x1d2))/0x7+parseInt(h(0x1d7))/0x8;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x7b788));import{copyTemplateFiles}from'../utils/template.js';const TEMPLATE_NAME='vue3',TEMPLATE_FILES=[{'source':'vite.config.ts','destination':'vite.config.ts'}];export function createVue3Files(c){copyTemplateFiles(TEMPLATE_NAME,TEMPLATE_FILES,c);}
1
+ import { copyTemplateFiles } from "../utils/template.js";
2
+ const TEMPLATE_NAME = "vue3";
3
+ const TEMPLATE_FILES = [
4
+ { source: "vite.config.ts", destination: "vite.config.ts" },
5
+ ];
6
+ export function createVue3Files(root) {
7
+ copyTemplateFiles(TEMPLATE_NAME, TEMPLATE_FILES, root);
8
+ }
package/dist/index.js CHANGED
@@ -1,2 +1,175 @@
1
1
  #!/usr/bin/env node
2
- const J=b;function a(){const M=['text','28464pDzSBf','11ANHDdl','\x22\x20isn\x27t\x20a\x20valid\x20template.\x20Please\x20choose\x20from\x20below:\x20','black','name','Current\x20directory','1460105ByoqdE','\x20commands','75928ugdNOe','93317sZoODw','Cancel\x20operation','580302PzuzBz','Project\x20name:','cancel','multiStepCommands','12vSyJBU','overwrite','1894660JBJSlr','6170664vJwYIT','Select\x20a\x20variant:','map','select','intro','3nvfyva','8IGJzap','slice','Ignore\x20files\x20and\x20continue','15lMpwPi','TARGET_DIR','replace','yes','help','template','includes','Target\x20directory\x20\x22'];a=function(){return M;};return a();}(function(i,j){const I=b,k=i();while(!![]){try{const l=parseInt(I(0x126))/0x1*(parseInt(I(0x12f))/0x2)+parseInt(I(0x122))/0x3*(parseInt(I(0x137))/0x4)+-parseInt(I(0x135))/0x5+-parseInt(I(0x13e))/0x6*(parseInt(I(0x138))/0x7)+parseInt(I(0x123))/0x8*(-parseInt(I(0x13a))/0x9)+-parseInt(I(0x140))/0xa*(parseInt(I(0x130))/0xb)+parseInt(I(0x11d))/0xc;if(l===j)break;else k['push'](k['shift']());}catch(m){k['push'](k['shift']());}}}(a,0x2a7e9));import c from'node:fs';import d from'node:path';import e from'cross-spawn';import f from'mri';import*as g from'@clack/prompts';import h from'picocolors';import{helpMessage}from'./config/help.js';import{FRAMEWORKS,TEMPLATES,defaultTargetDir}from'./config/frameworks.js';import{formatTargetDir,isValidPackageName,toValidPackageName,isEmpty,emptyDir,pkgFromUserAgent}from'./utils/file.js';import{getFullCustomCommand}from'./utils/package-manager.js';import{executeMultiStepCommands,createProjectFiles,generateSuccessMessage}from'./generators/project.js';import{generateTemplateProject}from'./generators/template.js';const argv=f(process['argv'][J(0x124)](0x2),{'alias':{'h':'help','t':J(0x12b)},'boolean':[J(0x12a),J(0x13f)],'string':[J(0x12b)]}),cwd=process['cwd']();function b(c,d){const e=a();return b=function(f,g){f=f-0x11d;let h=e[f];return h;},b(c,d);}async function init(){const K=J,i=argv['_'][0x0]?formatTargetDir(String(argv['_'][0x0])):undefined,j=argv['template'],k=argv['overwrite'],l=argv['help'];if(l){console['log'](helpMessage);return;}const m=pkgFromUserAgent(process['env']['npm_config_user_agent']),n=()=>g[K(0x13c)]('Operation\x20cancelled');g[K(0x121)](h['bgCyan'](h[K(0x132)]('\x20create-web\x20')));let o=i;if(!o){const w=await g[K(0x12e)]({'message':K(0x13b),'defaultValue':defaultTargetDir,'placeholder':defaultTargetDir,'validate':x=>{return x['length']===0x0||formatTargetDir(x)['length']>0x0?undefined:'Invalid\x20project\x20name';}});if(g['isCancel'](w))return n();o=formatTargetDir(w);}if(c['existsSync'](o)&&!isEmpty(o)){const x=k?'yes':await g['select']({'message':(o==='.'?K(0x134):K(0x12d)+o+'\x22')+'\x20is\x20not\x20empty.\x20Please\x20choose\x20how\x20to\x20proceed:','options':[{'label':K(0x139),'value':'no'},{'label':'Remove\x20existing\x20files\x20and\x20continue','value':K(0x129)},{'label':K(0x125),'value':'ignore'}]});if(g['isCancel'](x))return n();switch(x){case'yes':emptyDir(o);break;case'no':n();return;}}let p=d['basename'](d['resolve'](o));if(!isValidPackageName(p)){const y=await g['text']({'message':'Package\x20name:','defaultValue':toValidPackageName(p),'placeholder':toValidPackageName(p),'validate'(z){if(!isValidPackageName(z))return'Invalid\x20package.json\x20name';}});if(g['isCancel'](y))return n();p=y;}let q=j,r=![];j&&!TEMPLATES[K(0x12c)](j)&&(q=undefined,r=!![]);if(!q){const z=await g[K(0x120)]({'message':r?'\x22'+j+K(0x131):'Select\x20a\x20framework:','options':FRAMEWORKS['map'](B=>{const C=B['color'];return{'label':C(B['display']||B['name']),'value':B};})});if(g['isCancel'](z))return n();const A=await g['select']({'message':K(0x11e),'options':z['variants'][K(0x11f)](B=>{const L=K,C=B['color'],D=B['customCommand']?getFullCustomCommand(B['customCommand'],m)[L(0x128)](/ TARGET_DIR$/,''):B['multiStepCommands']?'Multi-step\x20setup:\x20'+B[L(0x13d)]['length']+L(0x136):undefined;return{'label':C(B['display']||B['name']),'value':B['name'],'hint':D};})});if(g['isCancel'](A))return n();q=A;}const s=d['join'](cwd,o),t=m?m[K(0x133)]:'npm',u=FRAMEWORKS['flatMap'](B=>B['variants'])['find'](B=>B[K(0x133)]===q);if(u?.['multiStepCommands']){await executeMultiStepCommands(u,o,s,cwd,m),createProjectFiles(q,s);const B=generateSuccessMessage(o,t);g['outro'](B);return;}const {customCommand:v}=u??{};if(v){const C=getFullCustomCommand(v,m),[D,...E]=C['split']('\x20'),F=E[K(0x11f)](H=>H[K(0x128)](K(0x127),()=>o)),{status:G}=e['sync'](D,F,{'stdio':'inherit'});process['exit'](G??0x0);}generateTemplateProject(q,s,p,t,cwd);}init()['catch'](i=>{console['error'](i);});
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import spawn from "cross-spawn";
5
+ import mri from "mri";
6
+ import * as prompts from "@clack/prompts";
7
+ import colors from "picocolors";
8
+ // Import configurations
9
+ import { helpMessage } from "./config/help.js";
10
+ import { FRAMEWORKS, TEMPLATES, defaultTargetDir, } from "./config/frameworks.js";
11
+ // Import utilities
12
+ import { formatTargetDir, isValidPackageName, toValidPackageName, isEmpty, emptyDir, pkgFromUserAgent, } from "./utils/file.js";
13
+ import { getFullCustomCommand } from "./utils/package-manager.js";
14
+ // Import generators
15
+ import { executeMultiStepCommands, createProjectFiles, generateSuccessMessage, } from "./generators/project.js";
16
+ import { generateTemplateProject } from "./generators/template.js";
17
+ const argv = mri(process.argv.slice(2), {
18
+ alias: { h: "help", t: "template" },
19
+ boolean: ["help", "overwrite"],
20
+ string: ["template"],
21
+ });
22
+ const cwd = process.cwd();
23
+ async function init() {
24
+ const argTargetDir = argv._[0]
25
+ ? formatTargetDir(String(argv._[0]))
26
+ : undefined;
27
+ const argTemplate = argv.template;
28
+ const argOverwrite = argv.overwrite;
29
+ const help = argv.help;
30
+ if (help) {
31
+ console.log(helpMessage);
32
+ return;
33
+ }
34
+ const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);
35
+ const cancel = () => prompts.cancel("Operation cancelled");
36
+ prompts.intro(colors.bgCyan(colors.black(" create-web ")));
37
+ // 1. Get project name and target dir
38
+ let targetDir = argTargetDir;
39
+ if (!targetDir) {
40
+ const projectName = await prompts.text({
41
+ message: "Project name:",
42
+ defaultValue: defaultTargetDir,
43
+ placeholder: defaultTargetDir,
44
+ validate: (value) => {
45
+ return value.length === 0 || formatTargetDir(value).length > 0
46
+ ? undefined
47
+ : "Invalid project name";
48
+ },
49
+ });
50
+ if (prompts.isCancel(projectName))
51
+ return cancel();
52
+ targetDir = formatTargetDir(projectName);
53
+ }
54
+ // 2. Handle directory if exist and not empty
55
+ if (fs.existsSync(targetDir) && !isEmpty(targetDir)) {
56
+ const overwrite = argOverwrite
57
+ ? "yes"
58
+ : await prompts.select({
59
+ message: (targetDir === "."
60
+ ? "Current directory"
61
+ : `Target directory "${targetDir}"`) +
62
+ ` is not empty. Please choose how to proceed:`,
63
+ options: [
64
+ {
65
+ label: "Cancel operation",
66
+ value: "no",
67
+ },
68
+ {
69
+ label: "Remove existing files and continue",
70
+ value: "yes",
71
+ },
72
+ {
73
+ label: "Ignore files and continue",
74
+ value: "ignore",
75
+ },
76
+ ],
77
+ });
78
+ if (prompts.isCancel(overwrite))
79
+ return cancel();
80
+ switch (overwrite) {
81
+ case "yes":
82
+ emptyDir(targetDir);
83
+ break;
84
+ case "no":
85
+ cancel();
86
+ return;
87
+ }
88
+ }
89
+ // 3. Get package name
90
+ let packageName = path.basename(path.resolve(targetDir));
91
+ if (!isValidPackageName(packageName)) {
92
+ const packageNameResult = await prompts.text({
93
+ message: "Package name:",
94
+ defaultValue: toValidPackageName(packageName),
95
+ placeholder: toValidPackageName(packageName),
96
+ validate(dir) {
97
+ if (!isValidPackageName(dir)) {
98
+ return "Invalid package.json name";
99
+ }
100
+ },
101
+ });
102
+ if (prompts.isCancel(packageNameResult))
103
+ return cancel();
104
+ packageName = packageNameResult;
105
+ }
106
+ // 4. Choose a framework and variant
107
+ let template = argTemplate;
108
+ let hasInvalidArgTemplate = false;
109
+ if (argTemplate && !TEMPLATES.includes(argTemplate)) {
110
+ template = undefined;
111
+ hasInvalidArgTemplate = true;
112
+ }
113
+ if (!template) {
114
+ const framework = (await prompts.select({
115
+ message: hasInvalidArgTemplate
116
+ ? `"${argTemplate}" isn't a valid template. Please choose from below: `
117
+ : "Select a framework:",
118
+ options: FRAMEWORKS.map((framework) => {
119
+ const frameworkColor = framework.color;
120
+ return {
121
+ label: frameworkColor(framework.display || framework.name),
122
+ value: framework,
123
+ };
124
+ }),
125
+ }));
126
+ if (prompts.isCancel(framework))
127
+ return cancel();
128
+ const variant = (await prompts.select({
129
+ message: "Select a variant:",
130
+ options: framework.variants.map((variant) => {
131
+ const variantColor = variant.color;
132
+ const command = variant.customCommand
133
+ ? getFullCustomCommand(variant.customCommand, pkgInfo).replace(/ TARGET_DIR$/, "")
134
+ : variant.multiStepCommands
135
+ ? `Multi-step setup: ${variant.multiStepCommands.length} commands`
136
+ : undefined;
137
+ return {
138
+ label: variantColor(variant.display || variant.name),
139
+ value: variant.name,
140
+ hint: command,
141
+ };
142
+ }),
143
+ }));
144
+ if (prompts.isCancel(variant))
145
+ return cancel();
146
+ template = variant;
147
+ }
148
+ const root = path.join(cwd, targetDir);
149
+ const pkgManager = pkgInfo ? pkgInfo.name : "npm";
150
+ const selectedVariant = FRAMEWORKS.flatMap((f) => f.variants).find((v) => v.name === template);
151
+ // Handle multi-step commands
152
+ if (selectedVariant?.multiStepCommands) {
153
+ await executeMultiStepCommands(selectedVariant, targetDir, root, cwd, pkgInfo);
154
+ createProjectFiles(template, root);
155
+ const successMessage = generateSuccessMessage(targetDir, pkgManager);
156
+ prompts.outro(successMessage);
157
+ return;
158
+ }
159
+ // Handle custom commands
160
+ const { customCommand } = selectedVariant ?? {};
161
+ if (customCommand) {
162
+ const fullCustomCommand = getFullCustomCommand(customCommand, pkgInfo);
163
+ const [command, ...args] = fullCustomCommand.split(" ");
164
+ const replacedArgs = args.map((arg) => arg.replace("TARGET_DIR", () => targetDir));
165
+ const { status } = spawn.sync(command, replacedArgs, {
166
+ stdio: "inherit",
167
+ });
168
+ process.exit(status ?? 0);
169
+ }
170
+ // Handle template-based projects
171
+ generateTemplateProject(template, root, packageName, pkgManager, cwd);
172
+ }
173
+ init().catch((e) => {
174
+ console.error(e);
175
+ });
@@ -1 +1 @@
1
- export{};
1
+ export {};
@@ -1 +1,62 @@
1
- (function(e,f){const j=b,g=e();while(!![]){try{const h=-parseInt(j(0x1d3))/0x1+parseInt(j(0x1da))/0x2+-parseInt(j(0x1d1))/0x3*(parseInt(j(0x1cd))/0x4)+-parseInt(j(0x1db))/0x5+-parseInt(j(0x1dd))/0x6+parseInt(j(0x1cf))/0x7+parseInt(j(0x1d0))/0x8*(parseInt(j(0x1d6))/0x9);if(h===f)break;else g['push'](g['shift']());}catch(i){g['push'](g['shift']());}}}(a,0xa59ab));import c from'node:fs';import d from'node:path';export function formatTargetDir(e){return e['trim']()['replace'](/\/+$/g,'');}function a(){const r=['split','2797479kKBKHB','trim','.git','statSync','513894kwJXSj','1622185ftXcFL','writeFileSync','6938274WJWrPo','replace','12LUPhIh','length','1620479qUuClI','56lPAgBB','462945ZpiWjM','mkdirSync','42185ojECuO','resolve'];a=function(){return r;};return a();}export function isValidPackageName(e){return/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/['test'](e);}export function toValidPackageName(e){const k=b;return e[k(0x1d7)]()['toLowerCase']()['replace'](/\s+/g,'-')[k(0x1de)](/^[._]/,'')['replace'](/[^a-z\d\-~]+/g,'-');}export function isEmpty(e){const l=b,f=c['readdirSync'](e);return f['length']===0x0||f[l(0x1ce)]===0x1&&f[0x0]===l(0x1d8);}export function emptyDir(e){const m=b;if(!c['existsSync'](e))return;for(const f of c['readdirSync'](e)){if(f==='.git')continue;c['rmSync'](d[m(0x1d4)](e,f),{'recursive':!![],'force':!![]});}}export function pkgFromUserAgent(e){const n=b;if(!e)return undefined;const f=e['split']('\x20')[0x0],g=f[n(0x1d5)]('/');return{'name':g[0x0],'version':g[0x1]};}export function editFile(e,f){const o=b,g=c['readFileSync'](e,'utf-8');c[o(0x1dc)](e,f(g),'utf-8');}function b(c,d){const e=a();return b=function(f,g){f=f-0x1cd;let h=e[f];return h;},b(c,d);}export function copy(e,f){const p=b,g=c[p(0x1d9)](e);g['isDirectory']()?copyDir(e,f):c['copyFileSync'](e,f);}export function copyDir(e,f){const q=b;c[q(0x1d2)](f,{'recursive':!![]});for(const g of c['readdirSync'](e)){const h=d[q(0x1d4)](e,g),i=d['resolve'](f,g);copy(h,i);}}
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function formatTargetDir(targetDir) {
4
+ return targetDir.trim().replace(/\/+$/g, "");
5
+ }
6
+ export function isValidPackageName(projectName) {
7
+ return /^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(projectName);
8
+ }
9
+ export function toValidPackageName(projectName) {
10
+ return projectName
11
+ .trim()
12
+ .toLowerCase()
13
+ .replace(/\s+/g, "-")
14
+ .replace(/^[._]/, "")
15
+ .replace(/[^a-z\d\-~]+/g, "-");
16
+ }
17
+ export function isEmpty(dirPath) {
18
+ const files = fs.readdirSync(dirPath);
19
+ return files.length === 0 || (files.length === 1 && files[0] === ".git");
20
+ }
21
+ export function emptyDir(dir) {
22
+ if (!fs.existsSync(dir)) {
23
+ return;
24
+ }
25
+ for (const file of fs.readdirSync(dir)) {
26
+ if (file === ".git") {
27
+ continue;
28
+ }
29
+ fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });
30
+ }
31
+ }
32
+ export function pkgFromUserAgent(userAgent) {
33
+ if (!userAgent)
34
+ return undefined;
35
+ const pkgSpec = userAgent.split(" ")[0];
36
+ const pkgSpecArr = pkgSpec.split("/");
37
+ return {
38
+ name: pkgSpecArr[0],
39
+ version: pkgSpecArr[1],
40
+ };
41
+ }
42
+ export function editFile(file, callback) {
43
+ const content = fs.readFileSync(file, "utf-8");
44
+ fs.writeFileSync(file, callback(content), "utf-8");
45
+ }
46
+ export function copy(src, dest) {
47
+ const stat = fs.statSync(src);
48
+ if (stat.isDirectory()) {
49
+ copyDir(src, dest);
50
+ }
51
+ else {
52
+ fs.copyFileSync(src, dest);
53
+ }
54
+ }
55
+ export function copyDir(srcDir, destDir) {
56
+ fs.mkdirSync(destDir, { recursive: true });
57
+ for (const file of fs.readdirSync(srcDir)) {
58
+ const srcFile = path.resolve(srcDir, file);
59
+ const destFile = path.resolve(destDir, file);
60
+ copy(srcFile, destFile);
61
+ }
62
+ }
@@ -1 +1,94 @@
1
- (function(c,d){const h=b,e=c();while(!![]){try{const f=-parseInt(h(0xdd))/0x1+parseInt(h(0xcf))/0x2+parseInt(h(0xdb))/0x3+parseInt(h(0xdf))/0x4*(parseInt(h(0xd4))/0x5)+parseInt(h(0xd3))/0x6+-parseInt(h(0xcd))/0x7+-parseInt(h(0xce))/0x8*(parseInt(h(0xcc))/0x9);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xd42ac));export function getFullCustomCommand(c,d){const i=b,e=d?d[i(0xdc)]:i(0xe1),f=e==='yarn'&&d?.['version']['startsWith']('1.');return c[i(0xd7)](/^npm create (?:-- )?/,()=>{const j=i;if(e===j(0xd9))return'bun\x20x\x20create-';if(e==='pnpm')return j(0xda);return c[j(0xd1)]('npm\x20create\x20--\x20')?e+'\x20create\x20--\x20':e+'\x20create\x20';})[i(0xd7)]('@latest',()=>f?'':'@latest')[i(0xd7)](/^npm exec/,()=>{const k=i;if(e==='pnpm')return'pnpm\x20dlx';if(e==='yarn'&&!f)return k(0xd2);if(e==='bun')return'bun\x20x';return'npm\x20exec';});}export function replacePackageManagerInCommand(c,d){const l=b,e=d?d['name']:'npm',f=e==='yarn'&&d?.['version']['startsWith']('1.');return c[l(0xd7)](/^pnpx\s/,()=>{const m=l;if(e===m(0xe0))return f?'npx\x20':'yarn\x20dlx\x20';if(e==='bun')return'bunx\x20';if(e==='npm')return'npx\x20';return'pnpx\x20';})['replace'](/^pnpm dlx\s/,()=>{const n=l;if(e===n(0xe0))return f?n(0xde):n(0xd5);if(e==='bun')return n(0xd8);if(e==='npm')return'npx\x20';return'pnpm\x20dlx\x20';})['replace'](/^pnpm add\s/,()=>{const o=l;if(e===o(0xe0))return'yarn\x20add\x20';if(e==='bun')return'bun\x20add\x20';if(e===o(0xe1))return o(0xd6);return o(0xd0);})['replace'](/^pnpm create\s/,()=>{const p=l;if(e===p(0xe0))return'yarn\x20create\x20';if(e==='bun')return'bun\x20create\x20';if(e==='npm')return'npm\x20create\x20';return'pnpm\x20create\x20';});}function b(c,d){const e=a();return b=function(f,g){f=f-0xcc;let h=e[f];return h;},b(c,d);}function a(){const q=['bun','pnpm\x20create\x20','3159156RptVHB','name','1301822FElyXp','npx\x20','892PxGhqS','yarn','npm','347211gLVqqB','6736240tGEoNf','264mnaPxy','2532770VqVCkO','pnpm\x20add\x20','startsWith','yarn\x20dlx','3795990tmdlVS','32605vkvWHO','yarn\x20dlx\x20','npm\x20install\x20','replace','bunx\x20'];a=function(){return q;};return a();}
1
+ export function getFullCustomCommand(customCommand, pkgInfo) {
2
+ const pkgManager = pkgInfo ? pkgInfo.name : "npm";
3
+ const isYarn1 = pkgManager === "yarn" && pkgInfo?.version.startsWith("1.");
4
+ return (customCommand
5
+ .replace(/^npm create (?:-- )?/, () => {
6
+ // `bun create` uses it's own set of templates,
7
+ // the closest alternative is using `bun x` directly on the package
8
+ if (pkgManager === "bun") {
9
+ return "bun x create-";
10
+ }
11
+ // pnpm doesn't support the -- syntax
12
+ if (pkgManager === "pnpm") {
13
+ return "pnpm create ";
14
+ }
15
+ // For other package managers, preserve the original format
16
+ return customCommand.startsWith("npm create -- ")
17
+ ? `${pkgManager} create -- `
18
+ : `${pkgManager} create `;
19
+ })
20
+ // Only Yarn 1.x doesn't support `@version` in the `create` command
21
+ .replace("@latest", () => (isYarn1 ? "" : "@latest"))
22
+ .replace(/^npm exec/, () => {
23
+ // Prefer `pnpm dlx`, `yarn dlx`, or `bun x`
24
+ if (pkgManager === "pnpm") {
25
+ return "pnpm dlx";
26
+ }
27
+ if (pkgManager === "yarn" && !isYarn1) {
28
+ return "yarn dlx";
29
+ }
30
+ if (pkgManager === "bun") {
31
+ return "bun x";
32
+ }
33
+ // Use `npm exec` in all other cases,
34
+ // including Yarn 1.x and other custom npm clients.
35
+ return "npm exec";
36
+ }));
37
+ }
38
+ export function replacePackageManagerInCommand(command, pkgInfo) {
39
+ const pkgManager = pkgInfo ? pkgInfo.name : "npm";
40
+ const isYarn1 = pkgManager === "yarn" && pkgInfo?.version.startsWith("1.");
41
+ return (command
42
+ // Replace pnpx/npx with appropriate package manager
43
+ .replace(/^pnpx\s/, () => {
44
+ if (pkgManager === "yarn") {
45
+ return isYarn1 ? "npx " : "yarn dlx ";
46
+ }
47
+ if (pkgManager === "bun") {
48
+ return "bunx ";
49
+ }
50
+ if (pkgManager === "npm") {
51
+ return "npx ";
52
+ }
53
+ return "pnpx ";
54
+ })
55
+ // Replace pnpm dlx with appropriate package manager
56
+ .replace(/^pnpm dlx\s/, () => {
57
+ if (pkgManager === "yarn") {
58
+ return isYarn1 ? "npx " : "yarn dlx ";
59
+ }
60
+ if (pkgManager === "bun") {
61
+ return "bunx ";
62
+ }
63
+ if (pkgManager === "npm") {
64
+ return "npx ";
65
+ }
66
+ return "pnpm dlx ";
67
+ })
68
+ // Replace pnpm add with appropriate package manager
69
+ .replace(/^pnpm add\s/, () => {
70
+ if (pkgManager === "yarn") {
71
+ return "yarn add ";
72
+ }
73
+ if (pkgManager === "bun") {
74
+ return "bun add ";
75
+ }
76
+ if (pkgManager === "npm") {
77
+ return "npm install ";
78
+ }
79
+ return "pnpm add ";
80
+ })
81
+ // Replace pnpm create with appropriate package manager
82
+ .replace(/^pnpm create\s/, () => {
83
+ if (pkgManager === "yarn") {
84
+ return "yarn create ";
85
+ }
86
+ if (pkgManager === "bun") {
87
+ return "bun create ";
88
+ }
89
+ if (pkgManager === "npm") {
90
+ return "npm create ";
91
+ }
92
+ return "pnpm create ";
93
+ }));
94
+ }
@@ -1 +1,41 @@
1
- (function(e,f){const o=b,g=e();while(!![]){try{const h=parseInt(o(0xef))/0x1+parseInt(o(0xea))/0x2+parseInt(o(0xf2))/0x3*(-parseInt(o(0xf5))/0x4)+-parseInt(o(0xeb))/0x5+-parseInt(o(0xee))/0x6+-parseInt(o(0xf7))/0x7+parseInt(o(0xe9))/0x8*(parseInt(o(0xf0))/0x9);if(h===f)break;else g['push'](g['shift']());}catch(i){g['push'](g['shift']());}}}(a,0xd325a));import c from'node:fs';import d from'node:path';import{fileURLToPath}from'node:url';const __filename=fileURLToPath(import.meta['url']),__dirname=d['dirname'](__filename);function a(){const r=['26615144IBQnZO','2951894BOWqOd','3865840KKFOgh','join','dirname','9237240oeqMGF','301798UqxYdP','9CwRzIr','utf-8','39jQYCXs','existsSync','Template\x20file\x20not\x20found:\x20','133292eeDbHc','source','10457111DzSYra'];a=function(){return r;};return a();}export function getTemplatePath(e){return d['join'](__dirname,'../templates',e);}function b(c,d){const e=a();return b=function(f,g){f=f-0xe9;let h=e[f];return h;},b(c,d);}export function readTemplateFile(e,f){const p=b,g=d[p(0xec)](e,f);if(!c['existsSync'](g))throw new Error(p(0xf4)+g);return c['readFileSync'](g,p(0xf1));}export function copyTemplateFiles(e,f,g){const q=b,h=getTemplatePath(e);for(const i of f){try{const j=readTemplateFile(h,i[q(0xf6)]),k=d['join'](g,i['destination']),l=d[q(0xed)](k);!c[q(0xf3)](l)&&c['mkdirSync'](l,{'recursive':!![]});if(i['isJson']){const m=JSON['parse'](j);c['writeFileSync'](k,JSON['stringify'](m,null,0x2));}else c['writeFileSync'](k,j);}catch(n){console['error']('Error\x20copying\x20template\x20file\x20'+i['source']+':',n);throw n;}}}
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ export function getTemplatePath(template) {
7
+ return path.join(__dirname, "../templates", template);
8
+ }
9
+ export function readTemplateFile(templatePath, fileName) {
10
+ const filePath = path.join(templatePath, fileName);
11
+ if (!fs.existsSync(filePath)) {
12
+ throw new Error(`Template file not found: ${filePath}`);
13
+ }
14
+ return fs.readFileSync(filePath, "utf-8");
15
+ }
16
+ export function copyTemplateFiles(templateName, files, targetRoot) {
17
+ const templatePath = getTemplatePath(templateName);
18
+ for (const file of files) {
19
+ try {
20
+ const content = readTemplateFile(templatePath, file.source);
21
+ const targetPath = path.join(targetRoot, file.destination);
22
+ // Ensure target directory exists
23
+ const targetDir = path.dirname(targetPath);
24
+ if (!fs.existsSync(targetDir)) {
25
+ fs.mkdirSync(targetDir, { recursive: true });
26
+ }
27
+ if (file.isJson) {
28
+ // Pretty print JSON files
29
+ const jsonContent = JSON.parse(content);
30
+ fs.writeFileSync(targetPath, JSON.stringify(jsonContent, null, 2));
31
+ }
32
+ else {
33
+ fs.writeFileSync(targetPath, content);
34
+ }
35
+ }
36
+ catch (error) {
37
+ console.error(`Error copying template file ${file.source}:`, error);
38
+ throw error;
39
+ }
40
+ }
41
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-web-kit",
3
- "version": "25.0728.0953",
3
+ "version": "25.0728.1412",
4
4
  "description": "A powerful scaffolding tool for creating modern frontend projects with Vue, Next.js, and Electron templates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,13 +13,9 @@
13
13
  "node": "^18.0.0 || >=20.0.0"
14
14
  },
15
15
  "scripts": {
16
- "build": "tsc -d --outDir temp-dist && node scripts/copy-templates.mjs && node scripts/obfuscate.mjs",
17
- "dev": "tsc --watch",
18
- "start": "node dist/index.js",
19
- "test": "node dist/index.js --help",
20
- "prepublishOnly": "npm run build",
21
- "prepack": "node scripts/pre-publish.mjs",
22
- "clean": "rm -rf dist temp-dist"
16
+ "build": "tsc -d --outDir dist",
17
+ "dev": "pnpx tsx src/index.ts",
18
+ "start": "node dist/index.js"
23
19
  },
24
20
  "keywords": [
25
21
  "scaffolding",
@@ -51,10 +47,8 @@
51
47
  },
52
48
  "devDependencies": {
53
49
  "@types/cross-spawn": "^6.0.6",
54
- "@types/javascript-obfuscator": "^0.17.0",
55
50
  "@types/mri": "^1.1.5",
56
51
  "@types/node": "^20.0.0",
57
- "javascript-obfuscator": "^4.1.1",
58
52
  "typescript": "^5.0.0"
59
53
  }
60
54
  }
@@ -1,256 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
-
4
- <head>
5
- <meta charset="UTF-8" />
6
- <title>请升级您的浏览器</title>
7
- <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
8
- <meta name="renderer" content="webkit">
9
- <base target="_blank" />
10
- <style type="text/css">
11
- html,
12
- body,
13
- div,
14
- span,
15
- applet,
16
- object,
17
- iframe,
18
- h1,
19
- h2,
20
- h3,
21
- h4,
22
- h5,
23
- h6,
24
- p,
25
- blockquote,
26
- pre,
27
- a,
28
- abbr,
29
- acronym,
30
- address,
31
- big,
32
- cite,
33
- code,
34
- del,
35
- dfn,
36
- em,
37
- img,
38
- ins,
39
- kbd,
40
- q,
41
- s,
42
- samp,
43
- small,
44
- strike,
45
- strong,
46
- sub,
47
- sup,
48
- tt,
49
- var,
50
- b,
51
- u,
52
- i,
53
- center,
54
- dl,
55
- dt,
56
- dd,
57
- ol,
58
- ul,
59
- li,
60
- fieldset,
61
- form,
62
- label,
63
- legend,
64
- table,
65
- caption,
66
- tbody,
67
- tfoot,
68
- thead,
69
- tr,
70
- th,
71
- td,
72
- article,
73
- aside,
74
- canvas,
75
- details,
76
- embed,
77
- figure,
78
- figcaption,
79
- footer,
80
- header,
81
- hgroup,
82
- menu,
83
- nav,
84
- output,
85
- ruby,
86
- section,
87
- summary,
88
- time,
89
- mark,
90
- audio,
91
- video {
92
- border: 0;
93
- font-size: 100%;
94
- font: inherit;
95
- vertical-align: baseline;
96
- margin: 0;
97
- padding: 0
98
- }
99
-
100
- article,
101
- aside,
102
- details,
103
- figcaption,
104
- figure,
105
- footer,
106
- header,
107
- hgroup,
108
- menu,
109
- nav,
110
- section {
111
- display: block
112
- }
113
-
114
- body {
115
- line-height: 1
116
- }
117
-
118
- ol,
119
- ul {
120
- list-style: none
121
- }
122
-
123
- blockquote,
124
- q {
125
- quotes: none
126
- }
127
-
128
- blockquote:before,
129
- blockquote:after,
130
- q:before,
131
- q:after {
132
- content: none
133
- }
134
-
135
- table {
136
- border-collapse: collapse;
137
- border-spacing: 0
138
- }
139
-
140
- a {
141
- text-decoration: none;
142
- color: #0072c6;
143
- }
144
-
145
- a:hover {
146
- text-decoration: none;
147
- color: #004d8c;
148
- }
149
-
150
- body {
151
- width: 960px;
152
- margin: 0 auto;
153
- padding: 10px;
154
- font-size: 14px;
155
- line-height: 24px;
156
- color: #454545;
157
- font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', DengXian, SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif;
158
- overflow-y: scroll
159
- }
160
-
161
- h1 {
162
- font-size: 40px;
163
- line-height: 80px;
164
- font-weight: 100;
165
- margin-bottom: 10px;
166
- }
167
-
168
- h2 {
169
- font-size: 20px;
170
- line-height: 25px;
171
- font-weight: 100;
172
- margin: 10px 0;
173
- }
174
-
175
- em {
176
- color: red
177
- }
178
-
179
- p {
180
- margin-bottom: 10px;
181
- }
182
-
183
- hr {
184
- margin: 20px 0;
185
- border: 0;
186
- border-top: 1px solid #dadada
187
- }
188
-
189
- span {
190
- display: block;
191
- font-size: 12px;
192
- line-height: 12px;
193
- }
194
-
195
- .clean {
196
- clear: both;
197
- }
198
-
199
- .browser {
200
- padding: 10px 10px;
201
- }
202
-
203
- .browser li {
204
- width: auto;
205
- padding: 0 80px;
206
- margin-top: 30px;
207
- height: 34px;
208
- line-height: 22px;
209
- float: left;
210
- list-style: none;
211
- background: url(data:image/png;base64,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) no-repeat;
212
- padding-left: 40px
213
- }
214
-
215
- .browser .browser-firefox {
216
- background-position: 0 -34px
217
- }
218
-
219
- .browser .browser-ie {
220
- background-position: 0 -68px;
221
- margin-left: 0px
222
- }
223
-
224
- .browser .browser-360 {
225
- background-position: 0 -170px;
226
- margin-left: -27px
227
- }
228
- </style>
229
- </head>
230
-
231
- <body style="margin-top:50px">
232
- <h1>请升级您的浏览器,以便我们更好的为您提供服务!</h1>
233
- <p>您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。</p>
234
- <hr>
235
- <h2>请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束</h2>
236
- <p>自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11
237
- 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 <a
238
- href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support">微软对 Internet Explorer 早期版本的支持将于
239
- 2016 年 1 月 12 日结束的说明</a> 。</p>
240
- <hr>
241
- <h2>您可以选择更先进的浏览器</h2>
242
- <p>推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。</p>
243
- <ul class="browser">
244
- <li class="browser-chrome"><a
245
- href="https://www.google.cn/chrome/browser/desktop/index.html?hl=zh-CN&standalone=1"> 谷歌浏览器<span>Google
246
- Chrome</span></a></li>
247
- <li class="browser-firefox"><a href="https://www.mozilla.org/zh-CN/firefox/new/"> 火狐浏览器<span>Mozilla
248
- Firefox</span></a></li>
249
- <li class="browser-ie"><a href="https://windows.microsoft.com/zh-cn/internet-explorer/download-ie"> IE 11
250
- 浏览器<span>Internet Explorer</span></a></li>
251
- <div class="clean"></div>
252
- </ul>
253
- <hr>
254
- </body>
255
-
256
- </html>
@@ -1 +0,0 @@
1
- function a(){var j=['error','5Qliuti','2413588xaGfMS','1409580NJGgDt','@electron-toolkit/eslint-config-ts','warn','2YRlauA','576SJTueq','4909116oAiaMN','506852kJpARC','2300yEUocY','4022514hEfkgO','121GNRhCE','98847FjMpDJ','16227TNSZBr'];a=function(){return j;};return a();}var i=b;function b(c,d){var e=a();return b=function(f,g){f=f-0x17a;var h=e[f];return h;},b(c,d);}(function(c,d){var h=b,e=c();while(!![]){try{var f=parseInt(h(0x187))/0x1*(-parseInt(h(0x17b))/0x2)+-parseInt(h(0x17d))/0x3+-parseInt(h(0x183))/0x4*(parseInt(h(0x182))/0x5)+parseInt(h(0x184))/0x6+parseInt(h(0x17f))/0x7*(-parseInt(h(0x188))/0x8)+parseInt(h(0x180))/0x9*(-parseInt(h(0x17c))/0xa)+parseInt(h(0x17e))/0xb*(parseInt(h(0x17a))/0xc);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xd01f0),module['exports']={'extends':['electron',i(0x185),'prettier'],'rules':{'@typescript-eslint/no-unused-vars':i(0x181),'@typescript-eslint/no-explicit-any':i(0x186)}});
@@ -1 +0,0 @@
1
- function b(c,d){var e=a();return b=function(f,g){f=f-0x1e3;var h=e[f];return h;},b(c,d);}var i=b;(function(c,d){var h=b,e=c();while(!![]){try{var f=-parseInt(h(0x1e3))/0x1+parseInt(h(0x1e8))/0x2*(-parseInt(h(0x1e4))/0x3)+-parseInt(h(0x1eb))/0x4*(-parseInt(h(0x1ee))/0x5)+parseInt(h(0x1ec))/0x6*(-parseInt(h(0x1e5))/0x7)+-parseInt(h(0x1e7))/0x8*(parseInt(h(0x1e9))/0x9)+-parseInt(h(0x1ef))/0xa+-parseInt(h(0x1e6))/0xb*(-parseInt(h(0x1ea))/0xc);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xf265e),module['exports']={'extends':['electron','@electron-toolkit/eslint-config-ts',i(0x1ed)],'rules':{'@typescript-eslint/no-unused-vars':i(0x1f0),'@typescript-eslint/no-explicit-any':'warn'}});function a(){var j=['609099yjugVa','7iZgJgE','36714469XNjEoD','16XdmdlD','14rauSmG','1321929kYBgCq','12DMkopf','456pgIuJm','565602lwnetD','prettier','48030TiCCCO','7747310oQsGPx','error','855910Ilhzly'];a=function(){return j;};return a();}
@@ -1,20 +0,0 @@
1
- "use client";
2
-
3
- import { useEffect } from "react";
4
-
5
- import pkg from "../../package.json";
6
-
7
- export default function BuildInfo() {
8
- useEffect(() => {
9
- const print = (key: string, value: string) =>
10
- console.log(
11
- `%c ${key} %c ${value} %c `,
12
- "background:#20232a ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff",
13
- "background:#61dafb ;padding: 1px; border-radius: 0 3px 3px 0; color: #20232a; font-weight: bold;",
14
- "background:transparent"
15
- );
16
- print(pkg.name, pkg.version);
17
- print("build time", `${process.env.NEXT_PUBLIC_BUILD_TIME}`);
18
- }, []);
19
- return null;
20
- }
@@ -1,32 +0,0 @@
1
- {
2
- "name": "node:v22.9.0",
3
- "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
4
- "customizations": {
5
- "vscode": {
6
- "extensions": [
7
- "bradlc.vscode-tailwindcss",
8
- "esbenp.prettier-vscode",
9
- "dbaeumer.vscode-eslint",
10
- "ms-vscode.js-debug",
11
- "yoavbls.pretty-ts-errors",
12
- "github.vscode-github-actions"
13
- ]
14
- }
15
- },
16
- "remoteUser": "node",
17
- "mounts": [
18
- "source=${localEnv:HOME}/.ssh,target=/home/node/.ssh,type=bind,readonly",
19
- "source=/etc/localtime,target=/etc/localtime,type=bind",
20
- "source=/etc/timezone,target=/etc/timezone,type=bind"
21
- ],
22
- "remoteEnv": {
23
- "SSH_AUTH_SOCK": "/ssh-agent",
24
- "TZ": "Asia/Shanghai"
25
- },
26
- "initializeCommand": "mkdir -p ${localEnv:HOME}/.ssh",
27
- "runArgs": [
28
- "--volume=/run/host-services/ssh-auth.sock:/ssh-agent",
29
- "--network=host",
30
- "--privileged"
31
- ]
32
- }
@@ -1 +0,0 @@
1
- function b(c,d){var e=a();return b=function(f,g){f=f-0x1c7;var h=e[f];return h;},b(c,d);}var i=b;(function(c,d){var h=b,e=c();while(!![]){try{var f=parseInt(h(0x1cf))/0x1*(parseInt(h(0x1c9))/0x2)+-parseInt(h(0x1d2))/0x3*(parseInt(h(0x1ca))/0x4)+-parseInt(h(0x1d3))/0x5+parseInt(h(0x1c7))/0x6*(-parseInt(h(0x1d0))/0x7)+parseInt(h(0x1cd))/0x8*(-parseInt(h(0x1c8))/0x9)+parseInt(h(0x1cc))/0xa*(-parseInt(h(0x1ce))/0xb)+parseInt(h(0x1cb))/0xc;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x71abe),module['exports']={'extends':[i(0x1d1),'prettier']});function a(){var j=['3854050NuuTwF','1383198ymbVXD','18GTFHQT','26292GsLorK','143656hTQVSL','25155036ygxnxt','170LYHiPN','5848ExhhYJ','227623tnYkDE','2TANOPc','14CWdhqW','next/core-web-vitals','6EUZCrt'];a=function(){return j;};return a();}
@@ -1,46 +0,0 @@
1
- import type { Metadata } from "next";
2
- import { Inter } from "next/font/google";
3
- import "./globals.css";
4
-
5
- const inter = Inter({ subsets: ["latin"] });
6
-
7
- export const metadata: Metadata = {
8
- title: "Create Next App",
9
- description: "Generated by create next app",
10
- };
11
-
12
- export default function RootLayout({
13
- children,
14
- }: {
15
- children: React.ReactNode;
16
- }) {
17
- return (
18
- <html lang="en" suppressHydrationWarning>
19
- <head>
20
- <meta httpEquiv="X-UA-Compatible" content="IE=edge,chrome=1" />
21
- <meta name="renderer" content="webkit" />
22
- <meta
23
- name="viewport"
24
- content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
25
- />
26
- {/* eslint-disable-next-line @next/next/no-before-interactive-script-outside-document */}
27
- <script
28
- dangerouslySetInnerHTML={{
29
- __html: `
30
- (function() {
31
- var isIE = /MSIE|Trident/.test(navigator.userAgent);
32
- var isOldIE = /MSIE [1-9]\\.|MSIE 10\\./.test(navigator.userAgent);
33
- if (isOldIE) {
34
- window.location.href = '/ie.html';
35
- }
36
- })();
37
- `,
38
- }}
39
- />
40
- </head>
41
- <body className={inter.className} suppressHydrationWarning>
42
- {children}
43
- </body>
44
- </html>
45
- );
46
- }
@@ -1 +0,0 @@
1
- const j=b;(function(c,d){const h=b,e=c();while(!![]){try{const f=parseInt(h(0xd0))/0x1+-parseInt(h(0xda))/0x2*(parseInt(h(0xd6))/0x3)+parseInt(h(0xd5))/0x4+parseInt(h(0xd4))/0x5+parseInt(h(0xd2))/0x6*(parseInt(h(0xd7))/0x7)+-parseInt(h(0xcd))/0x8+-parseInt(h(0xce))/0x9*(parseInt(h(0xd1))/0xa);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xb1f1b));import{format}from'date-fns';const nextConfig={},proxy=async()=>{const i=b;return[{'source':'/api/:path*','destination':i(0xdb)}];};switch(process[j(0xd8)]['NODE_ENV']){case j(0xcf):nextConfig[j(0xd3)]='export',nextConfig['images']={},nextConfig['images']['unoptimized']=!![],nextConfig['distDir']='dist';break;case'development':nextConfig['rewrites']=proxy;break;}process['env'][j(0xd9)]=format(new Date(),'yyyy-MM-dd\x20HH:mm');function b(c,d){const e=a();return b=function(f,g){f=f-0xcd;let h=e[f];return h;},b(c,d);}export default nextConfig;function a(){const k=['1779960UjRIza','63849gPVWTi','2069053BtpThL','env','NEXT_PUBLIC_BUILD_TIME','114SqHVXB','http://localhost:8000/api/:path*','241728OCxWvH','45lxaPrF','production','1218817iSkBYk','1067810KBoPZX','12OjfYxq','output','1255730nxyrCr'];a=function(){return k;};return a();}
@@ -1,16 +0,0 @@
1
- import Link from "next/link";
2
-
3
- export default function NotFound() {
4
- return (
5
- <div className="flex min-h-screen flex-col items-center justify-center">
6
- <h2 className="text-2xl font-bold">页面未找到</h2>
7
- <p className="mt-4 text-gray-600">抱歉,您访问的页面不存在。</p>
8
- <Link
9
- href="/"
10
- className="mt-6 rounded bg-blue-500 px-4 py-2 text-white hover:bg-blue-600"
11
- >
12
- 返回首页
13
- </Link>
14
- </div>
15
- );
16
- }
@@ -1,21 +0,0 @@
1
- {
2
- "semi": true,
3
- "trailingComma": "all",
4
- "singleQuote": true,
5
- "printWidth": 80,
6
- "tabWidth": 2,
7
- "useTabs": false,
8
- "importOrder": [
9
- "^@core/(.*)$",
10
- "^@server/(.*)$",
11
- "^@ui/(.*)$",
12
- "^[./]"
13
- ],
14
- "importOrderSeparation": true,
15
- "importOrderSortSpecifiers": true,
16
- "endOfLine": "auto",
17
- "plugins": [
18
- "prettier-plugin-tailwindcss",
19
- "@trivago/prettier-plugin-sort-imports"
20
- ]
21
- }
@@ -1,45 +0,0 @@
1
- "use client";
2
-
3
- import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
- import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
5
- import { useState } from "react";
6
-
7
- export function QueryProvider({ children }: { children: React.ReactNode }) {
8
- const [queryClient] = useState(
9
- () =>
10
- new QueryClient({
11
- defaultOptions: {
12
- queries: {
13
- // 数据缓存时间 (默认 5 分钟)
14
- staleTime: 5 * 60 * 1000,
15
- // 数据在内存中的缓存时间 (默认 5 分钟)
16
- gcTime: 5 * 60 * 1000,
17
- // 重试次数
18
- retry: 3,
19
- // 重试延迟
20
- retryDelay: (attemptIndex) =>
21
- Math.min(1000 * 2 ** attemptIndex, 30000),
22
- // 窗口重新获得焦点时是否重新获取数据
23
- refetchOnWindowFocus: false,
24
- // 网络重新连接时是否重新获取数据
25
- refetchOnReconnect: true,
26
- },
27
- mutations: {
28
- // 重试次数
29
- retry: 1,
30
- // 重试延迟
31
- retryDelay: 1000,
32
- },
33
- },
34
- })
35
- );
36
-
37
- return (
38
- <QueryClientProvider client={queryClient}>
39
- {children}
40
- {/* {process.env.NODE_ENV === 'development' && (
41
- <ReactQueryDevtools initialIsOpen={false} />
42
- )} */}
43
- </QueryClientProvider>
44
- );
45
- }
@@ -1,204 +0,0 @@
1
- /**
2
- * HTTP 请求类封装(强类型,无 any)
3
- * 配合 React Query 使用,简化超时和重试逻辑
4
- */
5
-
6
- import { toast } from "sonner";
7
-
8
- interface RequestConfig {
9
- baseURL?: string;
10
- headers?: Record<string, string>;
11
- }
12
-
13
- interface RequestOptions extends RequestInit {
14
- params?: Record<string, string | number | boolean>;
15
- data?: unknown; // 用于传递请求体
16
- }
17
-
18
- interface ApiResponse<T> {
19
- data: T;
20
- status?: number;
21
- ok?: boolean;
22
- code?: number; // 后端业务状态码
23
- msg?: string | null; // 后端消息
24
- }
25
-
26
- // 后端 API 响应结构
27
- interface BackendResponse<T> {
28
- code: number;
29
- msg: string | null;
30
- data: T;
31
- }
32
-
33
- export class HttpClient {
34
- private baseURL: string;
35
- private defaultHeaders: Record<string, string>;
36
-
37
- constructor(config: RequestConfig = {}) {
38
- this.baseURL = config.baseURL || "";
39
- this.defaultHeaders = {
40
- "Content-Type": "application/json",
41
- ...config.headers,
42
- };
43
- }
44
- updateToken(token: string) {
45
- // this.defaultHeaders['Authorization'] = `Bearer ${token}`;
46
- this.defaultHeaders["token"] = `${token}`;
47
- }
48
-
49
- private buildURL(url: string, params?: Record<string, unknown>): string {
50
- let fullURL = url.startsWith("http") ? url : `${this.baseURL}${url}`;
51
-
52
- if (params) {
53
- const searchParams = new URLSearchParams();
54
- Object.entries(params).forEach(([key, value]) => {
55
- if (value !== null && value !== undefined) {
56
- searchParams.append(key, String(value));
57
- }
58
- });
59
- const paramString = searchParams.toString();
60
- if (paramString) {
61
- fullURL += `${fullURL.includes("?") ? "&" : "?"}${paramString}`;
62
- }
63
- }
64
-
65
- return fullURL;
66
- }
67
-
68
- async request<T>(
69
- url: string,
70
- options: RequestOptions = {}
71
- ): Promise<ApiResponse<T>> {
72
- const { params, data, ...fetchOptions } = options;
73
-
74
- const fullURL = this.buildURL(url, params);
75
-
76
- const headers: HeadersInit = {
77
- ...this.defaultHeaders,
78
- ...(fetchOptions.headers || {}),
79
- };
80
-
81
- let body = fetchOptions.body;
82
-
83
- // 如果提供了 data,优先使用
84
- if (data !== undefined) {
85
- if (data instanceof FormData) {
86
- body = data;
87
- Reflect.deleteProperty(headers, "Content-Type"); // FormData 不需要手动设置 Content-Type
88
- } else {
89
- body = JSON.stringify(data);
90
- }
91
- }
92
- try {
93
- const response = await fetch(fullURL, {
94
- ...fetchOptions,
95
- headers,
96
- body,
97
- });
98
- const contentType = response.headers.get("content-type");
99
- let responseData: T;
100
- if (contentType?.includes("application/json")) {
101
- const jsonResponse: BackendResponse<T> = await response.json();
102
- if (jsonResponse.code == 401) {
103
- // 清除本地存储
104
- localStorage.clear();
105
-
106
- // 退出用户状态
107
- if (typeof window !== "undefined") {
108
- // 动态导入store避免循环依赖
109
- import("@/store")
110
- .then(({ useStore }) => {
111
- const { logout, openLoginDialog } = useStore.getState();
112
- logout();
113
- openLoginDialog();
114
- })
115
- .catch(console.error);
116
- }
117
-
118
- toast.error("登录信息已过期,请重新登录");
119
- }
120
- return jsonResponse;
121
- } else if (contentType?.startsWith("text/")) {
122
- responseData = (await response.text()) as T;
123
- } else {
124
- responseData = (await response.blob()) as T;
125
- }
126
-
127
- return {
128
- data: responseData,
129
- status: response.status,
130
- ok: response.ok,
131
- };
132
- } catch (error: unknown) {
133
- if (error instanceof Error) {
134
- throw new Error(error.message);
135
- }
136
- throw new Error("网络请求失败");
137
- }
138
- }
139
-
140
- // GET 请求
141
- get<T>(
142
- url: string,
143
- params?: Record<string, string | number | boolean>,
144
- options?: Omit<RequestOptions, "params">
145
- ) {
146
- return this.request<T>(url, { ...options, method: "GET", params });
147
- }
148
-
149
- // POST 请求
150
- post<T = unknown, B = unknown>(
151
- url: string,
152
- data?: B,
153
- options?: Omit<RequestOptions, "data">
154
- ) {
155
- return this.request<T>(url, { ...options, method: "POST", data });
156
- }
157
-
158
- // PUT 请求
159
- put<T = unknown, B = unknown>(
160
- url: string,
161
- data?: B,
162
- options?: Omit<RequestOptions, "data">
163
- ) {
164
- return this.request<T>(url, { ...options, method: "PUT", data });
165
- }
166
-
167
- // PATCH 请求
168
- patch<T = unknown, B = unknown>(
169
- url: string,
170
- data?: B,
171
- options?: Omit<RequestOptions, "data">
172
- ) {
173
- return this.request<T>(url, { ...options, method: "PATCH", data });
174
- }
175
-
176
- // DELETE 请求
177
- delete<T = unknown>(url: string, options?: RequestOptions) {
178
- return this.request<T>(url, { ...options, method: "DELETE" });
179
- }
180
-
181
- // 上传文件
182
- upload<T = unknown>(
183
- url: string,
184
- formData: FormData,
185
- options?: Omit<RequestOptions, "data" | "body">
186
- ) {
187
- return this.request<T>(url, { ...options, method: "POST", data: formData });
188
- }
189
- }
190
-
191
- // 创建默认实例
192
- export const http = new HttpClient({
193
- baseURL: `${process.env.NEXT_PUBLIC_API_URL || "/api"}`,
194
- });
195
-
196
- // 快捷导出函数
197
- export const get = http.get.bind(http);
198
- export const post = http.post.bind(http);
199
- export const put = http.put.bind(http);
200
- export const patch = http.patch.bind(http);
201
- export const del = http.delete.bind(http);
202
- export const upload = http.upload.bind(http);
203
-
204
- export default http;
@@ -1,12 +0,0 @@
1
- interface ShowProps {
2
- when: boolean;
3
- fallback?: React.ReactNode;
4
- }
5
-
6
- export default function Show({
7
- children,
8
- when,
9
- fallback = null,
10
- }: React.PropsWithChildren<ShowProps>) {
11
- return when ? children : fallback;
12
- }
@@ -1,17 +0,0 @@
1
- "use client";
2
-
3
- import { ThemeProvider as NextThemesProvider } from "next-themes";
4
- import * as React from "react";
5
-
6
- export function ThemeProvider({ children }: React.PropsWithChildren) {
7
- return (
8
- <NextThemesProvider
9
- attribute="class"
10
- defaultTheme="system"
11
- enableSystem
12
- disableTransitionOnChange
13
- >
14
- {children}
15
- </NextThemesProvider>
16
- );
17
- }
@@ -1,12 +0,0 @@
1
- import { defineConfig } from "vite";
2
- import vue from "@vitejs/plugin-vue";
3
- import { resolve } from "path";
4
-
5
- export default defineConfig({
6
- plugins: [vue()],
7
- resolve: {
8
- alias: {
9
- "@": resolve(__dirname, "src"),
10
- },
11
- },
12
- });