Jsdom: рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ jsdom рдХреЗ рднреАрддрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдордИ 2015  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рджреЛрд╕реНрддреЛрдВ,

рдХреНрдпрд╛ рдХреЛрдИ рдЬреЗрдПрд╕рдбреЙрдо рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ/рд╕рддреНрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╕рд╛рджрд░,
рдЕрд▓рд╡рд╛рд░реЛ

best-fixed-by-webidl2js feature html living standard

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@justinmchase рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

    var jsdom = require('jsdom').jsdom;
    document = jsdom('hello world');
    window = document.defaultView;
    navigator = window.navigator;
    window.localStorage = window.sessionStorage = {
        getItem: function (key) {
            return this[key];
        },
        setItem: function (key, value) {
            this[key] = value;
        }
    };

FAIK рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдордЬрд╛рдХ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рд╕рднреА 29 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпреЗ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ ES2015 рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИрдВ :(ред рд╣рдо getItem/setItem/etc рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдкрддреНрддрд┐ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЗрди-рдореЗрдореЛрд░реА рдЕрдиреБрднрд╡ рдпрд╛рдиреА рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ
рдпрд╣ рдХрдо рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП (рдпрд╛рдиреА рдХреЗрд╡рд▓ getItem/setItem рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЧреБрдгреЛрдВ рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

@ рд╕реЗрдмрдорд╛рд╕реНрдЯрд░ : рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╢рд┐рдо рд▓рд┐рдЦрд╛ рдерд╛ред

https://github.com/mnahkies/node-storage-shim

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдХреНрд╖рдгрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдЙрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рдзрд┐ рдирд╛рдореЛрдВ рд╕реЗ рдЯрдХрд░рд╛рддреА рд╣реИрдВред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдИрд╡реЗрдВрдЯ рдлрд╛рдпрд░рд┐рдВрдЧ рднрд╛рдЧреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд░рд┐рдпрд▓ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдЗрди рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдЙрдбрд╝ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдЖрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рдХреБрдВрдЬрд┐рдпреЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрди рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рдлрд╛рджрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
https://github.com/mnahkies/node-storage-shim/blob/master/test.js

рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рдХрд┐рди рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдореБрдЦреНрдп рдмрд╛рдд рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрд╡реЗрдВрдЯ рдлрд╛рдпрд░рд┐рдВрдЧ рд╣реИред

рдореБрдЭреЗ рдЗрд╕реЗ jsdom рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред

рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рдХрд┐рди рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╕реАрдзреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ in

localStorage.myKey = "myVal";
localStorage.getItem('myKey') // 'myVal'

localStorage.setItem('otherKey', 'val')
localStorage.otherKey // 'val'

рдЬрд┐рд╕реЗ рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдЧреЗрдЯрдЯрд░ рдмрдирд╛рдХрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕реЗрдЯрдЗрдЯрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░реА рддрд░рдл (рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдордирдорд╛рдиреА рдЧреБрдг рд╕реЗрдЯ рдХрд░рдирд╛) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреБрдВрдЬреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдБ, рдпрд╣ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рд╣реИред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП ES6 рдкреНрд░реЙрдХреНрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, v8 рдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдФрд░ рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ!)

рд╣рдо рдЗрд╕реА рд░реЛрдб рдмреНрд▓реЙрдХ рдХреЛ jsdom рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдорд╛рд░ рд░рд╣реЗ рд╣реИрдВ

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

var localStorage = {
  getItem: function (key) {
    return this[key];
  },
  setItem: function (key, value) {
    this[key] = value;
  }
};

localStorage.setItem('foo', 'bar');
localStorage.bar = 'foo'
assert(localStorage.foo === 'bar')
assert(localStorage.getItem('bar') === 'foo')

рдореБрдЭреЗ рдХрд┐рд╕рдХреА рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ?

рдЬрдм рдЖрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЗрдЯрдо рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рд╣рдореЗрд╢рд╛ рдорд╛рди рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕реЗ:

localStorage.foo = 35
assert(typeof localStorage.foo === "string")

localStorage.foo = {my: 'object'}
assert(localStorage.foo === "[object Object]")

рдпрд╣ ES6 рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ

рдЕрдЪреНрдЫрд╛ рдРрд╕рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд╣ рд╢рд░реНрдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ;)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЬреЗрдПрд╕рдбреЙрдо рджреНрд╡рд╛рд░рд╛ рдореБрдЦреМрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╣реЛрдЧрд╛

+1

+1

рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдХреБрдЫ рдРрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рд╣реИрдВред

рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╕рдорд╛рдзрд╛рди рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ jsdom рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рдлрд╛рджрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛

@mnahkies рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ,

рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП +1, рдПрдордбреАрдПрди рдкрд░ рдЙрджрд╛рд╣рд░рдг setItem рдФрд░ getItem рдХреЛ рднрдВрдбрд╛рд░рдг рдХреЗ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд╛рдпрдм рд╣реИрдВред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ jasmine.createSpy рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ (рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬреИрд╕реНрдореАрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЕрдиреНрдп рдЬрд╛рд╕реВрд╕ libs рднреА рдЗрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

@justinmchase рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

    var jsdom = require('jsdom').jsdom;
    document = jsdom('hello world');
    window = document.defaultView;
    navigator = window.navigator;
    window.localStorage = window.sessionStorage = {
        getItem: function (key) {
            return this[key];
        },
        setItem: function (key, value) {
            this[key] = value;
        }
    };

FAIK рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдордЬрд╛рдХ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рддрдм рддрдХ рдареАрдХ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЧрд▓рддреА рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрдЧ рдмрдирд╛рддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЖрдк рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд░рдЦрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рд╕реНрд╡реИрдкреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрд░реЗ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЙрд▓реНрдпреВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди, рд╕рдВрдкреАрдбрд╝рди, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрдиреЗ рдЖрджрд┐ рдЬреИрд╕реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╛рдж рдХреА рддрд╛рд░реАрдЦ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣ рд╕рдордп рд╣реИ!!!

Node.js v6 рдЖ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде... PROXIES.

@Sebmaster , рдХреНрдпрд╛ рдЖрдк webidl2js рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ, рдЬрдм рдирд╛рдорд┐рдд рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕/рдбрд┐рд▓реАрдЯрд░реНрд╕ рдореМрдЬреВрдж рд╣реЛрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ NamedNodeMap рдпрд╛ NodeList рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЕрдиреНрдп рд╕рд╛рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдХреЛрд░ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

https://html.spec.whatwg.org/multipage/webstorage.html#storage -2 рдореЗрдВ рдЖрдИрдбреАрдПрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЗ getItem, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

+1

рдЖрдк рдиреЛрдб-рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

var LocalStorage = require('node-localstorage').LocalStorage;
global.localStorage = new LocalStorage('./build/localStorageTemp');

global.document = jsdom('');

global.window = document.defaultView;
global.window.localStorage = global.localStorage;

@adjavaherian @justinmchase рдореИрдВ jsdom рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-jwt-auth рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-jwt-auth-redux рджреЛрдиреЛрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП localStorage рдФрд░ sessionStorage ред рдореИрдВрдиреЗ рдареАрдХ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЖрдкрдХрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ jsdom рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП webidl2js рд╕рдкреЛрд░реНрдЯ рдЕрдм рдореМрдЬреВрдж рд╣реИред рдЕрдЧрд░ рд▓реЛрдЧ рдЗрд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрддрд░реЗ DOMStringList рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред

рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдм рдХреБрдЫ рдЗрди-рдореЗрдореЛрд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЕрдВрддрддрдГ рд╣рдореЗрдВ рдбрд┐рд╕реНрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд▓реЛрдЧ рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред (рдХреНрдпрд╛ рд▓реЛрдЧ рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?)

рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдк рдореБрдЭреЗ рдпрд╣ рдореБрджреНрджрд╛ рд╕реМрдВрдк рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдирдХрд▓реА рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдХреЛрдИ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ localStorage.getItem() рдХреЛ null рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ undefined :

const jsdom = require('jsdom');
// setup the simplest document possible
const doc = jsdom.jsdom('<!doctype html><html><body></body></html>');;

// get the window object out of the document
const win = doc.defaultView;

win.localStorage = win.sessionStorage = {
  getItem: function(key) {
    const value = this[key];
    return typeof value === 'undefined' ? null : value;
  },
  setItem: function (key, value) {
    this[key] = value;
  },
  removeItem: function(key) {
    return delete this[key]
  }
};

// set globals for mocha that make access to document and window feel
// natural in the test environment
global.document = doc;
global.window = win;

рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреНрдпреЛрдВ рд╣реИ? рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдиреАрдЪреЗ рджреА рдЧрдИ рд░реЗрдЦрд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред json.parse() рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдЕрдЧрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ undefined рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ null рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

let users = JSON.parse(localStorage.getItem('users')) || [];

@simoami рдмрд╕ win.localStorage = win.sessionStorage = { ... } рд╕рд╛рде рдЕрдкрдиреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВред рдпрд╣ рд╡рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рд╣реИ рдЬреЛ рджреЛрдиреЛрдВ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЧреЗрдЯ/рд╕реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЙрд╕реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП localStorage.set('foo', 'bar') рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ sessionStorage.get('foo') рдХрд╛рдо рдХрд░реЗрдЧрд╛ - рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

https://gist.github.com/rkurbatov/17468b2ade459a7498c8209800287a03 - рд╣рдо рдЗрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд╛рдиреАрдп/рд╕рддреНрд░ рднрдВрдбрд╛рд░рдг рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ @capaj . рджреНрд╡рд╛рд░рд╛ https://github.com/capaj/localstorage-polyfill рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

рдЬреЛ рд▓реЛрдЧ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓ рдХреЗ jsdom рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ window._localStorage рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирдХрд▓реА рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдИрд╡реЗрдВрдЯ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛

рдФрд░ рдЬреЛ рдХреЛрдИ рднреА рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, node-localstorage рдЖрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреЗрдХрд╛рд░ рд╣реИрдВ, рдЖрдк рдкрд╣рд┐рдпрд╛ рдХрд╛ рдкреБрди: рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рдЬреИрд╕реЗ for(var key in localStorage) рдпрд╛ Object.keys(localStorage) рдЖрджрд┐ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