pulumi/sdk/nodejs
Justin Van Patten 3027d01f25
Enable output values by default (#8014)
* Enable output values by default

Enable output values by default in the resource monitor and change the polarity of the envvar from `PULUMI_ENABLE_OUTPUT_VALUES` to `PULUMI_DISABLE_OUTPUT_VALUES`.

* Marshal unknown as unknown string when `!KeepOutputValues`

Marshal all unknown output values as `resource.MakeComputed(resource.NewStringProperty(""))` when not keeping output values, which is consistent with what the SDKs do.

Otherwise, when `v.OutputValue().Element` is nil, `resource.MakeComputed(v.OutputValue().Element)` will be marshaled as a null value rather than as an unknown sentinel.

* Add MarshalOptions.DontSkipOutputs and use where needed

Before we expanded the meaning of `resource.Output`, `MarshalProperties` always skipped output values:

```go
if v.IsOutput() {
    logging.V(9).Infof("Skipping output property for RPC[%s]: %v", opts.Label, key)
}
```

As part of expanding the meaning of `resource.Output`, I'd adjusted `MarshalProperties` to only skip output values when the value was unknown and when not keeping output values:

```go
if v.IsOutput() && !v.OutputValue().Known && !opts.KeepOutputValues {
    logging.V(9).Infof("Skipping output property for RPC[%s]: %v", opts.Label, key)
}
```

However, this doesn't work the way we want when marshaling properties that include unknown output values to a provider that does not accept outputs. In that case, `opts.KeepOutputValues` will be `false` because we want the marshaler to fall back to returning non-output-values (e.g. unknown sentinel value for unknown output values), but instead of getting the intended fallback values, the unknown output values are skipped (not what we want).

I suspect we may be able to delete the output value skipping in `MarshalProperties` altogether (it's odd that it is skipping `resource.Output` but not `resource.Computed`), but to avoid any unintended side effects of doing that, instead, this commit introduces a new `MarshalOptions.DontSkipOutputs` option that can be set to `true` to opt-in to not skipping output values when marshaling. The check in `MarshalProperties` now looks like this:

```go
if !opts.DontSkipOutputs && v.IsOutput() && !v.OutputValue().Known {
    logging.V(9).Infof("Skipping output property for RPC[%s]: %v", opts.Label, key)
}
```

`opts.DontSkipOutputs` is set to `true` when marshaling properties for calls to a provider's `Construct` and `Call`.

* [sdk/nodejs] Deserialize output values

This commit adds support for deserializing output values, which is needed in some cases when serialized inputs are returned as outputs in the SDK.

* [sdk/python] Deserialize output values

This commit adds support for deserializing output values, which is needed in some cases when serialized inputs are returned as outputs in the SDK.
2021-09-24 08:57:04 -07:00
..
asset Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
automation Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
cmd Fix lint (#7915) 2021-09-07 16:41:17 -04:00
dist Fix typo in PP script 2019-08-06 17:35:52 -07:00
dynamic Enable nodejs dynamic provider caching by default on program side (#6704) 2021-04-14 19:32:18 +01:00
iterable Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
log Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
npm skip installing dev dependencies for nodejs plugin setup (#7188) 2021-06-02 11:09:03 -07:00
proto Add monitor feature for output values (#7870) 2021-09-15 14:16:00 -07:00
provider Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
queryable Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
runtime Enable output values by default (#8014) 2021-09-24 08:57:04 -07:00
tests Enable output values by default (#8014) 2021-09-24 08:57:04 -07:00
tests_with_mocks [sdk/{nodejs,python}] Fix errors when testing remote components with mocks (#8053) 2021-09-24 06:08:13 -07:00
.eslintrc.js Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
.gitignore Add a SxS test for @pulumi/pulumi to help catch when we make breaking changes to core types. (#2610) 2019-03-29 12:27:42 -07:00
config.ts Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
errors.ts Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
index.ts Removing x namespace from go/python/nodejs automation packages (#6518) 2021-04-14 19:32:18 +01:00
invoke.ts Breaking changes due to Feature 2.0 work 2020-04-14 09:30:25 +01:00
Makefile [automation-api] Exclude tests from test_fast. (#7986) 2021-09-16 17:33:33 -07:00
metadata.ts Enable unit testing for Pulumi programs (#2638) 2019-04-16 22:20:01 -07:00
output.ts Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
package.json Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
README.md Update README.md (#7088) 2021-05-21 10:46:56 -07:00
resource.ts Use ESlint instead of TSlint (#7719) 2021-08-10 11:31:59 -07:00
stackReference.ts Breaking changes due to Feature 2.0 work 2020-04-14 09:30:25 +01:00
tsconfig.json Ignore logflow args in Node providers (#7644) 2021-07-26 19:52:59 -04:00
tslint.json Fix issue with comments throwing off function/class serialization (#2438) 2019-02-08 14:58:24 -08:00
utils.ts Enable resource reference feature by default (#5905) 2020-12-10 11:21:05 -07:00
version.ts Add license headers 2018-05-22 15:02:47 -07:00

Pulumi Node.js SDK

The Pulumi Node.js SDK lets you write cloud programs in JavaScript.

Installation

Using npm:

$ npm install --save @pulumi/pulumi

Using yarn:

$ yarn add @pulumi/pulumi

This SDK is meant for use with the Pulumi CLI. Please visit pulumi.com for installation instructions.

Building and Testing

For anybody who wants to build from source, here is how you do it.

Prerequisites

This SDK uses Node.js and we support any of the Current, Active and Maintenance LTS versions. We support both NPM and Yarn for package management.

At the moment, we only support building on macOS and Linux, where standard GNU tools like make are available.

Make Targets

To build the SDK, simply run make from the root directory (where this README lives, at sdk/nodejs/ from the repo's root). This will build the code, run tests, and install the package and its supporting artifacts.

At the moment, for local development, we install everything into /opt/pulumi. You will want this on your $PATH.

The tests will verify that everything works, but feel free to try running pulumi preview and/or pulumi up from the examples/minimal/ directory. Remember to run tsc first, since pulumi expects JavaScript, not TypeScript.