@gershy/lilac 0.0.1

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 (62) hide show
  1. package/cmp/cjs/main.d.ts +75 -0
  2. package/cmp/cjs/main.js +299 -0
  3. package/cmp/cjs/package.json +1 -0
  4. package/cmp/cjs/petal/petal.d.ts +3 -0
  5. package/cmp/cjs/petal/petal.js +6 -0
  6. package/cmp/cjs/petal/terraform/terraform.d.ts +82 -0
  7. package/cmp/cjs/petal/terraform/terraform.js +194 -0
  8. package/cmp/cjs/util/aws.d.ts +5 -0
  9. package/cmp/cjs/util/aws.js +61 -0
  10. package/cmp/cjs/util/awsTerraform.d.ts +3 -0
  11. package/cmp/cjs/util/awsTerraform.js +9 -0
  12. package/cmp/cjs/util/capitalize.d.ts +2 -0
  13. package/cmp/cjs/util/capitalize.js +12 -0
  14. package/cmp/cjs/util/hash.d.ts +2 -0
  15. package/cmp/cjs/util/hash.js +14 -0
  16. package/cmp/cjs/util/logger.d.ts +20 -0
  17. package/cmp/cjs/util/logger.js +150 -0
  18. package/cmp/cjs/util/normalize.d.ts +2 -0
  19. package/cmp/cjs/util/normalize.js +25 -0
  20. package/cmp/cjs/util/procTerraform.d.ts +8 -0
  21. package/cmp/cjs/util/procTerraform.js +31 -0
  22. package/cmp/cjs/util/slashEscape.d.ts +2 -0
  23. package/cmp/cjs/util/slashEscape.js +10 -0
  24. package/cmp/cjs/util/snakeCase.d.ts +2 -0
  25. package/cmp/cjs/util/snakeCase.js +3 -0
  26. package/cmp/cjs/util/terraform.d.ts +2 -0
  27. package/cmp/cjs/util/terraform.js +11 -0
  28. package/cmp/cjs/util/tryWithHealing.d.ts +7 -0
  29. package/cmp/cjs/util/tryWithHealing.js +11 -0
  30. package/cmp/mjs/main.d.ts +75 -0
  31. package/cmp/mjs/main.js +276 -0
  32. package/cmp/mjs/package.json +1 -0
  33. package/cmp/mjs/petal/petal.d.ts +3 -0
  34. package/cmp/mjs/petal/petal.js +3 -0
  35. package/cmp/mjs/petal/terraform/terraform.d.ts +82 -0
  36. package/cmp/mjs/petal/terraform/terraform.js +188 -0
  37. package/cmp/mjs/util/aws.d.ts +5 -0
  38. package/cmp/mjs/util/aws.js +54 -0
  39. package/cmp/mjs/util/awsTerraform.d.ts +3 -0
  40. package/cmp/mjs/util/awsTerraform.js +5 -0
  41. package/cmp/mjs/util/capitalize.d.ts +2 -0
  42. package/cmp/mjs/util/capitalize.js +10 -0
  43. package/cmp/mjs/util/hash.d.ts +2 -0
  44. package/cmp/mjs/util/hash.js +12 -0
  45. package/cmp/mjs/util/logger.d.ts +20 -0
  46. package/cmp/mjs/util/logger.js +147 -0
  47. package/cmp/mjs/util/normalize.d.ts +2 -0
  48. package/cmp/mjs/util/normalize.js +23 -0
  49. package/cmp/mjs/util/procTerraform.d.ts +8 -0
  50. package/cmp/mjs/util/procTerraform.js +26 -0
  51. package/cmp/mjs/util/slashEscape.d.ts +2 -0
  52. package/cmp/mjs/util/slashEscape.js +8 -0
  53. package/cmp/mjs/util/snakeCase.d.ts +2 -0
  54. package/cmp/mjs/util/snakeCase.js +1 -0
  55. package/cmp/mjs/util/terraform.d.ts +2 -0
  56. package/cmp/mjs/util/terraform.js +6 -0
  57. package/cmp/mjs/util/tryWithHealing.d.ts +7 -0
  58. package/cmp/mjs/util/tryWithHealing.js +9 -0
  59. package/cmp/sideEffects.d.ts +2 -0
  60. package/license +15 -0
  61. package/package.json +55 -0
  62. package/readme.md +39 -0
