tailar 0.2.2 → 0.4.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.
Files changed (55) hide show
  1. package/README.md +35 -0
  2. package/README.npm.md +35 -0
  3. package/assets/favicon.ico +0 -0
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +40 -16
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +96 -58
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/list.d.ts.map +1 -1
  11. package/dist/commands/list.js +3 -3
  12. package/dist/commands/list.js.map +1 -1
  13. package/dist/commands/playground.d.ts +9 -0
  14. package/dist/commands/playground.d.ts.map +1 -0
  15. package/dist/commands/playground.js +159 -0
  16. package/dist/commands/playground.js.map +1 -0
  17. package/dist/commands/sync.d.ts +9 -0
  18. package/dist/commands/sync.d.ts.map +1 -0
  19. package/dist/commands/sync.js +59 -0
  20. package/dist/commands/sync.js.map +1 -0
  21. package/dist/index.js +14 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/installers/files.d.ts +3 -3
  24. package/dist/installers/files.d.ts.map +1 -1
  25. package/dist/installers/files.js +17 -11
  26. package/dist/installers/files.js.map +1 -1
  27. package/dist/installers/install-feature.d.ts +10 -0
  28. package/dist/installers/install-feature.d.ts.map +1 -1
  29. package/dist/installers/install-feature.js +29 -3
  30. package/dist/installers/install-feature.js.map +1 -1
  31. package/dist/installers/post-install.d.ts +4 -1
  32. package/dist/installers/post-install.d.ts.map +1 -1
  33. package/dist/installers/post-install.js +7 -3
  34. package/dist/installers/post-install.js.map +1 -1
  35. package/dist/registry/loader.d.ts +4 -0
  36. package/dist/registry/loader.d.ts.map +1 -1
  37. package/dist/registry/loader.js +28 -8
  38. package/dist/registry/loader.js.map +1 -1
  39. package/dist/registry/local-mode.d.ts +30 -0
  40. package/dist/registry/local-mode.d.ts.map +1 -0
  41. package/dist/registry/local-mode.js +81 -0
  42. package/dist/registry/local-mode.js.map +1 -0
  43. package/dist/utils/clack-wizard.d.ts +6 -0
  44. package/dist/utils/clack-wizard.d.ts.map +1 -1
  45. package/dist/utils/clack-wizard.js +50 -81
  46. package/dist/utils/clack-wizard.js.map +1 -1
  47. package/dist/utils/init-flags.d.ts +27 -0
  48. package/dist/utils/init-flags.d.ts.map +1 -0
  49. package/dist/utils/init-flags.js +102 -0
  50. package/dist/utils/init-flags.js.map +1 -0
  51. package/dist/utils/local-options.d.ts +7 -0
  52. package/dist/utils/local-options.d.ts.map +1 -0
  53. package/dist/utils/local-options.js +10 -0
  54. package/dist/utils/local-options.js.map +1 -0
  55. package/package.json +3 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Build a greenfield wizard state from CLI flags (no prompts).
