Skip to content

Instantly share code, notes, and snippets.

@klokane
Last active August 29, 2015 14:23
Show Gist options
  • Save klokane/a09b33abb79fa5a14adb to your computer and use it in GitHub Desktop.
Save klokane/a09b33abb79fa5a14adb to your computer and use it in GitHub Desktop.
Refract element Mixins expansion
## Address (object)
- street
- city

## User (Address)
- id
- login

Nonexpanded version

[ "Address", { "id" : "User" }, {}, [
  [ "member", {}, {}, { "key" : "id" } ],
  [ "member", {}, {}, { "key" : "login" } ]
]

Copy && Expanded members solution

[ "object", { "id" : "User" }, {}, [
  [ "extend", { "ref" : "Address" }, {}, [
    [ "member", {}, {}, { "key" : "street" } ],
    [ "member", {}, {}, { "key" : "city" } ],
  ],
  [ "member", {}, {}, { "key" : "id" } ],
  [ "member", {}, {}, { "key" : "login" } ]
]

Members from parent comes first, to allow override them.

# A (object)
- a1
- include (B)
- a2

# B (C)
- b1

# C
- c1

Nonexpanded

[ "object", { "id" : "A" }, {}, [
  [ "member", {}, {}, { "key" : "a1" } ],
  [ "ref", {}, {}, 
   { 
      "href" : "B",
      "path" : "content"
    }
  ],
  [ "member", {}, {}, { "key" : "a2" } ]
]

Copy members

[ "object", { "id" : "A" }, {}, [
  [ "member", {}, {}, { "key" : "a1" } ],
  [ "extend", { "ref" : "B" }, {}, [
    [ "extend", { "ref" : "C" }, {}, [
      [ "member", {}, {}, { "key" : "c1" } ]
    ],
    [ "member", {}, {}, { "key" : "b1" } ],
  ],
  [ "member", {}, {}, { "key" : "a2" } ]
]

Problem

We need to solve expansion of MSON Mixins in refract spec.

Acceptable Criteria

It must preserve orders elements as they become from it original structures:

Input MSON

## Address (object)
- street
- city

## User (object)
- id
- Include Address
- login

Without expansion User MSON comes into refract:

[ "object", { "id" : "User" }, {}, [
  [ "member", {}, {}, { "key" : "id" } ],
  [ "ref", {}, {}, 
    { 
      "href" : "Address",
      "path" : ""content"
    }
  ],
  [ "member", {}, {}, { "key" : "login" } ]
]

As specified above we MUST preserve order of members in expanded element.

Copy members of referenced object into original object

[ "object", { "id" : "User" }, {}, [
  [ "member", {}, {}, { "key" : "id" } ],
  [ "extend", { "ref" : "Address" }, {}, [
    [ "member", {}, {}, { "key" : "street" } ],
    [ "member", {}, {}, { "key" : "city" } ],
  ],
  [ "member", {}, {}, { "key" : "login" } ]
]

This solution replace original referenced Element by extend and replace original element meta.id by meta.ref

@klokane
Copy link
Author

klokane commented Jun 24, 2015

@pksunkara added

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment