{"action":"created","comment":{"url":"https://api.github.com/repos/Polymer/lit-element/pulls/comments/209043716","pull_request_review_id":144947085,"id":209043716,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwOTA0MzcxNg==","diff_hunk":"@@ -0,0 +1,545 @@\n+/**\n+ * @license\n+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n+ * This code may only be used under the BSD style license found at\n+ * http://polymer.github.io/LICENSE.txt\n+ * The complete set of authors may be found at\n+ * http://polymer.github.io/AUTHORS.txt\n+ * The complete set of contributors may be found at\n+ * http://polymer.github.io/CONTRIBUTORS.txt\n+ * Code distributed by Google as part of the polymer project is also\n+ * subject to an additional IP rights grant found at\n+ * http://polymer.github.io/PATENTS.txt\n+ */\n+\n+/**\n+ * Converts property values to and from attribute values.\n+ */\n+interface AttributeSerializer<T = any> {\n+\n+  /**\n+   * Deserializing function called to convert an attribute value to a property value.\n+   */\n+  fromAttribute?(value: string): T;\n+\n+  /**\n+   * Serializing function called to convert a property value to an attribute value.\n+   */\n+  toAttribute?(value: T): string|null;\n+\n+}\n+\n+type AttributeType<T = any> = AttributeSerializer<T>|((value: string) => T);\n+\n+/**\n+ * Defines options for a property accessor.\n+ */\n+export interface PropertyDeclaration<T = any> {\n+\n+  /**\n+   * Describes how and if the property becomes an observed attribute.\n+   * If the value is false, the property is not added to `observedAttributes`.\n+   * If true or absent, the lowercased property name is observed (e.g. `fooBar` becomes `foobar`).\n+   * If a string, the string value is observed (e.g `attribute: 'foo-bar'`).\n+   */\n+  attribute?: boolean|string;\n+\n+  /**\n+   * Describes how to serialize and deserialize the attribute to/from a property.\n+   * If this value is a function, it is used to deserialize the attribute value\n+   * a the property value. If it's an object, it can have keys for `fromAttribute` and\n+   * `toAttribute` where `fromAttribute` is the deserialize function and `toAttribute`\n+   * is a serialize function used to set the property to an attribute. If no `toAttribute`\n+   * function is provided and `reflect` is set to true, the property value is set\n+   * directly to the attribute.\n+   */\n+  type?: AttributeType<T>;\n+\n+  /**\n+   * Describes if the property should reflect to an attribute.\n+   * If true, when the property is set, the attribute is set using the\n+   * attribute name determined according to the rules for the `attribute`\n+   * propety option and the value of the property serialized using the rules from\n+   * the `type` property option.\n+   */\n+  reflect?: boolean;\n+\n+  /**\n+   * Describes if setting a property should trigger invalidation and updating.\n+   * This function takes the `newValue` and `oldValue` and returns true if\n+   * invalidation should occur. If not present, a strict identity check\n+   * (eg. === operator) is used. This is useful if a property should be\n+   * considered dirty only if some condition is met, like if a key of an\n+   * object value changes.\n+   */\n+  shouldInvalidate?(value: T, oldValue: T): boolean;\n+\n+}\n+\n+/**\n+ * Object that describes accessors to be created on the element prototype.\n+ * An accessor is created for each key with the given options.\n+ */\n+export interface PropertyDeclarations {\n+  [key: string]: PropertyDeclaration;\n+}\n+\n+interface AttributeMap {\n+  [key: string]: string;\n+}\n+\n+export interface PropertyValues {\n+  [key: string]: unknown;\n+}\n+\n+/**\n+ * Creates a property accessor on the given prototype if one does not exist.\n+ * Uses `getProperty` and `setProperty` to manage the property's value.\n+ */\n+const makeProperty = (name: PropertyKey, proto: Object) => {\n+  if (name in proto) {\n+    return;\n+  }\n+  Object.defineProperty(proto, name, {\n+    get() {\n+      return this.getProperty(name);\n+    },\n+    set(value) {\n+      this.setProperty(name, value);\n+    },\n+    configurable: true,\n+    enumerable: true\n+  });\n+};\n+\n+/**\n+ * Creates and sets object used to memoize all class property values. Object\n+ * is chained from superclass.\n+ */\n+const ensurePropertyStorage = (ctor: typeof UpdatingElement) => {\n+  if (!ctor.hasOwnProperty('_classProperties')) {\n+    ctor._classProperties = Object.create(Object.getPrototypeOf(ctor)._classProperties);\n+  }\n+};\n+\n+/**\n+ * Decorator which creates a property. Optionally a `PropertyDeclaration` object\n+ * can be supplied to describe how the property should be configured.\n+ */\n+export const property = (options: PropertyDeclaration = {}) => (proto: Object, name: string) => {\n+  const ctor = proto.constructor as typeof UpdatingElement;\n+  ensurePropertyStorage(ctor);\n+  ctor._classProperties[name] = options;\n+  makeProperty(name, proto);\n+};\n+\n+\n+/**\n+ * AttributeSerializer which configures properties which should reflect to and\n+ * from boolean attributes. If the attribute exists, the property is set to true.\n+ * If the property value is truthy, the attribute is set to an empty string;\n+ * otherwise, the attribute is removed.\n+ */\n+export const BooleanAttribute: AttributeSerializer = {\n+  fromAttribute: (value: string) => value !== null,\n+  toAttribute: (value: string) => value ? '' : null\n+};\n+\n+/**\n+ * Change function that returns true if `value` is different from `oldValue`.\n+ * This method is used as the default for a property's `shouldChange` function.\n+ */\n+export const identity = (value: unknown, old: unknown) => {\n+  // This ensures (old==NaN, value==NaN) always returns false\n+  return old !== value && (old === old || value === value);\n+};\n+\n+const disabled = 0;\n+const valid = 1;\n+const invalid = 2;\n+type ValidationState = typeof disabled | typeof valid | typeof invalid;\n+\n+/**\n+ * Base element class which manages element properties and attributes. When\n+ * properties change, the `update` method is asynchronously called. This method\n+ * should be supplied by subclassers to render updates as desired.\n+ */\n+export abstract class UpdatingElement extends HTMLElement {\n+\n+  /**\n+   * Maps attribute names to properties; for example `foobar` attribute\n+   * to `fooBar` property.\n+   */\n+  private static _attributeToPropertyMap: AttributeMap = {};\n+\n+  /**\n+   * Marks class as having finished creating properties.\n+   */\n+  private static _finalized = true;\n+\n+  /**\n+   * Memoized result of computed observedAttributes.\n+   */\n+  private static _observedAttributes: string[]|undefined;\n+\n+  // TODO(sorvell): intended to be private but called by decorator.\n+  /**\n+   * Memoized list of all class properties, including any superclass properties.\n+   */\n+  static _classProperties: PropertyDeclarations = {};\n+\n+  static properties: PropertyDeclarations = {};\n+\n+  /**\n+   * Returns a list of attributes corresponding to the registered properties.\n+   */\n+  static get observedAttributes() {\n+    if (!this.hasOwnProperty('_observedAttributes')) {\n+      // note: piggy backing on this to ensure we're _finalized.\n+      this._finalize();\n+      this._observedAttributes = [];\n+      for (const p in this._classProperties) {\n+        const attr = this.attributeNameForProperty(p);\n+        if (attr !== undefined) {\n+          this._attributeToPropertyMap[attr] = p;\n+          this._observedAttributes.push(attr);\n+        }\n+      }\n+    }\n+    return this._observedAttributes;\n+  }\n+\n+  /**\n+   * Creates property accessors for registered properties and ensures\n+   * any superclasses are also finalized.\n+   */\n+  private static _finalize() {\n+    if (this.hasOwnProperty('_finalized') && this._finalized) {\n+      return;\n+    }\n+    // finalize any superclasses\n+    const superCtor = Object.getPrototypeOf(this);\n+    if (typeof superCtor._finalize === 'function') {\n+      superCtor._finalize();\n+    }\n+    this._finalized = true;\n+    // make any properties\n+    const props = this.properties;\n+    for (const p in props) {\n+      makeProperty(p, this.prototype);\n+    }\n+    // support symbols in properties (IE11 does not support this)\n+    if (typeof Object.getOwnPropertySymbols === 'function') {\n+      Object.getOwnPropertySymbols(props).forEach((p) => makeProperty(p, this.prototype));\n+    }\n+    // initialize map populated in observedAttributes\n+    this._attributeToPropertyMap = {};\n+    // memoize list of all class properties.\n+    ensurePropertyStorage(this);\n+    Object.assign(this._classProperties, props);\n+  }\n+\n+  /**\n+   * Returns the property name for the given attribute `name`.\n+   */\n+  private static attributeNameForProperty(name: string) {\n+    const info = this._classProperties[name];\n+    const attribute = info && info.attribute;\n+    return attribute === false ? undefined : (typeof attribute === 'string' ?\n+        attribute : name.toLowerCase());\n+  }\n+\n+  /**\n+   * Returns true if a property should cause invalidation and update.\n+   * Called when a property value is set and uses the `shouldInvalidate`\n+   * option for the property if present or a strict identity check.\n+   */\n+  // tslint:disable-next-line no-any\n+  private static propertyShouldInvalidate(name: string, value: any, old: any) {\n+    const info = this._classProperties[name];\n+    const fn = info && info.shouldInvalidate || identity;\n+    return fn(value, old);\n+  }\n+\n+  /**\n+   * Returns the property value for the given attribute value.\n+   * Called via the `attributeChangedCallback` and uses the property's `type`\n+   * or `type.fromAttribute` property option.\n+   */\n+  private static propertyValueFromAttribute(name: string, value: string) {\n+    const info = this._classProperties[name];\n+    const type = info && info.type;\n+    if (!type) {\n+      return value;\n+    }\n+    const fromAttribute = typeof type === 'function' ? type : type.fromAttribute;\n+    return fromAttribute ? fromAttribute(value) : value;\n+  }\n+\n+  /**\n+   * Returns the attribute value for the given property value. If this\n+   * returns undefined, the property will *not* be reflected to an attribute.\n+   * If this returns null, the attribute will be removed, otherwise the\n+   * attribute will be set to the value.\n+   * This uses the property's `reflect` and `type.toAttribute` property options.\n+   */\n+  // tslint:disable-next-line no-any\n+  private static propertyValueToAttribute(name: string, value: any) {\n+    const info = this._classProperties[name];\n+    if (!info || !info.reflect) {\n+      return;\n+    }\n+    const toAttribute = info.type && (info.type as AttributeSerializer).toAttribute || String;\n+    return (typeof toAttribute === 'function') ? toAttribute(value) : null;\n+  }\n+\n+  private _validationState: ValidationState = disabled;\n+  private _isReflectingProperty: boolean = false;\n+  private _instanceProperties: PropertyValues|undefined;\n+  private _validatePromise: any = undefined;\n+  private _validateResolver: (() => void)|undefined;\n+  private _firstUpdated: boolean = false;\n+\n+  /**\n+   * Object with keys for all properties with their current values.\n+   */\n+  private _props: PropertyValues = {};\n+\n+  /**\n+   * Object with keys for any properties that have changed since the last\n+   * update cycle with previous values.\n+   */\n+  private _changedProps?: PropertyValues|undefined;\n+\n+  /**\n+   * Node or ShadowRoot into which element DOM should be rendered. Defaults\n+   * to an open shadowRoot.\n+   */\n+  protected renderRoot?: Element|DocumentFragment;\n+\n+  constructor() {\n+    super();\n+    this.initialize();\n+  }\n+\n+  /**\n+   * Performs element initialization. By default this calls `createRoot` to\n+   * create the element `root` node and captures any pre-set values for\n+   * registered properties.\n+   */\n+  initialize() {\n+    this.renderRoot = this.createRenderRoot();\n+    // Apply any properties set on the instance before upgrade time.\n+    for (const p in (this.constructor as typeof UpdatingElement)._classProperties) {\n+      if (this.hasOwnProperty(p)) {\n+        const value = this[p as keyof this];\n+        delete this[p as keyof this];\n+        this._instanceProperties = this._instanceProperties || {};\n+        // NOTE: must capture these into a bag and reset at when validating\n+        // to avoid stomping on a user value set in the constructor. Being\n+        // async doesn't help here since the subclass' constructor value should\n+        // be overwritten.\n+        this._instanceProperties![p] = value;\n+      }\n+    }\n+  }\n+\n+  /**\n+   * Returns the node into which the element should render and by default\n+   * creates and returns an open shadowRoot. Implement to customize where the\n+   * element's DOM is rendered. For example, to render into the element's\n+   * childNodes, return `this`.\n+   * @returns {Element|DocumentFragment} Returns a node into which to render.\n+   */\n+  protected createRenderRoot(): Element|ShadowRoot {\n+    return this.attachShadow({mode : 'open'});\n+  }\n+\n+  /**\n+   * Uses ShadyCSS to keep element DOM updated.\n+   */\n+  connectedCallback() {\n+    if (this._validationState !== disabled && typeof window.ShadyCSS !== 'undefined') {\n+      window.ShadyCSS.styleElement(this);\n+    }\n+    this.invalidate();\n+  }\n+\n+  /**\n+   * Synchronizes property values when attributes change.\n+   */\n+  attributeChangedCallback(name: string, old: string, value: string) {\n+    if (old !== value) {\n+      this._attributeToProperty(name, value);\n+    }\n+  }\n+\n+  /**\n+   * Returns the value of the property with `name`. This method is used\n+   * to get property values of registered properties.\n+   */\n+  protected getProperty(name: string) {","path":"src/lib/updating-element.ts","position":381,"original_position":381,"commit_id":"3f0315cd0f710881e24afb2577fd6f7f08dfd51d","original_commit_id":"3f0315cd0f710881e24afb2577fd6f7f08dfd51d","user":{"login":"justinfagnani","id":522948,"node_id":"MDQ6VXNlcjUyMjk0OA==","avatar_url":"https://avatars0.githubusercontent.com/u/522948?v=4","gravatar_id":"","url":"https://api.github.com/users/justinfagnani","html_url":"https://github.com/justinfagnani","followers_url":"https://api.github.com/users/justinfagnani/followers","following_url":"https://api.github.com/users/justinfagnani/following{/other_user}","gists_url":"https://api.github.com/users/justinfagnani/gists{/gist_id}","starred_url":"https://api.github.com/users/justinfagnani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinfagnani/subscriptions","organizations_url":"https://api.github.com/users/justinfagnani/orgs","repos_url":"https://api.github.com/users/justinfagnani/repos","events_url":"https://api.github.com/users/justinfagnani/events{/privacy}","received_events_url":"https://api.github.com/users/justinfagnani/received_events","type":"User","site_admin":false},"body":"This is an idea for a bigger change that we should probably discuss in person, but...\r\n\r\nCould we possibly get rid of `getProperty`, `setProperty` and `_props` altogether?\r\n\r\nThe way it would work is:\r\n\r\n1. `makeProperty` would create a Symbol key for the private storage of the property and defineProperty for the private storage directly on the prototype.\r\n2. The `get` and `set` methods in `makeProperty` would read/write to the private storage property.\r\n3. The setter would do all the `setProperty` work (except write to `_props`), including still writing to `_changedProps`\r\n4. If a user wants to write their own getter/setter pair, they implement their own storage (or call makeProperty), and call invalidate rather than `setProperty`.\r\n5. Any previous call to `setProperty` or `getProperty` should be fine as calls to the accessors.\r\n\r\nReducing metaprograming APIs and forcing properties to be declared will be good for static analysis and compilers. If we remove `getProperty`/`setProperty`, the only remaining reason to disallow class property renaming will be property bindings in lit-html templates, but we could address that with plugins that support renaming in templates.\r\n\r\nThis should also make getting property values marginally faster due to skipping an object dereference into `this._props`.\r\n\r\nWDYT?","created_at":"2018-08-09T19:00:06Z","updated_at":"2018-08-09T19:01:23Z","html_url":"https://github.com/Polymer/lit-element/pull/132#discussion_r209043716","pull_request_url":"https://api.github.com/repos/Polymer/lit-element/pulls/132","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/comments/209043716"},"html":{"href":"https://github.com/Polymer/lit-element/pull/132#discussion_r209043716"},"pull_request":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/132"}}},"pull_request":{"url":"https://api.github.com/repos/Polymer/lit-element/pulls/132","id":203693506,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAzNjkzNTA2","html_url":"https://github.com/Polymer/lit-element/pull/132","diff_url":"https://github.com/Polymer/lit-element/pull/132.diff","patch_url":"https://github.com/Polymer/lit-element/pull/132.patch","issue_url":"https://api.github.com/repos/Polymer/lit-element/issues/132","number":132,"state":"open","locked":false,"title":"Refine API and refactor","user":{"login":"sorvell","id":78891,"node_id":"MDQ6VXNlcjc4ODkx","avatar_url":"https://avatars1.githubusercontent.com/u/78891?v=4","gravatar_id":"","url":"https://api.github.com/users/sorvell","html_url":"https://github.com/sorvell","followers_url":"https://api.github.com/users/sorvell/followers","following_url":"https://api.github.com/users/sorvell/following{/other_user}","gists_url":"https://api.github.com/users/sorvell/gists{/gist_id}","starred_url":"https://api.github.com/users/sorvell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sorvell/subscriptions","organizations_url":"https://api.github.com/users/sorvell/orgs","repos_url":"https://api.github.com/users/sorvell/repos","events_url":"https://api.github.com/users/sorvell/events{/privacy}","received_events_url":"https://api.github.com/users/sorvell/received_events","type":"User","site_admin":false},"body":"WIP (do not merge). Tests do not pass.\r\n\r\n* does not rely on Polymer\r\n* API\r\n  * startup: \r\n    * constructor => `initialize` => `createRoot`\r\n    * `connectedCallback` => `enableUpdate` => `invalidate`\r\n  * update/render: \r\n    * property change => `invalidate` => \r\n    * (async) `shouldUpdate` => `update`\r\n    * resolves any `updateComplete` promise\r\n","created_at":"2018-07-25T00:57:19Z","updated_at":"2018-08-09T19:01:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2779697f8f212c21121753146c0084edf1909a0f","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kevinpschaaf","id":1354932,"node_id":"MDQ6VXNlcjEzNTQ5MzI=","avatar_url":"https://avatars0.githubusercontent.com/u/1354932?v=4","gravatar_id":"","url":"https://api.github.com/users/kevinpschaaf","html_url":"https://github.com/kevinpschaaf","followers_url":"https://api.github.com/users/kevinpschaaf/followers","following_url":"https://api.github.com/users/kevinpschaaf/following{/other_user}","gists_url":"https://api.github.com/users/kevinpschaaf/gists{/gist_id}","starred_url":"https://api.github.com/users/kevinpschaaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kevinpschaaf/subscriptions","organizations_url":"https://api.github.com/users/kevinpschaaf/orgs","repos_url":"https://api.github.com/users/kevinpschaaf/repos","events_url":"https://api.github.com/users/kevinpschaaf/events{/privacy}","received_events_url":"https://api.github.com/users/kevinpschaaf/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Polymer/lit-element/pulls/132/commits","review_comments_url":"https://api.github.com/repos/Polymer/lit-element/pulls/132/comments","review_comment_url":"https://api.github.com/repos/Polymer/lit-element/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Polymer/lit-element/issues/132/comments","statuses_url":"https://api.github.com/repos/Polymer/lit-element/statuses/3f0315cd0f710881e24afb2577fd6f7f08dfd51d","head":{"label":"Polymer:refactor","ref":"refactor","sha":"3f0315cd0f710881e24afb2577fd6f7f08dfd51d","user":{"login":"Polymer","id":2159051,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNTkwNTE=","avatar_url":"https://avatars3.githubusercontent.com/u/2159051?v=4","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"repo":{"id":102217920,"node_id":"MDEwOlJlcG9zaXRvcnkxMDIyMTc5MjA=","name":"lit-element","full_name":"Polymer/lit-element","owner":{"login":"Polymer","id":2159051,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNTkwNTE=","avatar_url":"https://avatars3.githubusercontent.com/u/2159051?v=4","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Polymer/lit-element","description":"An ultra-light custom element base class with a simple but expressive API","fork":false,"url":"https://api.github.com/repos/Polymer/lit-element","forks_url":"https://api.github.com/repos/Polymer/lit-element/forks","keys_url":"https://api.github.com/repos/Polymer/lit-element/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Polymer/lit-element/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Polymer/lit-element/teams","hooks_url":"https://api.github.com/repos/Polymer/lit-element/hooks","issue_events_url":"https://api.github.com/repos/Polymer/lit-element/issues/events{/number}","events_url":"https://api.github.com/repos/Polymer/lit-element/events","assignees_url":"https://api.github.com/repos/Polymer/lit-element/assignees{/user}","branches_url":"https://api.github.com/repos/Polymer/lit-element/branches{/branch}","tags_url":"https://api.github.com/repos/Polymer/lit-element/tags","blobs_url":"https://api.github.com/repos/Polymer/lit-element/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Polymer/lit-element/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Polymer/lit-element/git/refs{/sha}","trees_url":"https://api.github.com/repos/Polymer/lit-element/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Polymer/lit-element/statuses/{sha}","languages_url":"https://api.github.com/repos/Polymer/lit-element/languages","stargazers_url":"https://api.github.com/repos/Polymer/lit-element/stargazers","contributors_url":"https://api.github.com/repos/Polymer/lit-element/contributors","subscribers_url":"https://api.github.com/repos/Polymer/lit-element/subscribers","subscription_url":"https://api.github.com/repos/Polymer/lit-element/subscription","commits_url":"https://api.github.com/repos/Polymer/lit-element/commits{/sha}","git_commits_url":"https://api.github.com/repos/Polymer/lit-element/git/commits{/sha}","comments_url":"https://api.github.com/repos/Polymer/lit-element/comments{/number}","issue_comment_url":"https://api.github.com/repos/Polymer/lit-element/issues/comments{/number}","contents_url":"https://api.github.com/repos/Polymer/lit-element/contents/{+path}","compare_url":"https://api.github.com/repos/Polymer/lit-element/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Polymer/lit-element/merges","archive_url":"https://api.github.com/repos/Polymer/lit-element/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Polymer/lit-element/downloads","issues_url":"https://api.github.com/repos/Polymer/lit-element/issues{/number}","pulls_url":"https://api.github.com/repos/Polymer/lit-element/pulls{/number}","milestones_url":"https://api.github.com/repos/Polymer/lit-element/milestones{/number}","notifications_url":"https://api.github.com/repos/Polymer/lit-element/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Polymer/lit-element/labels{/name}","releases_url":"https://api.github.com/repos/Polymer/lit-element/releases{/id}","deployments_url":"https://api.github.com/repos/Polymer/lit-element/deployments","created_at":"2017-09-02T19:09:16Z","updated_at":"2018-08-09T14:35:11Z","pushed_at":"2018-08-08T23:18:57Z","git_url":"git://github.com/Polymer/lit-element.git","ssh_url":"git@github.com:Polymer/lit-element.git","clone_url":"https://github.com/Polymer/lit-element.git","svn_url":"https://github.com/Polymer/lit-element","homepage":"","size":662,"stargazers_count":523,"watchers_count":523,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":52,"mirror_url":null,"archived":false,"open_issues_count":46,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":52,"open_issues":46,"watchers":523,"default_branch":"master"}},"base":{"label":"Polymer:master","ref":"master","sha":"2433ce376521aa8ab5272aa9c12a49ee74ac8c4e","user":{"login":"Polymer","id":2159051,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNTkwNTE=","avatar_url":"https://avatars3.githubusercontent.com/u/2159051?v=4","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"repo":{"id":102217920,"node_id":"MDEwOlJlcG9zaXRvcnkxMDIyMTc5MjA=","name":"lit-element","full_name":"Polymer/lit-element","owner":{"login":"Polymer","id":2159051,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIxNTkwNTE=","avatar_url":"https://avatars3.githubusercontent.com/u/2159051?v=4","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Polymer/lit-element","description":"An ultra-light custom element base class with a simple but expressive API","fork":false,"url":"https://api.github.com/repos/Polymer/lit-element","forks_url":"https://api.github.com/repos/Polymer/lit-element/forks","keys_url":"https://api.github.com/repos/Polymer/lit-element/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Polymer/lit-element/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Polymer/lit-element/teams","hooks_url":"https://api.github.com/repos/Polymer/lit-element/hooks","issue_events_url":"https://api.github.com/repos/Polymer/lit-element/issues/events{/number}","events_url":"https://api.github.com/repos/Polymer/lit-element/events","assignees_url":"https://api.github.com/repos/Polymer/lit-element/assignees{/user}","branches_url":"https://api.github.com/repos/Polymer/lit-element/branches{/branch}","tags_url":"https://api.github.com/repos/Polymer/lit-element/tags","blobs_url":"https://api.github.com/repos/Polymer/lit-element/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Polymer/lit-element/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Polymer/lit-element/git/refs{/sha}","trees_url":"https://api.github.com/repos/Polymer/lit-element/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Polymer/lit-element/statuses/{sha}","languages_url":"https://api.github.com/repos/Polymer/lit-element/languages","stargazers_url":"https://api.github.com/repos/Polymer/lit-element/stargazers","contributors_url":"https://api.github.com/repos/Polymer/lit-element/contributors","subscribers_url":"https://api.github.com/repos/Polymer/lit-element/subscribers","subscription_url":"https://api.github.com/repos/Polymer/lit-element/subscription","commits_url":"https://api.github.com/repos/Polymer/lit-element/commits{/sha}","git_commits_url":"https://api.github.com/repos/Polymer/lit-element/git/commits{/sha}","comments_url":"https://api.github.com/repos/Polymer/lit-element/comments{/number}","issue_comment_url":"https://api.github.com/repos/Polymer/lit-element/issues/comments{/number}","contents_url":"https://api.github.com/repos/Polymer/lit-element/contents/{+path}","compare_url":"https://api.github.com/repos/Polymer/lit-element/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Polymer/lit-element/merges","archive_url":"https://api.github.com/repos/Polymer/lit-element/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Polymer/lit-element/downloads","issues_url":"https://api.github.com/repos/Polymer/lit-element/issues{/number}","pulls_url":"https://api.github.com/repos/Polymer/lit-element/pulls{/number}","milestones_url":"https://api.github.com/repos/Polymer/lit-element/milestones{/number}","notifications_url":"https://api.github.com/repos/Polymer/lit-element/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Polymer/lit-element/labels{/name}","releases_url":"https://api.github.com/repos/Polymer/lit-element/releases{/id}","deployments_url":"https://api.github.com/repos/Polymer/lit-element/deployments","created_at":"2017-09-02T19:09:16Z","updated_at":"2018-08-09T14:35:11Z","pushed_at":"2018-08-08T23:18:57Z","git_url":"git://github.com/Polymer/lit-element.git","ssh_url":"git@github.com:Polymer/lit-element.git","clone_url":"https://github.com/Polymer/lit-element.git","svn_url":"https://github.com/Polymer/lit-element","homepage":"","size":662,"stargazers_count":523,"watchers_count":523,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":52,"mirror_url":null,"archived":false,"open_issues_count":46,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":52,"open_issues":46,"watchers":523,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/132"},"html":{"href":"https://github.com/Polymer/lit-element/pull/132"},"issue":{"href":"https://api.github.com/repos/Polymer/lit-element/issues/132"},"comments":{"href":"https://api.github.com/repos/Polymer/lit-element/issues/132/comments"},"review_comments":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/132/comments"},"review_comment":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Polymer/lit-element/pulls/132/commits"},"statuses":{"href":"https://api.github.com/repos/Polymer/lit-element/statuses/3f0315cd0f710881e24afb2577fd6f7f08dfd51d"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"justinfagnani"}}