@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 +18 -26
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +160 -181
- package/dist/cli.js.map +1 -1
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +806 -891
- package/dist/index.js.map +1 -1
- package/package.json +11 -8
package/dist/cli.cjs
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
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>`),
|
|
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
|
-
`),
|
|
29
|
-
Next steps:`),console.log(` cd ${e}`),console.log(
|
|
30
|
-
`)}function
|
|
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 ${
|
|
37
|
-
@State() title: string = '${
|
|
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
|
-
`),
|
|
49
|
+
`),v(r,`${t}.html`,`<div class="${t}">
|
|
52
50
|
<h2>{title}</h2>
|
|
53
51
|
</div>
|
|
54
|
-
`),console.log(`
|
|
55
|
-
|
|
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 ${
|
|
60
|
-
private static _instance: ${
|
|
55
|
+
export class ${n}Service {
|
|
56
|
+
private static _instance: ${n}Service;
|
|
61
57
|
|
|
62
|
-
static get instance(): ${
|
|
63
|
-
if (!${
|
|
64
|
-
${
|
|
58
|
+
static get instance(): ${n}Service {
|
|
59
|
+
if (!${n}Service._instance) {
|
|
60
|
+
${n}Service._instance = new ${n}Service();
|
|
65
61
|
}
|
|
66
|
-
return ${
|
|
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
|
|
3
|
-
import * as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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>${
|
|
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>`),
|
|
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 ${
|
|
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
|
-
`),
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
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: '${
|
|
133
|
-
templateUrl: './src/components/${
|
|
129
|
+
tag: '${r}',
|
|
130
|
+
templateUrl: './src/components/${r}/${r}.html',
|
|
134
131
|
})
|
|
135
|
-
export class ${
|
|
136
|
-
@State() title: string = '${
|
|
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
|
-
`),
|
|
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
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
* ${
|
|
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 ${
|
|
163
|
-
private static _instance: ${
|
|
157
|
+
export class ${i}Service {
|
|
158
|
+
private static _instance: ${i}Service;
|
|
164
159
|
|
|
165
|
-
static get instance(): ${
|
|
166
|
-
if (!${
|
|
167
|
-
${
|
|
160
|
+
static get instance(): ${i}Service {
|
|
161
|
+
if (!${i}Service._instance) {
|
|
162
|
+
${i}Service._instance = new ${i}Service();
|
|
168
163
|
}
|
|
169
|
-
return ${
|
|
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
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
207
|
-
|
|
196
|
+
function c(e) {
|
|
197
|
+
return e.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
|
|
208
198
|
}
|
|
209
|
-
function
|
|
210
|
-
|
|
199
|
+
function l(e) {
|
|
200
|
+
return e.replace(/[-_\s]+(.)/g, (e, t) => t.toUpperCase()).replace(/^(.)/, (e, t) => t.toUpperCase());
|
|
211
201
|
}
|
|
212
|
-
function
|
|
213
|
-
|
|
214
|
-
|
|
202
|
+
function u(n, r, i) {
|
|
203
|
+
let a = t.join(n, r);
|
|
204
|
+
e.writeFileSync(a, i, "utf-8");
|
|
215
205
|
}
|
|
216
|
-
function
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
224
|
-
|
|
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
|
-
//#
|
|
215
|
+
//#endregion
|
|
216
|
+
|
|
217
|
+
//# sourceMappingURL=cli.js.map
|