diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d9c6bd3f256..d132eb423c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -351,8 +351,8 @@ jobs: env: PACKAGE_VERSION: ${{ needs.build.outputs.version }} run: | - PACKAGES=("winglang-sdk" "winglang-compiler" "wingconsole-design-system" "wingconsole-ui" "wingconsole-server" "wingconsole-app") - for PACKAGE in $PACKAGES; do + PACKAGES=("winglang-sdk" "winglang-compiler" "wingconsole-design-system" "wingconsole-ui" "wingconsole-server" "wingconsole-app" "winglang") + for PACKAGE in "${PACKAGES[@]}"; do npm publish "$PACKAGE-$PACKAGE_VERSION.tgz" --access public done diff --git a/apps/wing-console/console/ui/src/layout/default-layout.tsx b/apps/wing-console/console/ui/src/layout/default-layout.tsx index 2f497324248..44268ecd6f5 100644 --- a/apps/wing-console/console/ui/src/layout/default-layout.tsx +++ b/apps/wing-console/console/ui/src/layout/default-layout.tsx @@ -246,7 +246,12 @@ export const DefaultLayout = ({ "h-full flex flex-col select-none", theme.text2, showTerms && "blur-sm", +<<<<<<< HEAD "gap-1 pt-1", +======= + "gap-1", + layout?.panels?.rounded && "pt-1", +>>>>>>> main )} > {cloudAppState === "error" && diff --git a/apps/wing-console/console/ui/src/layout/layout-provider.tsx b/apps/wing-console/console/ui/src/layout/layout-provider.tsx index 2dea2f18b98..8af50a15386 100644 --- a/apps/wing-console/console/ui/src/layout/layout-provider.tsx +++ b/apps/wing-console/console/ui/src/layout/layout-provider.tsx @@ -39,6 +39,12 @@ export function LayoutProvider({ }, ], }, + statusBar: { + showThemeToggle: false, + }, + panels: { + rounded: false, + }, }; break; @@ -64,6 +70,9 @@ export function LayoutProvider({ statusBar: { hide: true, }, + panels: { + rounded: false, + }, }; break; } diff --git a/examples/tests/valid/struct_from_json.w b/examples/tests/valid/struct_from_json.w index d3db2b0b4a9..454b5ea9cdb 100644 --- a/examples/tests/valid/struct_from_json.w +++ b/examples/tests/valid/struct_from_json.w @@ -236,4 +236,16 @@ test "lifting a student" { assert(studentInflight1.dob.month == 10); assert(studentInflight1.dob.day == 10); assert(studentInflight1.dob.year == 2005); -} \ No newline at end of file +} + +// bring structs from other files +bring "./subdir/structs.w" as externalStructs; + +let jj1 = { + data: { + val: 10 + } +}; + +let externalBar = externalStructs.MyOtherStruct.fromJson(jj1); +assert(externalBar.data.val == 10); \ No newline at end of file diff --git a/examples/tests/valid/subdir/structs.w b/examples/tests/valid/subdir/structs.w new file mode 100644 index 00000000000..5307cdca1d0 --- /dev/null +++ b/examples/tests/valid/subdir/structs.w @@ -0,0 +1,7 @@ +struct MyStruct { + val: num; +} + +struct MyOtherStruct { + data: MyStruct; +} \ No newline at end of file diff --git a/libs/wingc/src/jsify.rs b/libs/wingc/src/jsify.rs index 98e95210db3..606d12246ab 100644 --- a/libs/wingc/src/jsify.rs +++ b/libs/wingc/src/jsify.rs @@ -540,8 +540,9 @@ impl<'a> JSifier<'a> { ExprKind::Reference(Reference::InstanceMember { object, .. }) => { self.jsify_expression(&object, ctx) }, - ExprKind::Reference(Reference::TypeMember { .. }) => { - expr_string.clone().split(".").next().unwrap_or("").to_string() + ExprKind::Reference(Reference::TypeMember { property, .. }) => { + // remove the property name from the expression string + expr_string.split(".").filter(|s| s != &property.name).join(".") }, _ => expr_string, } @@ -1571,8 +1572,9 @@ fn get_public_symbols(scope: &Scope) -> Vec { } // interfaces are bringable, but there's nothing to emit StmtKind::Interface(_) => {} - // structs are bringable, but there's nothing to emit - StmtKind::Struct { .. } => {} + StmtKind::Struct { name, .. } => { + symbols.push(name.clone()); + } StmtKind::Enum { name, .. } => { symbols.push(name.clone()); } diff --git a/libs/wingc/src/type_check.rs b/libs/wingc/src/type_check.rs index 85379962afc..175be9c83e7 100644 --- a/libs/wingc/src/type_check.rs +++ b/libs/wingc/src/type_check.rs @@ -4609,8 +4609,6 @@ impl<'a> TypeChecker<'a> { } } } - let lookup = env.lookup(&s.name, None); - let type_ = lookup.unwrap().as_type().unwrap(); let new_class = self.hydrate_class_type_arguments(env, WINGSDK_STRUCT, vec![type_]); let v = self.get_property_from_class_like(new_class.as_class().unwrap(), property, true); diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_local.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_local.w_compile_tf-aws.md index b5f20f9effe..8d26bdf7eba 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/bring_local.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_local.w_compile_tf-aws.md @@ -586,7 +586,7 @@ module.exports = function({ $stdlib }) { })({}) ; const Point = require("./Point.Struct.js")($stdlib.std.Struct, $stdlib.core.NodeJsCode.fromInline); - return { Util, Store, Color }; + return { Util, Store, Color, Point }; }; ``` 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 1b4f392312e..1d44834d3fc 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 @@ -227,6 +227,67 @@ module.exports = function(stdStruct, fromInline) { ``` +## MyOtherStruct.Struct.js +```js +module.exports = function(stdStruct, fromInline) { + class MyOtherStruct { + static jsonSchema() { + return { + id: "/MyOtherStruct", + type: "object", + properties: { + data: { "$ref": "#/$defs/MyStruct" }, + }, + required: [ + "data", + ], + $defs: { + "MyStruct": { type: "object", "properties": require("./MyStruct.Struct.js")().jsonSchema().properties }, + } + } + } + static fromJson(obj) { + return stdStruct._validate(obj, this.jsonSchema()) + } + static _toInflightType(context) { + return fromInline(`require("./MyOtherStruct.Struct.js")(${ context._lift(stdStruct) })`); + } + } + return MyOtherStruct; +}; + +``` + +## MyStruct.Struct.js +```js +module.exports = function(stdStruct, fromInline) { + class MyStruct { + static jsonSchema() { + return { + id: "/MyStruct", + type: "object", + properties: { + val: { type: "number" }, + }, + required: [ + "val", + ], + $defs: { + } + } + } + static fromJson(obj) { + return stdStruct._validate(obj, this.jsonSchema()) + } + static _toInflightType(context) { + return fromInline(`require("./MyStruct.Struct.js")(${ context._lift(stdStruct) })`); + } + } + return MyStruct; +}; + +``` + ## Person.Struct.js ```js module.exports = function(stdStruct, fromInline) { @@ -561,6 +622,7 @@ const $stdlib = require('@winglang/sdk'); const $outdir = process.env.WING_SYNTH_DIR ?? "."; const $wing_is_test = process.env.WING_IS_TEST === "true"; const std = $stdlib.std; +const externalStructs = require("./preflight.structs-1.js")({ $stdlib }); class $Root extends $stdlib.std.Resource { constructor(scope, id) { super(scope, id); @@ -731,6 +793,9 @@ class $Root extends $stdlib.std.Resource { } this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:flight school student :)",new $Closure1(this,"$Closure1")); this.node.root.new("@winglang/sdk.std.Test",std.Test,this,"test:lifting a student",new $Closure2(this,"$Closure2")); + const jj1 = ({"data": ({"val": 10})}); + const externalBar = (externalStructs.MyOtherStruct.fromJson(jj1)); + {((cond) => {if (!cond) throw new Error("assertion failed: externalBar.data.val == 10")})((((a,b) => { try { return require('assert').deepStrictEqual(a,b) === undefined; } catch { return false; } })(externalBar.data.val,10)))}; } } const $App = $stdlib.core.App.for(process.env.WING_TARGET); @@ -738,3 +803,14 @@ new $App({ outdir: $outdir, name: "struct_from_json", rootConstruct: $Root, plug ``` +## preflight.structs-1.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + const MyStruct = require("./MyStruct.Struct.js")($stdlib.std.Struct, $stdlib.core.NodeJsCode.fromInline); + const MyOtherStruct = require("./MyOtherStruct.Struct.js")($stdlib.std.Struct, $stdlib.core.NodeJsCode.fromInline); + return { MyStruct, MyOtherStruct }; +}; + +``` +