@webiny/pulumi-sdk 0.0.0-mt-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.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/downloadBinaries.d.ts +2 -0
- package/downloadBinaries.js +105 -0
- package/index.d.ts +37 -0
- package/index.js +126 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Webiny
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# @webiny/pulumi-sdk
|
|
2
|
+
[](https://www.npmjs.com/package/@webiny/pulumi-sdk)
|
|
3
|
+
[](https://www.npmjs.com/package/@webiny/pulumi-sdk)
|
|
4
|
+
[](https://github.com/prettier/prettier)
|
|
5
|
+
[](http://makeapullrequest.com)
|
|
6
|
+
|
|
7
|
+
A simple Pulumi Node.JS SDK - programmatically execute Pulumi CLI commands within your Node.js scripts.
|
|
8
|
+
|
|
9
|
+
### Example
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
const { Pulumi } = require("@webiny/pulumi-sdk");
|
|
13
|
+
|
|
14
|
+
// Create a new instance of Pulumi class.
|
|
15
|
+
// Note that Pulumi will be installed automatically on first use, you don't need to install it
|
|
16
|
+
// manually first. That's why the `beforePulumiInstall` and `afterPulumiInstall` are exposed.
|
|
17
|
+
const pulumi = new Pulumi({
|
|
18
|
+
execa: {
|
|
19
|
+
cwd: stacksDir,
|
|
20
|
+
env: { PULUMI_CONFIG_PASSPHRASE: process.env.PULUMI_CONFIG_PASSPHRASE }
|
|
21
|
+
},
|
|
22
|
+
args: {
|
|
23
|
+
secretsProvider: "passphrase"
|
|
24
|
+
},
|
|
25
|
+
beforePulumiInstall: () => {
|
|
26
|
+
console.log(
|
|
27
|
+
`💡 It looks like this is your first time using ${green(
|
|
28
|
+
"@webiny/pulumi-sdk"
|
|
29
|
+
)}.`
|
|
30
|
+
);
|
|
31
|
+
spinner.start(`Downloading Pulumi...`);
|
|
32
|
+
},
|
|
33
|
+
afterPulumiInstall: () => {
|
|
34
|
+
spinner.stopAndPersist({
|
|
35
|
+
symbol: green("✔"),
|
|
36
|
+
text: `Pulumi downloaded, continuing...`
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Use existing stack if possible, otherwise create a new one.
|
|
42
|
+
let stackExists = true;
|
|
43
|
+
try {
|
|
44
|
+
const { process } = await pulumi.run({ command: ["stack", "select", env] });
|
|
45
|
+
await process;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
stackExists = false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!stackExists) {
|
|
51
|
+
const { process } = await pulumi.run({ command: ["stack", "init", env] });
|
|
52
|
+
await process;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// If isPreview was set to true in our script, then run `preview` command, otherwise `up`.
|
|
56
|
+
if (isPreview) {
|
|
57
|
+
const pulumi = new Pulumi();
|
|
58
|
+
const { toConsole } = await pulumi.run({
|
|
59
|
+
command: "preview",
|
|
60
|
+
execa: {
|
|
61
|
+
cwd: stacksDir,
|
|
62
|
+
env: { PULUMI_CONFIG_PASSPHRASE: process.env.PULUMI_CONFIG_PASSPHRASE }
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
await toConsole();
|
|
66
|
+
} else {
|
|
67
|
+
const { toConsole } = await pulumi.run({
|
|
68
|
+
command: "up",
|
|
69
|
+
args: {
|
|
70
|
+
yes: true,
|
|
71
|
+
skipPreview: true
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
await toConsole();
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Development
|
|
79
|
+
|
|
80
|
+
#### Updating versions
|
|
81
|
+
Currently, versions of the Pulumi code are hard-coded. For example, the version of Pulumi CLI we're currently downloading is set to `2.16.2`, the AWS plugin `3.22.0`. We define these in a couple of places:
|
|
82
|
+
|
|
83
|
+
1. In `src/index.ts`, check `AWS_PLUGIN_VERSION`.
|
|
84
|
+
2. In `src/downloadBinaries.ts`, check `PULUMI_VERSION`.
|
|
85
|
+
3. Finally, in `package.json`, we have the `@pulumi/aws` and `@pulumi/pulumi` in `dependencies`.
|
|
86
|
+
|
|
87
|
+
When updating versions, make sure the versions in `package.json` and in files mentioned in `1` and `2`, are synced.
|
|
88
|
+
|
|
89
|
+
And of course, once you change the version, please test with current dev repo at least. Everything should still be deployable from scratch.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
const os = require("os");
|
|
9
|
+
|
|
10
|
+
const tar = require("tar");
|
|
11
|
+
|
|
12
|
+
const fs = require("fs");
|
|
13
|
+
|
|
14
|
+
const download = require("download");
|
|
15
|
+
|
|
16
|
+
const path = require("path");
|
|
17
|
+
|
|
18
|
+
const decompress = require("decompress");
|
|
19
|
+
|
|
20
|
+
const semver = require("semver"); // We gotta sanitize the package version, since on a few occasions, we've detected the Pulumi version
|
|
21
|
+
// can look like the following: "2.25.2+dirty". We want to ensure only "2.25.2" is returned.
|
|
22
|
+
// @see https://github.com/pulumi/pulumi/issues/6847
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
const getPulumiVersion = () => {
|
|
26
|
+
const {
|
|
27
|
+
version
|
|
28
|
+
} = require("@pulumi/pulumi/package.json");
|
|
29
|
+
|
|
30
|
+
return semver.clean(version);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
var _default = async (downloadFolder, beforeInstall, afterInstall) => {
|
|
34
|
+
if (fs.existsSync(downloadFolder)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (typeof beforeInstall === "function") {
|
|
39
|
+
await beforeInstall();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const platform = os.platform();
|
|
43
|
+
|
|
44
|
+
switch (platform) {
|
|
45
|
+
case "darwin":
|
|
46
|
+
await setupDarwin(downloadFolder);
|
|
47
|
+
break;
|
|
48
|
+
|
|
49
|
+
case "linux":
|
|
50
|
+
await setupLinux(downloadFolder);
|
|
51
|
+
break;
|
|
52
|
+
|
|
53
|
+
case "win32":
|
|
54
|
+
await setupWindows(downloadFolder);
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
default:
|
|
58
|
+
throw Error(`Cannot download Pulumi binaries - platform "${platform}" not supported. Supported ones are "darwin", "linux", and "win32"`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (typeof afterInstall === "function") {
|
|
62
|
+
await afterInstall();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return true;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
exports.default = _default;
|
|
69
|
+
|
|
70
|
+
async function setupDarwin(downloadFolder) {
|
|
71
|
+
const version = getPulumiVersion();
|
|
72
|
+
const filename = `pulumi-v${version}-darwin-x64.tar.gz`;
|
|
73
|
+
const downloadUrl = "https://get.pulumi.com/releases/sdk/" + filename;
|
|
74
|
+
await download(downloadUrl, downloadFolder);
|
|
75
|
+
await tar.extract({
|
|
76
|
+
cwd: downloadFolder,
|
|
77
|
+
file: path.join(downloadFolder, filename)
|
|
78
|
+
});
|
|
79
|
+
fs.unlinkSync(path.join(downloadFolder, filename));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function setupWindows(downloadFolder) {
|
|
83
|
+
const version = getPulumiVersion();
|
|
84
|
+
const filename = `pulumi-v${version}-windows-x64.zip`;
|
|
85
|
+
const downloadUrl = "https://get.pulumi.com/releases/sdk/" + filename;
|
|
86
|
+
await download(downloadUrl, downloadFolder);
|
|
87
|
+
const archive = path.join(downloadFolder, filename);
|
|
88
|
+
const destination = path.join(downloadFolder, "pulumi");
|
|
89
|
+
await decompress(archive, destination, {
|
|
90
|
+
strip: 2
|
|
91
|
+
});
|
|
92
|
+
fs.unlinkSync(path.join(downloadFolder, filename));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function setupLinux(downloadFolder) {
|
|
96
|
+
const version = getPulumiVersion();
|
|
97
|
+
const filename = `pulumi-v${version}-linux-x64.tar.gz`;
|
|
98
|
+
const downloadUrl = "https://get.pulumi.com/releases/sdk/" + filename;
|
|
99
|
+
await download(downloadUrl, downloadFolder);
|
|
100
|
+
await tar.extract({
|
|
101
|
+
cwd: downloadFolder,
|
|
102
|
+
file: path.join(downloadFolder, filename)
|
|
103
|
+
});
|
|
104
|
+
fs.unlinkSync(path.join(downloadFolder, filename));
|
|
105
|
+
}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import execa from "execa";
|
|
2
|
+
declare type Command = string | string[];
|
|
3
|
+
declare type PulumiArgs = {
|
|
4
|
+
[key: string]: string | boolean;
|
|
5
|
+
};
|
|
6
|
+
declare type ExecaArgs = {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
};
|
|
9
|
+
declare type Options = {
|
|
10
|
+
args?: PulumiArgs;
|
|
11
|
+
execa?: ExecaArgs;
|
|
12
|
+
beforePulumiInstall?: () => any;
|
|
13
|
+
afterPulumiInstall?: () => any;
|
|
14
|
+
pulumiFolder?: string;
|
|
15
|
+
};
|
|
16
|
+
declare type RunArgs = {
|
|
17
|
+
command: Command;
|
|
18
|
+
args?: PulumiArgs;
|
|
19
|
+
execa?: ExecaArgs;
|
|
20
|
+
beforePulumiInstall?: () => any;
|
|
21
|
+
afterPulumiInstall?: () => any;
|
|
22
|
+
};
|
|
23
|
+
declare type InstallArgs = {
|
|
24
|
+
beforePulumiInstall?: () => any;
|
|
25
|
+
afterPulumiInstall?: () => any;
|
|
26
|
+
};
|
|
27
|
+
export declare const FLAG_NON_INTERACTIVE = "--non-interactive";
|
|
28
|
+
export declare class Pulumi {
|
|
29
|
+
options: Options;
|
|
30
|
+
pulumiFolder: string;
|
|
31
|
+
pulumiDownloadFolder: string;
|
|
32
|
+
pulumiBinaryPath: string;
|
|
33
|
+
constructor(options?: Options);
|
|
34
|
+
run(rawArgs: RunArgs): execa.ExecaChildProcess<string>;
|
|
35
|
+
install(rawArgs?: InstallArgs): Promise<boolean>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
package/index.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.Pulumi = exports.FLAG_NON_INTERACTIVE = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _set2 = _interopRequireDefault(require("lodash/set"));
|
|
13
|
+
|
|
14
|
+
var _kebabCase2 = _interopRequireDefault(require("lodash/kebabCase"));
|
|
15
|
+
|
|
16
|
+
var _merge2 = _interopRequireDefault(require("lodash/merge"));
|
|
17
|
+
|
|
18
|
+
var _os = _interopRequireDefault(require("os"));
|
|
19
|
+
|
|
20
|
+
var _execa = _interopRequireDefault(require("execa"));
|
|
21
|
+
|
|
22
|
+
var path = _interopRequireWildcard(require("path"));
|
|
23
|
+
|
|
24
|
+
var _downloadBinaries = _interopRequireDefault(require("./downloadBinaries"));
|
|
25
|
+
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
|
|
28
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
29
|
+
|
|
30
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
31
|
+
|
|
32
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
33
|
+
|
|
34
|
+
const FLAG_NON_INTERACTIVE = "--non-interactive";
|
|
35
|
+
exports.FLAG_NON_INTERACTIVE = FLAG_NON_INTERACTIVE;
|
|
36
|
+
|
|
37
|
+
class Pulumi {
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
(0, _defineProperty2.default)(this, "options", void 0);
|
|
40
|
+
(0, _defineProperty2.default)(this, "pulumiFolder", void 0);
|
|
41
|
+
(0, _defineProperty2.default)(this, "pulumiDownloadFolder", void 0);
|
|
42
|
+
(0, _defineProperty2.default)(this, "pulumiBinaryPath", void 0);
|
|
43
|
+
this.options = options;
|
|
44
|
+
this.pulumiDownloadFolder = path.join(options.pulumiFolder || process.cwd(), "pulumi-cli", _os.default.platform());
|
|
45
|
+
this.pulumiFolder = path.join(this.pulumiDownloadFolder, "pulumi");
|
|
46
|
+
this.pulumiBinaryPath = path.join(this.pulumiFolder, "pulumi");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
run(rawArgs) {
|
|
50
|
+
const args = (0, _merge2.default)({}, this.options, rawArgs);
|
|
51
|
+
|
|
52
|
+
if (!Array.isArray(args.command)) {
|
|
53
|
+
args.command = [args.command];
|
|
54
|
+
} // 1. Prepare Pulumi args.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
const finalArgs = [];
|
|
58
|
+
|
|
59
|
+
for (const key in args.args) {
|
|
60
|
+
const value = args.args[key];
|
|
61
|
+
|
|
62
|
+
if (!value) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
for (let i = 0; i < value.length; i++) {
|
|
68
|
+
finalArgs.push(`--${(0, _kebabCase2.default)(key)}`, value[i]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (typeof value === "boolean") {
|
|
75
|
+
finalArgs.push(`--${(0, _kebabCase2.default)(key)}`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
finalArgs.push(`--${(0, _kebabCase2.default)(key)}`, value);
|
|
80
|
+
} // Prepare execa args.
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
(0, _set2.default)(args.execa, "env.PULUMI_SKIP_UPDATE_CHECK", "true");
|
|
84
|
+
(0, _set2.default)(args.execa, "env.PULUMI_HOME", this.pulumiFolder);
|
|
85
|
+
|
|
86
|
+
const execaArgs = _objectSpread(_objectSpread({}, args.execa), {}, {
|
|
87
|
+
env: _objectSpread(_objectSpread({}, args.execa.env || {}), {}, {
|
|
88
|
+
/**
|
|
89
|
+
* Due to an issue with Pulumi https://github.com/pulumi/pulumi/issues/8374, and even though this
|
|
90
|
+
* commit suggests it should already work like that https://github.com/pulumi/pulumi/commit/c878916901a997a9c0ffcbed23560e19e224a6f1,
|
|
91
|
+
* we need to specify the exact location of our Pulumi binaries, using the PATH environment variable, so it can correctly resolve
|
|
92
|
+
* plugins necessary for custom resources and dynamic providers to work.
|
|
93
|
+
*/
|
|
94
|
+
PATH: `${process.env.PATH};${this.pulumiFolder}`
|
|
95
|
+
})
|
|
96
|
+
}); // We want to keep the "interactive" output format of the Pulumi command when `--preview` flag is passed in.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
const flags = args.command && args.command.includes("preview") ? [] : [FLAG_NON_INTERACTIVE];
|
|
100
|
+
return (0, _execa.default)(this.pulumiBinaryPath, [...args.command, ...finalArgs, ...flags], execaArgs);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async install(rawArgs) {
|
|
104
|
+
const args = (0, _merge2.default)({}, this.options, rawArgs);
|
|
105
|
+
const installed = await (0, _downloadBinaries.default)(this.pulumiDownloadFolder, args.beforePulumiInstall, args.afterPulumiInstall);
|
|
106
|
+
|
|
107
|
+
if (installed) {
|
|
108
|
+
const {
|
|
109
|
+
version
|
|
110
|
+
} = require("@pulumi/aws/package.json");
|
|
111
|
+
|
|
112
|
+
await (0, _execa.default)(this.pulumiBinaryPath, ["plugin", "install", "resource", "aws", version], {
|
|
113
|
+
stdio: "inherit",
|
|
114
|
+
env: {
|
|
115
|
+
PULUMI_HOME: this.pulumiFolder,
|
|
116
|
+
PULUMI_SKIP_UPDATE_CHECK: "true"
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return installed;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
exports.Pulumi = Pulumi;
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/pulumi-sdk",
|
|
3
|
+
"version": "0.0.0-mt-1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/webiny/webiny-js.git"
|
|
8
|
+
},
|
|
9
|
+
"description": "A simple Node.js Pulumi SDK.",
|
|
10
|
+
"author": "Webiny Ltd",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"directory": "dist"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@pulumi/aws": "^4.10.0",
|
|
18
|
+
"@pulumi/pulumi": "< 3.18.0",
|
|
19
|
+
"decompress": "4.2.1",
|
|
20
|
+
"download": "5.0.3",
|
|
21
|
+
"execa": "4.1.0",
|
|
22
|
+
"lodash": "4.17.21",
|
|
23
|
+
"semver": "7.3.5",
|
|
24
|
+
"tar": "6.1.11"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@babel/cli": "^7.5.5",
|
|
28
|
+
"@babel/core": "^7.5.5",
|
|
29
|
+
"@types/node": "^10.0.0",
|
|
30
|
+
"@webiny/cli": "^0.0.0-mt-1",
|
|
31
|
+
"@webiny/project-utils": "^0.0.0-mt-1",
|
|
32
|
+
"rimraf": "^3.0.2",
|
|
33
|
+
"typescript": "^4.1.3"
|
|
34
|
+
},
|
|
35
|
+
"adio": {
|
|
36
|
+
"ignore": {
|
|
37
|
+
"dependencies": [
|
|
38
|
+
"@pulumi/pulumi",
|
|
39
|
+
"@pulumi/aws"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "yarn webiny run build",
|
|
45
|
+
"watch": "yarn webiny run watch"
|
|
46
|
+
},
|
|
47
|
+
"gitHead": "37736d8456a6ecb342a6c3645060bd9a3f2d4bb0"
|
|
48
|
+
}
|