@junojs/core 0.1.1 → 0.1.3

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/dist/cli.cjs CHANGED
@@ -1,7 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";const j=require("fs"),S=require("path");function d(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s.get?s:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const r=d(j),n=d(S),i=process.argv.slice(2),$=i[0];switch($){case"new":h(i[1]);break;case"generate":case"g":y(i[1],i[2]);break;case"manifest":k();break;default:O()}function h(e){e||(console.error("Usage: juno new <project-name>"),process.exit(1));const t=n.resolve(process.cwd(),e);r.existsSync(t)&&(console.error(`Directory "${e}" already exists.`),process.exit(1)),console.log(`
3
- ⚡ Creating JunoJS project: ${e}
4
- `);const o=["","src","src/core","src/common","src/components","src/services"];for(const s of o)r.mkdirSync(n.join(t,s),{recursive:!0});c(t,"package.json",JSON.stringify({name:e,version:"0.1.0",private:!0,type:"module",scripts:{dev:"vite",build:"tsc && vite build",preview:"vite preview",types:"ts-node scripts/meta-compiler.ts"},dependencies:{"@junojs/core":"^0.1.0","reflect-metadata":"^0.2.1"},devDependencies:{typescript:"^5.2.2",vite:"^5.4.0","ts-node":"^10.9.0"}},null,2)),c(t,"tsconfig.json",JSON.stringify({compilerOptions:{target:"ESNext",module:"ESNext",experimentalDecorators:!0,emitDecoratorMetadata:!0,moduleResolution:"bundler",strict:!0,outDir:"dist",lib:["ESNext","DOM","DOM.Iterable"],skipLibCheck:!0,esModuleInterop:!0},include:["src","main.ts"]},null,2)),c(t,"index.html",`<!DOCTYPE html>
2
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`fs`);c=s(c);let l=require(`path`);l=s(l);var u=process.argv.slice(2);switch(u[0]){case`new`:d(u[1]);break;case`generate`:case`g`:f(u[1],u[2]);break;case`manifest`:h();break;default:b()}function d(e){e||(console.error(`Usage: juno new <project-name>`),process.exit(1));let t=l.resolve(process.cwd(),e);c.existsSync(t)&&(console.error(`Directory "${e}" already exists.`),process.exit(1)),console.log(`\n⚡ Creating JunoJS project: ${e}\n`);for(let e of[``,`src`,`src/core`,`src/common`,`src/components`,`src/services`])c.mkdirSync(l.join(t,e),{recursive:!0});v(t,`package.json`,JSON.stringify({name:e,version:`0.1.0`,private:!0,type:`module`,scripts:{dev:`vite`,build:`tsc && vite build`,preview:`vite preview`,types:`ts-node scripts/meta-compiler.ts`},dependencies:{"@junojs/core":`^0.1.0`,"reflect-metadata":`^0.2.1`},devDependencies:{typescript:`^5.2.2`,vite:`^5.4.0`,"ts-node":`^10.9.0`}},null,2)),v(t,`tsconfig.json`,JSON.stringify({compilerOptions:{target:`ESNext`,module:`ESNext`,experimentalDecorators:!0,emitDecoratorMetadata:!0,moduleResolution:`bundler`,strict:!0,outDir:`dist`,lib:[`ESNext`,`DOM`,`DOM.Iterable`],skipLibCheck:!0,esModuleInterop:!0},include:[`src`,`main.ts`]},null,2)),v(t,`index.html`,`<!DOCTYPE html>
5
3
  <html lang="en">
6
4
  <head>
7
5
  <meta charset="UTF-8" />
@@ -12,7 +10,7 @@
12
10
  <app-root></app-root>
13
11
  <script type="module" src="/main.ts"><\/script>
14
12
  </body>
15
- </html>`),c(t,"main.ts",`import 'reflect-metadata';
13
+ </html>`),v(t,`main.ts`,`import 'reflect-metadata';
16
14
  import { Component, State, bootstrap } from './src/core';
17
15
 
18
16
  @Component({ tag: 'app-root' })
@@ -25,16 +23,16 @@ class AppRoot {
25
23
  }
26
24
 
27
25
  bootstrap(AppRoot);
28
- `),c(t,"junojs.manifest.json",JSON.stringify({name:e,version:"0.1.0",framework:"@junojs/core",generatedAt:new Date().toISOString(),structure:{components:"src/components/",services:"src/services/",core:"src/core/",common:"src/common/"},entry:"main.ts",discovered:{components:[],services:[]}},null,2)),console.log(" ✅ Project scaffolded successfully!"),console.log(`
29
- Next steps:`),console.log(` cd ${e}`),console.log(" npm install"),console.log(` npm run dev
30
- `)}function y(e,t){switch((!e||!t)&&(console.error("Usage: juno generate <component|service> <name>"),process.exit(1)),e){case"component":case"c":w(t);break;case"service":case"s":b(t);break;default:console.error(`Unknown generator: "${e}". Use "component" or "service".`),process.exit(1)}}function w(e){const t=g(e),o=v(e),s=n.resolve(process.cwd(),"src","components",t);r.mkdirSync(s,{recursive:!0}),c(s,`${t}.ts`,`import { Component, State } from '../../core/decorators';
26
+ `),v(t,`junojs.manifest.json`,JSON.stringify({name:e,version:`0.1.0`,framework:`@junojs/core`,generatedAt:new Date().toISOString(),structure:{components:`src/components/`,services:`src/services/`,core:`src/core/`,common:`src/common/`},entry:`main.ts`,discovered:{components:[],services:[]}},null,2)),console.log(` ✅ Project scaffolded successfully!`),console.log(`
27
+ Next steps:`),console.log(` cd ${e}`),console.log(` npm install`),console.log(` npm run dev
28
+ `)}function f(e,t){switch((!e||!t)&&(console.error(`Usage: juno generate <component|service> <name>`),process.exit(1)),e){case`component`:case`c`:p(t);break;case`service`:case`s`:m(t);break;default:console.error(`Unknown generator: "${e}". Use "component" or "service".`),process.exit(1)}}function p(e){let t=g(e),n=_(e),r=l.resolve(process.cwd(),`src`,`components`,t);c.mkdirSync(r,{recursive:!0}),v(r,`${t}.ts`,`import { Component, State } from '../../core/decorators';
31
29
 
32
30
  @Component({
33
31
  tag: '${t}',
34
32
  templateUrl: './src/components/${t}/${t}.html',
35
33
  })
36
- export class ${o} {
37
- @State() title: string = '${o} works!';
34
+ export class ${n} {
35
+ @State() title: string = '${n} works!';
38
36
 
39
37
  onInit() {
40
38
  // Async data fetching
@@ -48,31 +46,25 @@ export class ${o} {
48
46
  // Cleanup
49
47
  }
50
48
  }
51
- `),c(s,`${t}.html`,`<div class="${t}">
49
+ `),v(r,`${t}.html`,`<div class="${t}">
52
50
  <h2>{title}</h2>
53
51
  </div>
54
- `),console.log(`
55
- Generated component: <${t}>`),console.log(` → ${s}/${t}.ts`),console.log(` → ${s}/${t}.html
56
- `)}function b(e){const t=g(e),o=v(e),s=n.resolve(process.cwd(),"src","services");r.mkdirSync(s,{recursive:!0}),c(s,`${t}.service.ts`,`/**
57
- * ${o}Service — Singleton
52
+ `),console.log(`\n⚡ Generated component: <${t}>`),console.log(` → ${r}/${t}.ts`),console.log(` → ${r}/${t}.html\n`)}function m(e){let t=g(e),n=_(e),r=l.resolve(process.cwd(),`src`,`services`);c.mkdirSync(r,{recursive:!0}),v(r,`${t}.service.ts`,`/**
53
+ * ${n}Service — Singleton
58
54
  */
59
- export class ${o}Service {
60
- private static _instance: ${o}Service;
55
+ export class ${n}Service {
56
+ private static _instance: ${n}Service;
61
57
 
62
- static get instance(): ${o}Service {
63
- if (!${o}Service._instance) {
64
- ${o}Service._instance = new ${o}Service();
58
+ static get instance(): ${n}Service {
59
+ if (!${n}Service._instance) {
60
+ ${n}Service._instance = new ${n}Service();
65
61
  }
66
- return ${o}Service._instance;
62
+ return ${n}Service._instance;
67
63
  }
68
64
 
69
65
  // Add your service methods here
70
66
  }
71
- `),console.log(`
72
- ⚡ Generated service: ${o}Service`),console.log(` → ${s}/${t}.service.ts
73
- `)}function k(){const e=process.cwd(),t=n.join(e,"package.json");let o="junojs-app",s="0.1.0";if(r.existsSync(t)){const m=JSON.parse(r.readFileSync(t,"utf-8"));o=m.name||o,s=m.version||s}const l=a(n.join(e,"src","components"),".ts"),p=a(n.join(e,"src","services"),".service.ts"),f={name:o,version:s,framework:"@junojs/core",generatedAt:new Date().toISOString(),structure:{components:"src/components/",services:"src/services/",core:"src/core/",common:"src/common/"},entry:"main.ts",discovered:{components:l,services:p}},u=n.join(e,"junojs.manifest.json");r.writeFileSync(u,JSON.stringify(f,null,2),"utf-8"),console.log(`
74
- ⚡ Generated manifest: ${u}`),console.log(` → ${l.length} component(s), ${p.length} service(s)
75
- `)}function g(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()}function v(e){return e.replace(/[-_\s]+(.)/g,(t,o)=>o.toUpperCase()).replace(/^(.)/,(t,o)=>o.toUpperCase())}function c(e,t,o){const s=n.join(e,t);r.writeFileSync(s,o,"utf-8")}function a(e,t){if(!r.existsSync(e))return[];const o=[];for(const s of r.readdirSync(e,{withFileTypes:!0}))s.isDirectory()?o.push(...a(n.join(e,s.name),t)):s.name.endsWith(t)&&o.push(n.relative(process.cwd(),n.join(e,s.name)));return o}function O(){console.log(`
67
+ `),console.log(`\n⚡ Generated service: ${n}Service`),console.log(` → ${r}/${t}.service.ts\n`)}function h(){let e=process.cwd(),t=l.join(e,`package.json`),n=`junojs-app`,r=`0.1.0`;if(c.existsSync(t)){let e=JSON.parse(c.readFileSync(t,`utf-8`));n=e.name||n,r=e.version||r}let i=y(l.join(e,`src`,`components`),`.ts`),a=y(l.join(e,`src`,`services`),`.service.ts`),o={name:n,version:r,framework:`@junojs/core`,generatedAt:new Date().toISOString(),structure:{components:`src/components/`,services:`src/services/`,core:`src/core/`,common:`src/common/`},entry:`main.ts`,discovered:{components:i,services:a}},s=l.join(e,`junojs.manifest.json`);c.writeFileSync(s,JSON.stringify(o,null,2),`utf-8`),console.log(`\n⚡ Generated manifest: ${s}`),console.log(` → ${i.length} component(s), ${a.length} service(s)\n`)}function g(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function _(e){return e.replace(/[-_\s]+(.)/g,(e,t)=>t.toUpperCase()).replace(/^(.)/,(e,t)=>t.toUpperCase())}function v(e,t,n){let r=l.join(e,t);c.writeFileSync(r,n,`utf-8`)}function y(e,t){if(!c.existsSync(e))return[];let n=[];for(let r of c.readdirSync(e,{withFileTypes:!0}))r.isDirectory()?n.push(...y(l.join(e,r.name),t)):r.name.endsWith(t)&&n.push(l.relative(process.cwd(),l.join(e,r.name)));return n}function b(){console.log(`
76
68
  ⚡ JunoJS CLI v1.0
77
69
 
78
70
  Usage:
@@ -85,4 +77,4 @@ export class ${o}Service {
85
77
  juno g c <name> → generate component
86
78
  juno g s <name> → generate service
87
79
  `)}
88
- //# sourceMappingURL=cli.cjs.map
80
+ //# sourceMappingURL=cli.cjs.map
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","sources":["../src/cli/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * JunoJS CLI — Scaffolding & Manifest\n *\n * Commands:\n * juno new <project> — Create a new JunoJS project\n * juno generate component <name> — Generate a component (.ts + .html)\n * juno generate service <name> — Generate a service class\n * juno manifest — Generate junojs.manifest.json\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\n// ─── Main Router ────────────────────────────────────────────\n\nswitch (command) {\n case 'new':\n createProject(args[1]);\n break;\n case 'generate':\n case 'g':\n generate(args[1], args[2]);\n break;\n case 'manifest':\n generateManifest();\n break;\n default:\n printHelp();\n}\n\n// ─── Commands ───────────────────────────────────────────────\n\nfunction createProject(name?: string) {\n if (!name) {\n console.error('Usage: juno new <project-name>');\n process.exit(1);\n }\n\n const dir = path.resolve(process.cwd(), name);\n if (fs.existsSync(dir)) {\n console.error(`Directory \"${name}\" already exists.`);\n process.exit(1);\n }\n\n console.log(`\\n⚡ Creating JunoJS project: ${name}\\n`);\n\n // Create directory structure\n const dirs = [\n '',\n 'src',\n 'src/core',\n 'src/common',\n 'src/components',\n 'src/services',\n ];\n for (const d of dirs) {\n fs.mkdirSync(path.join(dir, d), { recursive: true });\n }\n\n // package.json\n writeFile(dir, 'package.json', JSON.stringify({\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n types: 'ts-node scripts/meta-compiler.ts',\n },\n dependencies: {\n '@junojs/core': '^0.1.0',\n 'reflect-metadata': '^0.2.1',\n },\n devDependencies: {\n typescript: '^5.2.2',\n vite: '^5.4.0',\n 'ts-node': '^10.9.0',\n },\n }, null, 2));\n\n // tsconfig.json\n writeFile(dir, 'tsconfig.json', JSON.stringify({\n compilerOptions: {\n target: 'ESNext',\n module: 'ESNext',\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n moduleResolution: 'bundler',\n strict: true,\n outDir: 'dist',\n lib: ['ESNext', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n esModuleInterop: true,\n },\n include: ['src', 'main.ts'],\n }, null, 2));\n\n // index.html\n writeFile(dir, 'index.html', `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${name}</title>\n</head>\n<body>\n <app-root></app-root>\n <script type=\"module\" src=\"/main.ts\"></script>\n</body>\n</html>`);\n\n // main.ts\n writeFile(dir, 'main.ts', `import 'reflect-metadata';\nimport { Component, State, bootstrap } from './src/core';\n\n@Component({ tag: 'app-root' })\nclass AppRoot {\n @State() message: string = 'Welcome to ${name}!';\n\n template = \\`\n <h1>{message}</h1>\n \\`;\n}\n\nbootstrap(AppRoot);\n`);\n\n // junojs.manifest.json\n writeFile(dir, 'junojs.manifest.json', JSON.stringify({\n name,\n version: '0.1.0',\n framework: '@junojs/core',\n generatedAt: new Date().toISOString(),\n structure: {\n components: 'src/components/',\n services: 'src/services/',\n core: 'src/core/',\n common: 'src/common/',\n },\n entry: 'main.ts',\n discovered: {\n components: [],\n services: [],\n },\n }, null, 2));\n\n console.log(' ✅ Project scaffolded successfully!');\n console.log(`\\n Next steps:`);\n console.log(` cd ${name}`);\n console.log(` npm install`);\n console.log(` npm run dev\\n`);\n}\n\nfunction generate(type?: string, name?: string) {\n if (!type || !name) {\n console.error('Usage: juno generate <component|service> <name>');\n process.exit(1);\n }\n\n switch (type) {\n case 'component':\n case 'c':\n generateComponent(name);\n break;\n case 'service':\n case 's':\n generateService(name);\n break;\n default:\n console.error(`Unknown generator: \"${type}\". Use \"component\" or \"service\".`);\n process.exit(1);\n }\n}\n\nfunction generateComponent(name: string) {\n const kebab = toKebab(name);\n const pascal = toPascal(name);\n const dir = path.resolve(process.cwd(), 'src', 'components', kebab);\n\n fs.mkdirSync(dir, { recursive: true });\n\n // TypeScript file\n writeFile(dir, `${kebab}.ts`, `import { Component, State } from '../../core/decorators';\n\n@Component({\n tag: '${kebab}',\n templateUrl: './src/components/${kebab}/${kebab}.html',\n})\nexport class ${pascal} {\n @State() title: string = '${pascal} works!';\n\n onInit() {\n // Async data fetching\n }\n\n onRender(el: HTMLElement) {\n // Post-render DOM access\n }\n\n onDestroy() {\n // Cleanup\n }\n}\n`);\n\n // HTML template\n writeFile(dir, `${kebab}.html`, `<div class=\"${kebab}\">\n <h2>{title}</h2>\n</div>\n`);\n\n console.log(`\\n⚡ Generated component: <${kebab}>`);\n console.log(` → ${dir}/${kebab}.ts`);\n console.log(` → ${dir}/${kebab}.html\\n`);\n}\n\nfunction generateService(name: string) {\n const kebab = toKebab(name);\n const pascal = toPascal(name);\n const dir = path.resolve(process.cwd(), 'src', 'services');\n\n fs.mkdirSync(dir, { recursive: true });\n\n writeFile(dir, `${kebab}.service.ts`, `/**\n * ${pascal}Service — Singleton\n */\nexport class ${pascal}Service {\n private static _instance: ${pascal}Service;\n\n static get instance(): ${pascal}Service {\n if (!${pascal}Service._instance) {\n ${pascal}Service._instance = new ${pascal}Service();\n }\n return ${pascal}Service._instance;\n }\n\n // Add your service methods here\n}\n`);\n\n console.log(`\\n⚡ Generated service: ${pascal}Service`);\n console.log(` → ${dir}/${kebab}.service.ts\\n`);\n}\n\nfunction generateManifest() {\n const cwd = process.cwd();\n const pkgPath = path.join(cwd, 'package.json');\n\n let name = 'junojs-app';\n let version = '0.1.0';\n\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n name = pkg.name || name;\n version = pkg.version || version;\n }\n\n // Discover components and services\n const components = discoverFiles(path.join(cwd, 'src', 'components'), '.ts');\n const services = discoverFiles(path.join(cwd, 'src', 'services'), '.service.ts');\n\n const manifest = {\n name,\n version,\n framework: '@junojs/core',\n generatedAt: new Date().toISOString(),\n structure: {\n components: 'src/components/',\n services: 'src/services/',\n core: 'src/core/',\n common: 'src/common/',\n },\n entry: 'main.ts',\n discovered: {\n components,\n services,\n },\n };\n\n const outPath = path.join(cwd, 'junojs.manifest.json');\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2), 'utf-8');\n console.log(`\\n⚡ Generated manifest: ${outPath}`);\n console.log(` → ${components.length} component(s), ${services.length} service(s)\\n`);\n}\n\n// ─── Utilities ──────────────────────────────────────────────\n\nfunction toKebab(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nfunction toPascal(name: string): string {\n return name\n .replace(/[-_\\s]+(.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(dir: string, filename: string, content: string): void {\n const filePath = path.join(dir, filename);\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\nfunction discoverFiles(dir: string, ext: string): string[] {\n if (!fs.existsSync(dir)) return [];\n const files: string[] = [];\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n files.push(...discoverFiles(path.join(dir, entry.name), ext));\n } else if (entry.name.endsWith(ext)) {\n files.push(path.relative(process.cwd(), path.join(dir, entry.name)));\n }\n }\n return files;\n}\n\nfunction printHelp() {\n console.log(`\n ⚡ JunoJS CLI v1.0\n\n Usage:\n juno new <project> Create a new JunoJS project\n juno generate component <name> Generate a component (.ts + .html)\n juno generate service <name> Generate a service class\n juno manifest Generate junojs.manifest.json\n\n Shortcuts:\n juno g c <name> → generate component\n juno g s <name> → generate service\n`);\n}\n"],"names":["args","command","createProject","generate","generateManifest","printHelp","name","dir","path","fs","dirs","d","writeFile","type","generateComponent","generateService","kebab","toKebab","pascal","toPascal","cwd","pkgPath","version","pkg","components","discoverFiles","services","manifest","outPath","_","c","filename","content","filePath","ext","files","entry"],"mappings":"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"}
1
+ {"version":3,"file":"cli.cjs","names":[],"sources":["../src/cli/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * JunoJS CLI — Scaffolding & Manifest\n *\n * Commands:\n * juno new <project> — Create a new JunoJS project\n * juno generate component <name> — Generate a component (.ts + .html)\n * juno generate service <name> — Generate a service class\n * juno manifest — Generate junojs.manifest.json\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\n// ─── Main Router ────────────────────────────────────────────\n\nswitch (command) {\n case 'new':\n createProject(args[1]);\n break;\n case 'generate':\n case 'g':\n generate(args[1], args[2]);\n break;\n case 'manifest':\n generateManifest();\n break;\n default:\n printHelp();\n}\n\n// ─── Commands ───────────────────────────────────────────────\n\nfunction createProject(name?: string) {\n if (!name) {\n console.error('Usage: juno new <project-name>');\n process.exit(1);\n }\n\n const dir = path.resolve(process.cwd(), name);\n if (fs.existsSync(dir)) {\n console.error(`Directory \"${name}\" already exists.`);\n process.exit(1);\n }\n\n console.log(`\\n⚡ Creating JunoJS project: ${name}\\n`);\n\n // Create directory structure\n const dirs = [\n '',\n 'src',\n 'src/core',\n 'src/common',\n 'src/components',\n 'src/services',\n ];\n for (const d of dirs) {\n fs.mkdirSync(path.join(dir, d), { recursive: true });\n }\n\n // package.json\n writeFile(dir, 'package.json', JSON.stringify({\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n types: 'ts-node scripts/meta-compiler.ts',\n },\n dependencies: {\n '@junojs/core': '^0.1.0',\n 'reflect-metadata': '^0.2.1',\n },\n devDependencies: {\n typescript: '^5.2.2',\n vite: '^5.4.0',\n 'ts-node': '^10.9.0',\n },\n }, null, 2));\n\n // tsconfig.json\n writeFile(dir, 'tsconfig.json', JSON.stringify({\n compilerOptions: {\n target: 'ESNext',\n module: 'ESNext',\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n moduleResolution: 'bundler',\n strict: true,\n outDir: 'dist',\n lib: ['ESNext', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n esModuleInterop: true,\n },\n include: ['src', 'main.ts'],\n }, null, 2));\n\n // index.html\n writeFile(dir, 'index.html', `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${name}</title>\n</head>\n<body>\n <app-root></app-root>\n <script type=\"module\" src=\"/main.ts\"></script>\n</body>\n</html>`);\n\n // main.ts\n writeFile(dir, 'main.ts', `import 'reflect-metadata';\nimport { Component, State, bootstrap } from './src/core';\n\n@Component({ tag: 'app-root' })\nclass AppRoot {\n @State() message: string = 'Welcome to ${name}!';\n\n template = \\`\n <h1>{message}</h1>\n \\`;\n}\n\nbootstrap(AppRoot);\n`);\n\n // junojs.manifest.json\n writeFile(dir, 'junojs.manifest.json', JSON.stringify({\n name,\n version: '0.1.0',\n framework: '@junojs/core',\n generatedAt: new Date().toISOString(),\n structure: {\n components: 'src/components/',\n services: 'src/services/',\n core: 'src/core/',\n common: 'src/common/',\n },\n entry: 'main.ts',\n discovered: {\n components: [],\n services: [],\n },\n }, null, 2));\n\n console.log(' ✅ Project scaffolded successfully!');\n console.log(`\\n Next steps:`);\n console.log(` cd ${name}`);\n console.log(` npm install`);\n console.log(` npm run dev\\n`);\n}\n\nfunction generate(type?: string, name?: string) {\n if (!type || !name) {\n console.error('Usage: juno generate <component|service> <name>');\n process.exit(1);\n }\n\n switch (type) {\n case 'component':\n case 'c':\n generateComponent(name);\n break;\n case 'service':\n case 's':\n generateService(name);\n break;\n default:\n console.error(`Unknown generator: \"${type}\". Use \"component\" or \"service\".`);\n process.exit(1);\n }\n}\n\nfunction generateComponent(name: string) {\n const kebab = toKebab(name);\n const pascal = toPascal(name);\n const dir = path.resolve(process.cwd(), 'src', 'components', kebab);\n\n fs.mkdirSync(dir, { recursive: true });\n\n // TypeScript file\n writeFile(dir, `${kebab}.ts`, `import { Component, State } from '../../core/decorators';\n\n@Component({\n tag: '${kebab}',\n templateUrl: './src/components/${kebab}/${kebab}.html',\n})\nexport class ${pascal} {\n @State() title: string = '${pascal} works!';\n\n onInit() {\n // Async data fetching\n }\n\n onRender(el: HTMLElement) {\n // Post-render DOM access\n }\n\n onDestroy() {\n // Cleanup\n }\n}\n`);\n\n // HTML template\n writeFile(dir, `${kebab}.html`, `<div class=\"${kebab}\">\n <h2>{title}</h2>\n</div>\n`);\n\n console.log(`\\n⚡ Generated component: <${kebab}>`);\n console.log(` → ${dir}/${kebab}.ts`);\n console.log(` → ${dir}/${kebab}.html\\n`);\n}\n\nfunction generateService(name: string) {\n const kebab = toKebab(name);\n const pascal = toPascal(name);\n const dir = path.resolve(process.cwd(), 'src', 'services');\n\n fs.mkdirSync(dir, { recursive: true });\n\n writeFile(dir, `${kebab}.service.ts`, `/**\n * ${pascal}Service — Singleton\n */\nexport class ${pascal}Service {\n private static _instance: ${pascal}Service;\n\n static get instance(): ${pascal}Service {\n if (!${pascal}Service._instance) {\n ${pascal}Service._instance = new ${pascal}Service();\n }\n return ${pascal}Service._instance;\n }\n\n // Add your service methods here\n}\n`);\n\n console.log(`\\n⚡ Generated service: ${pascal}Service`);\n console.log(` → ${dir}/${kebab}.service.ts\\n`);\n}\n\nfunction generateManifest() {\n const cwd = process.cwd();\n const pkgPath = path.join(cwd, 'package.json');\n\n let name = 'junojs-app';\n let version = '0.1.0';\n\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n name = pkg.name || name;\n version = pkg.version || version;\n }\n\n // Discover components and services\n const components = discoverFiles(path.join(cwd, 'src', 'components'), '.ts');\n const services = discoverFiles(path.join(cwd, 'src', 'services'), '.service.ts');\n\n const manifest = {\n name,\n version,\n framework: '@junojs/core',\n generatedAt: new Date().toISOString(),\n structure: {\n components: 'src/components/',\n services: 'src/services/',\n core: 'src/core/',\n common: 'src/common/',\n },\n entry: 'main.ts',\n discovered: {\n components,\n services,\n },\n };\n\n const outPath = path.join(cwd, 'junojs.manifest.json');\n fs.writeFileSync(outPath, JSON.stringify(manifest, null, 2), 'utf-8');\n console.log(`\\n⚡ Generated manifest: ${outPath}`);\n console.log(` → ${components.length} component(s), ${services.length} service(s)\\n`);\n}\n\n// ─── Utilities ──────────────────────────────────────────────\n\nfunction toKebab(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nfunction toPascal(name: string): string {\n return name\n .replace(/[-_\\s]+(.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(dir: string, filename: string, content: string): void {\n const filePath = path.join(dir, filename);\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\nfunction discoverFiles(dir: string, ext: string): string[] {\n if (!fs.existsSync(dir)) return [];\n const files: string[] = [];\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n files.push(...discoverFiles(path.join(dir, entry.name), ext));\n } else if (entry.name.endsWith(ext)) {\n files.push(path.relative(process.cwd(), path.join(dir, entry.name)));\n }\n }\n return files;\n}\n\nfunction printHelp() {\n console.log(`\n ⚡ JunoJS CLI v1.0\n\n Usage:\n juno new <project> Create a new JunoJS project\n juno generate component <name> Generate a component (.ts + .html)\n juno generate service <name> Generate a service class\n juno manifest Generate junojs.manifest.json\n\n Shortcuts:\n juno g c <name> → generate component\n juno g s <name> → generate service\n`);\n}\n"],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,88 +1,88 @@
1
1
  #!/usr/bin/env node
2
- import * as r from "fs";
3
- import * as n from "path";
4
- const i = process.argv.slice(2), f = i[0];
5
- switch (f) {
6
- case "new":
7
- j(i[1]);
8
- break;
9
- case "generate":
10
- case "g":
11
- S(i[1], i[2]);
12
- break;
13
- case "manifest":
14
- w();
15
- break;
16
- default:
17
- y();
2
+ import * as e from "fs";
3
+ import * as t from "path";
4
+ //#region src/cli/cli.ts
5
+ var n = process.argv.slice(2);
6
+ switch (n[0]) {
7
+ case "new":
8
+ r(n[1]);
9
+ break;
10
+ case "generate":
11
+ case "g":
12
+ i(n[1], n[2]);
13
+ break;
14
+ case "manifest":
15
+ s();
16
+ break;
17
+ default: f();
18
18
  }
19
- function j(e) {
20
- e || (console.error("Usage: juno new <project-name>"), process.exit(1));
21
- const t = n.resolve(process.cwd(), e);
22
- r.existsSync(t) && (console.error(`Directory "${e}" already exists.`), process.exit(1)), console.log(`
23
- Creating JunoJS project: ${e}
24
- `);
25
- const o = [
26
- "",
27
- "src",
28
- "src/core",
29
- "src/common",
30
- "src/components",
31
- "src/services"
32
- ];
33
- for (const s of o)
34
- r.mkdirSync(n.join(t, s), { recursive: !0 });
35
- c(t, "package.json", JSON.stringify({
36
- name: e,
37
- version: "0.1.0",
38
- private: !0,
39
- type: "module",
40
- scripts: {
41
- dev: "vite",
42
- build: "tsc && vite build",
43
- preview: "vite preview",
44
- types: "ts-node scripts/meta-compiler.ts"
45
- },
46
- dependencies: {
47
- "@junojs/core": "^0.1.0",
48
- "reflect-metadata": "^0.2.1"
49
- },
50
- devDependencies: {
51
- typescript: "^5.2.2",
52
- vite: "^5.4.0",
53
- "ts-node": "^10.9.0"
54
- }
55
- }, null, 2)), c(t, "tsconfig.json", JSON.stringify({
56
- compilerOptions: {
57
- target: "ESNext",
58
- module: "ESNext",
59
- experimentalDecorators: !0,
60
- emitDecoratorMetadata: !0,
61
- moduleResolution: "bundler",
62
- strict: !0,
63
- outDir: "dist",
64
- lib: ["ESNext", "DOM", "DOM.Iterable"],
65
- skipLibCheck: !0,
66
- esModuleInterop: !0
67
- },
68
- include: ["src", "main.ts"]
69
- }, null, 2)), c(t, "index.html", `<!DOCTYPE html>
19
+ function r(n) {
20
+ n || (console.error("Usage: juno new <project-name>"), process.exit(1));
21
+ let r = t.resolve(process.cwd(), n);
22
+ e.existsSync(r) && (console.error(`Directory "${n}" already exists.`), process.exit(1)), console.log(`\n⚡ Creating JunoJS project: ${n}\n`);
23
+ for (let n of [
24
+ "",
25
+ "src",
26
+ "src/core",
27
+ "src/common",
28
+ "src/components",
29
+ "src/services"
30
+ ]) e.mkdirSync(t.join(r, n), { recursive: !0 });
31
+ u(r, "package.json", JSON.stringify({
32
+ name: n,
33
+ version: "0.1.0",
34
+ private: !0,
35
+ type: "module",
36
+ scripts: {
37
+ dev: "vite",
38
+ build: "tsc && vite build",
39
+ preview: "vite preview",
40
+ types: "ts-node scripts/meta-compiler.ts"
41
+ },
42
+ dependencies: {
43
+ "@junojs/core": "^0.1.0",
44
+ "reflect-metadata": "^0.2.1"
45
+ },
46
+ devDependencies: {
47
+ typescript: "^5.2.2",
48
+ vite: "^5.4.0",
49
+ "ts-node": "^10.9.0"
50
+ }
51
+ }, null, 2)), u(r, "tsconfig.json", JSON.stringify({
52
+ compilerOptions: {
53
+ target: "ESNext",
54
+ module: "ESNext",
55
+ experimentalDecorators: !0,
56
+ emitDecoratorMetadata: !0,
57
+ moduleResolution: "bundler",
58
+ strict: !0,
59
+ outDir: "dist",
60
+ lib: [
61
+ "ESNext",
62
+ "DOM",
63
+ "DOM.Iterable"
64
+ ],
65
+ skipLibCheck: !0,
66
+ esModuleInterop: !0
67
+ },
68
+ include: ["src", "main.ts"]
69
+ }, null, 2)), u(r, "index.html", `<!DOCTYPE html>
70
70
  <html lang="en">
71
71
  <head>
72
72
  <meta charset="UTF-8" />
73
73
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
74
- <title>${e}</title>
74
+ <title>${n}</title>
75
75
  </head>
76
76
  <body>
77
77
  <app-root></app-root>
78
78
  <script type="module" src="/main.ts"><\/script>
79
79
  </body>
80
- </html>`), c(t, "main.ts", `import 'reflect-metadata';
80
+ </html>`), u(r, "main.ts", `import 'reflect-metadata';
81
81
  import { Component, State, bootstrap } from './src/core';
82
82
 
83
83
  @Component({ tag: 'app-root' })
84
84
  class AppRoot {
85
- @State() message: string = 'Welcome to ${e}!';
85
+ @State() message: string = 'Welcome to ${n}!';
86
86
 
87
87
  template = \`
88
88
  <h1>{message}</h1>
@@ -90,50 +90,47 @@ class AppRoot {
90
90
  }
91
91
 
92
92
  bootstrap(AppRoot);
93
- `), c(t, "junojs.manifest.json", JSON.stringify({
94
- name: e,
95
- version: "0.1.0",
96
- framework: "@junojs/core",
97
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
98
- structure: {
99
- components: "src/components/",
100
- services: "src/services/",
101
- core: "src/core/",
102
- common: "src/common/"
103
- },
104
- entry: "main.ts",
105
- discovered: {
106
- components: [],
107
- services: []
108
- }
109
- }, null, 2)), console.log(" ✅ Project scaffolded successfully!"), console.log(`
110
- Next steps:`), console.log(` cd ${e}`), console.log(" npm install"), console.log(` npm run dev
111
- `);
93
+ `), u(r, "junojs.manifest.json", JSON.stringify({
94
+ name: n,
95
+ version: "0.1.0",
96
+ framework: "@junojs/core",
97
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
98
+ structure: {
99
+ components: "src/components/",
100
+ services: "src/services/",
101
+ core: "src/core/",
102
+ common: "src/common/"
103
+ },
104
+ entry: "main.ts",
105
+ discovered: {
106
+ components: [],
107
+ services: []
108
+ }
109
+ }, null, 2)), console.log(" ✅ Project scaffolded successfully!"), console.log("\n Next steps:"), console.log(` cd ${n}`), console.log(" npm install"), console.log(" npm run dev\n");
112
110
  }
113
- function S(e, t) {
114
- switch ((!e || !t) && (console.error("Usage: juno generate <component|service> <name>"), process.exit(1)), e) {
115
- case "component":
116
- case "c":
117
- $(t);
118
- break;
119
- case "service":
120
- case "s":
121
- h(t);
122
- break;
123
- default:
124
- console.error(`Unknown generator: "${e}". Use "component" or "service".`), process.exit(1);
125
- }
111
+ function i(e, t) {
112
+ switch ((!e || !t) && (console.error("Usage: juno generate <component|service> <name>"), process.exit(1)), e) {
113
+ case "component":
114
+ case "c":
115
+ a(t);
116
+ break;
117
+ case "service":
118
+ case "s":
119
+ o(t);
120
+ break;
121
+ default: console.error(`Unknown generator: "${e}". Use "component" or "service".`), process.exit(1);
122
+ }
126
123
  }
127
- function $(e) {
128
- const t = d(e), o = g(e), s = n.resolve(process.cwd(), "src", "components", t);
129
- r.mkdirSync(s, { recursive: !0 }), c(s, `${t}.ts`, `import { Component, State } from '../../core/decorators';
124
+ function a(n) {
125
+ let r = c(n), i = l(n), a = t.resolve(process.cwd(), "src", "components", r);
126
+ e.mkdirSync(a, { recursive: !0 }), u(a, `${r}.ts`, `import { Component, State } from '../../core/decorators';
130
127
 
131
128
  @Component({
132
- tag: '${t}',
133
- templateUrl: './src/components/${t}/${t}.html',
129
+ tag: '${r}',
130
+ templateUrl: './src/components/${r}/${r}.html',
134
131
  })
135
- export class ${o} {
136
- @State() title: string = '${o} works!';
132
+ export class ${i} {
133
+ @State() title: string = '${i} works!';
137
134
 
138
135
  onInit() {
139
136
  // Async data fetching
@@ -147,92 +144,74 @@ export class ${o} {
147
144
  // Cleanup
148
145
  }
149
146
  }
150
- `), c(s, `${t}.html`, `<div class="${t}">
147
+ `), u(a, `${r}.html`, `<div class="${r}">
151
148
  <h2>{title}</h2>
152
149
  </div>
153
- `), console.log(`
154
- ⚡ Generated component: <${t}>`), console.log(` → ${s}/${t}.ts`), console.log(` → ${s}/${t}.html
155
- `);
150
+ `), console.log(`\n⚡ Generated component: <${r}>`), console.log(` → ${a}/${r}.ts`), console.log(` → ${a}/${r}.html\n`);
156
151
  }
157
- function h(e) {
158
- const t = d(e), o = g(e), s = n.resolve(process.cwd(), "src", "services");
159
- r.mkdirSync(s, { recursive: !0 }), c(s, `${t}.service.ts`, `/**
160
- * ${o}Service — Singleton
152
+ function o(n) {
153
+ let r = c(n), i = l(n), a = t.resolve(process.cwd(), "src", "services");
154
+ e.mkdirSync(a, { recursive: !0 }), u(a, `${r}.service.ts`, `/**
155
+ * ${i}Service — Singleton
161
156
  */
162
- export class ${o}Service {
163
- private static _instance: ${o}Service;
157
+ export class ${i}Service {
158
+ private static _instance: ${i}Service;
164
159
 
165
- static get instance(): ${o}Service {
166
- if (!${o}Service._instance) {
167
- ${o}Service._instance = new ${o}Service();
160
+ static get instance(): ${i}Service {
161
+ if (!${i}Service._instance) {
162
+ ${i}Service._instance = new ${i}Service();
168
163
  }
169
- return ${o}Service._instance;
164
+ return ${i}Service._instance;
170
165
  }
171
166
 
172
167
  // Add your service methods here
173
168
  }
174
- `), console.log(`
175
- ⚡ Generated service: ${o}Service`), console.log(` → ${s}/${t}.service.ts
176
- `);
169
+ `), console.log(`\n⚡ Generated service: ${i}Service`), console.log(` → ${a}/${r}.service.ts\n`);
177
170
  }
178
- function w() {
179
- const e = process.cwd(), t = n.join(e, "package.json");
180
- let o = "junojs-app", s = "0.1.0";
181
- if (r.existsSync(t)) {
182
- const u = JSON.parse(r.readFileSync(t, "utf-8"));
183
- o = u.name || o, s = u.version || s;
184
- }
185
- const l = a(n.join(e, "src", "components"), ".ts"), p = a(n.join(e, "src", "services"), ".service.ts"), v = {
186
- name: o,
187
- version: s,
188
- framework: "@junojs/core",
189
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
190
- structure: {
191
- components: "src/components/",
192
- services: "src/services/",
193
- core: "src/core/",
194
- common: "src/common/"
195
- },
196
- entry: "main.ts",
197
- discovered: {
198
- components: l,
199
- services: p
200
- }
201
- }, m = n.join(e, "junojs.manifest.json");
202
- r.writeFileSync(m, JSON.stringify(v, null, 2), "utf-8"), console.log(`
203
- ⚡ Generated manifest: ${m}`), console.log(` → ${l.length} component(s), ${p.length} service(s)
204
- `);
171
+ function s() {
172
+ let n = process.cwd(), r = t.join(n, "package.json"), i = "junojs-app", a = "0.1.0";
173
+ if (e.existsSync(r)) {
174
+ let t = JSON.parse(e.readFileSync(r, "utf-8"));
175
+ i = t.name || i, a = t.version || a;
176
+ }
177
+ let o = d(t.join(n, "src", "components"), ".ts"), s = d(t.join(n, "src", "services"), ".service.ts"), c = {
178
+ name: i,
179
+ version: a,
180
+ framework: "@junojs/core",
181
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
182
+ structure: {
183
+ components: "src/components/",
184
+ services: "src/services/",
185
+ core: "src/core/",
186
+ common: "src/common/"
187
+ },
188
+ entry: "main.ts",
189
+ discovered: {
190
+ components: o,
191
+ services: s
192
+ }
193
+ }, l = t.join(n, "junojs.manifest.json");
194
+ e.writeFileSync(l, JSON.stringify(c, null, 2), "utf-8"), console.log(`\n⚡ Generated manifest: ${l}`), console.log(` → ${o.length} component(s), ${s.length} service(s)\n`);
205
195
  }
206
- function d(e) {
207
- return e.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
196
+ function c(e) {
197
+ return e.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
208
198
  }
209
- function g(e) {
210
- return e.replace(/[-_\s]+(.)/g, (t, o) => o.toUpperCase()).replace(/^(.)/, (t, o) => o.toUpperCase());
199
+ function l(e) {
200
+ return e.replace(/[-_\s]+(.)/g, (e, t) => t.toUpperCase()).replace(/^(.)/, (e, t) => t.toUpperCase());
211
201
  }
212
- function c(e, t, o) {
213
- const s = n.join(e, t);
214
- r.writeFileSync(s, o, "utf-8");
202
+ function u(n, r, i) {
203
+ let a = t.join(n, r);
204
+ e.writeFileSync(a, i, "utf-8");
215
205
  }
216
- function a(e, t) {
217
- if (!r.existsSync(e)) return [];
218
- const o = [];
219
- for (const s of r.readdirSync(e, { withFileTypes: !0 }))
220
- s.isDirectory() ? o.push(...a(n.join(e, s.name), t)) : s.name.endsWith(t) && o.push(n.relative(process.cwd(), n.join(e, s.name)));
221
- return o;
206
+ function d(n, r) {
207
+ if (!e.existsSync(n)) return [];
208
+ let i = [];
209
+ for (let a of e.readdirSync(n, { withFileTypes: !0 })) a.isDirectory() ? i.push(...d(t.join(n, a.name), r)) : a.name.endsWith(r) && i.push(t.relative(process.cwd(), t.join(n, a.name)));
210
+ return i;
222
211
  }
223
- function y() {
224
- console.log(`
225
- ⚡ JunoJS CLI v1.0
226
-
227
- Usage:
228
- juno new <project> Create a new JunoJS project
229
- juno generate component <name> Generate a component (.ts + .html)
230
- juno generate service <name> Generate a service class
231
- juno manifest Generate junojs.manifest.json
232
-
233
- Shortcuts:
234
- juno g c <name> → generate component
235
- juno g s <name> → generate service
236
- `);
212
+ function f() {
213
+ console.log("\n ⚡ JunoJS CLI v1.0\n\n Usage:\n juno new <project> Create a new JunoJS project\n juno generate component <name> Generate a component (.ts + .html)\n juno generate service <name> Generate a service class\n juno manifest Generate junojs.manifest.json\n\n Shortcuts:\n juno g c <name> → generate component\n juno g s <name> → generate service\n");
237
214
  }
238
- //# sourceMappingURL=cli.js.map
215
+ //#endregion
216
+
217
+ //# sourceMappingURL=cli.js.map