@@ -0,0 +1,61 @@
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.regions = exports.capitalKeys = void 0;
7
+ const clearing_1 = require("@gershy/clearing");
8
+ const capitalize_ts_1 = __importDefault(require("./capitalize.js"));
9
+ const capitalKeys = (v) => {
10
+ if ((0, clearing_1.isCls)(v, Array))
11
+ return v[map](v => (0, exports.capitalKeys)(v));
12
+ if ((0, clearing_1.isCls)(v, Object))
13
+ return v[mapk]((val, key) => [(0, capitalize_ts_1.default)(key), (0, exports.capitalKeys)(val)]);
14
+ return v;
15
+ };
16
+ exports.capitalKeys = capitalKeys;
17
+ exports.regions = [
18
+ 'ca-central-1',
19
+ 'us-east-1',
20
+ 'us-east-2',
21
+ 'us-west-1',
22
+ 'us-west-2',
23
+ // TODO: What's the exact purpose of this definition? Exhaustive list of regions??
24
+ // 'af-south-1',
25
+ // 'ap-east-1',
26
+ // 'ap-east-2',
27
+ // 'ap-northeast-1',
28
+ // 'ap-northeast-2',
29
+ // 'ap-northeast-3',
30
+ // 'ap-south-1',
31
+ // 'ap-south-2',
32
+ // 'ap-southeast-1',
33
+ // 'ap-southeast-2',
34
+ // 'ap-southeast-3',
35
+ // 'ap-southeast-4',
36
+ // 'ap-southeast-5',
37
+ // 'ap-southeast-7',
38
+ // 'ca-west-1',
39
+ // 'cn-north-1',
40
+ // 'cn-northwest-1',
41
+ // 'eu-central-1',
42
+ // 'eu-central-2',
43
+ // 'eu-north-1',
44
+ // 'eu-south-1',
45
+ // 'eu-south-2',
46
+ // 'eu-west-1',
47
+ // 'eu-west-2',
48
+ // 'eu-west-3',
49
+ // 'il-central-1',
50
+ // 'me-central-1',
51
+ // 'me-south-1',
52
+ // 'mx-central-1',
53
+ // 'sa-east-1',
54
+ // Ignoring these for now...
55
+ // 'us-gov-east-1',
56
+ // 'us-gov-west-1',
57
+ ][map](region => {
58
+ const [c, z, num] = region.split('-');
59
+ const [dir0, dir1 = dir0] = z.match(/central|north|south|east|west/g);
60
+ return { term: region, mini: [c, dir0[0], dir1[0], num].join('') };
61
+ });
@@ -0,0 +1,3 @@
1
+ export declare const provider: (defaultAwsRegion: string, targetAwsRegion: string) => {
2
+ $provider: string;
3
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.provider = void 0;
4
+ const provider = (defaultAwsRegion, targetAwsRegion) => {
5
+ return defaultAwsRegion !== targetAwsRegion
6
+ ? { $provider: `aws.${targetAwsRegion.split('-').join('_')}` }
7
+ : {};
8
+ };
9
+ exports.provider = provider;
@@ -0,0 +1,2 @@
1
+ declare const capitalize: (v: string | string[]) => string;
2
+ export default capitalize;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const clearing_1 = require("@gershy/clearing");
4
+ const capitalize = (v) => {
5
+ // capitalize('hello') -> "Hello"
6
+ // capitalize('heLLo') -> "HeLLo"
7
+ // capitalize([ 'my', 'name', 'is', 'bOb' ]) -> "myNameIsBOb"
8
+ if ((0, clearing_1.isCls)(v, String))
9
+ return v[0][upper]() + v.slice(1);
10
+ return [v[0], ...v.slice(1)[map](v => v[0][upper]() + v.slice(1))].join('');
11
+ };
12
+ exports.default = capitalize;
@@ -0,0 +1,2 @@
1
+ declare const _default: (str: string | Buffer | Iterable<string | Buffer>, targetBase?: string) => string;
2
+ export default _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_crypto_1 = require("node:crypto");
4
+ const clearing_1 = require("@gershy/clearing");
5
+ exports.default = (str, targetBase = String[base62]) => {
6
+ // Consider moving this under the "node" directory - relies on "node:crypto'
7
+ if ((0, clearing_1.isCls)(str, String) || (0, clearing_1.isCls)(str, Buffer))
8
+ str = [str];
9
+ const hash = (0, node_crypto_1.createHash)('sha256');
10
+ for (const val of str)
11
+ hash.update(val);
12
+ return hash
13
+ .digest('base64url')[toNum](String[base64Url])[toStr](targetBase);
14
+ };
@@ -0,0 +1,20 @@
1
+ type LoggerData = null | boolean | number | string | {
2
+ [limn]: (...args: any) => LoggerData;
3
+ } | LoggerData[] | {
4
+ [k: string]: LoggerData;
5
+ };
6
+ export default class Logger {
7
+ static dummy: Logger;
8
+ private format;
9
+ private domain;
10
+ private ctx;
11
+ private write;
12
+ private opts;
13
+ constructor(domain: string, ctx?: Obj<any>, opts?: typeof this.opts, write?: typeof this.write);
14
+ getDomain(): string;
15
+ getTraceId(term: string): string;
16
+ log(data: LoggerData): void;
17
+ kid(domain: string): Logger;
18
+ scope<Fn extends (logger: Logger) => any>(domain: string, ctx: Obj<any>, fn: Fn): ReturnType<Fn>;
19
+ }
20
+ export {};
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ // TODO: @gershy/logger (or @gershy/watcher?)
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const clearing_1 = require("@gershy/clearing");
5
+ const scrubbed = (val, opts = {}) => {
6
+ const { isScrub = (k, _v) => k[0] === '!', doScrub = ((v) => `$scrub(${(0, clearing_1.getClsName)(v)})`), seen = new Map() } = opts ?? {};
7
+ if (val === null)
8
+ return val;
9
+ if ((0, clearing_1.isCls)(val, Boolean))
10
+ return val;
11
+ if ((0, clearing_1.isCls)(val, Number))
12
+ return val;
13
+ if ((0, clearing_1.isCls)(val, String))
14
+ return val;
15
+ if (seen.has(val))
16
+ return seen.get(val) ?? null;
17
+ if ((0, clearing_1.isCls)(val, Array)) {
18
+ const result = [];
19
+ seen.set(val, result);
20
+ for (const item of val)
21
+ result.push(scrubbed(item, { isScrub, doScrub, seen }));
22
+ return result;
23
+ }
24
+ else if ((0, clearing_1.isCls)(val, Object)) {
25
+ // Consider using hashes to display scrubbed values? (Makes them correlatable!)
26
+ const result = {};
27
+ seen.set(val, result);
28
+ for (const [k, v] of val)
29
+ result[k] = isScrub(k, v) ? doScrub(v) : scrubbed(v, { isScrub, doScrub, seen });
30
+ return result;
31
+ }
32
+ else if ((0, clearing_1.inCls)(val[limn], Function)) {
33
+ return scrubbed(val[limn](), { isScrub, doScrub, seen });
34
+ }
35
+ else {
36
+ // Consider processing for other types (sets, maps?)
37
+ return val;
38
+ }
39
+ };
40
+ class Logger {
41
+ static dummy = {
42
+ getTraceId() { return ''; },
43
+ log() { },
44
+ kid() { return Logger.dummy; },
45
+ scope(...args) { return args.at(-1)(Logger.dummy); }
46
+ };
47
+ format(v /* should not have cycles */, seen = new Map()) {
48
+ // Formats any value into json (so that it can be logged)
49
+ if (v == null)
50
+ return null;
51
+ if ((0, clearing_1.isCls)(v, Boolean))
52
+ return v;
53
+ if ((0, clearing_1.isCls)(v, Number))
54
+ return v;
55
+ if ((0, clearing_1.isCls)(v, String))
56
+ return v.length > this.opts.maxStrLen ? v.slice(0, this.opts.maxStrLen - 1) + '\u2026' : v;
57
+ if (seen.has(v))
58
+ return `<cyc> ${(0, clearing_1.getClsName)(v)}(...)`;
59
+ if ((0, clearing_1.inCls)(v[limn], Function)) {
60
+ const formatted = {};
61
+ seen.set(v, formatted);
62
+ Object.assign(formatted, this.format(v[limn](), seen));
63
+ return formatted;
64
+ }
65
+ if ((0, clearing_1.isCls)(v, Array)) {
66
+ const arr = [];
67
+ seen.set(v, arr);
68
+ for (const vv of v)
69
+ arr.push(this.format(vv, seen));
70
+ return arr;
71
+ }
72
+ if ((0, clearing_1.isCls)(v, Object)) {
73
+ const obj = {};
74
+ seen.set(v, obj);
75
+ for (const k in v)
76
+ obj[k] = this.format(v[k], seen);
77
+ return obj;
78
+ }
79
+ return `${(0, clearing_1.getClsName)(v)}(...)`;
80
+ }
81
+ ;
82
+ domain;
83
+ ctx;
84
+ write;
85
+ opts;
86
+ constructor(domain, ctx = {}, opts, write) {
87
+ this.domain = domain;
88
+ this.ctx = {
89
+ ...ctx,
90
+ $: this.domain,
91
+ [this.domain.split('.').at(-1)]: Math.random().toString(36).slice(2, 12)[padTail](10, '0'),
92
+ };
93
+ this.opts = opts ?? { maxStrLen: 250 };
94
+ // Note this default `this.write` function produces truncated values (sloppy outputting) in the
95
+ // cli, but works perfectly for lambdas with json-style logging configured!
96
+ this.write = write ?? ((val) => console.log(val));
97
+ }
98
+ getDomain() { return this.domain; }
99
+ getTraceId(term) {
100
+ const traceId = this.ctx[term];
101
+ if (!traceId)
102
+ throw Error('trace term invalid')[mod]({ term, ctx: this.ctx });
103
+ return traceId;
104
+ }
105
+ log(data) {
106
+ // Use-cases:
107
+ // 1. logger.log('a basic string')
108
+ // - The logged payload is converted to `{ msg: 'a basic string' }`
109
+ // 2. logger.log({ msg: 'a basic string' })
110
+ // - Logged as-is; equivalent to #1
111
+ // 3. logger.log({ $$: 'note', msg: 'a basic string' })
112
+ // - Same as #1 and #2, but logger domain has "note" appended to it
113
+ // 4. logger.log({ $$: 'noteOnly' })
114
+ // - Logged payload will be `{}`; only info is the tag - useful for infinitesimal moments in
115
+ // the flamegraph!
116
+ // 5. logger.log({ $$: 'context.noteOnly' })
117
+ // - Valid way to extend domain with more than 1 component at once!
118
+ let dmn = null;
119
+ if (data && (0, clearing_1.isCls)(data?.$$, String))
120
+ ({ $$: dmn, ...data } = data);
121
+ const domain = dmn ? [this.domain, dmn].join('.') : this.domain;
122
+ if (!(0, clearing_1.isCls)(data, Object))
123
+ data = { msg: data };
124
+ this.write({}[merge]({ $: this.ctx })[merge](scrubbed(this.format(data)))[merge]({ $: { $: domain } }));
125
+ }
126
+ kid(domain) {
127
+ const d = [this.domain, domain].filter(Boolean).join('.');
128
+ const logger = new Logger(d, this.ctx, this.opts, this.write);
129
+ return logger;
130
+ }
131
+ scope(domain, ctx, fn) {
132
+ const ms = Date.now();
133
+ const logger = this.kid(domain);
134
+ logger.log({ $$: 'launch', ...ctx });
135
+ const accept = val => { logger.log({ $$: 'accept', ms: Date.now() - ms }); return val; };
136
+ const glitch = err => { logger.log({ $$: err.log?.term ?? 'glitch', ms: Date.now() - ms, err }); throw err; }; // Always throws an error! Note allowing the consumer to override the logged term/domain offers a lot of flexibility!
137
+ let v;
138
+ try {
139
+ v = fn(logger);
140
+ }
141
+ catch (err) {
142
+ glitch(err);
143
+ }
144
+ return (0, clearing_1.isCls)(v, Promise)
145
+ ? v.then(accept, glitch)
146
+ : accept(v);
147
+ }
148
+ }
149
+ exports.default = Logger;
150
+ ;
@@ -0,0 +1,2 @@
1
+ declare const normalize: (val: any, seen?: Set<any>) => any;
2
+ export default normalize;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const clearing_1 = require("@gershy/clearing");
4
+ const normalize = (val, seen = new Set()) => {
5
+ // Derives a json-stringifiable value from *any* value
6
+ // E.g. to hash *anything*: hash(JSON.stringify(normalized(anything)));
7
+ // Handles terminations
8
+ if ((0, clearing_1.isCls)(val, String))
9
+ return val;
10
+ if ((0, clearing_1.isCls)(val, Number))
11
+ return val;
12
+ if (val === null)
13
+ return null;
14
+ if (val === undefined)
15
+ return null;
16
+ if (seen.has(val))
17
+ return '<<!circ!>>';
18
+ seen.add(val);
19
+ if ((0, clearing_1.isCls)(val, Array))
20
+ return val[map](v => normalize(v, seen));
21
+ if ((0, clearing_1.isCls)(val, Object))
22
+ return normalize(Object.entries(val).sort((e0, e1) => e0[0] < e1[0] ? -1 : 1), seen);
23
+ return normalize({ $form: (0, clearing_1.getClsName)(val), ...val }, seen);
24
+ };
25
+ exports.default = normalize;
@@ -0,0 +1,8 @@
1
+ import { rootFact } from '@gershy/disk';
2
+ import { ProcOpts } from '@gershy/util-nodejs-proc';
3
+ type Fact = typeof rootFact;
4
+ declare const _default: (fact: Fact, cmd: string, opts?: ProcOpts) => Promise<{
5
+ logDb: import("@gershy/disk").Fact;
6
+ output: string;
7
+ }>;
8
+ export default _default;
@@ -0,0 +1,31 @@
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
+ const util_nodejs_proc_1 = __importDefault(require("@gershy/util-nodejs-proc"));
7
+ exports.default = (fact, cmd, opts) => {
8
+ const numTailingTfLogLines = 20;
9
+ const writeLog = async (result) => {
10
+ const [yr, mo, dy, hr, mn, sc, ms] = new Date().toISOString().match(/([0-9]{4})[-]([0-9]{2})[-]([0-9]{2})[T]([0-9]{2})[:]([0-9]{2})[:]([0-9]{2})[.]([0-9]+)[Z]/).slice(1);
11
+ const term = `${cmd.split(' ')[1]}-${yr}${mo}${dy}-${hr}${mn}${sc}`;
12
+ const logDb = fact.kid(['.terraform.log', `${term}.txt`]);
13
+ await logDb.setData(result);
14
+ return logDb;
15
+ };
16
+ return (0, util_nodejs_proc_1.default)(cmd, {
17
+ timeoutMs: 0,
18
+ ...opts,
19
+ cwd: fact,
20
+ env: { TF_DATA_DIR: '' }
21
+ }).then(async (result) => {
22
+ const logDb = await writeLog(result.output);
23
+ return { logDb, output: result.output.split('\n').slice(-numTailingTfLogLines).join('\n') };
24
+ }, async (err) => {
25
+ const logDb = await writeLog(err.output ?? err[limn]());
26
+ throw Error(`terraform failed (${err.message})`)[mod]({
27
+ logDb,
28
+ ...(err.output ? { output: err.output.split('\n').slice(-numTailingTfLogLines).join('\n') } : { cause: err })
29
+ });
30
+ });
31
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: (str: string, escapeChars: string) => string;
2
+ export default _default;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (str, escapeChars) => {
4
+ if (!escapeChars[has]('\\'))
5
+ escapeChars += '\\';
6
+ // The regex to construct must have "\" and "]" escaped:
7
+ const escChars = escapeChars.replace(/([\\\]])/g, '\\$1');
8
+ const reg = new RegExp(`([${escChars}])`, 'g');
9
+ return str.replace(reg, '\\$1');
10
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: (val: string) => Lowercase<string>;
2
+ export default _default;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (val) => val.replace(/([A-Z])/g, '_$1')[lower]();
@@ -0,0 +1,2 @@
1
+ export declare const embed: (v: string) => string;
2
+ export declare const json: (v: Json) => string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.json = exports.embed = void 0;
4
+ const embed = (v) => '${' + v + '}';
5
+ exports.embed = embed;
6
+ const json = (v) => [
7
+ '| <<EOF',
8
+ JSON.stringify(v, null, 2)[indent](2),
9
+ 'EOF'
10
+ ].join('\n');
11
+ exports.json = json;
@@ -0,0 +1,7 @@
1
+ export type TryWithHealingArgs<T> = {
2
+ fn: () => Promise<T>;
3
+ canHeal: (err: any) => boolean;
4
+ heal: () => Promise<any>;
5
+ };
6
+ declare const _default: <T>(args: TryWithHealingArgs<T>) => Promise<T>;
7
+ export default _default;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = async (args) => {
4
+ const { fn, heal, canHeal } = args;
5
+ return fn().catch(async (err) => {
6
+ if (!canHeal(err))
7
+ throw err;
8
+ await heal();
9
+ return fn();
10
+ });
11
+ };
@@ -0,0 +1,75 @@
1
+ import '../sideEffects.js';
2
+ import { PetalTerraform } from './petal/terraform/terraform.ts';
3
+ import Logger from './util/logger.ts';
4
+ import { Fact } from '@gershy/disk';
5
+ export type Context = {
6
+ name: string;
7
+ logger: Logger;
8
+ fact: Fact;
9
+ patioFact: Fact;
10
+ aws: {
11
+ accountId: string;
12
+ accessKey: {
13
+ id: string;
14
+ '!secret': string;
15
+ };
16
+ region: string;
17
+ };
18
+ maturity: string;
19
+ debug: boolean;
20
+ pfx: string;
21
+ };
22
+ export declare class Flower {
23
+ constructor();
24
+ getDependencies(): Generator<Flower>;
25
+ getPetals(ctx: Context): Iterable<PetalTerraform.Base> | AsyncIterable<PetalTerraform.Base>;
26
+ }
27
+ type RegistryFlowers<R extends Registry<any>, M extends 'real' | 'test'> = R extends Registry<infer Flowers> ? {
28
+ [K in keyof Flowers]: Flowers[K][M];
29
+ } : never;
30
+ export declare class Registry<Flowers extends Obj<{
31
+ real: typeof Flower;
32
+ test: typeof Flower;
33
+ }> = Obj<never>> {
34
+ private flowers;
35
+ constructor(flowers: Flowers);
36
+ add<MoreFlowers extends Obj<{
37
+ real: typeof Flower;
38
+ test: typeof Flower;
39
+ }>>(flowers: MoreFlowers): Registry<Omit<Flowers, keyof MoreFlowers> & MoreFlowers>;
40
+ get<Mode extends 'real' | 'test'>(mode: Mode): RegistryFlowers<Registry<Flowers>, Mode>;
41
+ }
42
+ export declare class Garden<Reg extends Registry<any>> {
43
+ private ctx;
44
+ private registry;
45
+ private define;
46
+ constructor(args: {
47
+ name: string;
48
+ logger: Logger;
49
+ fact: Fact;
50
+ patioFact: Fact;
51
+ aws: {
52
+ accountId: string;
53
+ accessKey: {
54
+ id: string;
55
+ '!secret': string;
56
+ };
57
+ region: string;
58
+ };
59
+ maturity: string;
60
+ debug: boolean;
61
+ pfx: string;
62
+ registry: Reg;
63
+ define: Garden<Reg>['define'];
64
+ });
65
+ private getPetals;
66
+ prepare(): Promise<{
67
+ bootFact: Fact;
68
+ mainFact: Fact;
69
+ }>;
70
+ private terraformInit;
71
+ private terraformPlan;
72
+ private terraformApply;
73
+ grow(mode: 'real' | 'test'): Promise<void>;
74
+ }
75
+ export * from './petal/terraform/terraform.ts';