@optimizely/ocp-cli-v2 2.0.3 → 2.0.5-beta.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 (67) hide show
  1. package/dist/commands/add/destination.d.ts +12 -0
  2. package/dist/commands/add/destination.js +106 -0
  3. package/dist/commands/add/destination.js.map +1 -0
  4. package/dist/commands/add/function.d.ts +11 -0
  5. package/dist/commands/add/function.js +71 -0
  6. package/dist/commands/add/function.js.map +1 -0
  7. package/dist/commands/add/job.d.ts +11 -0
  8. package/dist/commands/add/job.js +71 -0
  9. package/dist/commands/add/job.js.map +1 -0
  10. package/dist/commands/add/source.d.ts +12 -0
  11. package/dist/commands/add/source.js +93 -0
  12. package/dist/commands/add/source.js.map +1 -0
  13. package/dist/commands/app/init.d.ts +16 -0
  14. package/dist/commands/app/init.js +133 -32
  15. package/dist/commands/app/init.js.map +1 -1
  16. package/dist/commands/app/register.d.ts +7 -0
  17. package/dist/commands/app/register.js +26 -4
  18. package/dist/commands/app/register.js.map +1 -1
  19. package/dist/commands/app/setLogLevel.js +1 -0
  20. package/dist/commands/app/setLogLevel.js.map +1 -1
  21. package/dist/commands/autocomplete/options.d.ts +18 -0
  22. package/dist/commands/autocomplete/options.js +228 -0
  23. package/dist/commands/autocomplete/options.js.map +1 -0
  24. package/dist/commands/env/set.js +1 -0
  25. package/dist/commands/env/set.js.map +1 -1
  26. package/dist/commands/jobs/list.js +3 -0
  27. package/dist/commands/jobs/list.js.map +1 -1
  28. package/dist/hooks/autocomplete-refresh.d.ts +3 -0
  29. package/dist/hooks/autocomplete-refresh.js +11 -0
  30. package/dist/hooks/autocomplete-refresh.js.map +1 -0
  31. package/dist/hooks/postrun-autocomplete-patch.d.ts +8 -0
  32. package/dist/hooks/postrun-autocomplete-patch.js +274 -0
  33. package/dist/hooks/postrun-autocomplete-patch.js.map +1 -0
  34. package/dist/index.js +2 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/lib/autocomplete/cache.d.ts +5 -0
  37. package/dist/lib/autocomplete/cache.js +88 -0
  38. package/dist/lib/autocomplete/cache.js.map +1 -0
  39. package/dist/lib/autocomplete/completions.d.ts +22 -0
  40. package/dist/lib/autocomplete/completions.js +144 -0
  41. package/dist/lib/autocomplete/completions.js.map +1 -0
  42. package/dist/lib/autocomplete/spinner.d.ts +16 -0
  43. package/dist/lib/autocomplete/spinner.js +50 -0
  44. package/dist/lib/autocomplete/spinner.js.map +1 -0
  45. package/dist/lib/autocomplete/types.d.ts +13 -0
  46. package/dist/lib/autocomplete/types.js +3 -0
  47. package/dist/lib/autocomplete/types.js.map +1 -0
  48. package/dist/lib/autocomplete/warm-cache.d.ts +6 -0
  49. package/dist/lib/autocomplete/warm-cache.js +83 -0
  50. package/dist/lib/autocomplete/warm-cache.js.map +1 -0
  51. package/dist/lib/scaffolding/appYml.d.ts +23 -0
  52. package/dist/lib/scaffolding/appYml.js +110 -0
  53. package/dist/lib/scaffolding/appYml.js.map +1 -0
  54. package/dist/lib/scaffolding/files.d.ts +10 -0
  55. package/dist/lib/scaffolding/files.js +45 -0
  56. package/dist/lib/scaffolding/files.js.map +1 -0
  57. package/dist/lib/scaffolding/naming.d.ts +12 -0
  58. package/dist/lib/scaffolding/naming.js +32 -0
  59. package/dist/lib/scaffolding/naming.js.map +1 -0
  60. package/dist/lib/scaffolding/templates.d.ts +9 -0
  61. package/dist/lib/scaffolding/templates.js +128 -0
  62. package/dist/lib/scaffolding/templates.js.map +1 -0
  63. package/dist/lib/suggestDisplayName.d.ts +12 -0
  64. package/dist/lib/suggestDisplayName.js +27 -0
  65. package/dist/lib/suggestDisplayName.js.map +1 -0
  66. package/dist/oclif.manifest.json +431 -51
  67. package/package.json +8 -4
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionLookup = exports.completionMapping = exports.versionCompletion = exports.sortDirectionCompletion = exports.environmentCompletion = exports.jobStatusCompletion = exports.logLevelCompletion = exports.jobIdCompletion = exports.shardCompletion = exports.appVersionCompletion = exports.appIdCompletion = void 0;
4
+ const Rivendell_1 = require("../Rivendell");
5
+ const ONE_HOUR = 60 * 60;
6
+ const ONE_DAY = ONE_HOUR * 24;
7
+ const FIVE_MINUTES = 5 * 60;
8
+ function getAvailability(ctx) {
9
+ return (ctx.flags && ctx.flags.availability) || 'us';
10
+ }
11
+ exports.appIdCompletion = {
12
+ cacheDuration: ONE_HOUR,
13
+ async options(_ctx) {
14
+ // Use whoami() which returns personal_apps and vendor_apps - lightweight, no shard needed
15
+ const me = await Rivendell_1.Rivendell.whoami();
16
+ const ids = [
17
+ ...me.personal_apps.map((a) => a.id),
18
+ ...me.vendor_apps.map((a) => a.id),
19
+ ];
20
+ return [...new Set(ids)].sort();
21
+ },
22
+ };
23
+ exports.appVersionCompletion = {
24
+ cacheDuration: ONE_HOUR / 2,
25
+ cacheKey(ctx) {
26
+ const partial = (ctx.args && ctx.args.appVersion) || '';
27
+ if (partial.includes('@')) {
28
+ const appId = partial.split('@')[0];
29
+ return `appVersion_${appId}_${getAvailability(ctx)}`;
30
+ }
31
+ return 'appId';
32
+ },
33
+ async options(ctx) {
34
+ const partial = (ctx.args && ctx.args.appVersion) || '';
35
+ // Phase 1: no @ yet — show app names only
36
+ if (!partial.includes('@')) {
37
+ return exports.appIdCompletion.options(ctx);
38
+ }
39
+ // Phase 2: @ present — show versions for the specific app
40
+ const appId = partial.split('@')[0];
41
+ if (!appId)
42
+ return [];
43
+ const shard = getAvailability(ctx);
44
+ const versions = await Rivendell_1.Rivendell.searchAppVersions({ appId }, shard);
45
+ return versions.map((v) => `${appId}@${v.id.version}`).sort();
46
+ },
47
+ };
48
+ exports.shardCompletion = {
49
+ cacheDuration: ONE_DAY,
50
+ async options(_ctx) {
51
+ const shards = await Rivendell_1.Rivendell.shards();
52
+ return shards.map((s) => s.id).sort();
53
+ },
54
+ };
55
+ exports.jobIdCompletion = {
56
+ cacheDuration: FIVE_MINUTES,
57
+ cacheKey(ctx) {
58
+ const appId = (ctx.args && ctx.args.appId) || 'all';
59
+ return `jobId_${getAvailability(ctx)}_${appId}`;
60
+ },
61
+ async options(ctx) {
62
+ const shard = getAvailability(ctx);
63
+ const appId = ctx.args && ctx.args.appId;
64
+ if (!appId)
65
+ return [];
66
+ const jobs = await Rivendell_1.Rivendell.searchJobs({ appId, limit: 50 }, shard);
67
+ return jobs.map((j) => j.id);
68
+ },
69
+ };
70
+ exports.logLevelCompletion = {
71
+ skipCache: true,
72
+ options() {
73
+ return Object.values(Rivendell_1.Rivendell.LogLevel);
74
+ },
75
+ };
76
+ exports.jobStatusCompletion = {
77
+ skipCache: true,
78
+ options() {
79
+ return Object.values(Rivendell_1.Rivendell.JobStatus);
80
+ },
81
+ };
82
+ exports.environmentCompletion = {
83
+ skipCache: true,
84
+ options() {
85
+ return ['staging', 'production'];
86
+ },
87
+ };
88
+ exports.sortDirectionCompletion = {
89
+ skipCache: true,
90
+ options() {
91
+ return ['asc', 'desc'];
92
+ },
93
+ };
94
+ exports.versionCompletion = {
95
+ cacheDuration: ONE_HOUR / 2,
96
+ cacheKey(ctx) {
97
+ const appId = (ctx.args && ctx.args.appId) || 'all';
98
+ return `version_${getAvailability(ctx)}_${appId}`;
99
+ },
100
+ async options(ctx) {
101
+ const shard = getAvailability(ctx);
102
+ const appId = ctx.args && ctx.args.appId;
103
+ if (!appId)
104
+ return [];
105
+ const versions = await Rivendell_1.Rivendell.searchAppVersions({ appId }, shard);
106
+ return versions.map((v) => v.id.version).sort();
107
+ },
108
+ };
109
+ exports.completionMapping = {
110
+ appid: exports.appIdCompletion,
111
+ appversion: exports.appVersionCompletion,
112
+ availability: exports.shardCompletion,
113
+ version: exports.versionCompletion,
114
+ jobid: exports.jobIdCompletion,
115
+ loglevel: exports.logLevelCompletion,
116
+ status: exports.jobStatusCompletion,
117
+ env: exports.environmentCompletion,
118
+ sortdirection: exports.sortDirectionCompletion,
119
+ // jobName falls back to appId completion since jobName needs app context
120
+ jobname: exports.appIdCompletion,
121
+ };
122
+ class CompletionLookup {
123
+ constructor(cmdId, name) {
124
+ this.cmdId = cmdId;
125
+ this.name = name;
126
+ this.blocklistMap = {
127
+ appid: ['app:register', 'app:init'],
128
+ };
129
+ }
130
+ run() {
131
+ if (this.blocklisted())
132
+ return;
133
+ return exports.completionMapping[this.key];
134
+ }
135
+ blocklisted() {
136
+ const list = this.blocklistMap[this.name.toLowerCase()];
137
+ return list ? list.includes(this.cmdId) : false;
138
+ }
139
+ get key() {
140
+ return this.name.toLowerCase();
141
+ }
142
+ }
143
+ exports.CompletionLookup = CompletionLookup;
144
+ //# sourceMappingURL=completions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../../src/lib/autocomplete/completions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Cursor spinner for completion lookups.
3
+ *
4
+ * Writes braille animation frames directly to /dev/tty so the spinner
5
+ * appears at the cursor without being captured by the shell completion
6
+ * subshell. Windows is unsupported because PowerShell captures all
7
+ * subprocess output as text — control chars like \b would get appended
8
+ * instead of overwriting.
9
+ */
10
+ export declare class CompletionSpinner {
11
+ private ttyFd;
12
+ private timer;
13
+ private tick;
14
+ start(): void;
15
+ stop(): void;
16
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionSpinner = void 0;
4
+ const fs = require("fs");
5
+ const SPIN_MARKS = ['⠏', '⠛', '⠹', '⠼', '⠶', '⠧'];
6
+ const TICK_INTERVAL_MS = 100;
7
+ /**
8
+ * Cursor spinner for completion lookups.
9
+ *
10
+ * Writes braille animation frames directly to /dev/tty so the spinner
11
+ * appears at the cursor without being captured by the shell completion
12
+ * subshell. Windows is unsupported because PowerShell captures all
13
+ * subprocess output as text — control chars like \b would get appended
14
+ * instead of overwriting.
15
+ */
16
+ class CompletionSpinner {
17
+ constructor() {
18
+ this.ttyFd = null;
19
+ this.timer = null;
20
+ this.tick = 0;
21
+ }
22
+ start() {
23
+ if (process.platform === 'win32')
24
+ return;
25
+ try {
26
+ this.ttyFd = fs.openSync('/dev/tty', 'w');
27
+ }
28
+ catch (_a) {
29
+ return;
30
+ }
31
+ this.timer = setInterval(() => {
32
+ const mark = SPIN_MARKS[this.tick % SPIN_MARKS.length];
33
+ fs.writeSync(this.ttyFd, mark + '\b');
34
+ this.tick++;
35
+ }, TICK_INTERVAL_MS);
36
+ }
37
+ stop() {
38
+ if (this.timer) {
39
+ clearInterval(this.timer);
40
+ this.timer = null;
41
+ }
42
+ if (this.ttyFd !== null) {
43
+ fs.writeSync(this.ttyFd, ' \b');
44
+ fs.closeSync(this.ttyFd);
45
+ this.ttyFd = null;
46
+ }
47
+ }
48
+ }
49
+ exports.CompletionSpinner = CompletionSpinner;
50
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/lib/autocomplete/spinner.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AAEzB,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAClD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAa,iBAAiB;IAA9B;QACU,UAAK,GAAkB,IAAI,CAAC;QAC5B,UAAK,GAA0C,IAAI,CAAC;QACpD,SAAI,GAAG,CAAC,CAAC;IA2BnB,CAAC;IAzBQ,KAAK;QACV,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO;QACzC,IAAI;YACF,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SAC3C;QAAC,WAAM;YACN,OAAO;SACR;QACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACvD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAM,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAEM,IAAI;QACT,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;SACnB;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;YACvB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;SACnB;IACH,CAAC;CACF;AA9BD,8CA8BC"}
@@ -0,0 +1,13 @@
1
+ import { Config } from '@oclif/core';
2
+ export interface CompletionContext {
3
+ config: Config;
4
+ flags?: Record<string, any>;
5
+ args?: Record<string, any>;
6
+ argv?: string[];
7
+ }
8
+ export interface Completion {
9
+ cacheDuration?: number;
10
+ cacheKey?: (ctx: CompletionContext) => Promise<string> | string;
11
+ options: (ctx: CompletionContext) => Promise<string[]> | string[];
12
+ skipCache?: boolean;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/autocomplete/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface WarmCacheResult {
2
+ failures: string[];
3
+ }
4
+ export declare function warmCache(completionsCacheDir: string, options?: {
5
+ force?: boolean;
6
+ }): Promise<WarmCacheResult>;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.warmCache = void 0;
4
+ /**
5
+ * Background cache warming.
6
+ *
7
+ * Two modes:
8
+ * - default ("soft"): goes through fetchCache, which skips entries that are
9
+ * still fresh and keeps stale data on failure. Used by plain
10
+ * `ocp autocomplete` to silently top up caches in the background.
11
+ * - force: bypasses the freshness check, fetches every entry directly with a
12
+ * timeout, and only overwrites the cache file on success. Used by
13
+ * `ocp autocomplete --refresh-cache` so a network failure leaves prior
14
+ * cache contents intact instead of nuking them.
15
+ *
16
+ * Can be used as a library (importable warmCache) or as a CLI script:
17
+ * node warm-cache.js <completionsCacheDir> [--force] [--report-failures]
18
+ */
19
+ const path = require("path");
20
+ const cache_1 = require("./cache");
21
+ const completions_1 = require("./completions");
22
+ const ONE_DAY = 60 * 60 * 24;
23
+ const defaultCtx = {
24
+ args: {},
25
+ flags: { availability: 'us' },
26
+ argv: [],
27
+ config: {},
28
+ };
29
+ const warmupItems = [
30
+ { key: 'appId', completion: completions_1.appIdCompletion },
31
+ { key: 'availability', completion: completions_1.shardCompletion },
32
+ ];
33
+ async function warmCache(completionsCacheDir, options = {}) {
34
+ const failures = [];
35
+ for (const item of warmupItems) {
36
+ const cachePath = path.join(completionsCacheDir, item.key);
37
+ const ok = options.force
38
+ ? await forceRefresh(cachePath, item)
39
+ : await softWarm(cachePath, item);
40
+ if (!ok)
41
+ failures.push(item.key);
42
+ }
43
+ return { failures };
44
+ }
45
+ exports.warmCache = warmCache;
46
+ async function forceRefresh(cachePath, item) {
47
+ try {
48
+ const data = await (0, cache_1.withTimeout)(item.completion.options(defaultCtx), cache_1.FETCH_TIMEOUT_MS, 'autocomplete cache fetch timed out');
49
+ (0, cache_1.updateCache)(cachePath, data);
50
+ return true;
51
+ }
52
+ catch (_a) {
53
+ return false;
54
+ }
55
+ }
56
+ async function softWarm(cachePath, item) {
57
+ const duration = item.completion.cacheDuration || ONE_DAY;
58
+ try {
59
+ await (0, cache_1.fetchCache)(cachePath, duration, () => item.completion.options(defaultCtx));
60
+ return true;
61
+ }
62
+ catch (_a) {
63
+ return false;
64
+ }
65
+ }
66
+ // Script entry point — invoked by spawn() from the postrun hook.
67
+ if (require.main === module) {
68
+ const completionsCacheDir = process.argv[2];
69
+ if (!completionsCacheDir)
70
+ process.exit(1);
71
+ const force = process.argv.includes('--force');
72
+ const reportFailures = process.argv.includes('--report-failures');
73
+ warmCache(completionsCacheDir, { force })
74
+ .then(({ failures }) => {
75
+ if (reportFailures) {
76
+ for (const f of failures)
77
+ console.log(f);
78
+ }
79
+ process.exit(0);
80
+ })
81
+ .catch(() => process.exit(1));
82
+ }
83
+ //# sourceMappingURL=warm-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warm-cache.js","sourceRoot":"","sources":["../../../src/lib/autocomplete/warm-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Document } from 'yaml';
2
+ /**
3
+ * Find the app root directory by looking for app.yml in the current directory or parents.
4
+ * Exits with an error if not found.
5
+ */
6
+ export declare function requireAppRoot(startDir?: string): string;
7
+ /**
8
+ * Read and parse app.yml preserving comments and formatting.
9
+ */
10
+ export declare function readAppYml(appRoot: string): Document;
11
+ /**
12
+ * Write app.yml back preserving formatting.
13
+ */
14
+ export declare function writeAppYml(appRoot: string, doc: Document): void;
15
+ /**
16
+ * Check if a component name already exists under a given top-level key.
17
+ */
18
+ export declare function componentExists(doc: Document, section: string, name: string): boolean;
19
+ /**
20
+ * Add a component entry to a top-level section of app.yml.
21
+ * Creates the section if it doesn't exist, inserting it in conventional order.
22
+ */
23
+ export declare function addComponent(doc: Document, section: string, name: string, value: Record<string, any>): void;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addComponent = exports.componentExists = exports.writeAppYml = exports.readAppYml = exports.requireAppRoot = void 0;
4
+ const chalk = require("chalk");
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const yaml_1 = require("yaml");
8
+ const APP_YML = 'app.yml';
9
+ /**
10
+ * Find the app root directory by looking for app.yml in the current directory or parents.
11
+ * Exits with an error if not found.
12
+ */
13
+ function requireAppRoot(startDir = process.cwd()) {
14
+ const root = findAppRoot(startDir);
15
+ if (!root) {
16
+ console.error(chalk.red('No app.yml found. Run this command from an OCP app directory.'));
17
+ process.exit(1);
18
+ }
19
+ return root;
20
+ }
21
+ exports.requireAppRoot = requireAppRoot;
22
+ function findAppRoot(startDir = process.cwd()) {
23
+ let dir = path.resolve(startDir);
24
+ while (true) {
25
+ if (fs.existsSync(path.join(dir, APP_YML))) {
26
+ return dir;
27
+ }
28
+ const parent = path.dirname(dir);
29
+ if (parent === dir)
30
+ return null;
31
+ dir = parent;
32
+ }
33
+ }
34
+ /**
35
+ * Read and parse app.yml preserving comments and formatting.
36
+ */
37
+ function readAppYml(appRoot) {
38
+ const content = fs.readFileSync(path.join(appRoot, APP_YML), 'utf8');
39
+ return (0, yaml_1.parseDocument)(content);
40
+ }
41
+ exports.readAppYml = readAppYml;
42
+ /**
43
+ * Write app.yml back preserving formatting.
44
+ */
45
+ function writeAppYml(appRoot, doc) {
46
+ fs.writeFileSync(path.join(appRoot, APP_YML), doc.toString());
47
+ }
48
+ exports.writeAppYml = writeAppYml;
49
+ /**
50
+ * Check if a component name already exists under a given top-level key.
51
+ */
52
+ function componentExists(doc, section, name) {
53
+ const sectionNode = doc.get(section);
54
+ if (!sectionNode || !(sectionNode instanceof yaml_1.YAMLMap))
55
+ return false;
56
+ return sectionNode.has(name);
57
+ }
58
+ exports.componentExists = componentExists;
59
+ // Preferred ordering of top-level keys in app.yml
60
+ const SECTION_ORDER = [
61
+ 'meta', 'runtime', 'functions', 'jobs', 'consumers',
62
+ 'liquid_extensions', 'sources', 'destinations', 'channel',
63
+ 'environment', 'outbound_domains',
64
+ ];
65
+ /**
66
+ * Add a component entry to a top-level section of app.yml.
67
+ * Creates the section if it doesn't exist, inserting it in conventional order.
68
+ */
69
+ function addComponent(doc, section, name, value) {
70
+ var _a, _b;
71
+ const sectionNode = doc.get(section);
72
+ if (sectionNode && sectionNode instanceof yaml_1.YAMLMap) {
73
+ sectionNode.set(name, doc.createNode(value));
74
+ return;
75
+ }
76
+ // Section doesn't exist — insert at the right position based on SECTION_ORDER
77
+ const newNode = doc.createNode({ [name]: value });
78
+ const contents = doc.contents;
79
+ if (!contents || !(contents instanceof yaml_1.YAMLMap)) {
80
+ doc.set(section, newNode);
81
+ return;
82
+ }
83
+ const targetIdx = SECTION_ORDER.indexOf(section);
84
+ if (targetIdx === -1) {
85
+ // Unknown section, append at end
86
+ contents.set(section, newNode);
87
+ return;
88
+ }
89
+ // Find the first existing key that comes after this section in the preferred order
90
+ let insertBeforeIdx = -1;
91
+ for (let i = 0; i < contents.items.length; i++) {
92
+ const key = (_b = (_a = contents.items[i].key) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : String(contents.items[i].key);
93
+ const keyOrder = SECTION_ORDER.indexOf(key);
94
+ if (keyOrder > targetIdx) {
95
+ insertBeforeIdx = i;
96
+ break;
97
+ }
98
+ }
99
+ if (insertBeforeIdx === -1) {
100
+ // All existing keys come before this section, append at end
101
+ contents.set(section, newNode);
102
+ }
103
+ else {
104
+ // Insert before the found position
105
+ const pair = doc.createPair(section, newNode);
106
+ contents.items.splice(insertBeforeIdx, 0, pair);
107
+ }
108
+ }
109
+ exports.addComponent = addComponent;
110
+ //# sourceMappingURL=appYml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appYml.js","sourceRoot":"","sources":["../../../src/lib/scaffolding/appYml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Detect whether the project uses a `src/` subdirectory for source files.
3
+ * Checks for common directories like functions/, jobs/, etc. under src/ or at root.
4
+ */
5
+ export declare function detectSourceDir(appRoot: string): string;
6
+ /**
7
+ * Write a file, creating parent directories as needed.
8
+ * Returns false if the file already exists.
9
+ */
10
+ export declare function writeScaffoldFile(filePath: string, content: string): boolean;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeScaffoldFile = exports.detectSourceDir = void 0;
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ /**
7
+ * Detect whether the project uses a `src/` subdirectory for source files.
8
+ * Checks for common directories like functions/, jobs/, etc. under src/ or at root.
9
+ */
10
+ function detectSourceDir(appRoot) {
11
+ const knownDirs = ['functions', 'jobs', 'sources', 'destinations', 'lifecycle'];
12
+ // Check if any known dir exists under src/
13
+ for (const dir of knownDirs) {
14
+ if (fs.existsSync(path.join(appRoot, 'src', dir))) {
15
+ return path.join(appRoot, 'src');
16
+ }
17
+ }
18
+ // Check if any known dir exists at root
19
+ for (const dir of knownDirs) {
20
+ if (fs.existsSync(path.join(appRoot, dir))) {
21
+ return appRoot;
22
+ }
23
+ }
24
+ // Check if src/ directory exists at all (likely a TypeScript project)
25
+ if (fs.existsSync(path.join(appRoot, 'src'))) {
26
+ return path.join(appRoot, 'src');
27
+ }
28
+ // Default to root
29
+ return appRoot;
30
+ }
31
+ exports.detectSourceDir = detectSourceDir;
32
+ /**
33
+ * Write a file, creating parent directories as needed.
34
+ * Returns false if the file already exists.
35
+ */
36
+ function writeScaffoldFile(filePath, content) {
37
+ if (fs.existsSync(filePath)) {
38
+ return false;
39
+ }
40
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
41
+ fs.writeFileSync(filePath, content);
42
+ return true;
43
+ }
44
+ exports.writeScaffoldFile = writeScaffoldFile;
45
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/lib/scaffolding/files.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,6BAA6B;AAE7B;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAEhF,2CAA2C;IAC3C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE;YACjD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAClC;KACF;IAED,wCAAwC;IACxC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE;YAC1C,OAAO,OAAO,CAAC;SAChB;KACF;IAED,sEAAsE;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAClC;IAED,kBAAkB;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC;AAxBD,0CAwBC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,QAAgB,EAAE,OAAe;IACjE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC3B,OAAO,KAAK,CAAC;KACd;IACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IACxD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAPD,8CAOC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Convert a name to snake_case. Accepts snake_case, PascalCase, camelCase, or kebab-case.
3
+ */
4
+ export declare function toSnakeCase(input: string): string;
5
+ /**
6
+ * Convert snake_case to PascalCase.
7
+ */
8
+ export declare function toPascalCase(snakeCase: string): string;
9
+ /**
10
+ * Validate that a name is valid snake_case for use as an app.yml key.
11
+ */
12
+ export declare function isValidName(name: string): boolean;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidName = exports.toPascalCase = exports.toSnakeCase = void 0;
4
+ const SNAKE_CASE = /^[a-z][a-z0-9_]*$/;
5
+ /**
6
+ * Convert a name to snake_case. Accepts snake_case, PascalCase, camelCase, or kebab-case.
7
+ */
8
+ function toSnakeCase(input) {
9
+ return input
10
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
11
+ .replace(/[-\s]+/g, '_')
12
+ .toLowerCase();
13
+ }
14
+ exports.toSnakeCase = toSnakeCase;
15
+ /**
16
+ * Convert snake_case to PascalCase.
17
+ */
18
+ function toPascalCase(snakeCase) {
19
+ return snakeCase
20
+ .split('_')
21
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
22
+ .join('');
23
+ }
24
+ exports.toPascalCase = toPascalCase;
25
+ /**
26
+ * Validate that a name is valid snake_case for use as an app.yml key.
27
+ */
28
+ function isValidName(name) {
29
+ return SNAKE_CASE.test(name);
30
+ }
31
+ exports.isValidName = isValidName;
32
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../src/lib/scaffolding/naming.ts"],"names":[],"mappings":";;;AAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC;;GAEG;AACH,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AALD,kCAKC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,SAAiB;IAC5C,OAAO,SAAS;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AALD,oCAKC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAFD,kCAEC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TypeScript scaffold templates for each component type.
3
+ */
4
+ export declare function functionTemplate(className: string, global: boolean): string;
5
+ export declare function jobTemplate(className: string): string;
6
+ export declare function destinationTemplate(className: string): string;
7
+ export declare function sourceSchemaFunctionTemplate(className: string, name: string, displayName: string): string;
8
+ export declare function destinationSchemaFunctionTemplate(className: string, name: string, displayName: string): string;
9
+ export declare function schemaYmlTemplate(name: string, displayName: string): string;