@timbenniks/contentstack-platform-app-scaffold 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.
Files changed (51) hide show
  1. package/dist/commands/scaffold.d.ts +19 -0
  2. package/dist/commands/scaffold.d.ts.map +1 -0
  3. package/dist/commands/scaffold.js +83 -0
  4. package/dist/commands/scaffold.js.map +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +9 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/services/prompts.d.ts +3 -0
  10. package/dist/services/prompts.d.ts.map +1 -0
  11. package/dist/services/prompts.js +154 -0
  12. package/dist/services/prompts.js.map +1 -0
  13. package/dist/services/scaffold.d.ts +3 -0
  14. package/dist/services/scaffold.d.ts.map +1 -0
  15. package/dist/services/scaffold.js +119 -0
  16. package/dist/services/scaffold.js.map +1 -0
  17. package/dist/types.d.ts +49 -0
  18. package/dist/types.d.ts.map +1 -0
  19. package/dist/types.js +16 -0
  20. package/dist/types.js.map +1 -0
  21. package/dist/utils/git.d.ts +5 -0
  22. package/dist/utils/git.d.ts.map +1 -0
  23. package/dist/utils/git.js +33 -0
  24. package/dist/utils/git.js.map +1 -0
  25. package/dist/utils/package-manager.d.ts +8 -0
  26. package/dist/utils/package-manager.d.ts.map +1 -0
  27. package/dist/utils/package-manager.js +40 -0
  28. package/dist/utils/package-manager.js.map +1 -0
  29. package/dist/utils/template-engine.d.ts +13 -0
  30. package/dist/utils/template-engine.d.ts.map +1 -0
  31. package/dist/utils/template-engine.js +87 -0
  32. package/dist/utils/template-engine.js.map +1 -0
  33. package/oclif.manifest.json +101 -0
  34. package/package.json +40 -0
  35. package/templates/nextjs/.env.example.hbs +22 -0
  36. package/templates/nextjs/app/api/auth/[...nextauth]/route.ts.hbs +3 -0
  37. package/templates/nextjs/app/api/brandkit/[...path]/route.ts.hbs +35 -0
  38. package/templates/nextjs/app/api/cma/[...path]/route.ts.hbs +35 -0
  39. package/templates/nextjs/app/api/launch/[...path]/route.ts.hbs +34 -0
  40. package/templates/nextjs/app/assets/page.tsx.hbs +25 -0
  41. package/templates/nextjs/app/brandkit/page.tsx.hbs +43 -0
  42. package/templates/nextjs/app/entries/page.tsx.hbs +26 -0
  43. package/templates/nextjs/app/launch/page.tsx.hbs +43 -0
  44. package/templates/nextjs/app/layout.tsx.hbs +20 -0
  45. package/templates/nextjs/app/page.tsx.hbs +55 -0
  46. package/templates/nextjs/app/providers.tsx.hbs +11 -0
  47. package/templates/nextjs/lib/auth.ts.hbs +12 -0
  48. package/templates/nextjs/manifest.json +19 -0
  49. package/templates/nextjs/next.config.js +4 -0
  50. package/templates/nextjs/package.json.hbs +24 -0
  51. package/templates/nextjs/tsconfig.json +21 -0
