Inflight Magazine no. 6
The 6th issue of the Wing Inflight Magazine.
Hey folks!
We are back with another issue of the Wing Inflight Magazine and excited to share some updates about the Winglang project.
An open source programming language for the cloud
Winglang is an open-source programming language for the cloud. It combines infrastructure and runtime into a single programming model, making it easy for any developer to build serverless cloud-native applications without having to become a DevOps expert.
Winglang code compiles to Terraform + JavaScript and can be deployed on AWS, GCP and Azure (see support matrix).
Winglang is designed to be a familiar and friendly language to learn for developers who come from modern object-oriented background, so it will take you 5 minutes to learn.
Check out our getting started tutorial or hit the Wing Playground for an online experience.
In today's issue
- 🚀 New: Introducing custom platforms
- 🚀 New: Singletons, the Wing way
- 🔥 String interpolation syntax is getting a face lift
- 🔥 Constructors are now called
new()
instead ofinit()
- 🔥
http.fetch()
responsebody
is not optional anymore - 🚀 New: Down-casting from
cloud.*
toaws.*
- 🚀 New: Sourcemaps and Stacktraces
- 📅 Upcoming Events
- 🎥 The Wingly Update
Introducing custom platforms
An integral part of Wing's power comes from the use of platform providers. Platform providers are libraries which specify how and where your application is deployed. They determine both the cloud environment (e.g. AWS, GCP, Azure) and the provisioning engine (e.g. Terraform, CloudFormation) that the application will be deployed with.
Today, Wing is shipped with the following built-in platforms:
sim
- runs your entire app on a single machine. Used for development with the Wing Console or for unit tests withwing test
.tf-aws
,tf-azure
,tf-gcp
- deployes your app to AWS, Azure or GCP using Terraform.awscdk
- deploys your app to AWS using the AWS CDK (CloudFormation).
Platform providers can also hook into the compliation process to perform any type of "bellow the abstraction" customization during preflight, either on the construct nodes or directly on the output Terraform our CloudFormation.
Built-in platforms look the same as our previously supported targets:
wing compile -t tf-aws
wing compile --platform tf-aws
Platform providers can also be composed together:
wing compile --platform tf-aws --platform tf-aws-soc2
Check out our documentation about platforms for more details.
❤️ Hasan Abu-Rayan ❤️
Singletons, the Wing way
There are situations where it makes sense for a certain resource to have only a single
instance within a Wing application.
To facilitate that, we are now making it easy to access the root node of the app through Node.of(this).root
. Then, with tryFindChild()
you can get to singleton nirvana:
A common use cases for singletons in Wing is to add a Terraform provider only once. Other examples could be a shared resource such as a VPC that other resources across the app can use.
Check this out:
class SingletonBucket {
pub static of(scope: std.IResource): cloud.Bucket {
let uid = "SingletonBucket";
let root = std.Node.of(scope).root;
let rootNode = std.Node.of(root);
return unsafeCast(rootNode.tryFindChild(uid)) ?? new cloud.Bucket() as uid in root;
}
}
let q1 = new cloud.Queue() as "q1";
let store1 = SingletonBucket.of(q1);
test "singleton" {
store1.put("hello", "world");
}
❤️ Elad Ben-Israel ❤️
String interpolation syntax is getting a face lift
We decided to change the syntax of string interpolations from ${foo}
to {foo}
. It's a stylistic choice which also offers better ergonomics in the IDE (you can just select a portion of the string and click {
to get that portion interpolated).
Unsurprisingly, this change stirred a major emotional response in our team, and we would love to hear what people think about it.
let s1 = "hello";
// Before
let s2 = "${s1}, world";
// After
let s3 = "{s1}, world";
❤️ Yoav Steinberg ❤️
Constructors are now called new()
instead of init()
Another stylistic choice (this one with much less pushback) was to change the name of class constructors to new()
instead of init()
:
class Nice {
isNice: bool;
new() {
this.isNice = true;
}
}
❤️ Elad Ben-Israel ❤️
http.fetch()
response body
is not optional anymore
To streamline the interaction with HTTP responses, we've changed the body
field of HttpResponse
(returned from http.fetch()
, http.get()
, etc)
to return a non-optional str
instead of str?
. If there is no body, the body
will an empty string (""
).
This means that, for example, you can simply call Json.parse(response.body)
or Struct.parseJson(response.body)
and move on with your life.
bring http;
test "wingly" {
let response = http.get("https://someapi.org");
let jsonBody = Json.parse(response.body);
// 💝
}
❤️ Chris Rybicki ❤️
Down-casting from cloud.*
to aws.*
Winglang now supports a way to cast down an abstract cloud.Bucket
or any Wing Cloud Library resource into its AWS counterpart.
This makes it easy to access AWS-specific attributes (such as ARNs) given a cloud
resoufce.
For example, let's say we want to obtain the ARN of an S3 Bucket:
bring cloud;
bring aws;
let bucket = new cloud.Bucket();
if let b = aws.Bucket.from(bucket) {
let bucketArn = b.bucketArn;
}
Notice that
aws.Bucket.from()
returns an optional (str?
), which will benil
in case the casting failed. This makes it easy to write code that's conditional on the target platform.
❤️ Marcio Cruz ❤️
Sourcemaps and Stacktraces
We've added source maps to the generated JavaScript output. These are used, for example, to show .w
files in stack traces emitted in errors.
As an example, the except.equal()
call fails (because 5 != 8) and the stack trace ion the error only showed the compiled JavaScript code, now you'll see the .w
files:
bring expect;
let x = 2;
let y = 3;
expect.equal(x + y, 8);
Here's how this looks now:
❤️ Mark McCulloh ❤️
Upcoming Events
🔥 Workshop: Wing + Amazon Bedrock = ❤️ - January 3rd @4:30 - 6pm IST Get your hands dirty Eyal Keren as we build together an application that allows you to load any PDF file and ask questions about it using one of Amazon Bedrock's generative AI models. Reserve your spot.
The Wingly Update
The Wingly Update is our weird biweekly stream where we share the latest developments of the project, chat with folks from the cloud industry, geek out and celebrate the beauty of the cloud.
If you haven't been able to catch our show, you can find the complete stack of all our episodes here.
Here are a few segments from the previous shows we thought might be interesting to check out:
- Ron Record shares war stories from the early days of open source: In this clip from The Wingly Update #23, Elad and Eyal host Ron who has been involved in open-source for the last 30 years! Ron shows us how he added Wing support to Kasm Workspaces, a container streaming platform that runs in your browser.
- Ben Kehoe talks about serverless, serviceful and everything in between: Elad and Eyal are diving deep with Ben, who have been one of the most prolific thought leaders in the serverless world about his previous role at iRobot, his journey to educate developers about "serviceful" systems and his upcoming challenge at Siemens.
- Looking to get your hands dirty with some open-source?: Revital and Eyal walk through some of the Wing's
good first issues
, which are an excellent starting point for contributors who with to take their first steps to contributing to the Wing project.
Community Meetings
If you are looking to interact more directly with the Wing team, we are hosting a bunch of reccuring meetings. Feel free to pop in any time and hang out with us:
Winglang Community Meeting is our bi-weekly gathering where members of our community showcase cool apps, demos, and other projects! The upcoming session is scheduled for Tuesday, December 19th, at 2:30 PM UTC. We look forward to seeing you there!
Monday Office Hours is our bi-weekly opportunity for you to share your feedback, thoughts, concerns, or simply drop by to say hi.
You can find details for all our events in the Wingnuts calendar! We'd love to see you at one or all of them :)
Summary
That's it for this edition!
If you're not already, stay updated on the latest changes in our repo.
You'll find us regularly on Discord, so feel free to say hello! Give winglang.io a visit and take Wing out for a spin.
Catch you in the next update!