3
+ */
4
+ import { type AuthStructure, type TailarInitWizardState } from "../types/wizard.js";
5
+ export interface InitFlagInput {
6
+ projectName?: string;
7
+ modules?: string;
8
+ db?: string;
9
+ email?: string;
10
+ auth?: string;
11
+ }
12
+ export interface InitFlagResult {
13
+ state: TailarInitWizardState;
14
+ autoNotes: string[];
15
+ }
16
+ export declare function parseAuthStructure(value: string): AuthStructure;
17
+ export declare function buildWizardStateFromFlags(input: InitFlagInput): InitFlagResult;
18
+ export declare function isNonInteractiveInit(input: {
19
+ yes?: boolean;
20
+ projectArg?: string;
21
+ name?: string;
22
+ modules?: string;
23
+ db?: string;
24
+ email?: string;
25
+ auth?: string;
26
+ }): boolean;
27
+ //# sourceMappingURL=init-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-flags.d.ts","sourceRoot":"","sources":["../../src/utils/init-flags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,aAAa,EAIlB,KAAK,qBAAqB,EAE3B,MAAM,oBAAoB,CAAC;AAqB5B,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAwBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAQ/D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAoD9E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAUV"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Build a greenfield wizard state from CLI flags (no prompts).
3
+ */
4
+ import { normalizeModuleSelection, } from "../types/wizard.js";
5
+ const CORE_MODULES = [
6
+ "database",
7
+ "email",
8
+ "auth",
9
+ "payments",
10
+ ];
11
+ const DATABASE_PROVIDERS = [
12
+ "postgres",
13
+ "mysql",
14
+ "mongodb",
15
+ ];
16
+ const EMAIL_PROVIDERS = [
17
+ "resend",
18
+ "postmark",
19
+ "sendgrid",
20
+ ];
21
+ function isCoreModule(value) {
22
+ return CORE_MODULES.includes(value);
23
+ }
24
+ function parseDatabase(value) {
25
+ if (DATABASE_PROVIDERS.includes(value)) {
26
+ return value;
27
+ }
28
+ throw new Error(`Unknown database provider "${value}". Use postgres, mysql, or mongodb.`);
29
+ }
30
+ function parseEmail(value) {
31
+ if (EMAIL_PROVIDERS.includes(value)) {
32
+ return value;
33
+ }
34
+ throw new Error(`Unknown email provider "${value}". Use resend, postmark, or sendgrid.`);
35
+ }
36
+ export function parseAuthStructure(value) {
37
+ if (value === "user-based")
38
+ return "user-based";
39
+ if (value === "organization-based" || value === "org-based") {
40
+ return "org-based";
41
+ }
42
+ throw new Error(`Unknown auth structure "${value}". Use user-based or organization-based.`);
43
+ }
44
+ export function buildWizardStateFromFlags(input) {
45
+ const requested = [];
46
+ if (input.modules) {
47
+ for (const part of input.modules.split(",")) {
48
+ const id = part.trim();
49
+ if (!id)
50
+ continue;
51
+ if (!isCoreModule(id)) {
52
+ throw new Error(`Unknown module "${id}". Use database, email, auth, payments.`);
53
+ }
54
+ requested.push(id);
55
+ }
56
+ }
57
+ if (input.db)
58
+ requested.push("database");
59
+ if (input.email)
60
+ requested.push("email");
61
+ if (input.auth)
62
+ requested.push("auth");
63
+ const { modules, autoNotes } = normalizeModuleSelection(requested);
64
+ const providers = {
65
+ authProvider: "better-auth",
66
+ };
67
+ if (modules.includes("database")) {
68
+ providers.database = parseDatabase(input.db ?? "postgres");
69
+ }
70
+ if (modules.includes("email")) {
71
+ providers.email = parseEmail(input.email ?? "resend");
72
+ }
73
+ if (modules.includes("auth")) {
74
+ providers.authStructure = parseAuthStructure(input.auth ?? "user-based");
75
+ }
76
+ if (modules.includes("payments")) {
77
+ providers.payments = "stripe";
78
+ }
79
+ const projectName = input.projectName?.trim() || "my-app";
80
+ if (!projectName) {
81
+ throw new Error("Project name cannot be empty.");
82
+ }
83
+ return {
84
+ autoNotes,
85
+ state: {
86
+ projectType: "saas",
87
+ projectName,
88
+ modules,
89
+ providers,
90
+ },
91
+ };
92
+ }
93
+ export function isNonInteractiveInit(input) {
94
+ return Boolean(input.yes ||
95
+ input.projectArg ||
96
+ input.name ||
97
+ input.modules ||
98
+ input.db ||
99
+ input.email ||
100
+ input.auth);
101
+ }
102
+ //# sourceMappingURL=init-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-flags.js","sourceRoot":"","sources":["../../src/utils/init-flags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared --local / --components-path flags.
3
+ * They must be registered on each subcommand so `tailar init --local` parses.
4
+ */
5
+ import type { Command } from "commander";
6
+ export declare function addLocalOptions(command: Command): Command;
7
+ //# sourceMappingURL=local-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-options.d.ts","sourceRoot":"","sources":["../../src/utils/local-options.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAUzD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared --local / --components-path flags.
3
+ * They must be registered on each subcommand so `tailar init --local` parses.
4
+ */
5
+ export function addLocalOptions(command) {
6
+ return command
7
+ .option("--local", "Read the registry and files from disk and skip purchase checks (development and CI)")
8
+ .option("--components-path <path>", "Path to the local components directory (implies --local)");
9
+ }
10
+ //# sourceMappingURL=local-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-options.js","sourceRoot":"","sources":["../../src/utils/local-options.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO,OAAO;SACX,MAAM,CACL,SAAS,EACT,qFAAqF,CACtF;SACA,MAAM,CACL,0BAA0B,EAC1B,0DAA0D,CAC3D,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailar",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "CLI tool for scaffolding Next.js features and components",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@
9
9
  "main": "./dist/index.js",
10
10
  "files": [
11
11
  "dist",
12
+ "assets",
12
13
  "README.md",
13
14
  "LICENSE"
14
15
  ],
@@ -18,6 +19,7 @@
18
19
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
19
20
  "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
20
21
  "test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
22
+ "test:install": "node scripts/install-smoke.mjs",
21
23
  "prepublishOnly": "npm run build",
22
24
  "prepare-release": "npm run build && cp README.npm.md README.md",
23
25
  "version": "node -e \"console.log(require('./package.json').version)\""