Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9b0666e
render TS as proxy class in user namespace
ArcadeMode Dec 14, 2025
dffd03c
fix tests
ArcadeMode Dec 14, 2025
78b74ba
use proxy in sample
ArcadeMode Dec 14, 2025
6bd7927
setup code + better message on error
ArcadeMode Dec 14, 2025
9419bdc
use symbolextractor in tests
ArcadeMode Dec 14, 2025
6967437
render snapshot functions and types on TS side
ArcadeMode Dec 14, 2025
1481ba5
WIP jsobject automapping on c# side
ArcadeMode Dec 14, 2025
464ed43
jsobj single overload and jsobject automapping primitives
ArcadeMode Dec 15, 2025
d611da7
reconsidered the overload approach
ArcadeMode Dec 17, 2025
ebf04c8
factoring overloads
ArcadeMode Dec 17, 2025
afc1612
ts proxy/snapshot overload resolution
ArcadeMode Dec 17, 2025
ecd8689
instanceofable snapshots
ArcadeMode Dec 17, 2025
a5b4f2d
typeof for values
ArcadeMode Dec 17, 2025
5a9ebae
render overloads on interop definition
ArcadeMode Dec 18, 2025
1fe23bc
end to end automapping works for simple objects
ArcadeMode Dec 18, 2025
c6ed7ef
snapshot compatible properties
ArcadeMode Dec 19, 2025
99e2f63
use contains type method
ArcadeMode Dec 19, 2025
d7f912a
import system for array
ArcadeMode Dec 19, 2025
a5515ba
test and e2e assign js object through interop
ArcadeMode Dec 19, 2025
ee997ae
compact ts instanceof impl
ArcadeMode Dec 20, 2025
a885091
relocate TS method rendering in prep for extraction
ArcadeMode Dec 20, 2025
b87f6a2
extract method rendering, apply in module class renderer
ArcadeMode Dec 20, 2025
ff0d4c3
fix tests + add new
ArcadeMode Dec 20, 2025
b02fb34
fix failing tests + cleanup
ArcadeMode Dec 20, 2025
01c9c10
document idea for task types
ArcadeMode Dec 20, 2025
df05f6b
do fingerprint for debugger
ArcadeMode Dec 20, 2025
06ed8e2
cleanup
ArcadeMode Dec 20, 2025
cd805aa
implement dynamic resolution between proxy or snapshot on the C# side
ArcadeMode Dec 20, 2025
5f8424e
deprecate overloads impl
ArcadeMode Dec 20, 2025
71c4440
export properties in typeinfo, fix type conversions for arrays
ArcadeMode Dec 20, 2025
9eb4a7e
mark tests for implementing
ArcadeMode Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ export interface ArraysDemoProps {
}

type ArraysDemoState = {
instance: ArraysDemo;
instance: ArraysDemo.Proxy;
appendValue: number;
setValue: number;
};

