@devappsnpm/vue-kit 1.0.1 → 1.0.4

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.
@@ -0,0 +1,470 @@
1
+ // src/cli/utils/NameParser.ts
2
+ var NameParser = class _NameParser {
3
+ words;
4
+ constructor(input) {
5
+ _NameParser.assertSafe(input);
6
+ this.words = _NameParser.split(input);
7
+ if (this.words.length === 0) {
8
+ throw new Error(`Invalid module name: "${input}"`);
9
+ }
10
+ }
11
+ /** Original PascalCase — e.g. CustomerAccount */
12
+ get PascalCase() {
13
+ return this.words.map((w) => capitalize(w)).join("");
14
+ }
15
+ /** camelCase — e.g. customerAccount */
16
+ get camelCase() {
17
+ return this.words.map((w, i) => i === 0 ? w.toLowerCase() : capitalize(w)).join("");
18
+ }
19
+ /** kebab-case — e.g. customer-account */
20
+ get kebabCase() {
21
+ return this.words.map((w) => w.toLowerCase()).join("-");
22
+ }
23
+ /** snake_case — e.g. customer_account */
24
+ get snakeCase() {
25
+ return this.words.map((w) => w.toLowerCase()).join("_");
26
+ }
27
+ /** SCREAMING_SNAKE_CASE — e.g. CUSTOMER_ACCOUNT */
28
+ get screamingSnakeCase() {
29
+ return this.words.map((w) => w.toUpperCase()).join("_");
30
+ }
31
+ /** Naïve plural — appends "s". Sufficient for code generation. */
32
+ get plural() {
33
+ const last = this.words[this.words.length - 1];
34
+ if (!last) return this.PascalCase + "s";
35
+ const pluralLast = naivePlural(last);
36
+ return this.words.slice(0, -1).map((w) => capitalize(w)).concat(capitalize(pluralLast)).join("");
37
+ }
38
+ /** Plural in camelCase */
39
+ get pluralCamel() {
40
+ const p = new _NameParser(this.plural);
41
+ return p.camelCase;
42
+ }
43
+ /** Plural in kebab-case */
44
+ get pluralKebab() {
45
+ return naivePluralKebab(this.kebabCase);
46
+ }
47
+ // ─── private helpers ────────────────────────────────────────────────────────
48
+ static split(input) {
49
+ return input.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[-_]/g, " ").split(/\s+/).filter(Boolean);
50
+ }
51
+ /**
52
+ * Guards against path traversal and shell injection in user-provided names.
53
+ */
54
+ static assertSafe(name) {
55
+ if (/[/.\\]/.test(name)) {
56
+ throw new Error(
57
+ `Module name "${name}" contains illegal characters (/, \\, .). Use PascalCase names like "CustomerAccount".`
58
+ );
59
+ }
60
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
61
+ throw new Error(
62
+ `Module name "${name}" is invalid. Use only letters, digits, hyphens or underscores, starting with a letter.`
63
+ );
64
+ }
65
+ }
66
+ };
67
+ function capitalize(word) {
68
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
69
+ }
70
+ function naivePlural(word) {
71
+ const w = word.toLowerCase();
72
+ if (w.endsWith("y") && !["a", "e", "i", "o", "u"].includes(w.charAt(w.length - 2) ?? "")) {
73
+ return w.slice(0, -1) + "ies";
74
+ }
75
+ if (w.endsWith("s") || w.endsWith("sh") || w.endsWith("ch") || w.endsWith("x") || w.endsWith("z")) {
76
+ return w + "es";
77
+ }
78
+ return w + "s";
79
+ }
80
+ function naivePluralKebab(kebab) {
81
+ const parts = kebab.split("-");
82
+ const last = parts[parts.length - 1];
83
+ if (!last) return kebab + "s";
84
+ parts[parts.length - 1] = naivePlural(last);
85
+ return parts.join("-");
86
+ }
87
+
88
+ // src/cli/utils/TemplateRenderer.ts
89
+ var TemplateRenderer = class {
90
+ static varsFromParser(parser, resourcePath) {
91
+ return {
92
+ ModuleName: parser.PascalCase,
93
+ moduleName: parser.camelCase,
94
+ moduleSlug: parser.kebabCase,
95
+ ModuleNamePlural: parser.plural,
96
+ moduleNamePlural: parser.pluralCamel,
97
+ moduleSlugPlural: parser.pluralKebab,
98
+ resourcePath: resourcePath ?? `/${parser.pluralKebab}`
99
+ };
100
+ }
101
+ static render(template, vars) {
102
+ return template.replace(/\{\{\s*([a-zA-Z_]+)\s*\}\}/g, (_, key) => {
103
+ const value = vars[key];
104
+ return value !== void 0 ? value : `{{ ${key} }}`;
105
+ });
106
+ }
107
+ };
108
+
109
+ // src/cli/utils/FileGenerator.ts
110
+ import fs from "fs";
111
+ import path from "path";
112
+ import { fileURLToPath } from "url";
113
+ var __filename = fileURLToPath(import.meta.url);
114
+ var __dirname = path.dirname(__filename);
115
+ var PACKAGE_ROOT = path.resolve(__dirname, "../..");
116
+ var FileGenerator = class {
117
+ constructor(cwd = process.cwd(), customStubsRoot) {
118
+ this.cwd = cwd;
119
+ this.customStubsRoot = customStubsRoot;
120
+ }
121
+ cwd;
122
+ customStubsRoot;
123
+ /**
124
+ * Resolves a stub file path, preferring project-local overrides.
125
+ * @param stubRelPath Relative path from the stubs root (e.g. "module/crud/modal/types/types.ts.stub")
126
+ */
127
+ resolveStub(stubRelPath) {
128
+ const customRoot = this.customStubsRoot ?? path.join(this.cwd, ".devapps", "stubs");
129
+ const customPath = path.join(customRoot, stubRelPath);
130
+ if (fs.existsSync(customPath)) {
131
+ return customPath;
132
+ }
133
+ const packagePath = path.join(PACKAGE_ROOT, "stubs", stubRelPath);
134
+ if (fs.existsSync(packagePath)) {
135
+ return packagePath;
136
+ }
137
+ throw new Error(
138
+ `Stub not found: "${stubRelPath}"
139
+ Looked in:
140
+ ${customPath}
141
+ ${packagePath}`
142
+ );
143
+ }
144
+ /** Read and return stub content as a string. */
145
+ readStub(stubRelPath) {
146
+ return fs.readFileSync(this.resolveStub(stubRelPath), "utf8");
147
+ }
148
+ /**
149
+ * Write content to targetPath. Creates parent directories if needed.
150
+ * Respects `force` flag before overwriting.
151
+ */
152
+ write(targetPath, content, options) {
153
+ const abs = path.isAbsolute(targetPath) ? targetPath : path.join(this.cwd, targetPath);
154
+ if (fs.existsSync(abs) && !options?.force) {
155
+ console.warn(` \u26A0 Skipped (already exists): ${abs}`);
156
+ return { path: abs, created: false, skipped: true };
157
+ }
158
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
159
+ fs.writeFileSync(abs, content, "utf8");
160
+ console.log(` \u2714 Created: ${abs}`);
161
+ return { path: abs, created: true, skipped: false };
162
+ }
163
+ /**
164
+ * High-level helper: resolve stub → render → write.
165
+ */
166
+ generate(stubRelPath, targetPath, render, options) {
167
+ const raw = this.readStub(stubRelPath);
168
+ const content = render(raw);
169
+ return this.write(targetPath, content, options);
170
+ }
171
+ };
172
+
173
+ // src/cli/generators/ModuleGenerator.ts
174
+ import path2 from "path";
175
+ var ModuleGenerator = class {
176
+ parser;
177
+ fg;
178
+ vars;
179
+ options;
180
+ constructor(opts) {
181
+ this.parser = new NameParser(opts.name);
182
+ this.fg = new FileGenerator(opts.cwd, opts.customStubsPath);
183
+ this.vars = TemplateRenderer.varsFromParser(this.parser);
184
+ this.options = {
185
+ type: opts.type ?? "crud",
186
+ ui: opts.ui ?? "modal",
187
+ force: opts.force ?? false,
188
+ outputBase: opts.outputBase ?? path2.join(opts.cwd ?? process.cwd(), "src", "modules")
189
+ };
190
+ }
191
+ generate() {
192
+ const { type, ui, force, outputBase } = this.options;
193
+ const slug = this.parser.kebabCase;
194
+ const moduleDir = path2.join(outputBase, slug);
195
+ console.log(`
196
+ \u{1F680} Generating module: ${this.parser.PascalCase} (${type}${type === "crud" ? ` / ${ui}` : ""})
197
+ `);
198
+ switch (type) {
199
+ case "basic":
200
+ this.generateBasic(moduleDir, force);
201
+ break;
202
+ case "resource":
203
+ this.generateResource(moduleDir, force);
204
+ break;
205
+ case "crud":
206
+ if (ui === "page") {
207
+ this.generateCrudPage(moduleDir, force);
208
+ } else {
209
+ this.generateCrudModal(moduleDir, force);
210
+ }
211
+ break;
212
+ case "dashboard":
213
+ this.generateDashboard(moduleDir, force);
214
+ break;
215
+ }
216
+ console.log(`
217
+ \u2705 Module "${this.parser.PascalCase}" generated successfully!
218
+ `);
219
+ }
220
+ render(raw) {
221
+ return TemplateRenderer.render(raw, this.vars);
222
+ }
223
+ stub(relPath) {
224
+ return this.fg.readStub(relPath);
225
+ }
226
+ write(targetPath, content, force) {
227
+ this.fg.write(targetPath, content, { force });
228
+ }
229
+ // ─── basic ───────────────────────────────────────────────────────────────────
230
+ generateBasic(dir, force) {
231
+ const name = this.parser.PascalCase;
232
+ this.write(
233
+ path2.join(dir, "components", `${name}Component.vue`),
234
+ this.render(this.stub("module/basic/component.vue.stub")),
235
+ force
236
+ );
237
+ this.write(
238
+ path2.join(dir, "index.ts"),
239
+ this.render(this.stub("module/basic/index.ts.stub")),
240
+ force
241
+ );
242
+ }
243
+ // ─── resource ────────────────────────────────────────────────────────────────
244
+ generateResource(dir, force) {
245
+ const name = this.parser.PascalCase;
246
+ const slug = this.parser.kebabCase;
247
+ this.write(path2.join(dir, "services", `${slug}.service.ts`), this.render(this.stub("module/resource/service.ts.stub")), force);
248
+ this.write(path2.join(dir, "stores", `${slug}.store.ts`), this.render(this.stub("module/resource/store.ts.stub")), force);
249
+ this.write(path2.join(dir, "types", `${slug}.types.ts`), this.render(this.stub("module/resource/types.ts.stub")), force);
250
+ this.write(path2.join(dir, "components", `${name}List.vue`), this.render(this.stub("module/resource/List.vue.stub")), force);
251
+ this.write(path2.join(dir, "index.ts"), this.render(this.stub("module/resource/index.ts.stub")), force);
252
+ }
253
+ // ─── crud / modal ─────────────────────────────────────────────────────────────
254
+ generateCrudModal(dir, force) {
255
+ const name = this.parser.PascalCase;
256
+ const slug = this.parser.kebabCase;
257
+ this.write(path2.join(dir, "components", `${name}List.vue`), this.render(this.stub("module/crud/modal/components/List.vue.stub")), force);
258
+ this.write(path2.join(dir, "components", `${name}FormModal.vue`), this.render(this.stub("module/crud/modal/components/FormModal.vue.stub")), force);
259
+ this.write(path2.join(dir, "components", `${name}DeleteModal.vue`), this.render(this.stub("module/crud/modal/components/DeleteModal.vue.stub")), force);
260
+ this.write(path2.join(dir, "views", `${name}View.vue`), this.render(this.stub("module/crud/modal/views/View.vue.stub")), force);
261
+ this.write(path2.join(dir, "services", `${slug}.service.ts`), this.render(this.stub("module/crud/modal/services/service.ts.stub")), force);
262
+ this.write(path2.join(dir, "stores", `${slug}.store.ts`), this.render(this.stub("module/crud/modal/stores/store.ts.stub")), force);
263
+ this.write(path2.join(dir, "types", `${slug}.types.ts`), this.render(this.stub("module/crud/modal/types/types.ts.stub")), force);
264
+ this.write(path2.join(dir, "router.ts"), this.render(this.stub("module/crud/modal/router.ts.stub")), force);
265
+ this.write(path2.join(dir, "index.ts"), this.render(this.stub("module/crud/modal/index.ts.stub")), force);
266
+ }
267
+ // ─── crud / page ─────────────────────────────────────────────────────────────
268
+ generateCrudPage(dir, force) {
269
+ const name = this.parser.PascalCase;
270
+ const slug = this.parser.kebabCase;
271
+ this.write(path2.join(dir, "components", `${name}List.vue`), this.render(this.stub("module/crud/page/components/List.vue.stub")), force);
272
+ this.write(path2.join(dir, "components", `${name}Form.vue`), this.render(this.stub("module/crud/page/components/Form.vue.stub")), force);
273
+ this.write(path2.join(dir, "components", `${name}DeleteModal.vue`), this.render(this.stub("module/crud/page/components/DeleteModal.vue.stub")), force);
274
+ this.write(path2.join(dir, "pages", `${name}ListPage.vue`), this.render(this.stub("module/crud/page/pages/ListPage.vue.stub")), force);
275
+ this.write(path2.join(dir, "pages", `${name}CreatePage.vue`), this.render(this.stub("module/crud/page/pages/CreatePage.vue.stub")), force);
276
+ this.write(path2.join(dir, "pages", `${name}EditPage.vue`), this.render(this.stub("module/crud/page/pages/EditPage.vue.stub")), force);
277
+ this.write(path2.join(dir, "pages", `${name}ShowPage.vue`), this.render(this.stub("module/crud/page/pages/ShowPage.vue.stub")), force);
278
+ this.write(path2.join(dir, "services", `${slug}.service.ts`), this.render(this.stub("module/crud/page/services/service.ts.stub")), force);
279
+ this.write(path2.join(dir, "stores", `${slug}.store.ts`), this.render(this.stub("module/crud/page/stores/store.ts.stub")), force);
280
+ this.write(path2.join(dir, "types", `${slug}.types.ts`), this.render(this.stub("module/crud/page/types/types.ts.stub")), force);
281
+ this.write(path2.join(dir, "router.ts"), this.render(this.stub("module/crud/page/router.ts.stub")), force);
282
+ this.write(path2.join(dir, "index.ts"), this.render(this.stub("module/crud/page/index.ts.stub")), force);
283
+ }
284
+ // ─── dashboard ───────────────────────────────────────────────────────────────
285
+ generateDashboard(dir, force) {
286
+ const name = this.parser.PascalCase;
287
+ const slug = this.parser.kebabCase;
288
+ this.write(path2.join(dir, "views", `${name}Dashboard.vue`), this.render(this.stub("module/dashboard/Dashboard.vue.stub")), force);
289
+ this.write(path2.join(dir, "router.ts"), this.render(this.stub("module/dashboard/router.ts.stub")), force);
290
+ this.write(path2.join(dir, "index.ts"), this.render(this.stub("module/dashboard/index.ts.stub")), force);
291
+ }
292
+ };
293
+
294
+ // src/cli/commands/MakeModuleCommand.ts
295
+ function MakeModuleCommand(name, opts = {}) {
296
+ const config = {
297
+ name,
298
+ type: opts.type ?? "crud",
299
+ ui: opts.ui ?? "modal",
300
+ force: opts.force ?? false
301
+ };
302
+ if (opts.outputBase !== void 0) config.outputBase = opts.outputBase;
303
+ if (opts.cwd !== void 0) config.cwd = opts.cwd;
304
+ if (opts.customStubsPath !== void 0) config.customStubsPath = opts.customStubsPath;
305
+ const generator = new ModuleGenerator(config);
306
+ generator.generate();
307
+ }
308
+
309
+ // src/cli/generators/SingleFileGenerators.ts
310
+ import path3 from "path";
311
+ function makeGenerator(stubPath, getTarget) {
312
+ return (opts) => {
313
+ const parser = new NameParser(opts.name);
314
+ const fg = new FileGenerator(opts.cwd, opts.customStubsPath);
315
+ const vars = TemplateRenderer.varsFromParser(parser);
316
+ const base = opts.cwd ?? process.cwd();
317
+ const target = getTarget(parser, base);
318
+ const raw = fg.readStub(stubPath);
319
+ const content = TemplateRenderer.render(raw, vars);
320
+ const writeOptions = opts.force !== void 0 ? { force: opts.force } : {};
321
+ fg.write(target, content, writeOptions);
322
+ };
323
+ }
324
+ var ComponentGenerator = makeGenerator(
325
+ "components/component.vue.stub",
326
+ (p, base) => path3.join(base, "src", "components", `${p.PascalCase}.vue`)
327
+ );
328
+ var PageGenerator = makeGenerator(
329
+ "pages/page.vue.stub",
330
+ (p, base) => path3.join(base, "src", "pages", `${p.PascalCase}Page.vue`)
331
+ );
332
+ var ServiceGenerator = makeGenerator(
333
+ "services/service.ts.stub",
334
+ (p, base) => path3.join(base, "src", "services", `${p.kebabCase}.service.ts`)
335
+ );
336
+ var StoreGenerator = makeGenerator(
337
+ "stores/store.ts.stub",
338
+ (p, base) => path3.join(base, "src", "stores", `${p.kebabCase}.store.ts`)
339
+ );
340
+ var TypeGenerator = makeGenerator(
341
+ "types/types.ts.stub",
342
+ (p, base) => path3.join(base, "src", "types", `${p.kebabCase}.types.ts`)
343
+ );
344
+
345
+ // src/cli/commands/MakeOtherCommands.ts
346
+ function MakeComponentCommand(name, opts = { name }) {
347
+ ComponentGenerator({ ...opts, name });
348
+ }
349
+ function MakePageCommand(name, opts = { name }) {
350
+ PageGenerator({ ...opts, name });
351
+ }
352
+ function MakeServiceCommand(name, opts = { name }) {
353
+ ServiceGenerator({ ...opts, name });
354
+ }
355
+ function MakeStoreCommand(name, opts = { name }) {
356
+ StoreGenerator({ ...opts, name });
357
+ }
358
+ function MakeTypeCommand(name, opts = { name }) {
359
+ TypeGenerator({ ...opts, name });
360
+ }
361
+
362
+ // src/cli/index.ts
363
+ function parseArgs(argv) {
364
+ const [, , command, ...rest] = argv;
365
+ const args = [];
366
+ const flags = {};
367
+ for (const token of rest) {
368
+ if (token.startsWith("--")) {
369
+ const [key, value] = token.slice(2).split("=");
370
+ if (key) {
371
+ flags[key] = value !== void 0 ? value : true;
372
+ }
373
+ } else {
374
+ args.push(token);
375
+ }
376
+ }
377
+ return { command, args, flags };
378
+ }
379
+ function printHelp() {
380
+ console.log(`
381
+ @devapps/vue-kit CLI \u2014 v0.1.0
382
+
383
+ Usage:
384
+ npx devapps-vue <command> <name> [options]
385
+
386
+ Commands:
387
+ make:module <Name> --type=basic|resource|crud|dashboard --ui=modal|page
388
+ make:component <Name>
389
+ make:page <Name>
390
+ make:service <Name>
391
+ make:store <Name>
392
+ make:type <Name>
393
+
394
+ Options:
395
+ --type=<type> Module type (basic, resource, crud, dashboard). Default: crud
396
+ --ui=<ui> UI mode for crud modules (modal, page). Default: modal
397
+ --force Overwrite existing files
398
+ --help Show this help message
399
+
400
+ Examples:
401
+ npx devapps-vue make:module Customer --type=crud --ui=modal
402
+ npx devapps-vue make:module Customer --type=crud --ui=page
403
+ npx devapps-vue make:component CustomerCard
404
+ npx devapps-vue make:page CustomerDashboard
405
+ npx devapps-vue make:service Customer
406
+ npx devapps-vue make:store Customer
407
+ npx devapps-vue make:type Customer
408
+ `);
409
+ }
410
+ function run(argv = process.argv) {
411
+ const { command, args, flags } = parseArgs(argv);
412
+ if (!command || flags["help"]) {
413
+ printHelp();
414
+ return;
415
+ }
416
+ const name = args[0];
417
+ if (!name && command !== "--help") {
418
+ console.error(`
419
+ \u274C Missing name argument for command: ${command}
420
+ `);
421
+ printHelp();
422
+ process.exit(1);
423
+ }
424
+ const force = flags["force"] === true || flags["force"] === "true";
425
+ try {
426
+ switch (command) {
427
+ case "make:module":
428
+ MakeModuleCommand(name, {
429
+ type: flags["type"] ?? "crud",
430
+ ui: flags["ui"] ?? "modal",
431
+ force
432
+ });
433
+ break;
434
+ case "make:component":
435
+ MakeComponentCommand(name, { name, force });
436
+ break;
437
+ case "make:page":
438
+ MakePageCommand(name, { name, force });
439
+ break;
440
+ case "make:service":
441
+ MakeServiceCommand(name, { name, force });
442
+ break;
443
+ case "make:store":
444
+ MakeStoreCommand(name, { name, force });
445
+ break;
446
+ case "make:type":
447
+ MakeTypeCommand(name, { name, force });
448
+ break;
449
+ default:
450
+ console.error(`
451
+ \u274C Unknown command: "${command}"
452
+ `);
453
+ printHelp();
454
+ process.exit(1);
455
+ }
456
+ } catch (err) {
457
+ if (err instanceof Error) {
458
+ console.error(`
459
+ \u274C ${err.message}
460
+ `);
461
+ } else {
462
+ console.error("\n\u274C An unexpected error occurred.\n");
463
+ }
464
+ process.exit(1);
465
+ }
466
+ }
467
+ export {
468
+ run
469
+ };
470
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/utils/NameParser.ts","../../src/cli/utils/TemplateRenderer.ts","../../src/cli/utils/FileGenerator.ts","../../src/cli/generators/ModuleGenerator.ts","../../src/cli/commands/MakeModuleCommand.ts","../../src/cli/generators/SingleFileGenerators.ts","../../src/cli/commands/MakeOtherCommands.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * NameParser — centralises all name-casing transformations.\n *\n * Given a PascalCase input (e.g. \"CustomerAccount\") it derives:\n * - PascalCase → CustomerAccount\n * - camelCase → customerAccount\n * - kebab-case → customer-account\n * - snake_case → customer_account\n * - SCREAMING_SNAKE → CUSTOMER_ACCOUNT\n * - Plural (simple) → CustomerAccounts\n *\n * Security: sanitises names to prevent path traversal and shell injection.\n */\nexport class NameParser {\n private readonly words: string[];\n\n constructor(input: string) {\n NameParser.assertSafe(input);\n this.words = NameParser.split(input);\n\n if (this.words.length === 0) {\n throw new Error(`Invalid module name: \"${input}\"`);\n }\n }\n\n /** Original PascalCase — e.g. CustomerAccount */\n get PascalCase(): string {\n return this.words.map((w) => capitalize(w)).join(\"\");\n }\n\n /** camelCase — e.g. customerAccount */\n get camelCase(): string {\n return this.words\n .map((w, i) => (i === 0 ? w.toLowerCase() : capitalize(w)))\n .join(\"\");\n }\n\n /** kebab-case — e.g. customer-account */\n get kebabCase(): string {\n return this.words.map((w) => w.toLowerCase()).join(\"-\");\n }\n\n /** snake_case — e.g. customer_account */\n get snakeCase(): string {\n return this.words.map((w) => w.toLowerCase()).join(\"_\");\n }\n\n /** SCREAMING_SNAKE_CASE — e.g. CUSTOMER_ACCOUNT */\n get screamingSnakeCase(): string {\n return this.words.map((w) => w.toUpperCase()).join(\"_\");\n }\n\n /** Naïve plural — appends \"s\". Sufficient for code generation. */\n get plural(): string {\n const last = this.words[this.words.length - 1];\n if (!last) return this.PascalCase + \"s\";\n\n const pluralLast = naivePlural(last);\n return this.words\n .slice(0, -1)\n .map((w) => capitalize(w))\n .concat(capitalize(pluralLast))\n .join(\"\");\n }\n\n /** Plural in camelCase */\n get pluralCamel(): string {\n const p = new NameParser(this.plural);\n return p.camelCase;\n }\n\n /** Plural in kebab-case */\n get pluralKebab(): string {\n return naivePluralKebab(this.kebabCase);\n }\n\n // ─── private helpers ────────────────────────────────────────────────────────\n\n private static split(input: string): string[] {\n // Accept PascalCase, camelCase, kebab-case, snake_case\n return input\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camel/pascal → spaces\n .replace(/[-_]/g, \" \") // kebab/snake → spaces\n .split(/\\s+/)\n .filter(Boolean);\n }\n\n /**\n * Guards against path traversal and shell injection in user-provided names.\n */\n static assertSafe(name: string): void {\n if (/[/.\\\\]/.test(name)) {\n throw new Error(\n `Module name \"${name}\" contains illegal characters (/, \\\\, .). ` +\n `Use PascalCase names like \"CustomerAccount\".`,\n );\n }\n\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {\n throw new Error(\n `Module name \"${name}\" is invalid. ` +\n `Use only letters, digits, hyphens or underscores, starting with a letter.`,\n );\n }\n }\n}\n\n// ─── utility functions ────────────────────────────────────────────────────────\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\nfunction naivePlural(word: string): string {\n const w = word.toLowerCase();\n\n if (w.endsWith(\"y\") && ![\"a\", \"e\", \"i\", \"o\", \"u\"].includes(w.charAt(w.length - 2) ?? \"\")) {\n return w.slice(0, -1) + \"ies\";\n }\n\n if (w.endsWith(\"s\") || w.endsWith(\"sh\") || w.endsWith(\"ch\") || w.endsWith(\"x\") || w.endsWith(\"z\")) {\n return w + \"es\";\n }\n\n return w + \"s\";\n}\n\nfunction naivePluralKebab(kebab: string): string {\n const parts = kebab.split(\"-\");\n const last = parts[parts.length - 1];\n if (!last) return kebab + \"s\";\n parts[parts.length - 1] = naivePlural(last);\n return parts.join(\"-\");\n}\n","import type { NameParser } from \"./NameParser\";\n\nexport interface TemplateVars {\n ModuleName: string;\n moduleName: string;\n moduleSlug: string;\n ModuleNamePlural: string;\n moduleNamePlural: string;\n moduleSlugPlural: string;\n resourcePath: string;\n [key: string]: string;\n}\n\n/**\n * Replaces `{{ VarName }}` placeholders in a stub string.\n */\nexport class TemplateRenderer {\n static varsFromParser(parser: NameParser, resourcePath?: string): TemplateVars {\n return {\n ModuleName: parser.PascalCase,\n moduleName: parser.camelCase,\n moduleSlug: parser.kebabCase,\n ModuleNamePlural: parser.plural,\n moduleNamePlural: parser.pluralCamel,\n moduleSlugPlural: parser.pluralKebab,\n resourcePath: resourcePath ?? `/${parser.pluralKebab}`,\n };\n }\n\n static render(template: string, vars: TemplateVars): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z_]+)\\s*\\}\\}/g, (_, key: string) => {\n const value = vars[key];\n return value !== undefined ? value : `{{ ${key} }}`;\n });\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/** Root of the @devapps/vue-kit package. */\n// When bundled via tsup, this file runs from `dist/cli/index.js` or `dist/cli/index.cjs`\n// So __dirname is `dist/cli` and we need to go up 2 levels.\nconst PACKAGE_ROOT = path.resolve(__dirname, \"../..\");\n\nexport interface WriteOptions {\n /** If true, overwrite existing files. Default: false. */\n force?: boolean;\n}\n\nexport interface WriteResult {\n path: string;\n created: boolean;\n skipped: boolean;\n}\n\n/**\n * Responsible for resolving stub paths and writing generated files.\n *\n * Stub resolution order (first found wins):\n * 1. `<cwd>/.devapps/stubs/<stubRelPath>`\n * 2. `<package>/stubs/<stubRelPath>`\n */\nexport class FileGenerator {\n constructor(\n /** Working directory of the consuming project. Defaults to process.cwd(). */\n private readonly cwd: string = process.cwd(),\n /** Optional custom stubs path override (from VueKitConfig.cli.stubsPath). */\n private readonly customStubsRoot?: string,\n ) {}\n\n /**\n * Resolves a stub file path, preferring project-local overrides.\n * @param stubRelPath Relative path from the stubs root (e.g. \"module/crud/modal/types/types.ts.stub\")\n */\n resolveStub(stubRelPath: string): string {\n const customRoot =\n this.customStubsRoot ?? path.join(this.cwd, \".devapps\", \"stubs\");\n\n const customPath = path.join(customRoot, stubRelPath);\n if (fs.existsSync(customPath)) {\n return customPath;\n }\n\n const packagePath = path.join(PACKAGE_ROOT, \"stubs\", stubRelPath);\n if (fs.existsSync(packagePath)) {\n return packagePath;\n }\n\n throw new Error(\n `Stub not found: \"${stubRelPath}\"\\n` +\n ` Looked in:\\n` +\n ` ${customPath}\\n` +\n ` ${packagePath}`,\n );\n }\n\n /** Read and return stub content as a string. */\n readStub(stubRelPath: string): string {\n return fs.readFileSync(this.resolveStub(stubRelPath), \"utf8\");\n }\n\n /**\n * Write content to targetPath. Creates parent directories if needed.\n * Respects `force` flag before overwriting.\n */\n write(targetPath: string, content: string, options?: WriteOptions): WriteResult {\n const abs = path.isAbsolute(targetPath)\n ? targetPath\n : path.join(this.cwd, targetPath);\n\n if (fs.existsSync(abs) && !options?.force) {\n console.warn(` ⚠ Skipped (already exists): ${abs}`);\n return { path: abs, created: false, skipped: true };\n }\n\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content, \"utf8\");\n\n console.log(` ✔ Created: ${abs}`);\n return { path: abs, created: true, skipped: false };\n }\n\n /**\n * High-level helper: resolve stub → render → write.\n */\n generate(\n stubRelPath: string,\n targetPath: string,\n render: (raw: string) => string,\n options?: WriteOptions,\n ): WriteResult {\n const raw = this.readStub(stubRelPath);\n const content = render(raw);\n return this.write(targetPath, content, options);\n }\n}\n","import { NameParser } from \"../utils/NameParser\";\nimport { TemplateRenderer } from \"../utils/TemplateRenderer\";\nimport { FileGenerator } from \"../utils/FileGenerator\";\nimport path from \"node:path\";\n\nexport type ModuleType = \"basic\" | \"resource\" | \"crud\" | \"dashboard\";\nexport type UiMode = \"modal\" | \"page\";\n\nexport interface ModuleGeneratorOptions {\n name: string;\n type?: ModuleType;\n ui?: UiMode;\n force?: boolean;\n outputBase?: string;\n cwd?: string;\n customStubsPath?: string;\n}\n\n/**\n * Orchestrates the generation of all files that make up a module.\n */\nexport class ModuleGenerator {\n private readonly parser: NameParser;\n private readonly fg: FileGenerator;\n private readonly vars: ReturnType<typeof TemplateRenderer.varsFromParser>;\n private readonly options: Required<\n Pick<ModuleGeneratorOptions, \"type\" | \"ui\" | \"force\" | \"outputBase\">\n >;\n\n constructor(opts: ModuleGeneratorOptions) {\n this.parser = new NameParser(opts.name);\n this.fg = new FileGenerator(opts.cwd, opts.customStubsPath);\n this.vars = TemplateRenderer.varsFromParser(this.parser);\n\n this.options = {\n type: opts.type ?? \"crud\",\n ui: opts.ui ?? \"modal\",\n force: opts.force ?? false,\n outputBase: opts.outputBase ?? path.join(opts.cwd ?? process.cwd(), \"src\", \"modules\"),\n };\n }\n\n generate(): void {\n const { type, ui, force, outputBase } = this.options;\n const slug = this.parser.kebabCase;\n const moduleDir = path.join(outputBase, slug);\n\n console.log(`\\n🚀 Generating module: ${this.parser.PascalCase} (${type}${type === \"crud\" ? ` / ${ui}` : \"\"})\\n`);\n\n switch (type) {\n case \"basic\":\n this.generateBasic(moduleDir, force);\n break;\n case \"resource\":\n this.generateResource(moduleDir, force);\n break;\n case \"crud\":\n if (ui === \"page\") {\n this.generateCrudPage(moduleDir, force);\n } else {\n this.generateCrudModal(moduleDir, force);\n }\n break;\n case \"dashboard\":\n this.generateDashboard(moduleDir, force);\n break;\n }\n\n console.log(`\\n✅ Module \"${this.parser.PascalCase}\" generated successfully!\\n`);\n }\n\n private render(raw: string): string {\n return TemplateRenderer.render(raw, this.vars);\n }\n\n private stub(relPath: string): string {\n return this.fg.readStub(relPath);\n }\n\n private write(targetPath: string, content: string, force: boolean) {\n this.fg.write(targetPath, content, { force });\n }\n\n // ─── basic ───────────────────────────────────────────────────────────────────\n\n private generateBasic(dir: string, force: boolean): void {\n const name = this.parser.PascalCase;\n\n this.write(\n path.join(dir, \"components\", `${name}Component.vue`),\n this.render(this.stub(\"module/basic/component.vue.stub\")),\n force,\n );\n this.write(\n path.join(dir, \"index.ts\"),\n this.render(this.stub(\"module/basic/index.ts.stub\")),\n force,\n );\n }\n\n // ─── resource ────────────────────────────────────────────────────────────────\n\n private generateResource(dir: string, force: boolean): void {\n const name = this.parser.PascalCase;\n const slug = this.parser.kebabCase;\n\n this.write(path.join(dir, \"services\", `${slug}.service.ts`), this.render(this.stub(\"module/resource/service.ts.stub\")), force);\n this.write(path.join(dir, \"stores\", `${slug}.store.ts`), this.render(this.stub(\"module/resource/store.ts.stub\")), force);\n this.write(path.join(dir, \"types\", `${slug}.types.ts`), this.render(this.stub(\"module/resource/types.ts.stub\")), force);\n this.write(path.join(dir, \"components\", `${name}List.vue`), this.render(this.stub(\"module/resource/List.vue.stub\")), force);\n this.write(path.join(dir, \"index.ts\"), this.render(this.stub(\"module/resource/index.ts.stub\")), force);\n }\n\n // ─── crud / modal ─────────────────────────────────────────────────────────────\n\n private generateCrudModal(dir: string, force: boolean): void {\n const name = this.parser.PascalCase;\n const slug = this.parser.kebabCase;\n\n this.write(path.join(dir, \"components\", `${name}List.vue`), this.render(this.stub(\"module/crud/modal/components/List.vue.stub\")), force);\n this.write(path.join(dir, \"components\", `${name}FormModal.vue`), this.render(this.stub(\"module/crud/modal/components/FormModal.vue.stub\")), force);\n this.write(path.join(dir, \"components\", `${name}DeleteModal.vue`), this.render(this.stub(\"module/crud/modal/components/DeleteModal.vue.stub\")), force);\n this.write(path.join(dir, \"views\", `${name}View.vue`), this.render(this.stub(\"module/crud/modal/views/View.vue.stub\")), force);\n this.write(path.join(dir, \"services\", `${slug}.service.ts`), this.render(this.stub(\"module/crud/modal/services/service.ts.stub\")), force);\n this.write(path.join(dir, \"stores\", `${slug}.store.ts`), this.render(this.stub(\"module/crud/modal/stores/store.ts.stub\")), force);\n this.write(path.join(dir, \"types\", `${slug}.types.ts`), this.render(this.stub(\"module/crud/modal/types/types.ts.stub\")), force);\n this.write(path.join(dir, \"router.ts\"), this.render(this.stub(\"module/crud/modal/router.ts.stub\")), force);\n this.write(path.join(dir, \"index.ts\"), this.render(this.stub(\"module/crud/modal/index.ts.stub\")), force);\n }\n\n // ─── crud / page ─────────────────────────────────────────────────────────────\n\n private generateCrudPage(dir: string, force: boolean): void {\n const name = this.parser.PascalCase;\n const slug = this.parser.kebabCase;\n\n this.write(path.join(dir, \"components\", `${name}List.vue`), this.render(this.stub(\"module/crud/page/components/List.vue.stub\")), force);\n this.write(path.join(dir, \"components\", `${name}Form.vue`), this.render(this.stub(\"module/crud/page/components/Form.vue.stub\")), force);\n this.write(path.join(dir, \"components\", `${name}DeleteModal.vue`), this.render(this.stub(\"module/crud/page/components/DeleteModal.vue.stub\")), force);\n this.write(path.join(dir, \"pages\", `${name}ListPage.vue`), this.render(this.stub(\"module/crud/page/pages/ListPage.vue.stub\")), force);\n this.write(path.join(dir, \"pages\", `${name}CreatePage.vue`), this.render(this.stub(\"module/crud/page/pages/CreatePage.vue.stub\")), force);\n this.write(path.join(dir, \"pages\", `${name}EditPage.vue`), this.render(this.stub(\"module/crud/page/pages/EditPage.vue.stub\")), force);\n this.write(path.join(dir, \"pages\", `${name}ShowPage.vue`), this.render(this.stub(\"module/crud/page/pages/ShowPage.vue.stub\")), force);\n this.write(path.join(dir, \"services\", `${slug}.service.ts`), this.render(this.stub(\"module/crud/page/services/service.ts.stub\")), force);\n this.write(path.join(dir, \"stores\", `${slug}.store.ts`), this.render(this.stub(\"module/crud/page/stores/store.ts.stub\")), force);\n this.write(path.join(dir, \"types\", `${slug}.types.ts`), this.render(this.stub(\"module/crud/page/types/types.ts.stub\")), force);\n this.write(path.join(dir, \"router.ts\"), this.render(this.stub(\"module/crud/page/router.ts.stub\")), force);\n this.write(path.join(dir, \"index.ts\"), this.render(this.stub(\"module/crud/page/index.ts.stub\")), force);\n }\n\n // ─── dashboard ───────────────────────────────────────────────────────────────\n\n private generateDashboard(dir: string, force: boolean): void {\n const name = this.parser.PascalCase;\n const slug = this.parser.kebabCase;\n\n this.write(path.join(dir, \"views\", `${name}Dashboard.vue`), this.render(this.stub(\"module/dashboard/Dashboard.vue.stub\")), force);\n this.write(path.join(dir, \"router.ts\"), this.render(this.stub(\"module/dashboard/router.ts.stub\")), force);\n this.write(path.join(dir, \"index.ts\"), this.render(this.stub(\"module/dashboard/index.ts.stub\")), force);\n }\n}\n","import { ModuleGenerator, type ModuleType, type UiMode, type ModuleGeneratorOptions } from \"../generators/ModuleGenerator\";\n\nexport interface MakeModuleOptions {\n type?: ModuleType;\n ui?: UiMode;\n force?: boolean;\n cwd?: string;\n outputBase?: string;\n customStubsPath?: string;\n}\n\nexport function MakeModuleCommand(name: string, opts: MakeModuleOptions = {}): void {\n const config: ModuleGeneratorOptions = {\n name,\n type: opts.type ?? \"crud\",\n ui: opts.ui ?? \"modal\",\n force: opts.force ?? false,\n };\n \n if (opts.outputBase !== undefined) config.outputBase = opts.outputBase;\n if (opts.cwd !== undefined) config.cwd = opts.cwd;\n if (opts.customStubsPath !== undefined) config.customStubsPath = opts.customStubsPath;\n\n const generator = new ModuleGenerator(config);\n\n generator.generate();\n}\n","import { NameParser } from \"../utils/NameParser\";\nimport { TemplateRenderer } from \"../utils/TemplateRenderer\";\nimport { FileGenerator } from \"../utils/FileGenerator\";\nimport path from \"node:path\";\n\nexport interface SingleFileGeneratorOptions {\n name: string;\n force?: boolean;\n cwd?: string;\n customStubsPath?: string;\n}\n\nfunction makeGenerator(stubPath: string, getTarget: (name: NameParser, base: string) => string) {\n return (opts: SingleFileGeneratorOptions) => {\n const parser = new NameParser(opts.name);\n const fg = new FileGenerator(opts.cwd, opts.customStubsPath);\n const vars = TemplateRenderer.varsFromParser(parser);\n const base = opts.cwd ?? process.cwd();\n const target = getTarget(parser, base);\n const raw = fg.readStub(stubPath);\n const content = TemplateRenderer.render(raw, vars);\n const writeOptions = opts.force !== undefined ? { force: opts.force } : {};\n fg.write(target, content, writeOptions);\n };\n}\n\nexport const ComponentGenerator = makeGenerator(\n \"components/component.vue.stub\",\n (p, base) => path.join(base, \"src\", \"components\", `${p.PascalCase}.vue`),\n);\n\nexport const PageGenerator = makeGenerator(\n \"pages/page.vue.stub\",\n (p, base) => path.join(base, \"src\", \"pages\", `${p.PascalCase}Page.vue`),\n);\n\nexport const ServiceGenerator = makeGenerator(\n \"services/service.ts.stub\",\n (p, base) => path.join(base, \"src\", \"services\", `${p.kebabCase}.service.ts`),\n);\n\nexport const StoreGenerator = makeGenerator(\n \"stores/store.ts.stub\",\n (p, base) => path.join(base, \"src\", \"stores\", `${p.kebabCase}.store.ts`),\n);\n\nexport const TypeGenerator = makeGenerator(\n \"types/types.ts.stub\",\n (p, base) => path.join(base, \"src\", \"types\", `${p.kebabCase}.types.ts`),\n);\n","import {\n ComponentGenerator,\n PageGenerator,\n ServiceGenerator,\n StoreGenerator,\n TypeGenerator,\n type SingleFileGeneratorOptions,\n} from \"../generators/SingleFileGenerators\";\n\nexport function MakeComponentCommand(name: string, opts: SingleFileGeneratorOptions = { name }): void {\n ComponentGenerator({ ...opts, name });\n}\n\nexport function MakePageCommand(name: string, opts: SingleFileGeneratorOptions = { name }): void {\n PageGenerator({ ...opts, name });\n}\n\nexport function MakeServiceCommand(name: string, opts: SingleFileGeneratorOptions = { name }): void {\n ServiceGenerator({ ...opts, name });\n}\n\nexport function MakeStoreCommand(name: string, opts: SingleFileGeneratorOptions = { name }): void {\n StoreGenerator({ ...opts, name });\n}\n\nexport function MakeTypeCommand(name: string, opts: SingleFileGeneratorOptions = { name }): void {\n TypeGenerator({ ...opts, name });\n}\n","import { MakeModuleCommand } from \"./commands/MakeModuleCommand\";\nimport {\n MakeComponentCommand,\n MakePageCommand,\n MakeServiceCommand,\n MakeStoreCommand,\n MakeTypeCommand,\n} from \"./commands/MakeOtherCommands\";\nimport type { ModuleType, UiMode } from \"./generators/ModuleGenerator\";\n\n// ─── arg parsing ─────────────────────────────────────────────────────────────\n\nfunction parseArgs(argv: string[]): {\n command: string | undefined;\n args: string[];\n flags: Record<string, string | boolean>;\n} {\n const [, , command, ...rest] = argv;\n\n const args: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (const token of rest) {\n if (token.startsWith(\"--\")) {\n const [key, value] = token.slice(2).split(\"=\");\n if (key) {\n flags[key] = value !== undefined ? value : true;\n }\n } else {\n args.push(token);\n }\n }\n\n return { command, args, flags };\n}\n\n// ─── help ────────────────────────────────────────────────────────────────────\n\nfunction printHelp(): void {\n console.log(`\n@devapps/vue-kit CLI — v0.1.0\n\nUsage:\n npx devapps-vue <command> <name> [options]\n\nCommands:\n make:module <Name> --type=basic|resource|crud|dashboard --ui=modal|page\n make:component <Name>\n make:page <Name>\n make:service <Name>\n make:store <Name>\n make:type <Name>\n\nOptions:\n --type=<type> Module type (basic, resource, crud, dashboard). Default: crud\n --ui=<ui> UI mode for crud modules (modal, page). Default: modal\n --force Overwrite existing files\n --help Show this help message\n\nExamples:\n npx devapps-vue make:module Customer --type=crud --ui=modal\n npx devapps-vue make:module Customer --type=crud --ui=page\n npx devapps-vue make:component CustomerCard\n npx devapps-vue make:page CustomerDashboard\n npx devapps-vue make:service Customer\n npx devapps-vue make:store Customer\n npx devapps-vue make:type Customer\n`);\n}\n\n// ─── main ────────────────────────────────────────────────────────────────────\n\nexport function run(argv: string[] = process.argv): void {\n const { command, args, flags } = parseArgs(argv);\n\n if (!command || flags[\"help\"]) {\n printHelp();\n return;\n }\n\n const name = args[0];\n\n if (!name && command !== \"--help\") {\n console.error(`\\n❌ Missing name argument for command: ${command}\\n`);\n printHelp();\n process.exit(1);\n }\n\n const force = flags[\"force\"] === true || flags[\"force\"] === \"true\";\n\n try {\n switch (command) {\n case \"make:module\":\n MakeModuleCommand(name!, {\n type: (flags[\"type\"] as ModuleType) ?? \"crud\",\n ui: (flags[\"ui\"] as UiMode) ?? \"modal\",\n force,\n });\n break;\n\n case \"make:component\":\n MakeComponentCommand(name!, { name: name!, force });\n break;\n\n case \"make:page\":\n MakePageCommand(name!, { name: name!, force });\n break;\n\n case \"make:service\":\n MakeServiceCommand(name!, { name: name!, force });\n break;\n\n case \"make:store\":\n MakeStoreCommand(name!, { name: name!, force });\n break;\n\n case \"make:type\":\n MakeTypeCommand(name!, { name: name!, force });\n break;\n\n default:\n console.error(`\\n❌ Unknown command: \"${command}\"\\n`);\n printHelp();\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof Error) {\n console.error(`\\n❌ ${err.message}\\n`);\n } else {\n console.error(\"\\n❌ An unexpected error occurred.\\n\");\n }\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["path","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devappsnpm/vue-kit",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "description": "Vue 3 toolkit for Laravel API applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { ConfirmDeleteModal } from '@devapps/vue-kit/ui'
2
+ import { ConfirmDeleteModal } from '@devappsnpm/vue-kit/ui'
3
3
  import { use{{ ModuleName }}Store } from '../stores/{{ moduleSlug }}.store'
4
4
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
5
5
 
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { reactive, watch } from 'vue'
3
- import { BaseModal } from '@devapps/vue-kit/ui'
4
- import { Form } from '@devapps/vue-kit'
3
+ import { BaseModal } from '@devappsnpm/vue-kit/ui'
4
+ import { Form } from '@devappsnpm/vue-kit'
5
5
  import { use{{ ModuleName }}Store } from '../stores/{{ moduleSlug }}.store'
6
6
  import type { {{ ModuleName }}, {{ ModuleName }}Form } from '../types/{{ moduleSlug }}.types'
7
7
 
@@ -1,5 +1,5 @@
1
- import { CrudService } from '@devapps/vue-kit'
2
- import type { HttpClient } from '@devapps/vue-kit'
1
+ import { CrudService } from '@devappsnpm/vue-kit'
2
+ import type { HttpClient } from '@devappsnpm/vue-kit'
3
3
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
4
4
 
5
5
  export class {{ ModuleName }}Service extends CrudService<{{ ModuleName }}> {
@@ -1,4 +1,4 @@
1
- import { defineCrudStore } from '@devapps/vue-kit'
1
+ import { defineCrudStore } from '@devappsnpm/vue-kit'
2
2
  import { {{ ModuleName }}Service } from '../services/{{ moduleSlug }}.service'
3
3
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
4
4
  import { useHttpClient } from '@/composables/useHttpClient' // adjust to your project
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { ConfirmDeleteModal } from '@devapps/vue-kit/ui'
2
+ import { ConfirmDeleteModal } from '@devappsnpm/vue-kit/ui'
3
3
  import { use{{ ModuleName }}Store } from '../stores/{{ moduleSlug }}.store'
4
4
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
5
5
 
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { reactive, watch } from 'vue'
3
- import { Form } from '@devapps/vue-kit'
3
+ import { Form } from '@devappsnpm/vue-kit'
4
4
  import type { {{ ModuleName }}, {{ ModuleName }}Form } from '../types/{{ moduleSlug }}.types'
5
5
 
6
6
  const props = defineProps<{
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { reactive } from 'vue'
3
3
  import { useRouter } from 'vue-router'
4
- import { Form } from '@devapps/vue-kit'
4
+ import { Form } from '@devappsnpm/vue-kit'
5
5
  import { use{{ ModuleName }}Store } from '../stores/{{ moduleSlug }}.store'
6
6
  import {{ ModuleName }}Form from '../components/{{ ModuleName }}Form.vue'
7
7
  import type { {{ ModuleName }}Form as {{ ModuleName }}FormData } from '../types/{{ moduleSlug }}.types'
@@ -1,5 +1,5 @@
1
- import { CrudService } from '@devapps/vue-kit'
2
- import type { HttpClient } from '@devapps/vue-kit'
1
+ import { CrudService } from '@devappsnpm/vue-kit'
2
+ import type { HttpClient } from '@devappsnpm/vue-kit'
3
3
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
4
4
 
5
5
  export class {{ ModuleName }}Service extends CrudService<{{ ModuleName }}> {
@@ -1,4 +1,4 @@
1
- import { defineCrudStore } from '@devapps/vue-kit'
1
+ import { defineCrudStore } from '@devappsnpm/vue-kit'
2
2
  import { {{ ModuleName }}Service } from '../services/{{ moduleSlug }}.service'
3
3
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
4
4
  import { useHttpClient } from '@/composables/useHttpClient' // adjust to your project
@@ -1,5 +1,5 @@
1
- import { CrudService } from '@devapps/vue-kit'
2
- import type { HttpClient } from '@devapps/vue-kit'
1
+ import { CrudService } from '@devappsnpm/vue-kit'
2
+ import type { HttpClient } from '@devappsnpm/vue-kit'
3
3
  import type { {{ ModuleName }} } from '../types/{{ moduleSlug }}.types'
4
4
 
5
5
  export class {{ ModuleName }}Service extends CrudService<{{ ModuleName }}> {