@aire-ux/aire-condensation
TypeScript icon, indicating that this package has built-in type declarations

0.2.0 • Public • Published

Overview

Condensation is a library for transparently hydrating JavaScript or TypeScript objects from a variety of formats (JSON, XML, Avro, gRPC, Cap'n Proto)

Usage

JVM/Java

This process is optional, but if you use a JVM language and servlet technologies, then you can map your JVM objects directly to Condensation-mapped objects and call methods remotely

Define the AireServlet

    @Bean public ServletRegistrationBean<AireDesignerServlet> aireServlet() {
        return new ServletRegistrationBean(AireDesignerServlet, "context");  // servlet will be registered at "/web-context/context"
    }

Generic Usage (backend-agnostic)

Define a data-transfer object:

@RootElement
class Address {
  @Property({
    type: Number,
    read: {
      alias: "room-count",
    },
  })
  roomCount: number;

  @Property(String)
  city: string;
    
  showInfo() : void {
      console.log(`City: ${this.city}, Rooms: ${this.roomCount}`)
  }   
}

This object may be mounted from the following JSON document:

{
  "room-count": 4,
  "city": "Fort Collins"
}
/**
 this context can be made a global object
*/     
const context = Condensation.newContext();
const jsonDoc = await load('path/to/my/address'); // path returning above document
const address = ctx.create(Address, jsonDoc);

address.showInfo();
// logs City: Fort Collins, Rooms: 4

Condensation is capable of serializing/deserializing entire object-graphs, including graphs that contain cycles:

@Remotable
@RootElement
class Person {
    @Identity
    @Property(String)
    commonName: string;

    @Identity
    @Property({
        type: String,
        read: {
            alias: 'given-name' // can be read from "given-name" payload property
        },
        write: {
            alias: 'GivenName'  // will be written to "GivenName" payload property on write
        }
    })
    givenName: string;
    
    constructor(
        @Linked(via = "children")
        @Receive(Person) public readonly parents: Array<Person>,
        @Linked(via = "parents")
        @Receive(Person) public readonly children: Array<Person>
    ) {
    }
    

}

input document

[ 
    {
      "common-name": "Haswell",
      "given-name": "Dad"
    },
    {
      "common-name": "Haswell",
      "given-name": "Josiah",
      "parent": "Dad" // generated from commonName property of Identity.  @Linked annotations will correctly link Dad -> Josiah via parent and children properties
    }
]
@RootElement
class Person {
  @Property(String)
  name: string | undefined;
  @Property({
    type: Address,
    read: {
      alias: "home-addresses",
    },
  })
  addresses: Address[];
}

@RootElement
class Group {
  @Property(Person)
  members: Person[] | undefined;
}

Define a Remotable Object

import { Receive, Remotable } from "./remotable";

@Remotable
class RemotableGroup {
  /**
   * @param group the group to construct this from
   */
  constructor(@Receive(Group) group: Group) {}

  addMember(@Receive(Person) member: Person): void {
    this.group.members.push(member); // addMember can be called from the server-side
  }
}

const group = Condensation.newContext().bind(RemotableGroup);

Readme

Keywords

Package Sidebar

Install

npm i @aire-ux/aire-condensation

Weekly Downloads

1

Version

0.2.0

License

MIT

Unpacked Size

112 kB

Total Files

45

Last publish

Collaborators

  • sunshowerjoe