diff --git a/docs/docs/04-standard-library/02-std/api-reference.md b/docs/docs/04-standard-library/02-std/api-reference.md
index 46aa7a6ed45..2b54032ac6f 100644
--- a/docs/docs/04-standard-library/02-std/api-reference.md
+++ b/docs/docs/04-standard-library/02-std/api-reference.md
@@ -687,7 +687,7 @@ Immutable Json.
| asBool
| Convert Json element to boolean if possible. |
| asNum
| Convert Json element to number if possible. |
| asStr
| Convert Json element to string if possible. |
-| get
| Returns a specified element from the Json. |
+| get
| Returns the value associated with the specified Json key. |
| getAt
| Returns a specified element at a given index from Json Array. |
| tryAsBool
| Convert Json element to boolean if possible. |
| tryAsNum
| Convert Json element to number if possible. |
@@ -727,13 +727,13 @@ Convert Json element to string if possible.
get(key: str): Json
```
-Returns a specified element from the Json.
+Returns the value associated with the specified Json key.
###### `key`Required
- *Type:* str
-The key of the element to return.
+The key of the Json property.
---
@@ -1348,7 +1348,7 @@ Mutable Json.
| asBool
| Convert Json element to boolean if possible. |
| asNum
| Convert Json element to number if possible. |
| asStr
| Convert Json element to string if possible. |
-| get
| Returns a specified element from the Json. |
+| get
| Returns the value associated with the specified Json key. |
| getAt
| Returns a specified element at a given index from MutJson Array. |
| set
| Adds or updates an element in MutJson with a specific key and value. |
| setAt
| Set element in MutJson Array with a specific key and value. |
@@ -1390,13 +1390,13 @@ Convert Json element to string if possible.
get(key: str): MutJson
```
-Returns a specified element from the Json.
+Returns the value associated with the specified Json key.
###### `key`Required
- *Type:* str
-The key of the element to return.
+The key of the Json property.
---
diff --git a/examples/tests/sdk_tests/std/json.w b/examples/tests/sdk_tests/std/json.w
index 22b4c99f6d0..6d57a24db06 100644
--- a/examples/tests/sdk_tests/std/json.w
+++ b/examples/tests/sdk_tests/std/json.w
@@ -3,34 +3,86 @@
//-----------------------------------------------------------------------------
bring cloud;
-// set() & get()
-let a = MutJson { a: 1 };
-let b = MutJson { b: 2 };
-a.set("c", b);
+test "get()" {
+ let assertThrows = (expected: str, block: (): void) => {
+ let var error = false;
+ try {
+ block();
+ } catch actual {
+ assert(actual == expected);
+ error = true;
+ }
+ assert(error);
+ };
-let c = a.get("c");
-assert(c.get("b") == 2);
+ let JSON_PROPERTY_DOES_NOT_EXIST_ERROR = "Json property \"c\" does not exist";
+ let obj = Json { a: 1, b: 2 };
+ let mutObj = MutJson { a: 1, b: 2 };
-test "set()" {
- let x = MutJson { a: 1 };
- x.set("b", 2);
- let y = x.get("b");
- assert(y == 2);
+ assert(obj.get("b") == 2);
+ assert(mutObj.get("b") == 2);
+
+ assertThrows(JSON_PROPERTY_DOES_NOT_EXIST_ERROR, () => {
+ obj.get("c");
+ });
+ assertThrows(JSON_PROPERTY_DOES_NOT_EXIST_ERROR, () => {
+ mutObj.get("c");
+ });
}
-//-----------------------------------------------------------------------------
-// setAt() & getAt()
-let d = MutJson { d: 3 };
-a.setAt(2, d);
-let e = a.getAt(2);
-assert(e.get("d") == 3);
+test "getAt()" {
+ let assertThrows = (expected: str, block: (): void) => {
+ let var error = false;
+ try {
+ block();
+ } catch actual {
+ assert(actual == expected);
+ error = true;
+ }
+ assert(error);
+ };
+
+ let INDEX_OUT_OF_BOUNDS_ERROR = "Index out of bounds";
+ let jsonArray = Json ["foo", "bar", "baz"];
+ let mutJsonArray = MutJson [1, 2, 3];
+
+ assert(jsonArray.getAt(2) == "baz");
+ assert(mutJsonArray.getAt(2) == 3);
+
+ assertThrows(INDEX_OUT_OF_BOUNDS_ERROR, () => {
+ jsonArray.getAt(3);
+ mutJsonArray.getAt(3);
+ });
+}
+
+test "set()" {
+ let mutObj = MutJson { x: 1, y: 2 };
+
+ mutObj.set("x", -1);
+ mutObj.set("z", 3);
+
+ assert(mutObj.get("x") == -1);
+ assert(mutObj.get("z") == 3);
+}
test "setAt()" {
- let x = MutJson { a: 1 };
- let a = MutJson { c: 3 };
- x.setAt(2, a);
- let d = x.getAt(2);
- assert(d.get("c") == 3);
+ let mutJsonArray = MutJson [1, 2, 3];
+
+ mutJsonArray.setAt(0, -1);
+ mutJsonArray.setAt(3, 3);
+
+ assert(mutJsonArray.getAt(0) == -1);
+ assert(mutJsonArray.getAt(3) == 3);
+}
+
+test "stringify()" {
+ let obj = Json { a: 1, b: 2 };
+
+ let stringified = Json.stringify(obj);
+ let stringifiedIndent = Json.stringify(obj, indent: 2);
+
+ assert(stringified == "{\"a\":1,\"b\":2}");
+ assert(stringifiedIndent == "{\n \"a\": 1,\n \"b\": 2\n}");
}
//-----------------------------------------------------------------------------
@@ -53,17 +105,4 @@ try {
log(error);
assert(error == "");
}
-*/
-
-//-----------------------------------------------------------------------------
-// stringify()
-
-test "stringify()" {
- let obj = Json { a: 1, b: 2 };
-
- let stringified = Json.stringify(obj);
- let stringifiedIndent = Json.stringify(obj, indent: 2);
-
- assert(stringified == "{\"a\":1,\"b\":2}");
- assert(stringifiedIndent == "{\n \"a\": 1,\n \"b\": 2\n}");
-}
\ No newline at end of file
+*/
\ No newline at end of file
diff --git a/libs/wingc/src/lsp/snapshots/completions/mut_json_methods.snap b/libs/wingc/src/lsp/snapshots/completions/mut_json_methods.snap
index dc937d632b8..9837555d6ce 100644
--- a/libs/wingc/src/lsp/snapshots/completions/mut_json_methods.snap
+++ b/libs/wingc/src/lsp/snapshots/completions/mut_json_methods.snap
@@ -30,7 +30,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(key: str): MutJson"
documentation:
kind: markdown
- value: "```wing\nget: (key: str): MutJson\n```\n---\nReturns a specified element from the Json.\n\n\n### Returns\nThe element associated with the specified key, or undefined if the key can't be found"
+ value: "```wing\nget: (key: str): MutJson\n```\n---\nReturns the value associated with the specified Json key.\n\n\n### Returns\nThe value associated with the specified Json key\n\n*@throws* *Json property does not exist if the given key is not part of an existing property*"
sortText: ff|get
insertText: get($0)
insertTextFormat: 2
@@ -42,7 +42,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(index: num): MutJson"
documentation:
kind: markdown
- value: "```wing\ngetAt: (index: num): MutJson\n```\n---\nReturns a specified element at a given index from MutJson Array.\n\n\n### Returns\nThe element at given index in MutJson Array, or undefined if index is not valid"
+ value: "```wing\ngetAt: (index: num): MutJson\n```\n---\nReturns a specified element at a given index from MutJson Array.\n\n\n### Returns\nThe element at given index in MutJson Array\n\n*@throws* *index out of bounds error if the given index does not exist for the MutJson Array*"
sortText: ff|getAt
insertText: getAt($0)
insertTextFormat: 2
diff --git a/libs/wingc/src/lsp/snapshots/completions/optional_chaining.snap b/libs/wingc/src/lsp/snapshots/completions/optional_chaining.snap
index 17401ea88a5..ecb1f8b952d 100644
--- a/libs/wingc/src/lsp/snapshots/completions/optional_chaining.snap
+++ b/libs/wingc/src/lsp/snapshots/completions/optional_chaining.snap
@@ -30,7 +30,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(key: str): Json"
documentation:
kind: markdown
- value: "```wing\nget: (key: str): Json\n```\n---\nReturns a specified element from the Json.\n\n\n### Returns\nThe element associated with the specified key, or undefined if the key can't be found"
+ value: "```wing\nget: (key: str): Json\n```\n---\nReturns the value associated with the specified Json key.\n\n\n### Returns\nThe value associated with the specified Json key\n\n*@throws* *Json property does not exist if the given key is not part of an existing property*"
sortText: ff|get
insertText: get($0)
insertTextFormat: 2
@@ -42,7 +42,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(index: num): Json"
documentation:
kind: markdown
- value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array, or undefined if index is not valid"
+ value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array\n\n*@throws* *index out of bounds error if the given index does not exist for the Json Array*"
sortText: ff|getAt
insertText: getAt($0)
insertTextFormat: 2
diff --git a/libs/wingc/src/lsp/snapshots/completions/optional_chaining_auto.snap b/libs/wingc/src/lsp/snapshots/completions/optional_chaining_auto.snap
index 1d86421459f..b346a58a3e7 100644
--- a/libs/wingc/src/lsp/snapshots/completions/optional_chaining_auto.snap
+++ b/libs/wingc/src/lsp/snapshots/completions/optional_chaining_auto.snap
@@ -57,7 +57,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(key: str): Json"
documentation:
kind: markdown
- value: "```wing\nget: (key: str): Json\n```\n---\nReturns a specified element from the Json.\n\n\n### Returns\nThe element associated with the specified key, or undefined if the key can't be found"
+ value: "```wing\nget: (key: str): Json\n```\n---\nReturns the value associated with the specified Json key.\n\n\n### Returns\nThe value associated with the specified Json key\n\n*@throws* *Json property does not exist if the given key is not part of an existing property*"
sortText: ff|get
insertText: get($0)
insertTextFormat: 2
@@ -78,7 +78,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(index: num): Json"
documentation:
kind: markdown
- value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array, or undefined if index is not valid"
+ value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array\n\n*@throws* *index out of bounds error if the given index does not exist for the Json Array*"
sortText: ff|getAt
insertText: getAt($0)
insertTextFormat: 2
diff --git a/libs/wingc/src/lsp/snapshots/completions/parentheses_expression.snap b/libs/wingc/src/lsp/snapshots/completions/parentheses_expression.snap
index 17401ea88a5..ecb1f8b952d 100644
--- a/libs/wingc/src/lsp/snapshots/completions/parentheses_expression.snap
+++ b/libs/wingc/src/lsp/snapshots/completions/parentheses_expression.snap
@@ -30,7 +30,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(key: str): Json"
documentation:
kind: markdown
- value: "```wing\nget: (key: str): Json\n```\n---\nReturns a specified element from the Json.\n\n\n### Returns\nThe element associated with the specified key, or undefined if the key can't be found"
+ value: "```wing\nget: (key: str): Json\n```\n---\nReturns the value associated with the specified Json key.\n\n\n### Returns\nThe value associated with the specified Json key\n\n*@throws* *Json property does not exist if the given key is not part of an existing property*"
sortText: ff|get
insertText: get($0)
insertTextFormat: 2
@@ -42,7 +42,7 @@ source: libs/wingc/src/lsp/completions.rs
detail: "(index: num): Json"
documentation:
kind: markdown
- value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array, or undefined if index is not valid"
+ value: "```wing\ngetAt: (index: num): Json\n```\n---\nReturns a specified element at a given index from Json Array.\n\n\n### Returns\nThe element at given index in Json Array\n\n*@throws* *index out of bounds error if the given index does not exist for the Json Array*"
sortText: ff|getAt
insertText: getAt($0)
insertTextFormat: 2
diff --git a/libs/wingc/src/lsp/snapshots/hovers/multipart_reference_hover_middle.snap b/libs/wingc/src/lsp/snapshots/hovers/multipart_reference_hover_middle.snap
index c37c3a0861d..3514adc9ac5 100644
--- a/libs/wingc/src/lsp/snapshots/hovers/multipart_reference_hover_middle.snap
+++ b/libs/wingc/src/lsp/snapshots/hovers/multipart_reference_hover_middle.snap
@@ -3,7 +3,7 @@ source: libs/wingc/src/lsp/hover.rs
---
contents:
kind: markdown
- value: "```wing\nget: (key: str): Json\n```\n---\nReturns a specified element from the Json.\n\n\n### Returns\nThe element associated with the specified key, or undefined if the key can't be found"
+ value: "```wing\nget: (key: str): Json\n```\n---\nReturns the value associated with the specified Json key.\n\n\n### Returns\nThe value associated with the specified Json key\n\n*@throws* *Json property does not exist if the given key is not part of an existing property*"
range:
start:
line: 2
diff --git a/libs/wingsdk/src/std/json.ts b/libs/wingsdk/src/std/json.ts
index 6d39d704df8..0ae6496fbbd 100644
--- a/libs/wingsdk/src/std/json.ts
+++ b/libs/wingsdk/src/std/json.ts
@@ -146,12 +146,13 @@ export class Json {
private constructor() {}
/**
- * Returns a specified element from the Json.
+ * Returns the value associated with the specified Json key
*
- * @macro ($self$)[$args$]
+ * @macro ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })($self$, $args$)
*
- * @param key The key of the element to return
- * @returns The element associated with the specified key, or undefined if the key can't be found
+ * @param key The key of the Json property
+ * @returns The value associated with the specified Json key
+ * @throws Json property does not exist if the given key is not part of an existing property
*/
public get(key: string): Json {
key;
@@ -161,10 +162,11 @@ export class Json {
/**
* Returns a specified element at a given index from Json Array
*
- * @macro ($self$)[$args$]
+ * @macro ((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })($self$, $args$)
*
* @param index The index of the element in the Json Array to return
- * @returns The element at given index in Json Array, or undefined if index is not valid
+ * @returns The element at given index in Json Array
+ * @throws index out of bounds error if the given index does not exist for the Json Array
*/
public getAt(index: number): Json {
index;
@@ -278,12 +280,13 @@ export class MutJson {
private constructor() {}
/**
- * Returns a specified element from the Json.
+ * Returns the value associated with the specified Json key
*
- * @macro ($self$)[$args$]
+ * @macro ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })($self$, $args$)
*
- * @param key The key of the element to return
- * @returns The element associated with the specified key, or undefined if the key can't be found
+ * @param key The key of the Json property
+ * @returns The value associated with the specified Json key
+ * @throws Json property does not exist if the given key is not part of an existing property
*/
public get(key: string): MutJson {
key;
@@ -293,10 +296,11 @@ export class MutJson {
/**
* Returns a specified element at a given index from MutJson Array
*
- * @macro ($self$)[$args$]
+ * @macro ((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })($self$, $args$)
*
* @param index The index of the element in the MutJson Array to return
- * @returns The element at given index in MutJson Array, or undefined if index is not valid
+ * @returns The element at given index in MutJson Array
+ * @throws index out of bounds error if the given index does not exist for the MutJson Array
*/
public getAt(index: number): MutJson {
index;
diff --git a/tools/hangar/__snapshots__/error.ts.snap b/tools/hangar/__snapshots__/error.ts.snap
index 9c56a21c136..080e3627f22 100644
--- a/tools/hangar/__snapshots__/error.ts.snap
+++ b/tools/hangar/__snapshots__/error.ts.snap
@@ -6,7 +6,7 @@ exports[`bool_from_json.w 1`] = `
../../../examples/tests/error/target/test/bool_from_json.wsim.[REDACTED].tmp/.wing/preflight.js:9
super(scope, id);
const j = ({\\"a\\": 123});
->> const a = (std.Boolean.fromJson((j)[\\"a\\"]));
+>> const a = (std.Boolean.fromJson(((obj, args) => { if (obj[args] === undefined) throw new Error(\`Json property \\"\${args}\\" does not exist\`); return obj[args] })(j, \\"a\\")));
}
}
@@ -40,7 +40,7 @@ exports[`number_from_json.w 1`] = `
../../../examples/tests/error/target/test/number_from_json.wsim.[REDACTED].tmp/.wing/preflight.js:9
super(scope, id);
const j = ({\\"a\\": \\"apples\\"});
->> const a = ((args) => { if (typeof args !== \\"number\\") {throw new Error(\\"unable to parse \\" + typeof args + \\" \\" + args + \\" as a number\\")}; return JSON.parse(JSON.stringify(args)) })((j)[\\"a\\"]);
+>> const a = ((args) => { if (typeof args !== \\"number\\") {throw new Error(\\"unable to parse \\" + typeof args + \\" \\" + args + \\" as a number\\")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(\`Json property \\"\${args}\\" does not exist\`); return obj[args] })(j, \\"a\\"));
}
}
@@ -103,7 +103,7 @@ exports[`string_from_json.w 1`] = `
../../../examples/tests/error/target/test/string_from_json.wsim.[REDACTED].tmp/.wing/preflight.js:9
super(scope, id);
const j = ({\\"a\\": 123});
->> const a = ((args) => { if (typeof args !== \\"string\\") {throw new Error(\\"unable to parse \\" + typeof args + \\" \\" + args + \\" as a string\\")}; return JSON.parse(JSON.stringify(args)) })((j)[\\"a\\"]);
+>> const a = ((args) => { if (typeof args !== \\"string\\") {throw new Error(\\"unable to parse \\" + typeof args + \\" \\" + args + \\" as a string\\")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(\`Json property \\"\${args}\\" does not exist\`); return obj[args] })(j, \\"a\\"));
}
}
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/api/path_vars.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/api/path_vars.w_compile_tf-aws.md
index 2867d4f3bf5..9ca1e985925 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/api/path_vars.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/api/path_vars.w_compile_tf-aws.md
@@ -49,7 +49,7 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
const username = "tsuf";
const res = (await $http_Util.get(String.raw({ raw: ["", "/users/", ""] }, $api_url, username)));
{((cond) => {if (!cond) throw new Error("assertion failed: res.status == 200")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(res.status,200)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["user"],username)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "user"),username)))};
}
}
return $Closure3;
@@ -70,7 +70,7 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
const username = "akhil";
const res = (await $http_Util.get(String.raw({ raw: ["", "/path/", ""] }, $api_url, username)));
{((cond) => {if (!cond) throw new Error("assertion failed: res.status == 200")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(res.status,200)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["user"],username)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "user"),username)))};
}
}
return $Closure4;
@@ -91,7 +91,7 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
const username = "akhil";
const res = (await $http_Util.get(String.raw({ raw: ["", "/users/permission/", ""] }, $api_url, username)));
{((cond) => {if (!cond) throw new Error("assertion failed: res.status == 200")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(res.status,200)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["user"],username)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "user"),username)))};
}
}
return $Closure5;
@@ -113,8 +113,8 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
const age = "23";
const res = (await $http_Util.get(String.raw({ raw: ["", "/path/", "/", ""] }, $api_url, username, age)));
{((cond) => {if (!cond) throw new Error("assertion failed: res.status == 200")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(res.status,200)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["user"],username)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"age\") == age")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["age"],age)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "user"),username)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"age\") == age")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "age"),age)))};
}
}
return $Closure6;
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.w_compile_tf-aws.md
index 1bf3af84751..a112394970e 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.w_compile_tf-aws.md
@@ -166,7 +166,7 @@ module.exports = function({ $table }) {
return async () => {
let count = 0;
for (const u of (await $table.list())) {
- if ((((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((u)["key"],opts.key)) && (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((u)["operation"],opts.type))) && (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((u)["source"],String.raw({ raw: ["", ""] }, opts.source))))) {
+ if ((((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(u, "key"),opts.key)) && (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(u, "operation"),opts.type))) && (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(u, "source"),String.raw({ raw: ["", ""] }, opts.source))))) {
count = (count + 1);
}
}
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.w_compile_tf-aws.md
index 89ca5b98c13..9348600b7cd 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.w_compile_tf-aws.md
@@ -16,12 +16,12 @@ module.exports = function({ $b }) {
(await $b.putJson("test2.txt",jsonObj2));
const testJson1 = (await $b.getJson("test1.txt"));
const testJson2 = (await $b.getJson("test2.txt"));
- {((cond) => {if (!cond) throw new Error("assertion failed: testJson1.get(\"test\") == jsonObj1.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((testJson1)["test"],(jsonObj1)["test"])))};
- {((cond) => {if (!cond) throw new Error("assertion failed: testJson2.get(\"test\") == jsonObj2.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((testJson2)["test"],(jsonObj2)["test"])))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: testJson1.get(\"test\") == jsonObj1.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(testJson1, "test"),((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonObj1, "test"))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: testJson2.get(\"test\") == jsonObj2.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(testJson2, "test"),((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonObj2, "test"))))};
const jsonObj3 = ({"test": "test3"});
(await $b.putJson("test3.txt",jsonObj3));
const testJson3 = (await $b.getJson("test3.txt"));
- {((cond) => {if (!cond) throw new Error("assertion failed: testJson3.get(\"test\") == jsonObj3.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((testJson3)["test"],(jsonObj3)["test"])))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: testJson3.get(\"test\") == jsonObj3.get(\"test\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(testJson3, "test"),((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonObj3, "test"))))};
(await $b.delete("test1.txt"));
const files = (await $b.list());
{((cond) => {if (!cond) throw new Error("assertion failed: files.contains(\"test1.txt\") == false")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(files.includes("test1.txt"),false)))};
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_compile_tf-aws.md
index 737f96fa22e..ecf6c4202a4 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_compile_tf-aws.md
@@ -10,10 +10,32 @@ module.exports = function({ }) {
return $obj;
}
async handle() {
- const x = ({"a": 1});
- ((obj, args) => { obj[args[0]] = args[1]; })(x, ["b",2]);
- const y = (x)["b"];
- {((cond) => {if (!cond) throw new Error("assertion failed: y == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(y,2)))};
+ const assertThrows = async (expected, block) => {
+ let error = false;
+ try {
+ (await block());
+ }
+ catch ($error_actual) {
+ const actual = $error_actual.message;
+ {((cond) => {if (!cond) throw new Error("assertion failed: actual == expected")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(actual,expected)))};
+ error = true;
+ }
+ {((cond) => {if (!cond) throw new Error("assertion failed: error")})(error)};
+ }
+ ;
+ const JSON_PROPERTY_DOES_NOT_EXIST_ERROR = "Json property \"c\" does not exist";
+ const obj = ({"a": 1,"b": 2});
+ const mutObj = ({"a": 1,"b": 2});
+ {((cond) => {if (!cond) throw new Error("assertion failed: obj.get(\"b\") == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "b"),2)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutObj.get(\"b\") == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(mutObj, "b"),2)))};
+ (await assertThrows(JSON_PROPERTY_DOES_NOT_EXIST_ERROR,async () => {
+ ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "c");
+ }
+ ));
+ (await assertThrows(JSON_PROPERTY_DOES_NOT_EXIST_ERROR,async () => {
+ ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(mutObj, "c");
+ }
+ ));
}
}
return $Closure1;
@@ -31,11 +53,29 @@ module.exports = function({ }) {
return $obj;
}
async handle() {
- const x = ({"a": 1});
- const a = ({"c": 3});
- ((obj, args) => { obj[args[0]] = args[1]; })(x, [2,a]);
- const d = (x)[2];
- {((cond) => {if (!cond) throw new Error("assertion failed: d.get(\"c\") == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((d)["c"],3)))};
+ const assertThrows = async (expected, block) => {
+ let error = false;
+ try {
+ (await block());
+ }
+ catch ($error_actual) {
+ const actual = $error_actual.message;
+ {((cond) => {if (!cond) throw new Error("assertion failed: actual == expected")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(actual,expected)))};
+ error = true;
+ }
+ {((cond) => {if (!cond) throw new Error("assertion failed: error")})(error)};
+ }
+ ;
+ const INDEX_OUT_OF_BOUNDS_ERROR = "Index out of bounds";
+ const jsonArray = ["foo", "bar", "baz"];
+ const mutJsonArray = [1, 2, 3];
+ {((cond) => {if (!cond) throw new Error("assertion failed: jsonArray.getAt(2) == \"baz\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(jsonArray, 2),"baz")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutJsonArray.getAt(2) == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(mutJsonArray, 2),3)))};
+ (await assertThrows(INDEX_OUT_OF_BOUNDS_ERROR,async () => {
+ ((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(jsonArray, 3);
+ ((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(mutJsonArray, 3);
+ }
+ ));
}
}
return $Closure2;
@@ -45,8 +85,52 @@ module.exports = function({ }) {
## inflight.$Closure3-1.js
```js
-module.exports = function({ $std_Json }) {
+module.exports = function({ }) {
class $Closure3 {
+ constructor({ }) {
+ const $obj = (...args) => this.handle(...args);
+ Object.setPrototypeOf($obj, this);
+ return $obj;
+ }
+ async handle() {
+ const mutObj = ({"x": 1,"y": 2});
+ ((obj, args) => { obj[args[0]] = args[1]; })(mutObj, ["x",(-1)]);
+ ((obj, args) => { obj[args[0]] = args[1]; })(mutObj, ["z",3]);
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutObj.get(\"x\") == -1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(mutObj, "x"),(-1))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutObj.get(\"z\") == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(mutObj, "z"),3)))};
+ }
+ }
+ return $Closure3;
+}
+
+```
+
+## inflight.$Closure4-1.js
+```js
+module.exports = function({ }) {
+ class $Closure4 {
+ constructor({ }) {
+ const $obj = (...args) => this.handle(...args);
+ Object.setPrototypeOf($obj, this);
+ return $obj;
+ }
+ async handle() {
+ const mutJsonArray = [1, 2, 3];
+ ((obj, args) => { obj[args[0]] = args[1]; })(mutJsonArray, [0,(-1)]);
+ ((obj, args) => { obj[args[0]] = args[1]; })(mutJsonArray, [3,3]);
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutJsonArray.getAt(0) == -1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(mutJsonArray, 0),(-1))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: mutJsonArray.getAt(3) == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(mutJsonArray, 3),3)))};
+ }
+ }
+ return $Closure4;
+}
+
+```
+
+## inflight.$Closure5-1.js
+```js
+module.exports = function({ $std_Json }) {
+ class $Closure5 {
constructor({ }) {
const $obj = (...args) => this.handle(...args);
Object.setPrototypeOf($obj, this);
@@ -60,7 +144,7 @@ module.exports = function({ $std_Json }) {
{((cond) => {if (!cond) throw new Error("assertion failed: stringifiedIndent == \"{\\n \\\"a\\\": 1,\\n \\\"b\\\": 2\\n}\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(stringifiedIndent,"{\n \"a\": 1,\n \"b\": 2\n}")))};
}
}
- return $Closure3;
+ return $Closure5;
}
```
@@ -86,7 +170,7 @@ module.exports = function({ $std_Json }) {
},
"output": {
"WING_TEST_RUNNER_FUNCTION_ARNS": {
- "value": "[[\"root/Default/Default/test:set()\",\"${aws_lambda_function.testset_Handler_ADDF1A01.arn}\"],[\"root/Default/Default/test:setAt()\",\"${aws_lambda_function.testsetAt_Handler_51015029.arn}\"],[\"root/Default/Default/test:stringify()\",\"${aws_lambda_function.teststringify_Handler_2E93A8A7.arn}\"]]"
+ "value": "[[\"root/Default/Default/test:get()\",\"${aws_lambda_function.testget_Handler_A37EBFC3.arn}\"],[\"root/Default/Default/test:getAt()\",\"${aws_lambda_function.testgetAt_Handler_44D7BE7A.arn}\"],[\"root/Default/Default/test:set()\",\"${aws_lambda_function.testset_Handler_ADDF1A01.arn}\"],[\"root/Default/Default/test:setAt()\",\"${aws_lambda_function.testsetAt_Handler_51015029.arn}\"],[\"root/Default/Default/test:stringify()\",\"${aws_lambda_function.teststringify_Handler_2E93A8A7.arn}\"]]"
}
},
"provider": {
@@ -96,6 +180,24 @@ module.exports = function({ $std_Json }) {
},
"resource": {
"aws_iam_role": {
+ "testgetAt_Handler_IamRole_915EA920": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:getAt()/Handler/IamRole",
+ "uniqueId": "testgetAt_Handler_IamRole_915EA920"
+ }
+ },
+ "assume_role_policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\"}]}"
+ },
+ "testget_Handler_IamRole_7FCA766F": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:get()/Handler/IamRole",
+ "uniqueId": "testget_Handler_IamRole_7FCA766F"
+ }
+ },
+ "assume_role_policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\"}]}"
+ },
"testsetAt_Handler_IamRole_C36C780A": {
"//": {
"metadata": {
@@ -125,6 +227,26 @@ module.exports = function({ $std_Json }) {
}
},
"aws_iam_role_policy": {
+ "testgetAt_Handler_IamRolePolicy_0F6A0772": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:getAt()/Handler/IamRolePolicy",
+ "uniqueId": "testgetAt_Handler_IamRolePolicy_0F6A0772"
+ }
+ },
+ "policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"none:null\",\"Resource\":\"*\"}]}",
+ "role": "${aws_iam_role.testgetAt_Handler_IamRole_915EA920.name}"
+ },
+ "testget_Handler_IamRolePolicy_B215A072": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:get()/Handler/IamRolePolicy",
+ "uniqueId": "testget_Handler_IamRolePolicy_B215A072"
+ }
+ },
+ "policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"none:null\",\"Resource\":\"*\"}]}",
+ "role": "${aws_iam_role.testget_Handler_IamRole_7FCA766F.name}"
+ },
"testsetAt_Handler_IamRolePolicy_24EE9CC0": {
"//": {
"metadata": {
@@ -157,6 +279,26 @@ module.exports = function({ $std_Json }) {
}
},
"aws_iam_role_policy_attachment": {
+ "testgetAt_Handler_IamRolePolicyAttachment_4D020DB9": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:getAt()/Handler/IamRolePolicyAttachment",
+ "uniqueId": "testgetAt_Handler_IamRolePolicyAttachment_4D020DB9"
+ }
+ },
+ "policy_arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+ "role": "${aws_iam_role.testgetAt_Handler_IamRole_915EA920.name}"
+ },
+ "testget_Handler_IamRolePolicyAttachment_63E5FC9C": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:get()/Handler/IamRolePolicyAttachment",
+ "uniqueId": "testget_Handler_IamRolePolicyAttachment_63E5FC9C"
+ }
+ },
+ "policy_arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+ "role": "${aws_iam_role.testget_Handler_IamRole_7FCA766F.name}"
+ },
"testsetAt_Handler_IamRolePolicyAttachment_764BF14B": {
"//": {
"metadata": {
@@ -189,6 +331,64 @@ module.exports = function({ $std_Json }) {
}
},
"aws_lambda_function": {
+ "testgetAt_Handler_44D7BE7A": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:getAt()/Handler/Default",
+ "uniqueId": "testgetAt_Handler_44D7BE7A"
+ }
+ },
+ "architectures": [
+ "arm64"
+ ],
+ "environment": {
+ "variables": {
+ "WING_FUNCTION_NAME": "Handler-c8b9b051",
+ "WING_TARGET": "tf-aws"
+ }
+ },
+ "function_name": "Handler-c8b9b051",
+ "handler": "index.handler",
+ "publish": true,
+ "role": "${aws_iam_role.testgetAt_Handler_IamRole_915EA920.arn}",
+ "runtime": "nodejs18.x",
+ "s3_bucket": "${aws_s3_bucket.Code.bucket}",
+ "s3_key": "${aws_s3_object.testgetAt_Handler_S3Object_AE45FDF0.key}",
+ "timeout": 30,
+ "vpc_config": {
+ "security_group_ids": [],
+ "subnet_ids": []
+ }
+ },
+ "testget_Handler_A37EBFC3": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:get()/Handler/Default",
+ "uniqueId": "testget_Handler_A37EBFC3"
+ }
+ },
+ "architectures": [
+ "arm64"
+ ],
+ "environment": {
+ "variables": {
+ "WING_FUNCTION_NAME": "Handler-c8b799d4",
+ "WING_TARGET": "tf-aws"
+ }
+ },
+ "function_name": "Handler-c8b799d4",
+ "handler": "index.handler",
+ "publish": true,
+ "role": "${aws_iam_role.testget_Handler_IamRole_7FCA766F.arn}",
+ "runtime": "nodejs18.x",
+ "s3_bucket": "${aws_s3_bucket.Code.bucket}",
+ "s3_key": "${aws_s3_object.testget_Handler_S3Object_27E25F7F.key}",
+ "timeout": 30,
+ "vpc_config": {
+ "security_group_ids": [],
+ "subnet_ids": []
+ }
+ },
"testsetAt_Handler_51015029": {
"//": {
"metadata": {
@@ -289,6 +489,28 @@ module.exports = function({ $std_Json }) {
}
},
"aws_s3_object": {
+ "testgetAt_Handler_S3Object_AE45FDF0": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:getAt()/Handler/S3Object",
+ "uniqueId": "testgetAt_Handler_S3Object_AE45FDF0"
+ }
+ },
+ "bucket": "${aws_s3_bucket.Code.bucket}",
+ "key": "",
+ "source": ""
+ },
+ "testget_Handler_S3Object_27E25F7F": {
+ "//": {
+ "metadata": {
+ "path": "root/Default/Default/test:get()/Handler/S3Object",
+ "uniqueId": "testget_Handler_S3Object_27E25F7F"
+ }
+ },
+ "bucket": "${aws_s3_bucket.Code.bucket}",
+ "key": "",
+ "source": ""
+ },
"testsetAt_Handler_S3Object_FE28177A": {
"//": {
"metadata": {
@@ -398,7 +620,6 @@ class $Root extends $stdlib.std.Resource {
static _toInflightType(context) {
return `
require("./inflight.$Closure3-1.js")({
- $std_Json: ${context._lift(std.Json)},
})
`;
}
@@ -417,21 +638,67 @@ class $Root extends $stdlib.std.Resource {
return ["handle", "$inflight_init"];
}
}
- const a = ({"a": 1});
- const b = ({"b": 2});
- ((obj, args) => { obj[args[0]] = args[1]; })(a, ["c",b]);
- const c = (a)["c"];
- {((cond) => {if (!cond) throw new Error("assertion failed: c.get(\"b\") == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((c)["b"],2)))};
- this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:set()",new $Closure1(this,"$Closure1"));
- const d = ({"d": 3});
- ((obj, args) => { obj[args[0]] = args[1]; })(a, [2,d]);
- const e = (a)[2];
- {((cond) => {if (!cond) throw new Error("assertion failed: e.get(\"d\") == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((e)["d"],3)))};
- this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:setAt()",new $Closure2(this,"$Closure2"));
+ class $Closure4 extends $stdlib.std.Resource {
+ constructor(scope, id, ) {
+ super(scope, id);
+ (std.Node.of(this)).hidden = true;
+ }
+ static _toInflightType(context) {
+ return `
+ require("./inflight.$Closure4-1.js")({
+ })
+ `;
+ }
+ _toInflight() {
+ return `
+ (await (async () => {
+ const $Closure4Client = ${$Closure4._toInflightType(this)};
+ const client = new $Closure4Client({
+ });
+ if (client.$inflight_init) { await client.$inflight_init(); }
+ return client;
+ })())
+ `;
+ }
+ _getInflightOps() {
+ return ["handle", "$inflight_init"];
+ }
+ }
+ class $Closure5 extends $stdlib.std.Resource {
+ constructor(scope, id, ) {
+ super(scope, id);
+ (std.Node.of(this)).hidden = true;
+ }
+ static _toInflightType(context) {
+ return `
+ require("./inflight.$Closure5-1.js")({
+ $std_Json: ${context._lift(std.Json)},
+ })
+ `;
+ }
+ _toInflight() {
+ return `
+ (await (async () => {
+ const $Closure5Client = ${$Closure5._toInflightType(this)};
+ const client = new $Closure5Client({
+ });
+ if (client.$inflight_init) { await client.$inflight_init(); }
+ return client;
+ })())
+ `;
+ }
+ _getInflightOps() {
+ return ["handle", "$inflight_init"];
+ }
+ }
+ this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:get()",new $Closure1(this,"$Closure1"));
+ this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:getAt()",new $Closure2(this,"$Closure2"));
+ this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:set()",new $Closure3(this,"$Closure3"));
+ this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:setAt()",new $Closure4(this,"$Closure4"));
+ this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:stringify()",new $Closure5(this,"$Closure5"));
{((cond) => {if (!cond) throw new Error("assertion failed: Json.tryParse(nil) == nil")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { try { return (args === undefined) ? undefined : JSON.parse(args); } catch (err) { return undefined; } })(undefined),undefined)))};
{((cond) => {if (!cond) throw new Error("assertion failed: Json.tryParse(\"boom\") == nil")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { try { return (args === undefined) ? undefined : JSON.parse(args); } catch (err) { return undefined; } })("boom"),undefined)))};
{((cond) => {if (!cond) throw new Error("assertion failed: Json.tryParse(\"\") == nil")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { try { return (args === undefined) ? undefined : JSON.parse(args); } catch (err) { return undefined; } })(""),undefined)))};
- this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:stringify()",new $Closure3(this,"$Closure3"));
}
}
const $App = $stdlib.core.App.for(process.env.WING_TARGET);
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_test_sim.md
index 81f62e88c02..9f8b8b3e1df 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_test_sim.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/json.w_test_sim.md
@@ -2,12 +2,14 @@
## stdout.log
```log
-pass ─ json.wsim » root/env0/test:set()
-pass ─ json.wsim » root/env1/test:setAt()
-pass ─ json.wsim » root/env2/test:stringify()
+pass ─ json.wsim » root/env0/test:get()
+pass ─ json.wsim » root/env1/test:getAt()
+pass ─ json.wsim » root/env2/test:set()
+pass ─ json.wsim » root/env3/test:setAt()
+pass ─ json.wsim » root/env4/test:stringify()
-Tests 3 passed (3)
+Tests 5 passed (5)
Test Files 1 passed (1)
Duration
```
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/add_row.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/add_row.w_compile_tf-aws.md
index c4037389b26..6fe9a46a22d 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/add_row.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/add_row.w_compile_tf-aws.md
@@ -2,7 +2,7 @@
## inflight.$Closure1-1.js
```js
-module.exports = function({ $_marioInfo___gender__, $_marioInfo___role__, $_peachInfo___gender__, $_peachInfo___role__, $table }) {
+module.exports = function({ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___gender__, $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___role__, $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___gender__, $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___role__, $table }) {
class $Closure1 {
constructor({ }) {
const $obj = (...args) => this.handle(...args);
@@ -10,12 +10,12 @@ module.exports = function({ $_marioInfo___gender__, $_marioInfo___role__, $_peac
return $obj;
}
async handle() {
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"name\") == \"mario\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("mario")))["name"],"mario")))};
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"role\") == marioInfo.get(\"role\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("mario")))["role"],$_marioInfo___role__)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"gender\") == marioInfo.get(\"gender\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("mario")))["gender"],$_marioInfo___gender__)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"name\") == \"peach\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("peach")))["name"],"peach")))};
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"role\") == peachInfo.get(\"role\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("peach")))["role"],$_peachInfo___role__)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"gender\") == peachInfo.get(\"gender\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((await $table.get("peach")))["gender"],$_peachInfo___gender__)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"name\") == \"mario\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("mario")), "name"),"mario")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"role\") == marioInfo.get(\"role\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("mario")), "role"),$__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___role__)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"mario\").get(\"gender\") == marioInfo.get(\"gender\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("mario")), "gender"),$__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___gender__)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"name\") == \"peach\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("peach")), "name"),"peach")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"role\") == peachInfo.get(\"role\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("peach")), "role"),$__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___role__)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: table.get(\"peach\").get(\"gender\") == peachInfo.get(\"gender\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((await $table.get("peach")), "gender"),$__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___gender__)))};
}
}
return $Closure1;
@@ -213,10 +213,10 @@ class $Root extends $stdlib.std.Resource {
static _toInflightType(context) {
return `
require("./inflight.$Closure1-1.js")({
- $_marioInfo___gender__: ${context._lift((marioInfo)["gender"])},
- $_marioInfo___role__: ${context._lift((marioInfo)["role"])},
- $_peachInfo___gender__: ${context._lift((peachInfo)["gender"])},
- $_peachInfo___role__: ${context._lift((peachInfo)["role"])},
+ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___gender__: ${context._lift(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(marioInfo, "gender"))},
+ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____marioInfo___role__: ${context._lift(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(marioInfo, "role"))},
+ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___gender__: ${context._lift(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(peachInfo, "gender"))},
+ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____peachInfo___role__: ${context._lift(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(peachInfo, "role"))},
$table: ${context._lift(table)},
})
`;
@@ -237,10 +237,10 @@ class $Root extends $stdlib.std.Resource {
}
_registerBind(host, ops) {
if (ops.includes("handle")) {
- $Closure1._registerBindObject((marioInfo)["gender"], host, []);
- $Closure1._registerBindObject((marioInfo)["role"], host, []);
- $Closure1._registerBindObject((peachInfo)["gender"], host, []);
- $Closure1._registerBindObject((peachInfo)["role"], host, []);
+ $Closure1._registerBindObject(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(marioInfo, "gender"), host, []);
+ $Closure1._registerBindObject(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(marioInfo, "role"), host, []);
+ $Closure1._registerBindObject(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(peachInfo, "gender"), host, []);
+ $Closure1._registerBindObject(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(peachInfo, "role"), host, []);
$Closure1._registerBindObject(table, host, ["get"]);
}
super._registerBind(host, ops);
diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/list.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/list.w_compile_tf-aws.md
index 0403086b49d..a4b3f46825d 100644
--- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/list.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/table/list.w_compile_tf-aws.md
@@ -14,14 +14,14 @@ module.exports = function({ $std_String, $table }) {
(await $table.insert("revital",({"gender": "female"})));
const unorderded = ({});
for (const u of (await $table.list())) {
- ((obj, args) => { obj[args[0]] = args[1]; })(unorderded, [((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((u)["name"]),u]);
+ ((obj, args) => { obj[args[0]] = args[1]; })(unorderded, [((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(u, "name")),u]);
}
- const revital = (unorderded)["revital"];
- const eyal = (unorderded)["eyal"];
- {((cond) => {if (!cond) throw new Error("assertion failed: \"eyal\" == str.fromJson(eyal.get(\"name\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("eyal",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((eyal)["name"]))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: \"male\" == str.fromJson(eyal.get(\"gender\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("male",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((eyal)["gender"]))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: \"revital\" == str.fromJson(revital.get(\"name\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("revital",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((revital)["name"]))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: \"female\" == str.fromJson(revital.get(\"gender\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("female",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((revital)["gender"]))))};
+ const revital = ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(unorderded, "revital");
+ const eyal = ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(unorderded, "eyal");
+ {((cond) => {if (!cond) throw new Error("assertion failed: \"eyal\" == str.fromJson(eyal.get(\"name\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("eyal",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(eyal, "name")))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: \"male\" == str.fromJson(eyal.get(\"gender\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("male",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(eyal, "gender")))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: \"revital\" == str.fromJson(revital.get(\"name\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("revital",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(revital, "name")))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: \"female\" == str.fromJson(revital.get(\"gender\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })("female",((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(revital, "gender")))))};
}
}
return $Closure1;
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/api_path_vars.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/api_path_vars.w_compile_tf-aws.md
index c32ae02d8e9..0da60ef7550 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/api_path_vars.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/api_path_vars.w_compile_tf-aws.md
@@ -49,7 +49,7 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
const username = "tsuf";
const res = (await $http_Util.get(String.raw({ raw: ["", "/users/", ""] }, $api_url, username)));
{((cond) => {if (!cond) throw new Error("assertion failed: res.status == 200")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(res.status,200)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((JSON.parse((res.body ?? ""))))["user"],username)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: Json.parse(res.body ?? \"\").get(\"user\") == username")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })((JSON.parse((res.body ?? ""))), "user"),username)))};
}
}
return $Closure3;
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/capture_containers.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/capture_containers.w_compile_tf-aws.md
index bd1c6dfc691..18393a10947 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/capture_containers.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/capture_containers.w_compile_tf-aws.md
@@ -2,7 +2,7 @@
## inflight.$Closure1-1.js
```js
-module.exports = function({ $Object_keys_myMap__length, $__bang__in___arrOfMap_at_0____, $__world__in__myMap__, $_arr_at_0__, $_arr_at_1__, $_j___b__, $_mySet_has__my___, $arr_length, $mySet_size }) {
+module.exports = function({ $Object_keys_myMap__length, $__bang__in___arrOfMap_at_0____, $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____j___b__, $__world__in__myMap__, $_arr_at_0__, $_arr_at_1__, $_mySet_has__my___, $arr_length, $mySet_size }) {
class $Closure1 {
constructor({ }) {
const $obj = (...args) => this.handle(...args);
@@ -18,7 +18,7 @@ module.exports = function({ $Object_keys_myMap__length, $__bang__in___arrOfMap_a
{((cond) => {if (!cond) throw new Error("assertion failed: myMap.has(\"world\")")})($__world__in__myMap__)};
{((cond) => {if (!cond) throw new Error("assertion failed: myMap.size() == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })($Object_keys_myMap__length,2)))};
{((cond) => {if (!cond) throw new Error("assertion failed: arrOfMap.at(0).has(\"bang\")")})($__bang__in___arrOfMap_at_0____)};
- {((cond) => {if (!cond) throw new Error("assertion failed: j.get(\"b\") == \"world\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })($_j___b__,"world")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: j.get(\"b\") == \"world\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })($__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____j___b__,"world")))};
}
}
return $Closure1;
@@ -171,10 +171,10 @@ class $Root extends $stdlib.std.Resource {
require("./inflight.$Closure1-1.js")({
$Object_keys_myMap__length: ${context._lift(Object.keys(myMap).length)},
$__bang__in___arrOfMap_at_0____: ${context._lift(("bang" in ((arrOfMap.at(0)))))},
+ $__obj__args_______if__obj_args______undefined__throw_new_Error__Json_property____args___does_not_exist____return_obj_args_____j___b__: ${context._lift(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(j, "b"))},
$__world__in__myMap__: ${context._lift(("world" in (myMap)))},
$_arr_at_0__: ${context._lift((arr.at(0)))},
$_arr_at_1__: ${context._lift((arr.at(1)))},
- $_j___b__: ${context._lift((j)["b"])},
$_mySet_has__my___: ${context._lift((mySet.has("my")))},
$arr_length: ${context._lift(arr.length)},
$mySet_size: ${context._lift(mySet.size)},
@@ -199,9 +199,9 @@ class $Root extends $stdlib.std.Resource {
if (ops.includes("handle")) {
$Closure1._registerBindObject(("bang" in ((arrOfMap.at(0)))), host, []);
$Closure1._registerBindObject(("world" in (myMap)), host, []);
+ $Closure1._registerBindObject(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(j, "b"), host, []);
$Closure1._registerBindObject((arr.at(0)), host, []);
$Closure1._registerBindObject((arr.at(1)), host, []);
- $Closure1._registerBindObject((j)["b"], host, []);
$Closure1._registerBindObject((mySet.has("my")), host, []);
$Closure1._registerBindObject(Object.keys(myMap).length, host, []);
$Closure1._registerBindObject(arr.length, host, []);
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/issue_2889.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/issue_2889.w_compile_tf-aws.md
index 5811c8e0916..1941063f61e 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/issue_2889.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/issue_2889.w_compile_tf-aws.md
@@ -31,8 +31,8 @@ module.exports = function({ $api_url, $http_Util, $std_Json }) {
async handle() {
const res = (await $http_Util.get(($api_url + "/foo")));
const body = (JSON.parse((res.body ?? "")));
- const a1 = (body)[0];
- {((cond) => {if (!cond) throw new Error("assertion failed: a1.get(\"foo\") == \"bar\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((a1)["foo"],"bar")))};
+ const a1 = ((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(body, 0);
+ {((cond) => {if (!cond) throw new Error("assertion failed: a1.get(\"foo\") == \"bar\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(a1, "foo"),"bar")))};
}
}
return $Closure2;
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json.w_compile_tf-aws.md
index 067b8800741..5feb4c357b1 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/json.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/json.w_compile_tf-aws.md
@@ -312,7 +312,7 @@ class $Root extends $stdlib.std.Resource {
const jsonMutObj = ({"hello": 123,"world": [1, "cat", 3],"boom boom": ({"hello": 1233})});
const message = "Coolness";
((obj, args) => { obj[args[0]] = args[1]; })(jsonMutObj, ["hello",message]);
- {((cond) => {if (!cond) throw new Error("assertion failed: jsonMutObj.get(\"hello\") == message")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((jsonMutObj)["hello"],message)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: jsonMutObj.get(\"hello\") == message")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonMutObj, "hello"),message)))};
const someNumber = 999;
const jj = someNumber;
const jj1 = ({"foo": someNumber});
@@ -326,34 +326,34 @@ class $Root extends $stdlib.std.Resource {
const jj4 = f.SumStr;
{((cond) => {if (!cond) throw new Error("assertion failed: jj4 == Json \"wow!\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(jj4,"wow!")))};
const someJson = ({"x": someNumber});
- {((cond) => {if (!cond) throw new Error("assertion failed: someJson.get(\"x\") == someNumber")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((someJson)["x"],someNumber)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: someJson.get(\"x\") == someNumber")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(someJson, "x"),someNumber)))};
((obj, args) => { obj[args[0]] = args[1]; })(someJson, ["x",111]);
- {((cond) => {if (!cond) throw new Error("assertion failed: someJson.get(\"x\") == 111")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((someJson)["x"],111)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: someJson.get(\"x\") == 111")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(someJson, "x"),111)))};
const x = ({"cool": "beans"});
const nestedJson = ({"a": "hello","b": ({"c": "world","d": ({"foo": "foo","bar": 123})})});
- ((obj, args) => { obj[args[0]] = args[1]; })(((nestedJson)["b"])["d"], ["foo","tastic"]);
- {((cond) => {if (!cond) throw new Error("assertion failed: nestedJson.get(\"b\").get(\"d\").get(\"foo\") == \"tastic\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((((nestedJson)["b"])["d"])["foo"],"tastic")))};
- {((cond) => {if (!cond) throw new Error("assertion failed: nestedJson.get(\"b\").get(\"d\").get(\"bar\") == 123")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((((nestedJson)["b"])["d"])["bar"],123)))};
+ ((obj, args) => { obj[args[0]] = args[1]; })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(nestedJson, "b"), "d"), ["foo","tastic"]);
+ {((cond) => {if (!cond) throw new Error("assertion failed: nestedJson.get(\"b\").get(\"d\").get(\"foo\") == \"tastic\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(nestedJson, "b"), "d"), "foo"),"tastic")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: nestedJson.get(\"b\").get(\"d\").get(\"bar\") == 123")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(nestedJson, "b"), "d"), "bar"),123)))};
const b = "buckle";
const arr = [1, 2, b, "my", "shoe", 3, 4, ["shut", "the", "door"]];
- {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(0) == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((arr)[0],1)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(2) == b")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((arr)[2],b)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(7).getAt(0) == \"shut\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((arr)[7])[0],"shut")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(0) == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(arr, 0),1)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(2) == b")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(arr, 2),b)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: arr.getAt(7).getAt(0) == \"shut\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(arr, 7), 0),"shut")))};
({"a": [1, 2, "world"],"b": [1, 2, "world"]});
const emptyJson = ({});
const emptyJsonArr = [];
const emptyMutJson = ({});
const emptyMutJsonArr = [];
((obj, args) => { obj[args[0]] = args[1]; })(emptyMutJson, ["cool",({"a": 1,"b": 2})]);
- ((obj, args) => { obj[args[0]] = args[1]; })((emptyMutJson)["cool"], ["a",3]);
+ ((obj, args) => { obj[args[0]] = args[1]; })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(emptyMutJson, "cool"), ["a",3]);
((obj, args) => { obj[args[0]] = args[1]; })(emptyMutJsonArr, [0,({"a": 1,"b": 2})]);
- ((obj, args) => { obj[args[0]] = args[1]; })((emptyMutJsonArr)[0], ["a",3]);
+ ((obj, args) => { obj[args[0]] = args[1]; })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(emptyMutJsonArr, 0), ["a",3]);
const theTowerOfJson = ({"a": ({}),"b": ({"c": ({}),"d": [[[({})]]]}),"e": ({"f": ({"g": ({}),"h": [({}), []]})})});
- ((obj, args) => { obj[args[0]] = args[1]; })(((((theTowerOfJson)["e"])["f"])["h"])[0], ["a",1]);
- const thatSuperNestedValue = (((((theTowerOfJson)["e"])["f"])["h"])[0])["a"];
+ ((obj, args) => { obj[args[0]] = args[1]; })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(theTowerOfJson, "e"), "f"), "h"), 0), ["a",1]);
+ const thatSuperNestedValue = ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(theTowerOfJson, "e"), "f"), "h"), 0), "a");
{((cond) => {if (!cond) throw new Error("assertion failed: num.fromJson(thatSuperNestedValue) == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { if (typeof args !== "number") {throw new Error("unable to parse " + typeof args + " " + args + " as a number")}; return JSON.parse(JSON.stringify(args)) })(thatSuperNestedValue),1)))};
const unestedJsonArr = [1, 2, 3];
- {((cond) => {if (!cond) throw new Error("assertion failed: unestedJsonArr.getAt(0) == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((unestedJsonArr)[0],1)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: unestedJsonArr.getAt(0) == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(unestedJsonArr, 0),1)))};
const jsonElements = ({"strings": ({"single": "Hello","array": ["Hello", "World", "!"]}),"numbers": ({"one": 1,"two": 2,"three": 3}),"bools": ({"t": true,"f": false})});
{
const $if_let_value = ((arg) => { if (typeof arg !== "string") {throw new Error("unable to parse " + typeof arg + " " + arg + " as a string")}; return JSON.parse(JSON.stringify(arg)) })(((jsonElements)?.["strings"])?.["single"]);
@@ -419,7 +419,7 @@ class $Root extends $stdlib.std.Resource {
}
}
const notSpecified = ({"foo": "bar"});
- {((cond) => {if (!cond) throw new Error("assertion failed: notSpecified.get(\"foo\") == \"bar\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((notSpecified)["foo"],"bar")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: notSpecified.get(\"foo\") == \"bar\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(notSpecified, "foo"),"bar")))};
const empty = ({});
{((cond) => {if (!cond) throw new Error("assertion failed: Json.has(empty, \"something\") == false")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { return args[0].hasOwnProperty(args[1]); })([empty,"something"]),false)))};
const Base = require("./Base.Struct.js")($stdlib.std.Struct);
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.w_compile_tf-aws.md
index 6e8f7fde046..e8811603a2e 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.w_compile_tf-aws.md
@@ -11,7 +11,7 @@ module.exports = function({ $b, $fileName }) {
}
async handle(msg) {
const x = (await $b.getJson($fileName));
- {((cond) => {if (!cond) throw new Error("assertion failed: x.get(\"persons\").getAt(0).get(\"fears\").getAt(1) == \"failure\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((((x)["persons"])[0])["fears"])[1],"failure")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: x.get(\"persons\").getAt(0).get(\"fears\").getAt(1) == \"failure\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error("Index out of bounds"); return obj[args] })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(x, "persons"), 0), "fears"), 1),"failure")))};
}
}
return $Closure1;
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json_static.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json_static.w_compile_tf-aws.md
index 45c705c680c..16ff988fae8 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/json_static.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/json_static.w_compile_tf-aws.md
@@ -311,7 +311,7 @@ class $Root extends $stdlib.std.Resource {
{((cond) => {if (!cond) throw new Error("assertion failed: v.at(0) == 123")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((v.at(0)),123)))};
const m = (JSON.parse(JSON.stringify(x)));
((obj, args) => { obj[args[0]] = args[1]; })(m, ["a",321]);
- {((cond) => {if (!cond) throw new Error("assertion failed: m.get(\"a\") == 321")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((m)["a"],321)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: m.get(\"a\") == 321")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(m, "a"),321)))};
const n = JSON.parse(JSON.stringify(m));
{((cond) => {if (!cond) throw new Error("assertion failed: m == n")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(m,n)))};
let k2 = (Object.keys(m));
@@ -324,16 +324,16 @@ class $Root extends $stdlib.std.Resource {
{((cond) => {if (!cond) throw new Error("assertion failed: Json.keys(j).length == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((Object.keys(j)).length,2)))};
const invalidJson = "invalid";
const tryParsed = (((args) => { try { return (args === undefined) ? undefined : JSON.parse(args); } catch (err) { return undefined; } })(invalidJson) ?? ({"key": "value"}));
- {((cond) => {if (!cond) throw new Error("assertion failed: tryParsed.get(\"key\") == \"value\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((tryParsed)["key"],"value")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: tryParsed.get(\"key\") == \"value\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(tryParsed, "key"),"value")))};
const jj = ({"a": 123,"b": ({"c": 456,"d": 789})});
const ss = ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([jj]);
{((cond) => {if (!cond) throw new Error("assertion failed: ss == \"{\\\"a\\\":123,\\\"b\\\":{\\\"c\\\":456,\\\"d\\\":789}}\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(ss,"{\"a\":123,\"b\":{\"c\":456,\"d\":789}}")))};
const ss2 = ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([jj,{ indent: 2 }]);
{((cond) => {if (!cond) throw new Error("assertion failed: ss2 == \"{\\n \\\"a\\\": 123,\\n \\\"b\\\": {\\n \\\"c\\\": 456,\\n \\\"d\\\": 789\\n }\\n}\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(ss2,"{\n \"a\": 123,\n \"b\": {\n \"c\": 456,\n \"d\": 789\n }\n}")))};
const jsonOfMany = ({"a": 123,"b": "hello","c": true});
- {((cond) => {if (!cond) throw new Error("assertion failed: str.fromJson(jsonOfMany.get(\"b\")) == \"hello\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })((jsonOfMany)["b"]),"hello")))};
- {((cond) => {if (!cond) throw new Error("assertion failed: num.fromJson(jsonOfMany.get(\"a\")) == 123")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { if (typeof args !== "number") {throw new Error("unable to parse " + typeof args + " " + args + " as a number")}; return JSON.parse(JSON.stringify(args)) })((jsonOfMany)["a"]),123)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: bool.fromJson(jsonOfMany.get(\"c\"))")})((std.Boolean.fromJson((jsonOfMany)["c"])))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: str.fromJson(jsonOfMany.get(\"b\")) == \"hello\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { if (typeof args !== "string") {throw new Error("unable to parse " + typeof args + " " + args + " as a string")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonOfMany, "b")),"hello")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: num.fromJson(jsonOfMany.get(\"a\")) == 123")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((args) => { if (typeof args !== "number") {throw new Error("unable to parse " + typeof args + " " + args + " as a number")}; return JSON.parse(JSON.stringify(args)) })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonOfMany, "a")),123)))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: bool.fromJson(jsonOfMany.get(\"c\"))")})((std.Boolean.fromJson(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(jsonOfMany, "c"))))};
this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:Access Json static inflight",new $Closure1(this,"$Closure1"));
this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:has key or not",new $Closure2(this,"$Closure2"));
}
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json_string_interpolation.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json_string_interpolation.w_compile_tf-aws.md
index 6fad7e1558f..5ea7edd0f11 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/json_string_interpolation.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/json_string_interpolation.w_compile_tf-aws.md
@@ -43,14 +43,14 @@ class $Root extends $stdlib.std.Resource {
constructor(scope, id) {
super(scope, id);
const obj = ({"strValue": "test","numValue": 1});
- const notStringifyStrValue = String.raw({ raw: ["string: ", ""] }, JSON.stringify((obj)["strValue"]));
+ const notStringifyStrValue = String.raw({ raw: ["string: ", ""] }, JSON.stringify(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue")));
{((cond) => {if (!cond) throw new Error("assertion failed: notStringifyStrValue == \"string: \\\"test\\\"\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(notStringifyStrValue,"string: \"test\"")))};
- const stringifyNumValue = String.raw({ raw: ["number: ", ""] }, JSON.stringify((obj)["numValue"]));
+ const stringifyNumValue = String.raw({ raw: ["number: ", ""] }, JSON.stringify(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "numValue")));
{((cond) => {if (!cond) throw new Error("assertion failed: stringifyNumValue == \"number: 1\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(stringifyNumValue,"number: 1")))};
{((cond) => {if (!cond) throw new Error("assertion failed: \"${obj}\" == Json.stringify(obj)")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(String.raw({ raw: ["", ""] }, JSON.stringify(obj)),((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([obj]))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: \"${obj.get(\"strValue\")}\" == Json.stringify(obj.get(\"strValue\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(String.raw({ raw: ["", ""] }, JSON.stringify((obj)["strValue"])),((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([(obj)["strValue"]]))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: obj.get(\"strValue\") == Json.parse(Json.stringify(obj.get(\"strValue\")))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((obj)["strValue"],(JSON.parse(((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([(obj)["strValue"]]))))))};
- {((cond) => {if (!cond) throw new Error("assertion failed: obj.get(\"strValue\") == Json.parse(\"${obj.get(\"strValue\")}\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((obj)["strValue"],(JSON.parse(String.raw({ raw: ["", ""] }, JSON.stringify((obj)["strValue"])))))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: \"${obj.get(\"strValue\")}\" == Json.stringify(obj.get(\"strValue\"))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(String.raw({ raw: ["", ""] }, JSON.stringify(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue"))),((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue")]))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: obj.get(\"strValue\") == Json.parse(Json.stringify(obj.get(\"strValue\")))")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue"),(JSON.parse(((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue")]))))))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: obj.get(\"strValue\") == Json.parse(\"${obj.get(\"strValue\")}\")")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue"),(JSON.parse(String.raw({ raw: ["", ""] }, JSON.stringify(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(obj, "strValue"))))))))};
}
}
const $App = $stdlib.core.App.for(process.env.WING_TARGET);
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/std_containers.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/std_containers.w_compile_tf-aws.md
index bc4a1e77a6b..c44d1b1d8cb 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/std_containers.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/std_containers.w_compile_tf-aws.md
@@ -196,7 +196,7 @@ class $Root extends $stdlib.std.Resource {
{((cond) => {if (!cond) throw new Error("assertion failed: sMap.get(\"one\") == 1")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((sMap)["one"],1)))};
{((cond) => {if (!cond) throw new Error("assertion failed: sMap.size() == 2")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(Object.keys(sMap).length,2)))};
{((cond) => {if (!cond) throw new Error("assertion failed: immutMap.size() == 3")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(Object.keys(immutMap).length,3)))};
- {((cond) => {if (!cond) throw new Error("assertion failed: nestedMap.get(\"a\").get(\"b\").get(\"c\") == \"hello\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((((nestedMap)["a"])["b"])["c"],"hello")))};
+ {((cond) => {if (!cond) throw new Error("assertion failed: nestedMap.get(\"a\").get(\"b\").get(\"c\") == \"hello\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(((nestedMap)["a"])["b"], "c"),"hello")))};
const heterogeneousArray = [new Cat(this,"C1"), new Dog(this,"D1")];
const heterogeneousDoubleArray = [[new Cat(this,"C2")], [new Cat(this,"C3"), new Dog(this,"D2")], [new Animal(this,"A1")]];
const heterogeneousSet = new Set([new Cat(this,"C4"), new Dog(this,"D3")]);
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.w_compile_tf-aws.md
index 1e71508334b..e000a2c409d 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.w_compile_tf-aws.md
@@ -768,7 +768,7 @@ class $Root extends $stdlib.std.Resource {
const $if_let_value = student3.additionalData;
if ($if_let_value != undefined) {
const additionalData = $if_let_value;
- const notes = (additionalData)["notes"];
+ const notes = ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(additionalData, "notes");
{((cond) => {if (!cond) throw new Error("assertion failed: notes == \"wow such notes\"")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(notes,"wow such notes")))};
}
else {
diff --git a/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.w_compile_tf-aws.md
index 451cb823a60..0db07378045 100644
--- a/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.w_compile_tf-aws.md
+++ b/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.w_compile_tf-aws.md
@@ -29,11 +29,11 @@ module.exports = function({ $std_Json, $usersTable }) {
}
async handle(req) {
const body = (JSON.parse((req.body ?? ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([({"name": "","age": "","id": ""})]))));
- if ((((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((body)["name"],"")) || (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((body)["age"],""))) || (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })((body)["id"],"")))) {
+ if ((((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(body, "name"),"")) || (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(body, "age"),""))) || (((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(body, "id"),"")))) {
return ({"body": ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([({"error": "incomplete details"})]),"status": 400});
}
- (await $usersTable.insert(((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([(body)["id"]]),body));
- return ({"body": ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([({"user": (body)["id"]})]),"status": 201});
+ (await $usersTable.insert(((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(body, "id")]),body));
+ return ({"body": ((args) => { return JSON.stringify(args[0], null, args[1]?.indent) })([({"user": ((obj, args) => { if (obj[args] === undefined) throw new Error(`Json property "${args}" does not exist`); return obj[args] })(body, "id")})]),"status": 201});
}
}
return $Closure2;