diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb436ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# WebStorm non-sharable files +.idea/workspace.xml + +# Log files +*.log + +# NPM modules +node_modules diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..936869e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +react-cookie \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..d821048 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8662aa9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..efbb6ea --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/react-cookie.iml b/.idea/react-cookie.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/react-cookie.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..922003b --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2bf24b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebe570a --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# react-cookie +Load and save cookies within your React application + +## Download +NPM: `npm install react-cookie`
+Bower: `bower install react-cookie` + +# Examples + +## ES6 +```js +import React from 'react'; +import cookie from 'react-cookie'; + +export default class MyApp extends React.component { + + constructor(props) { + super(props); + this.state = { userId: cookie.load('userId') }; + } + + onLogin(userId) { + this.state.userId = userId; + cookie.save('userId', nextState.userId); + } + + render() { + return ( + + ); + } + +} +``` + +## ES5 +```js +var React = require('react'); +var cookie = require('react-cookie'); + +var MyApp = React.createClass({ + + getInitialState: function() { + return { userId: cookie.load('userId') }; + }, + + onLogin: function(userId) { + this.state.userId = userId; + cookie.save('userId', nextState.userId); + }, + + render: function() { + return ( + + ); + } + +}); + +module.exports = MyApp; +``` + +## Usage + +### `reactCookie.get(name: string)` +### `reactCookie.save(name: string, val, [opt])` + +## opt +Support all the cookie options from the RFC. + +### path +> cookie path + +### expires +> absolute expiration date for the cookie (Date object) + +### maxAge +> relative max age of the cookie from when the client receives it (seconds) + +### domain +> domain for the cookie + +### secure +> true or false + +### httpOnly +> true or false + +## License +This project is under the MIT license. You are free to do whatever you want with it. \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..d1f8913 --- /dev/null +++ b/bower.json @@ -0,0 +1,22 @@ +{ + "name": "react-cookie", + "main": "dist/react-cookie.js", + "version": "0.1.0", + "homepage": "https://github.com/eXon/react-cookie", + "authors": [ + "Benoit Tremblay " + ], + "description": "Load and save cookies within your React application", + "keywords": [ + "cookie", + "cookies", + "react", + "reactjs", + "jsx" + ], + "ignore": [ + "**/.*", + "node_modules" + ], + "license": "MIT" +} diff --git a/dist/react-cookie.js b/dist/react-cookie.js new file mode 100644 index 0000000..b37e2ad --- /dev/null +++ b/dist/react-cookie.js @@ -0,0 +1,115 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o "foo=bar; httpOnly" +/// +/// @param {String} name +/// @param {String} val +/// @param {Object} options +/// @return {String} +var serialize = function(name, val, opt){ + opt = opt || {}; + var enc = opt.encode || encode; + var pairs = [name + '=' + enc(val)]; + + if (null != opt.maxAge) { + var maxAge = opt.maxAge - 0; + if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); + pairs.push('Max-Age=' + maxAge); + } + + if (opt.domain) pairs.push('Domain=' + opt.domain); + if (opt.path) pairs.push('Path=' + opt.path); + if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); + if (opt.httpOnly) pairs.push('HttpOnly'); + if (opt.secure) pairs.push('Secure'); + + return pairs.join('; '); +}; + +/// Parse the given cookie header string into an object +/// The object has the various cookies as keys(names) => values +/// @param {String} str +/// @return {Object} +var parse = function(str, opt) { + opt = opt || {}; + var obj = {} + var pairs = str.split(/; */); + var dec = opt.decode || decode; + + pairs.forEach(function(pair) { + var eq_idx = pair.indexOf('=') + + // skip things that don't look like key=value + if (eq_idx < 0) { + return; + } + + var key = pair.substr(0, eq_idx).trim() + var val = pair.substr(++eq_idx, pair.length).trim(); + + // quoted values + if ('"' == val[0]) { + val = val.slice(1, -1); + } + + // only assign once + if (undefined == obj[key]) { + try { + obj[key] = dec(val); + } catch (e) { + obj[key] = val; + } + } + }); + + return obj; +}; + +var encode = encodeURIComponent; +var decode = decodeURIComponent; + +module.exports.serialize = serialize; +module.exports.parse = parse; + +},{}]},{},[1]); diff --git a/dist/react-cookie.min.js b/dist/react-cookie.min.js new file mode 100644 index 0000000..bf3f972 --- /dev/null +++ b/dist/react-cookie.min.js @@ -0,0 +1 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o", + "license": "MIT", + "scripts": { + "build": "browserify index.js > dist/react-cookie.js & uglifyjs dist/react-cookie.js -o dist/react-cookie.min.js" + }, + "dependencies": { + "cookie": "^0.1.2" + }, + "devDependencies": { + "browserify": "^9.0.3", + "uglify-js": "^2.4.17" + } +}