@mohasinac/cli 0.1.0

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,72 @@
1
+ import {
2
+ __spreadProps,
3
+ __spreadValues
4
+ } from "./chunk-N3ETBM74.js";
5
+
6
+ // src/next.ts
7
+ var ALWAYS_TRANSPILE = [
8
+ "@mohasinac/contracts",
9
+ "@mohasinac/core",
10
+ "@mohasinac/react",
11
+ "@mohasinac/ui",
12
+ "@mohasinac/http",
13
+ "@mohasinac/next",
14
+ "@mohasinac/tokens",
15
+ "@mohasinac/css-tailwind",
16
+ "@mohasinac/css-vanilla"
17
+ ];
18
+ var FEATURE_PACKAGE_MAP = {
19
+ layout: "@mohasinac/feat-layout",
20
+ forms: "@mohasinac/feat-forms",
21
+ filters: "@mohasinac/feat-filters",
22
+ media: "@mohasinac/feat-media",
23
+ auth: "@mohasinac/feat-auth",
24
+ account: "@mohasinac/feat-account",
25
+ products: "@mohasinac/feat-products",
26
+ categories: "@mohasinac/feat-categories",
27
+ cart: "@mohasinac/feat-cart",
28
+ wishlist: "@mohasinac/feat-wishlist",
29
+ checkout: "@mohasinac/feat-checkout",
30
+ orders: "@mohasinac/feat-orders",
31
+ payments: "@mohasinac/feat-payments",
32
+ blog: "@mohasinac/feat-blog",
33
+ reviews: "@mohasinac/feat-reviews",
34
+ faq: "@mohasinac/feat-faq",
35
+ search: "@mohasinac/feat-search",
36
+ homepage: "@mohasinac/feat-homepage",
37
+ admin: "@mohasinac/feat-admin",
38
+ events: "@mohasinac/feat-events",
39
+ auctions: "@mohasinac/feat-auctions",
40
+ promotions: "@mohasinac/feat-promotions",
41
+ seller: "@mohasinac/feat-seller",
42
+ stores: "@mohasinac/feat-stores",
43
+ "pre-orders": "@mohasinac/feat-pre-orders",
44
+ consultation: "@mohasinac/feat-consultation",
45
+ corporate: "@mohasinac/feat-corporate",
46
+ "before-after": "@mohasinac/feat-before-after",
47
+ loyalty: "@mohasinac/feat-loyalty",
48
+ collections: "@mohasinac/feat-collections",
49
+ preorders: "@mohasinac/feat-preorders",
50
+ "whatsapp-bot": "@mohasinac/feat-whatsapp-bot"
51
+ };
52
+ function resolveTranspilePackages(features) {
53
+ const featurePackages = Object.entries(features).filter(([, enabled]) => enabled).map(([key]) => FEATURE_PACKAGE_MAP[key]).filter((pkg) => pkg !== void 0);
54
+ return [...ALWAYS_TRANSPILE, ...featurePackages];
55
+ }
56
+ function withFeatures(features) {
57
+ return function applyFeatures(nextConfig) {
58
+ var _a;
59
+ const fromFeatures = resolveTranspilePackages(features);
60
+ const existing = (_a = nextConfig.transpilePackages) != null ? _a : [];
61
+ const merged = [
62
+ ...fromFeatures,
63
+ ...existing.filter((p) => !fromFeatures.includes(p))
64
+ ];
65
+ return __spreadProps(__spreadValues({}, nextConfig), { transpilePackages: merged });
66
+ };
67
+ }
68
+
69
+ export {
70
+ resolveTranspilePackages,
71
+ withFeatures
72
+ };
@@ -0,0 +1,24 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ export {
22
+ __spreadValues,
23
+ __spreadProps
24
+ };
@@ -0,0 +1,86 @@
1
+ import {
2
+ __spreadValues
3
+ } from "./chunk-N3ETBM74.js";
4
+
5
+ // src/i18n.ts
6
+ var _dynamicImport = new Function(
7
+ "modulePath",
8
+ "return import(modulePath)"
9
+ );
10
+ var FEATURE_NAMESPACE_MAP = {
11
+ layout: "layout",
12
+ forms: "forms",
13
+ auth: "auth",
14
+ account: "account",
15
+ products: "products",
16
+ categories: "categories",
17
+ cart: "cart",
18
+ wishlist: "wishlist",
19
+ checkout: "checkout",
20
+ orders: "orders",
21
+ payments: "payments",
22
+ blog: "blog",
23
+ reviews: "reviews",
24
+ faq: "faq",
25
+ search: "search",
26
+ homepage: "home",
27
+ admin: "admin",
28
+ events: "events",
29
+ auctions: "auctions",
30
+ promotions: "promotions",
31
+ seller: "seller",
32
+ stores: "stores",
33
+ "pre-orders": "preOrders",
34
+ consultation: "consultation",
35
+ concern: "concern",
36
+ corporate: "corporate",
37
+ "before-after": "beforeAfter",
38
+ loyalty: "loyalty",
39
+ collections: "collections",
40
+ preorders: "preorders"
41
+ };
42
+ function deepMerge(a, b) {
43
+ const result = __spreadValues({}, a);
44
+ for (const key of Object.keys(b)) {
45
+ const av = a[key];
46
+ const bv = b[key];
47
+ if (bv !== null && typeof bv === "object" && !Array.isArray(bv) && av !== null && typeof av === "object" && !Array.isArray(av)) {
48
+ result[key] = deepMerge(av, bv);
49
+ } else {
50
+ result[key] = bv;
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ async function tryLoadFeatureMessages(featureKey, locale) {
56
+ var _a;
57
+ try {
58
+ const pkg = `@mohasinac/feat-${featureKey}`;
59
+ const mod = await _dynamicImport(`${pkg}/messages/${locale}.json`);
60
+ return (_a = mod.default) != null ? _a : mod;
61
+ } catch (e) {
62
+ return {};
63
+ }
64
+ }
65
+ async function mergeFeatureMessages(locale, features) {
66
+ var _a;
67
+ let projectMessages = {};
68
+ try {
69
+ const mod = await _dynamicImport(`../../messages/${locale}.json`);
70
+ projectMessages = (_a = mod.default) != null ? _a : mod;
71
+ } catch (e) {
72
+ }
73
+ const enabledKeys = Object.entries(features).filter(([key, enabled]) => enabled && key in FEATURE_NAMESPACE_MAP).map(([key]) => key);
74
+ const fragments = await Promise.all(
75
+ enabledKeys.map((key) => tryLoadFeatureMessages(key, locale))
76
+ );
77
+ let base = {};
78
+ for (const fragment of fragments) {
79
+ base = deepMerge(base, fragment);
80
+ }
81
+ return deepMerge(base, projectMessages);
82
+ }
83
+
84
+ export {
85
+ mergeFeatureMessages
86
+ };
package/dist/cli.cjs ADDED
@@ -0,0 +1,377 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+
20
+ // src/cli.ts
21
+ var import_commander4 = require("commander");
22
+
23
+ // src/commands/add.ts
24
+ var import_commander = require("commander");
25
+ var import_path2 = require("path");
26
+
27
+ // src/utils.ts
28
+ var import_fs = require("fs");
29
+ var import_path = require("path");
30
+ function findProjectRoot(cwd = process.cwd()) {
31
+ var _a, _b;
32
+ let dir = cwd;
33
+ while (true) {
34
+ const pkgPath = (0, import_path.join)(dir, "package.json");
35
+ if ((0, import_fs.existsSync)(pkgPath)) {
36
+ try {
37
+ const pkg = JSON.parse((0, import_fs.readFileSync)(pkgPath, "utf-8"));
38
+ const deps = __spreadValues(__spreadValues({}, (_a = pkg.dependencies) != null ? _a : {}), (_b = pkg.devDependencies) != null ? _b : {});
39
+ if ("next" in deps) return dir;
40
+ } catch (e) {
41
+ }
42
+ }
43
+ const parent = (0, import_path.dirname)(dir);
44
+ if (parent === dir)
45
+ throw new Error("Could not find Next.js project root from: " + cwd);
46
+ dir = parent;
47
+ }
48
+ }
49
+ async function loadManifest(name, projectRoot) {
50
+ const monoSrcPath = (0, import_path.join)(
51
+ projectRoot,
52
+ "packages",
53
+ `feat-${name}`,
54
+ "src",
55
+ "manifest.ts"
56
+ );
57
+ const monoJsPath = (0, import_path.join)(
58
+ projectRoot,
59
+ "packages",
60
+ `feat-${name}`,
61
+ "dist",
62
+ "esm",
63
+ "manifest.js"
64
+ );
65
+ const pkgPath = (0, import_path.join)(
66
+ projectRoot,
67
+ "node_modules",
68
+ "@mohasinac",
69
+ `feat-${name}`,
70
+ "dist",
71
+ "esm",
72
+ "manifest.js"
73
+ );
74
+ const tryPaths = [monoJsPath, pkgPath];
75
+ let mod = null;
76
+ for (const p of tryPaths) {
77
+ if ((0, import_fs.existsSync)(p)) {
78
+ mod = await import(
79
+ /* @vite-ignore */
80
+ `file://${p}`
81
+ );
82
+ break;
83
+ }
84
+ }
85
+ if (!mod) {
86
+ if ((0, import_fs.existsSync)(monoSrcPath)) {
87
+ mod = await import(
88
+ /* @vite-ignore */
89
+ `file://${monoSrcPath}`
90
+ );
91
+ }
92
+ }
93
+ if (!(mod == null ? void 0 : mod.manifest)) {
94
+ throw new Error(
95
+ `Cannot find manifest for @mohasinac/feat-${name}. Tried:
96
+ ${tryPaths.join("\n ")}`
97
+ );
98
+ }
99
+ return mod.manifest;
100
+ }
101
+ function generateRouteStub(stub, featureName) {
102
+ const { default: def, generateMetadata: gm } = stub.exports;
103
+ const named = gm ? `{ ${def} as default, ${gm} }` : `{ ${def} as default }`;
104
+ return `// Auto-generated by @mohasinac/cli \u2014 do not edit
105
+ export ${named} from "@mohasinac/feat-${featureName}";
106
+ `;
107
+ }
108
+ function generateApiRouteStub(stub, featureName) {
109
+ const methods = stub.methods.join(", ");
110
+ const segment = stub.segment;
111
+ return `// Auto-generated by @mohasinac/cli \u2014 do not edit
112
+ export { ${methods} } from "@mohasinac/feat-${featureName}/${segment}";
113
+ `;
114
+ }
115
+ function writeStub(filePath, content) {
116
+ if ((0, import_fs.existsSync)(filePath)) return "skipped";
117
+ (0, import_fs.mkdirSync)((0, import_path.dirname)(filePath), { recursive: true });
118
+ (0, import_fs.writeFileSync)(filePath, content, "utf-8");
119
+ return "created";
120
+ }
121
+ function patchFeaturesConfig(projectRoot, featureKey, value) {
122
+ const candidates = [
123
+ (0, import_path.join)(projectRoot, "features.config.ts"),
124
+ (0, import_path.join)(projectRoot, "features.config.js")
125
+ ];
126
+ const configPath = candidates.find(import_fs.existsSync);
127
+ if (!configPath) {
128
+ console.warn(" \u26A0 features.config.ts not found \u2014 skipping config patch");
129
+ return;
130
+ }
131
+ let source = (0, import_fs.readFileSync)(configPath, "utf-8");
132
+ const valueStr = String(value);
133
+ const existingPattern = new RegExp(
134
+ `(\\b${featureKey}\\s*:\\s*)(true|false)`,
135
+ "g"
136
+ );
137
+ if (existingPattern.test(source)) {
138
+ source = source.replace(existingPattern, `$1${valueStr}`);
139
+ } else {
140
+ source = source.replace(
141
+ /(}\s*satisfies\s*FeaturesConfig)/,
142
+ ` ${featureKey}: ${valueStr},
143
+ $1`
144
+ );
145
+ }
146
+ (0, import_fs.writeFileSync)(configPath, source, "utf-8");
147
+ }
148
+ function patchEnvExample(projectRoot, envKeys) {
149
+ if (envKeys.length === 0) return;
150
+ const envPath = (0, import_path.join)(projectRoot, ".env.example");
151
+ const existing = (0, import_fs.existsSync)(envPath) ? (0, import_fs.readFileSync)(envPath, "utf-8") : "";
152
+ const missing = envKeys.filter((k) => !existing.includes(k));
153
+ if (missing.length === 0) return;
154
+ const block = "\n# Added by @mohasinac/cli\n" + missing.map((k) => `${k}=`).join("\n") + "\n";
155
+ (0, import_fs.writeFileSync)(envPath, existing + block, "utf-8");
156
+ }
157
+
158
+ // src/commands/add.ts
159
+ function addCommand() {
160
+ const cmd = new import_commander.Command("add");
161
+ cmd.description("Add a @mohasinac/feat-<name> feature to the project").argument("<name>", "Feature name, e.g. events").option("-r, --root <path>", "Project root (default: auto-detect)").option("--dry-run", "Print what would be created without writing files").action(async (name, opts) => {
162
+ var _a, _b;
163
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
164
+ const dryRun = (_b = opts.dryRun) != null ? _b : false;
165
+ console.log(`
166
+ Adding @mohasinac/feat-${name}...
167
+ `);
168
+ let manifest;
169
+ try {
170
+ manifest = await loadManifest(name, projectRoot);
171
+ } catch (err) {
172
+ console.error(` \u2717 ${err.message}`);
173
+ process.exit(1);
174
+ }
175
+ for (const route of manifest.routes) {
176
+ const stubPath = (0, import_path2.join)(projectRoot, "app", route.segment, "page.tsx");
177
+ const content = generateRouteStub(route, name);
178
+ if (dryRun) {
179
+ console.log(
180
+ ` [dry-run] would create: app/${route.segment}/page.tsx`
181
+ );
182
+ } else {
183
+ const result = writeStub(stubPath, content);
184
+ const icon = result === "created" ? "\u2714" : "\u2013";
185
+ const label = result === "created" ? "created" : "already exists";
186
+ console.log(` ${icon} app/${route.segment}/page.tsx \u2192 ${label}`);
187
+ }
188
+ }
189
+ for (const route of manifest.apiRoutes) {
190
+ const stubPath = (0, import_path2.join)(projectRoot, "app", route.segment, "route.ts");
191
+ const content = generateApiRouteStub(route, name);
192
+ if (dryRun) {
193
+ console.log(
194
+ ` [dry-run] would create: app/${route.segment}/route.ts`
195
+ );
196
+ } else {
197
+ const result = writeStub(stubPath, content);
198
+ const icon = result === "created" ? "\u2714" : "\u2013";
199
+ const label = result === "created" ? "created" : "already exists";
200
+ console.log(` ${icon} app/${route.segment}/route.ts \u2192 ${label}`);
201
+ }
202
+ }
203
+ if (!dryRun) {
204
+ patchFeaturesConfig(projectRoot, name, true);
205
+ console.log(` \u2714 features.config.ts \u2192 ${name}: true`);
206
+ } else {
207
+ console.log(
208
+ ` [dry-run] would patch: features.config.ts \u2192 ${name}: true`
209
+ );
210
+ }
211
+ if (manifest.envKeys.length > 0) {
212
+ if (!dryRun) {
213
+ patchEnvExample(projectRoot, manifest.envKeys);
214
+ console.log(` \u2714 .env.example \u2192 ${manifest.envKeys.join(", ")}`);
215
+ } else {
216
+ console.log(
217
+ ` [dry-run] would add to .env.example: ${manifest.envKeys.join(", ")}`
218
+ );
219
+ }
220
+ }
221
+ console.log(`
222
+ Done.
223
+ `);
224
+ });
225
+ return cmd;
226
+ }
227
+
228
+ // src/commands/remove.ts
229
+ var import_commander2 = require("commander");
230
+ var import_fs2 = require("fs");
231
+ var import_fs3 = require("fs");
232
+ var import_path3 = require("path");
233
+ var AUTO_GEN_MARKER = "// @mohasinac-generated";
234
+ function removeCommand() {
235
+ const cmd = new import_commander2.Command("remove");
236
+ cmd.alias("rm").description("Remove a @mohasinac/feat-<name> feature from the project").argument("<name>", "Feature name, e.g. events").option("-r, --root <path>", "Project root (default: auto-detect)").option("--dry-run", "Print what would be removed without touching files").action(async (name, opts) => {
237
+ var _a, _b;
238
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
239
+ const dryRun = (_b = opts.dryRun) != null ? _b : false;
240
+ console.log(`
241
+ Removing @mohasinac/feat-${name}...
242
+ `);
243
+ let manifest;
244
+ try {
245
+ manifest = await loadManifest(name, projectRoot);
246
+ } catch (err) {
247
+ console.error(` \u2717 ${err.message}`);
248
+ process.exit(1);
249
+ }
250
+ for (const route of manifest.routes) {
251
+ const stubPath = (0, import_path3.join)(projectRoot, "app", route.segment, "page.tsx");
252
+ deleteIfGenerated(stubPath, dryRun, `app/${route.segment}/page.tsx`);
253
+ }
254
+ for (const route of manifest.apiRoutes) {
255
+ const stubPath = (0, import_path3.join)(projectRoot, "app", route.segment, "route.ts");
256
+ deleteIfGenerated(stubPath, dryRun, `app/${route.segment}/route.ts`);
257
+ }
258
+ if (!dryRun) {
259
+ patchFeaturesConfig(projectRoot, name, false);
260
+ console.log(` \u2714 features.config.ts \u2192 ${name}: false`);
261
+ } else {
262
+ console.log(
263
+ ` [dry-run] would patch: features.config.ts \u2192 ${name}: false`
264
+ );
265
+ }
266
+ console.log(`
267
+ Done.
268
+ `);
269
+ });
270
+ return cmd;
271
+ }
272
+ function deleteIfGenerated(filePath, dryRun, label) {
273
+ if (!(0, import_fs2.existsSync)(filePath)) {
274
+ console.log(` \u2013 ${label} \u2192 not found, skipping`);
275
+ return;
276
+ }
277
+ const content = (0, import_fs3.readFileSync)(filePath, "utf8");
278
+ if (!content.includes(AUTO_GEN_MARKER)) {
279
+ console.log(` \u2013 ${label} \u2192 hand-edited, keeping`);
280
+ return;
281
+ }
282
+ if (dryRun) {
283
+ console.log(` [dry-run] would delete: ${label}`);
284
+ return;
285
+ }
286
+ (0, import_fs2.rmSync)(filePath);
287
+ console.log(` \u2714 ${label} \u2192 deleted`);
288
+ }
289
+
290
+ // src/commands/list.ts
291
+ var import_commander3 = require("commander");
292
+ var import_fs4 = require("fs");
293
+ var import_path4 = require("path");
294
+ var KNOWN_FEATURES = [
295
+ "auth",
296
+ "products",
297
+ "categories",
298
+ "events",
299
+ "orders",
300
+ "bookings",
301
+ "reviews",
302
+ "promotions",
303
+ "blog",
304
+ "sellers",
305
+ "search",
306
+ "notifications",
307
+ "analytics",
308
+ "media"
309
+ ];
310
+ function listCommand() {
311
+ const cmd = new import_commander3.Command("list");
312
+ cmd.alias("ls").description("List all @mohasinac/feat-* features and their enabled state").option("-r, --root <path>", "Project root (default: auto-detect)").option("--enabled-only", "Show only enabled features").action((opts) => {
313
+ var _a;
314
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
315
+ const configPath = (0, import_path4.join)(
316
+ projectRoot,
317
+ "src",
318
+ "config",
319
+ "features.config.ts"
320
+ );
321
+ const altConfigPath = (0, import_path4.join)(projectRoot, "features.config.ts");
322
+ const resolvedPath = (0, import_fs4.existsSync)(configPath) ? configPath : (0, import_fs4.existsSync)(altConfigPath) ? altConfigPath : null;
323
+ const parsed = {};
324
+ if (resolvedPath) {
325
+ const source = (0, import_fs4.readFileSync)(resolvedPath, "utf8");
326
+ const kvRe = /(\w+)\s*:\s*(true|false)/g;
327
+ let m;
328
+ while ((m = kvRe.exec(source)) !== null) {
329
+ parsed[m[1]] = m[2] === "true";
330
+ }
331
+ }
332
+ const allKeys = Array.from(
333
+ /* @__PURE__ */ new Set([...KNOWN_FEATURES, ...Object.keys(parsed)])
334
+ ).sort();
335
+ const rows = allKeys.map((key) => {
336
+ var _a2;
337
+ return {
338
+ key,
339
+ enabled: (_a2 = parsed[key]) != null ? _a2 : false,
340
+ pkg: `@mohasinac/feat-${key}`
341
+ };
342
+ }).filter((r) => !opts.enabledOnly || r.enabled);
343
+ if (rows.length === 0) {
344
+ console.log("\n No features found.\n");
345
+ return;
346
+ }
347
+ console.log();
348
+ console.log(
349
+ " Feature Package State"
350
+ );
351
+ console.log(
352
+ " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
353
+ );
354
+ for (const { key, pkg, enabled } of rows) {
355
+ const state = enabled ? "\u2714 enabled" : " disabled";
356
+ const paddedKey = key.padEnd(20);
357
+ const paddedPkg = pkg.padEnd(30);
358
+ console.log(` ${paddedKey} ${paddedPkg} ${state}`);
359
+ }
360
+ console.log();
361
+ if (!resolvedPath) {
362
+ console.log(
363
+ " \u2139 No features.config.ts found \u2014 run 'mohasinac add <name>' to create one."
364
+ );
365
+ console.log();
366
+ }
367
+ });
368
+ return cmd;
369
+ }
370
+
371
+ // src/cli.ts
372
+ var program = new import_commander4.Command();
373
+ program.name("mohasinac").description("@mohasinac/* feature library CLI").version("0.1.0");
374
+ program.addCommand(addCommand());
375
+ program.addCommand(removeCommand());
376
+ program.addCommand(listCommand());
377
+ program.parse(process.argv);
package/dist/cli.d.cts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node