diff --git a/src/deserializer-manager.coffee b/src/deserializer-manager.coffee deleted file mode 100644 index 3c73a0b02..000000000 --- a/src/deserializer-manager.coffee +++ /dev/null @@ -1,68 +0,0 @@ -{Disposable} = require 'event-kit' - -# Extended: Manages the deserializers used for serialized state -# -# An instance of this class is always available as the `atom.deserializers` -# global. -# -# ## Examples -# -# ```coffee -# class MyPackageView extends View -# atom.deserializers.add(this) -# -# @deserialize: (state) -> -# new MyPackageView(state) -# -# constructor: (@state) -> -# -# serialize: -> -# @state -# ``` -module.exports = -class DeserializerManager - constructor: (@atomEnvironment) -> - @deserializers = {} - - # Public: Register the given class(es) as deserializers. - # - # * `deserializers` One or more deserializers to register. A deserializer can - # be any object with a `.name` property and a `.deserialize()` method. A - # common approach is to register a *constructor* as the deserializer for its - # instances by adding a `.deserialize()` class method. When your method is - # called, it will be passed serialized state as the first argument and the - # {Atom} environment object as the second argument, which is useful if you - # wish to avoid referencing the `atom` global. - add: (deserializers...) -> - @deserializers[deserializer.name] = deserializer for deserializer in deserializers - new Disposable => - delete @deserializers[deserializer.name] for deserializer in deserializers - return - - getDeserializerCount: -> - Object.keys(@deserializers).length - - # Public: Deserialize the state and params. - # - # * `state` The state {Object} to deserialize. - deserialize: (state) -> - return unless state? - - if deserializer = @get(state) - stateVersion = state.get?('version') ? state.version - return if deserializer.version? and deserializer.version isnt stateVersion - deserializer.deserialize(state, @atomEnvironment) - else - console.warn "No deserializer found for", state - - # Get the deserializer for the state. - # - # * `state` The state {Object} being deserialized. - get: (state) -> - return unless state? - - name = state.get?('deserializer') ? state.deserializer - @deserializers[name] - - clear: -> - @deserializers = {} diff --git a/src/deserializer-manager.js b/src/deserializer-manager.js new file mode 100644 index 000000000..f5f2e6429 --- /dev/null +++ b/src/deserializer-manager.js @@ -0,0 +1,100 @@ +/** @babel */ + +import {Disposable} from 'event-kit' + +// Extended: Manages the deserializers used for serialized state +// +// An instance of this class is always available as the `atom.deserializers` +// global. +// +// ## Examples +// +// ```coffee +// class MyPackageView extends View +// atom.deserializers.add(this) +// +// @deserialize: (state) -> +// new MyPackageView(state) +// +// constructor: (@state) -> +// +// serialize: -> +// @state +// ``` +export default class DeserializerManager { + constructor (atomEnvironment) { + this.atomEnvironment = atomEnvironment + this.deserializers = {} + } + + // Public: Register the given class(es) as deserializers. + // + // * `deserializers` One or more deserializers to register. A deserializer can + // be any object with a `.name` property and a `.deserialize()` method. A + // common approach is to register a *constructor* as the deserializer for its + // instances by adding a `.deserialize()` class method. When your method is + // called, it will be passed serialized state as the first argument and the + // {Atom} environment object as the second argument, which is useful if you + // wish to avoid referencing the `atom` global. + add (...deserializers) { + for (let i = 0; i < deserializers.length; i++) { + let deserializer = deserializers[i] + this.deserializers[deserializer.name] = deserializer + } + + return new Disposable(() => { + for (let j = 0; j < deserializers.length; j++) { + let deserializer = deserializers[j] + delete this.deserializers[deserializer.name] + } + }) + } + + getDeserializerCount () { + return Object.keys(this.deserializers).length + } + + // Public: Deserialize the state and params. + // + // * `state` The state {Object} to deserialize. + deserialize (state) { + if (state == null) { + return + } + + const deserializer = this.get(state) + if (deserializer) { + let stateVersion = ( + (typeof state.get === 'function') && state.get('version') || + state.version + ) + + if ((deserializer.version != null) && deserializer.version !== stateVersion) { + return + } + return deserializer.deserialize(state, this.atomEnvironment) + } else { + return console.warn('No deserializer found for', state) + } + } + + // Get the deserializer for the state. + // + // * `state` The state {Object} being deserialized. + get (state) { + if (state == null) { + return + } + + let stateDeserializer = ( + (typeof state.get === 'function') && state.get('deserializer') || + state.deserializer + ) + + return this.deserializers[stateDeserializer] + } + + clear () { + this.deserializers = {} + } +}