export const ArraysDemoComponent: React.FC<ArraysDemoProps> = ({ exportsPromise }) => {
const [cap, setCap] = useState<CapabilitiesProvider | null>(null);
const [cap, setCap] = useState<CapabilitiesProvider.Proxy | null>(null);
const [demos, setDemos] = useState<ArraysDemoState[]>([]);

useEffect(() => {
Expand All @@ -35,7 +35,7 @@ export const ArraysDemoComponent: React.FC<ArraysDemoProps> = ({ exportsPromise

const createDemo = () => {
if (!cap) return;
const instance: ArraysDemo = cap.GetArraysDemo();
const instance: ArraysDemo.Proxy = cap.GetArraysDemo();
setDemos(prev => [{ instance, appendValue: 0, setValue: 0 }, ...prev]);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ export interface PrimitivesDemoProps {
}

export const PrimitivesDemoComponent: React.FC<PrimitivesDemoProps> = ({ exportsPromise }) => {
const [cap, setCap] = useState<CapabilitiesProvider | null>(null);
const [cap, setCap] = useState<CapabilitiesProvider.Proxy | null>(null);
const [newBaseInput, setNewBaseInput] = useState('Hello');
const [demos, setDemos] = useState<Array<{ instance: PrimitivesDemo; concatA: string; concatB: string; multiplyCount: number; multiplyResult?: string }>>([]);
const [demos, setDemos] = useState<Array<{ instance: PrimitivesDemo.Proxy; concatA: string; concatB: string; multiplyCount: number; multiplyResult?: string }>>([]);

useEffect(() => {
(async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export interface PeopleGridProps {
}

export const PeopleGrid: React.FC<PeopleGridProps> = ({ emptyText = 'No people found.', repository }) => {
const [people, setPeople] = useState<Person[]>([]);
const [people, setPeople] = useState<Person.Proxy[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export interface PeopleListProps {
}

export const PeopleList: React.FC<PeopleListProps> = ({ emptyText = 'No people found.', repository }) => {
const [people, setPeople] = useState<Person[]>([]);
const [people, setPeople] = useState<Person.Proxy[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@ export class PeopleRepository {
this.wasmModulePromise = this.getInitializedSampleModule(exportsPromise);
}

public async getAllPeople(): Promise<Person[]> {
public async getAllPeople(): Promise<Person.Proxy[]> {
const sampleModule: TypeShimSampleModule = await this.wasmModulePromise;
const peopleProvider: PeopleProvider | null = sampleModule.PeopleProvider;
const peopleProvider: PeopleProvider.Proxy | null = sampleModule.PeopleProvider;
if (!peopleProvider) {
throw new Error("PeopleProvider is null");
}
const people: People = await peopleProvider.FetchPeopleAsync();
const people: People.Proxy = await peopleProvider.FetchPeopleAsync();
this.PrintAgeMethodUsage(people);
return people.All;
}

private PrintAgeMethodUsage(people: People) {
private PrintAgeMethodUsage(people: People.Proxy) {
console.log("Demonstrating Person.IsOlderThan method:");
const persons: Person[] = people.All;
const persons: Person.Proxy[] = people.All;
const person1 = persons[(Math.random() * persons.length) | 0];
const person2 = persons[(Math.random() * persons.length) | 0];
console.log(person1.Name, person1.Age, "isOlderThan", person2.Name, person2.Age, ":", person1.IsOlderThan(person2));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import React, { useState } from 'react';
import type { Person } from '@typeshim/wasm-exports';
import { Person, Dog } from '@typeshim/wasm-exports';

export interface PersonCardProps {
initPerson: Person;
initPerson: Person.Proxy;
}

export const PersonCard: React.FC<PersonCardProps> = ({ initPerson }) => {
const [wrapper, setPerson] = useState<{person: Person}>({person: initPerson});
const person = wrapper.person;
const pet = person.Pet;
const [wrapper, setPerson] = useState<{person: Person.Proxy}>({person: initPerson});
const personSnapshot = Person.snapshot(wrapper.person);
const petSnapshot = personSnapshot.Pet;
const personProxy = wrapper.person;
const petProxy = personProxy.Pet;
return (
<div
style={{
Expand All @@ -21,11 +23,11 @@ export const PersonCard: React.FC<PersonCardProps> = ({ initPerson }) => {
flexDirection: 'row',
justifyContent: 'space-between',
}}>
<div title={`${person.Name} (Id: ${person.Id})`} style={{ padding: '0.5rem' }}>
<h3 style={{ margin: '0 0 0.25rem 0' }}>{person.Name}</h3>
<p style={{ margin: 0, fontSize: '0.875rem', color: '#555' }}>Age: {person.Age}</p>
<div title={`${personSnapshot.Name} (Id: ${personSnapshot.Id})`} style={{ padding: '0.5rem' }}>
<h3 style={{ margin: '0 0 0.25rem 0' }}>{personSnapshot.Name}</h3>
<p style={{ margin: 0, fontSize: '0.875rem', color: '#555' }}>Age: {personSnapshot.Age}</p>
</div>
{pet && (
{petSnapshot && petProxy && (
<div>
<span style={{
display: 'inline-block',
Expand All @@ -36,12 +38,16 @@ export const PersonCard: React.FC<PersonCardProps> = ({ initPerson }) => {
color: '#1e3a8a',
fontSize: '0.75rem',
border: '1px solid #cfe0ff'
}} title={`Pet: ${pet.Name} (Breed: ${pet.Breed})`}>
Pet: {pet.Name} {pet.GetAge(false)} years/{pet.GetAge(true)} years ({pet.Breed}) - {pet.Bark()}
}} title={`Pet: ${petSnapshot.Name} (Breed: ${petSnapshot.Breed})`}
onClick={() => {
personProxy.Pet = {...petSnapshot, Age: petSnapshot.Age + 1};
setPerson({...wrapper});
}}>
Pet: {petSnapshot.Name} {petProxy.GetAge(false)}/{petProxy.GetAge(true)} ({petSnapshot.Breed}) - {petProxy.Bark()}
</span>
</div>
)}
{!pet && (
{!petSnapshot && (
<div style={{ display: 'flex', alignItems: 'center' }}>
<button
style={{
Expand All @@ -57,7 +63,7 @@ export const PersonCard: React.FC<PersonCardProps> = ({ initPerson }) => {
cursor: 'pointer'
}}
onClick={() => {
person.AdoptPet();
personProxy.Adopt({ Name: "Boi", Breed: "JS", Age: 1 });
setPerson({...wrapper});
}}>
Adopt a pet!
Expand Down
Loading
Loading