@@ -0,0 +1,19 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Scaffold extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ framework: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ region: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ features: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ scopes: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ "package-manager": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ "no-git": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ "no-install": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAoBlD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAAuD;IAEzE,MAAM,CAAC,QAAQ,WAId;IAED,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;;;;;;;MA2BX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB3B"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const prompts_1 = require("../services/prompts");
5
+ const scaffold_1 = require("../services/scaffold");
6
+ const types_1 = require("../types");
7
+ function parseFeatures(value) {
8
+ const features = value.split(",").map((f) => f.trim().toLowerCase());
9
+ for (const f of features) {
10
+ if (!types_1.VALID_FEATURES.includes(f)) {
11
+ throw new Error(`Invalid feature "${f}". Valid: ${types_1.VALID_FEATURES.join(", ")}`);
12
+ }
13
+ }
14
+ return features;
15
+ }
16
+ function parseScopes(value) {
17
+ return value.split(",").map((s) => s.trim());
18
+ }
19
+ class Scaffold extends core_1.Command {
20
+ static description = "Scaffold a Contentstack app using the Platform SDK";
21
+ static examples = [
22
+ "<%= config.bin %> scaffold my-app",
23
+ "<%= config.bin %> scaffold my-app --framework nextjs --region eu",
24
+ "<%= config.bin %> scaffold my-app --features cma,oauth --no-install",
25
+ ];
26
+ static args = {
27
+ name: core_1.Args.string({
28
+ description: "Project directory name",
29
+ required: false,
30
+ }),
31
+ };
32
+ static flags = {
33
+ framework: core_1.Flags.string({
34
+ description: `Framework (${types_1.VALID_FRAMEWORKS.join("|")})`,
35
+ options: types_1.VALID_FRAMEWORKS,
36
+ }),
37
+ region: core_1.Flags.string({
38
+ description: `Contentstack region (${types_1.VALID_REGIONS.join("|")})`,
39
+ options: [...types_1.VALID_REGIONS],
40
+ }),
41
+ features: core_1.Flags.string({
42
+ description: "Comma-separated features: cma,oauth,launch,brandkit",
43
+ }),
44
+ scopes: core_1.Flags.string({
45
+ description: "Comma-separated OAuth scopes",
46
+ }),
47
+ "package-manager": core_1.Flags.string({
48
+ description: `Package manager (${types_1.VALID_PACKAGE_MANAGERS.join("|")})`,
49
+ options: types_1.VALID_PACKAGE_MANAGERS,
50
+ }),
51
+ "no-git": core_1.Flags.boolean({
52
+ description: "Skip git initialization",
53
+ default: false,
54
+ }),
55
+ "no-install": core_1.Flags.boolean({
56
+ description: "Skip dependency installation",
57
+ default: false,
58
+ }),
59
+ };
60
+ async run() {
61
+ const { args, flags } = await this.parse(Scaffold);
62
+ const cliOptions = {
63
+ projectName: args.name,
64
+ framework: flags.framework,
65
+ region: flags.region,
66
+ features: flags.features ? parseFeatures(flags.features) : undefined,
67
+ scopes: flags.scopes ? parseScopes(flags.scopes) : undefined,
68
+ packageManager: flags["package-manager"],
69
+ git: !flags["no-git"],
70
+ install: !flags["no-install"],
71
+ };
72
+ const resolvedOptions = await (0, prompts_1.runPrompts)(cliOptions);
73
+ try {
74
+ await (0, scaffold_1.scaffold)(resolvedOptions);
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : "Scaffolding failed";
78
+ this.error(message);
79
+ }
80
+ }
81
+ }
82
+ exports.default = Scaffold;
83
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { default as Scaffold } from "./commands/scaffold";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Scaffold = void 0;
7
+ var scaffold_1 = require("./commands/scaffold");
8
+ Object.defineProperty(exports, "Scaffold", { enumerable: true, get: function () { return __importDefault(scaffold_1).default; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAyD;AAAhD,qHAAA,OAAO,OAAY"}
@@ -0,0 +1,3 @@
1
+ import type { CLIOptions, ResolvedOptions } from "../types";
2
+ export declare function runPrompts(cliOptions: CLIOptions): Promise<ResolvedOptions>;
3
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/services/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAKV,eAAe,EAChB,MAAM,UAAU,CAAA;AAyCjB,wBAAsB,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA0FjF"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runPrompts = runPrompts;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const package_manager_1 = require("../utils/package-manager");
39
+ const REGION_LABELS = {
40
+ us: "US (North America)",
41
+ eu: "EU (Europe)",
42
+ au: "AU (Australia)",
43
+ "azure-na": "Azure NA",
44
+ "azure-eu": "Azure EU",
45
+ "gcp-na": "GCP NA",
46
+ "gcp-eu": "GCP EU",
47
+ };
48
+ const FEATURE_LABELS = {
49
+ cma: "Content Management (entries, assets)",
50
+ oauth: "Authentication (OAuth)",
51
+ launch: "Launch deployments",
52
+ brandkit: "Brand Kit AI",
53
+ };
54
+ const OAUTH_SCOPES = [
55
+ { value: "user:read", label: "user:read", hint: "Read user profile" },
56
+ { value: "cm.content-types:read", label: "cm.content-types:read", hint: "Read content types" },
57
+ {
58
+ value: "cm.entries.management:read",
59
+ label: "cm.entries.management:read",
60
+ hint: "Read entries",
61
+ },
62
+ {
63
+ value: "cm.entries.management:write",
64
+ label: "cm.entries.management:write",
65
+ hint: "Write entries",
66
+ },
67
+ { value: "cm.assets.management:read", label: "cm.assets.management:read", hint: "Read assets" },
68
+ {
69
+ value: "cm.assets.management:write",
70
+ label: "cm.assets.management:write",
71
+ hint: "Write assets",
72
+ },
73
+ ];
74
+ async function runPrompts(cliOptions) {
75
+ p.intro("Create Contentstack App");
76
+ const projectName = cliOptions.projectName ??
77
+ (await p.text({
78
+ message: "Project name:",
79
+ placeholder: "my-contentstack-app",
80
+ validate: (value) => {
81
+ if (!value.trim())
82
+ return "Project name is required";
83
+ if (!/^[a-z0-9][a-z0-9._-]*$/.test(value)) {
84
+ return "Must be lowercase, start with a letter or number";
85
+ }
86
+ return undefined;
87
+ },
88
+ }));
89
+ if (p.isCancel(projectName))
90
+ process.exit(0);
91
+ const framework = cliOptions.framework ??
92
+ (await p.select({
93
+ message: "Framework:",
94
+ options: [{ value: "nextjs", label: "Next.js (App Router)" }],
95
+ }));
96
+ if (p.isCancel(framework))
97
+ process.exit(0);
98
+ const region = cliOptions.region ??
99
+ (await p.select({
100
+ message: "Contentstack region:",
101
+ options: Object.entries(REGION_LABELS).map(([value, label]) => ({
102
+ value,
103
+ label,
104
+ })),
105
+ }));
106
+ if (p.isCancel(region))
107
+ process.exit(0);
108
+ const features = cliOptions.features ??
109
+ (await p.multiselect({
110
+ message: "What does your app need?",
111
+ options: Object.entries(FEATURE_LABELS).map(([value, label]) => ({
112
+ value,
113
+ label,
114
+ })),
115
+ required: false,
116
+ }));
117
+ if (p.isCancel(features))
118
+ process.exit(0);
119
+ let scopes = cliOptions.scopes ?? [];
120
+ if (features.includes("oauth") && cliOptions.scopes === undefined) {
121
+ const selectedScopes = await p.multiselect({
122
+ message: "OAuth scopes:",
123
+ options: OAUTH_SCOPES,
124
+ required: false,
125
+ });
126
+ if (p.isCancel(selectedScopes))
127
+ process.exit(0);
128
+ scopes = selectedScopes;
129
+ }
130
+ const detectedPm = (0, package_manager_1.detectPackageManager)();
131
+ const packageManager = cliOptions.packageManager ??
132
+ (await p.select({
133
+ message: "Package manager:",
134
+ options: [
135
+ { value: "npm", label: "npm" },
136
+ { value: "yarn", label: "yarn" },
137
+ { value: "pnpm", label: "pnpm" },
138
+ ],
139
+ initialValue: detectedPm,
140
+ }));
141
+ if (p.isCancel(packageManager))
142
+ process.exit(0);
143
+ return {
144
+ projectName: projectName,
145
+ framework: framework,
146
+ region: region,
147
+ features: features,
148
+ scopes,
149
+ packageManager: packageManager,
150
+ git: cliOptions.git,
151
+ install: cliOptions.install,
152
+ };
153
+ }
154
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/services/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ResolvedOptions } from "../types";
2
+ export declare function scaffold(options: ResolvedOptions): Promise<void>;
3
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,UAAU,CAAA;AA6BhE,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DtE"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.scaffold = scaffold;
40
+ const node_fs_1 = require("node:fs");
41
+ const node_path_1 = require("node:path");
42
+ const p = __importStar(require("@clack/prompts"));
43
+ const picocolors_1 = __importDefault(require("picocolors"));
44
+ const package_json_1 = __importDefault(require("../../package.json"));
45
+ const git_1 = require("../utils/git");
46
+ const package_manager_1 = require("../utils/package-manager");
47
+ const template_engine_1 = require("../utils/template-engine");
48
+ /** Resolve the path to a framework template directory */
49
+ function getTemplatePath(framework) {
50
+ return (0, node_path_1.resolve)(__dirname, "..", "..", "templates", framework);
51
+ }
52
+ /** Build the TemplateContext from resolved options */
53
+ function buildContext(options) {
54
+ return {
55
+ projectName: options.projectName,
56
+ region: options.region,
57
+ hasClientFeatures: options.features.some((feature) => feature === "cma" || feature === "launch" || feature === "brandkit"),
58
+ features: {
59
+ cma: options.features.includes("cma"),
60
+ oauth: options.features.includes("oauth"),
61
+ launch: options.features.includes("launch"),
62
+ brandkit: options.features.includes("brandkit"),
63
+ },
64
+ scopes: options.scopes,
65
+ sdkVersion: package_json_1.default.version,
66
+ };
67
+ }
68
+ async function scaffold(options) {
69
+ const projectDir = (0, node_path_1.resolve)(process.cwd(), options.projectName);
70
+ if ((0, node_fs_1.existsSync)(projectDir)) {
71
+ p.log.error(`Directory "${options.projectName}" already exists.`);
72
+ throw new Error(`Directory "${options.projectName}" already exists.`);
73
+ }
74
+ (0, node_fs_1.mkdirSync)(projectDir, { recursive: true });
75
+ const context = buildContext(options);
76
+ const templateDir = getTemplatePath(options.framework);
77
+ if (!(0, node_fs_1.existsSync)(templateDir)) {
78
+ p.log.error(`Template for "${options.framework}" not found at ${templateDir}`);
79
+ throw new Error(`Template for "${options.framework}" not found at ${templateDir}`);
80
+ }
81
+ const s = p.spinner();
82
+ s.start("Scaffolding project...");
83
+ (0, template_engine_1.renderDirectory)(templateDir, projectDir, context);
84
+ s.stop("Project scaffolded");
85
+ if (options.git) {
86
+ if ((0, git_1.isGitAvailable)()) {
87
+ s.start("Initializing git repository...");
88
+ const success = (0, git_1.initGitRepo)(projectDir);
89
+ s.stop(success ? "Git repository initialized" : "Git init failed (continuing)");
90
+ }
91
+ else {
92
+ p.log.warn("git not found on PATH, skipping git init");
93
+ }
94
+ }
95
+ if (options.install) {
96
+ const cmd = (0, package_manager_1.getInstallCommand)(options.packageManager);
97
+ s.start(`Installing dependencies (${cmd})...`);
98
+ try {
99
+ (0, package_manager_1.runInstall)(options.packageManager, projectDir);
100
+ s.stop("Dependencies installed");
101
+ }
102
+ catch {
103
+ s.stop("Dependency installation failed");
104
+ p.log.warn(`Run "${cmd}" manually in the project directory.`);
105
+ }
106
+ }
107
+ const steps = [
108
+ `cd ${options.projectName}`,
109
+ "cp .env.example .env.local",
110
+ "# Fill in your Contentstack credentials",
111
+ ];
112
+ if (!options.install) {
113
+ steps.push((0, package_manager_1.getInstallCommand)(options.packageManager));
114
+ }
115
+ steps.push(`${options.packageManager === "npm" ? "npm run" : options.packageManager} dev`);
116
+ p.note(steps.join("\n"), "Next steps");
117
+ p.outro(picocolors_1.default.green(`${options.projectName} is ready!`));
118
+ }
119
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /** All 7 Contentstack regions — mirrors ContentstackRegion from core without the dependency */
2
+ export type Region = "us" | "eu" | "au" | "azure-na" | "azure-eu" | "gcp-na" | "gcp-eu";
3
+ /** SDK features that can be scaffolded */
4
+ export type Feature = "cma" | "oauth" | "launch" | "brandkit";
5
+ /** Supported frameworks */
6
+ export type Framework = "nextjs";
7
+ /** Supported package managers */
8
+ export type PackageManager = "npm" | "yarn" | "pnpm";
9
+ /** Options parsed from CLI flags (partially filled) */
10
+ export interface CLIOptions {
11
+ projectName?: string;
12
+ framework?: Framework;
13
+ region?: Region;
14
+ features?: Feature[];
15
+ scopes?: string[];
16
+ packageManager?: PackageManager;
17
+ git: boolean;
18
+ install: boolean;
19
+ }
20
+ /** Fully resolved options after interactive prompts fill in missing values */
21
+ export interface ResolvedOptions {
22
+ projectName: string;
23
+ framework: Framework;
24
+ region: Region;
25
+ features: Feature[];
26
+ scopes: string[];
27
+ packageManager: PackageManager;
28
+ git: boolean;
29
+ install: boolean;
30
+ }
31
+ /** Context passed to Handlebars template rendering */
32
+ export interface TemplateContext {
33
+ projectName: string;
34
+ region: string;
35
+ hasClientFeatures: boolean;
36
+ features: {
37
+ cma: boolean;
38
+ oauth: boolean;
39
+ launch: boolean;
40
+ brandkit: boolean;
41
+ };
42
+ scopes: string[];
43
+ sdkVersion: string;
44
+ }
45
+ export declare const VALID_REGIONS: Region[];
46
+ export declare const VALID_FEATURES: Feature[];
47
+ export declare const VALID_FRAMEWORKS: Framework[];
48
+ export declare const VALID_PACKAGE_MANAGERS: PackageManager[];
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvF,0CAA0C;AAC1C,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAE7D,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAA;AAEhC,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpD,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,GAAG,EAAE,OAAO,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,EAAE,cAAc,CAAA;IAC9B,GAAG,EAAE,OAAO,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE;QACR,GAAG,EAAE,OAAO,CAAA;QACZ,KAAK,EAAE,OAAO,CAAA;QACd,MAAM,EAAE,OAAO,CAAA;QACf,QAAQ,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,EAQjC,CAAA;AACD,eAAO,MAAM,cAAc,EAAE,OAAO,EAA2C,CAAA;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAAe,CAAA;AACvD,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAA4B,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALID_PACKAGE_MANAGERS = exports.VALID_FRAMEWORKS = exports.VALID_FEATURES = exports.VALID_REGIONS = void 0;
4
+ exports.VALID_REGIONS = [
5
+ "us",
6
+ "eu",
7
+ "au",
8
+ "azure-na",
9
+ "azure-eu",
10
+ "gcp-na",
11
+ "gcp-eu",
12
+ ];
13
+ exports.VALID_FEATURES = ["cma", "oauth", "launch", "brandkit"];
14
+ exports.VALID_FRAMEWORKS = ["nextjs"];
15
+ exports.VALID_PACKAGE_MANAGERS = ["npm", "yarn", "pnpm"];
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAmDa,QAAA,aAAa,GAAa;IACrC,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,UAAU;IACV,UAAU;IACV,QAAQ;IACR,QAAQ;CACT,CAAA;AACY,QAAA,cAAc,GAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;AAClE,QAAA,gBAAgB,GAAgB,CAAC,QAAQ,CAAC,CAAA;AAC1C,QAAA,sBAAsB,GAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Check if git is available on the system */
2
+ export declare function isGitAvailable(): boolean;
3
+ /** Initialize a git repository in the given directory */
4
+ export declare function initGitRepo(cwd: string): boolean;
5
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,8CAA8C;AAC9C,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAchD"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isGitAvailable = isGitAvailable;
4
+ exports.initGitRepo = initGitRepo;
5
+ const node_child_process_1 = require("node:child_process");
6
+ /** Check if git is available on the system */
7
+ function isGitAvailable() {
8
+ try {
9
+ (0, node_child_process_1.execSync)("git --version", { stdio: "pipe" });
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ /** Initialize a git repository in the given directory */
17
+ function initGitRepo(cwd) {
18
+ if (!isGitAvailable())
19
+ return false;
20
+ try {
21
+ (0, node_child_process_1.execSync)("git init", { cwd, stdio: "pipe" });
22
+ (0, node_child_process_1.execSync)("git add -A", { cwd, stdio: "pipe" });
23
+ (0, node_child_process_1.execSync)('git commit -m "Initial commit from @timbenniks/contentstack-platform-app-scaffold"', {
24
+ cwd,
25
+ stdio: "pipe",
26
+ });
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":";;AAGA,wCAOC;AAGD,kCAcC;AA3BD,2DAA6C;AAE7C,8CAA8C;AAC9C,SAAgB,cAAc;IAC5B,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAA;IAEnC,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5C,IAAA,6BAAQ,EAAC,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,IAAA,6BAAQ,EAAC,oFAAoF,EAAE;YAC7F,GAAG;YACH,KAAK,EAAE,MAAM;SACd,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PackageManager } from "../types";
2
+ /** Detect the package manager from lock files or environment */
3
+ export declare function detectPackageManager(cwd?: string): PackageManager;
4
+ /** Get the install command string for a package manager */
5
+ export declare function getInstallCommand(pm: PackageManager): string;
6
+ /** Run install in a directory using the specified package manager */
7
+ export declare function runInstall(pm: PackageManager, cwd: string): void;
8
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAUhF;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAS5D;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGhE"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectPackageManager = detectPackageManager;
4
+ exports.getInstallCommand = getInstallCommand;
5
+ exports.runInstall = runInstall;
6
+ const node_child_process_1 = require("node:child_process");
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ /** Detect the package manager from lock files or environment */
10
+ function detectPackageManager(cwd = process.cwd()) {
11
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(cwd, "pnpm-lock.yaml")))
12
+ return "pnpm";
13
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(cwd, "yarn.lock")))
14
+ return "yarn";
15
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(cwd, "package-lock.json")))
16
+ return "npm";
17
+ const userAgent = process.env.npm_config_user_agent ?? "";
18
+ if (userAgent.startsWith("pnpm"))
19
+ return "pnpm";
20
+ if (userAgent.startsWith("yarn"))
21
+ return "yarn";
22
+ return "npm";
23
+ }
24
+ /** Get the install command string for a package manager */
25
+ function getInstallCommand(pm) {
26
+ switch (pm) {
27
+ case "pnpm":
28
+ return "pnpm install";
29
+ case "yarn":
30
+ return "yarn";
31
+ case "npm":
32
+ return "npm install";
33
+ }
34
+ }
35
+ /** Run install in a directory using the specified package manager */
36
+ function runInstall(pm, cwd) {
37
+ const command = getInstallCommand(pm);
38
+ (0, node_child_process_1.execSync)(command, { cwd, stdio: "pipe" });
39
+ }
40
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":";;AAMA,oDAUC;AAGD,8CASC;AAGD,gCAGC;AAlCD,2DAA6C;AAC7C,qCAAoC;AACpC,yCAAgC;AAGhC,gEAAgE;AAChE,SAAgB,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAA;IAC1D,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAA;IACrD,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAA;IACzD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC/C,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAE/C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,2DAA2D;AAC3D,SAAgB,iBAAiB,CAAC,EAAkB;IAClD,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,cAAc,CAAA;QACvB,KAAK,MAAM;YACT,OAAO,MAAM,CAAA;QACf,KAAK,KAAK;YACR,OAAO,aAAa,CAAA;IACxB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,SAAgB,UAAU,CAAC,EAAkB,EAAE,GAAW;IACxD,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACrC,IAAA,6BAAQ,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { TemplateContext } from "../types";
2
+ /** Render a single Handlebars template string with the given context */
3
+ export declare function renderTemplate(templateString: string, context: TemplateContext): string;
4
+ /**
5
+ * Render an entire template directory into an output directory.
6
+ *
7
+ * - Files ending in `.hbs` are rendered through Handlebars and the `.hbs` extension is stripped.
8
+ * - All other files are copied as-is.
9
+ * - Files listed in `manifest.json` with `requiredFeatures` are skipped if the features are not selected.
10
+ * - `manifest.json` itself is never copied to the output.
11
+ */
12
+ export declare function renderDirectory(templateDir: string, outputDir: string, context: TemplateContext): void;
13
+ //# sourceMappingURL=template-engine.d.ts.map