@optimizely/ocp-cli-v2 2.0.4 → 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.
- package/dist/commands/add/destination.d.ts +12 -0
- package/dist/commands/add/destination.js +106 -0
- package/dist/commands/add/destination.js.map +1 -0
- package/dist/commands/add/function.d.ts +11 -0
- package/dist/commands/add/function.js +71 -0
- package/dist/commands/add/function.js.map +1 -0
- package/dist/commands/add/job.d.ts +11 -0
- package/dist/commands/add/job.js +71 -0
- package/dist/commands/add/job.js.map +1 -0
- package/dist/commands/add/source.d.ts +12 -0
- package/dist/commands/add/source.js +93 -0
- package/dist/commands/add/source.js.map +1 -0
- package/dist/commands/app/init.d.ts +16 -0
- package/dist/commands/app/init.js +129 -21
- package/dist/commands/app/init.js.map +1 -1
- package/dist/commands/app/register.d.ts +7 -0
- package/dist/commands/app/register.js +26 -4
- package/dist/commands/app/register.js.map +1 -1
- package/dist/commands/app/setLogLevel.js +1 -0
- package/dist/commands/app/setLogLevel.js.map +1 -1
- package/dist/commands/autocomplete/options.d.ts +18 -0
- package/dist/commands/autocomplete/options.js +228 -0
- package/dist/commands/autocomplete/options.js.map +1 -0
- package/dist/commands/env/set.js +1 -0
- package/dist/commands/env/set.js.map +1 -1
- package/dist/commands/jobs/list.js +3 -0
- package/dist/commands/jobs/list.js.map +1 -1
- package/dist/hooks/autocomplete-refresh.d.ts +3 -0
- package/dist/hooks/autocomplete-refresh.js +11 -0
- package/dist/hooks/autocomplete-refresh.js.map +1 -0
- package/dist/hooks/postrun-autocomplete-patch.d.ts +8 -0
- package/dist/hooks/postrun-autocomplete-patch.js +274 -0
- package/dist/hooks/postrun-autocomplete-patch.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/autocomplete/cache.d.ts +5 -0
- package/dist/lib/autocomplete/cache.js +88 -0
- package/dist/lib/autocomplete/cache.js.map +1 -0
- package/dist/lib/autocomplete/completions.d.ts +22 -0
- package/dist/lib/autocomplete/completions.js +144 -0
- package/dist/lib/autocomplete/completions.js.map +1 -0
- package/dist/lib/autocomplete/spinner.d.ts +16 -0
- package/dist/lib/autocomplete/spinner.js +50 -0
- package/dist/lib/autocomplete/spinner.js.map +1 -0
- package/dist/lib/autocomplete/types.d.ts +13 -0
- package/dist/lib/autocomplete/types.js +3 -0
- package/dist/lib/autocomplete/types.js.map +1 -0
- package/dist/lib/autocomplete/warm-cache.d.ts +6 -0
- package/dist/lib/autocomplete/warm-cache.js +83 -0
- package/dist/lib/autocomplete/warm-cache.js.map +1 -0
- package/dist/lib/scaffolding/appYml.d.ts +23 -0
- package/dist/lib/scaffolding/appYml.js +110 -0
- package/dist/lib/scaffolding/appYml.js.map +1 -0
- package/dist/lib/scaffolding/files.d.ts +10 -0
- package/dist/lib/scaffolding/files.js +45 -0
- package/dist/lib/scaffolding/files.js.map +1 -0
- package/dist/lib/scaffolding/naming.d.ts +12 -0
- package/dist/lib/scaffolding/naming.js +32 -0
- package/dist/lib/scaffolding/naming.js.map +1 -0
- package/dist/lib/scaffolding/templates.d.ts +9 -0
- package/dist/lib/scaffolding/templates.js +128 -0
- package/dist/lib/scaffolding/templates.js.map +1 -0
- package/dist/oclif.manifest.json +431 -51
- package/package.json +6 -3
- package/dist/lib/suggestDisplayName.test.d.ts +0 -1
- package/dist/lib/suggestDisplayName.test.js +0 -44
- package/dist/lib/suggestDisplayName.test.js.map +0 -1
|
@@ -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":";;;AAAA,4CAAuC;AAGvC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,CAAC;AACzB,MAAM,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC9B,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC;AAE5B,SAAS,eAAe,CAAC,GAAsB;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAEY,QAAA,eAAe,GAAe;IACzC,aAAa,EAAE,QAAQ;IACvB,KAAK,CAAC,OAAO,CAAC,IAAuB;QACnC,0FAA0F;QAC1F,MAAM,EAAE,GAAG,MAAM,qBAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG;YACV,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnC,CAAC;QACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;CACF,CAAC;AAEW,QAAA,oBAAoB,GAAe;IAC9C,aAAa,EAAE,QAAQ,GAAG,CAAC;IAC3B,QAAQ,CAAC,GAAsB;QAC7B,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,cAAc,KAAK,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;SACtD;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,GAAsB;QAClC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAExD,0CAA0C;QAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,uBAAe,CAAC,OAAO,CAAC,GAAG,CAAsB,CAAC;SAC1D;QAED,0DAA0D;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,qBAAS,CAAC,iBAAiB,CAAC,EAAC,KAAK,EAAC,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;CACF,CAAC;AAEW,QAAA,eAAe,GAAe;IACzC,aAAa,EAAE,OAAO;IACtB,KAAK,CAAC,OAAO,CAAC,IAAuB;QACnC,MAAM,MAAM,GAAG,MAAM,qBAAS,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;CACF,CAAC;AAEW,QAAA,eAAe,GAAe;IACzC,aAAa,EAAE,YAAY;IAC3B,QAAQ,CAAC,GAAsB;QAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACpD,OAAO,SAAS,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,GAAsB;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,qBAAS,CAAC,UAAU,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC;AAEW,QAAA,kBAAkB,GAAe;IAC5C,SAAS,EAAE,IAAI;IACf,OAAO;QACL,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEW,QAAA,mBAAmB,GAAe;IAC7C,SAAS,EAAE,IAAI;IACf,OAAO;QACL,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC;AAEW,QAAA,qBAAqB,GAAe;IAC/C,SAAS,EAAE,IAAI;IACf,OAAO;QACL,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;CACF,CAAC;AAEW,QAAA,uBAAuB,GAAe;IACjD,SAAS,EAAE,IAAI;IACf,OAAO;QACL,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAe;IAC3C,aAAa,EAAE,QAAQ,GAAG,CAAC;IAC3B,QAAQ,CAAC,GAAsB;QAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACpD,OAAO,WAAW,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,GAAsB;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,qBAAS,CAAC,iBAAiB,CAAC,EAAC,KAAK,EAAC,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAgC;IAC5D,KAAK,EAAE,uBAAe;IACtB,UAAU,EAAE,4BAAoB;IAChC,YAAY,EAAE,uBAAe;IAC7B,OAAO,EAAE,yBAAiB;IAC1B,KAAK,EAAE,uBAAe;IACtB,QAAQ,EAAE,0BAAkB;IAC5B,MAAM,EAAE,2BAAmB;IAC3B,GAAG,EAAE,6BAAqB;IAC1B,aAAa,EAAE,+BAAuB;IACtC,yEAAyE;IACzE,OAAO,EAAE,uBAAe;CACzB,CAAC;AAEF,MAAa,gBAAgB;IAK3B,YACmB,KAAa,EACb,IAAY;QADZ,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAQ;QANd,iBAAY,GAA8B;YACzD,KAAK,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;SACpC,CAAC;IAKC,CAAC;IAEG,GAAG;QACR,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO;QAC/B,OAAO,yBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAEO,WAAW;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC;IAED,IAAY,GAAG;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;CACF;AAvBD,4CAuBC"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/autocomplete/types.ts"],"names":[],"mappings":""}
|
|
@@ -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;
|