ahoy_matey 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 47cc04adfac18b2f14547b376a3465f601d59307
4
- data.tar.gz: 6e1638296155ceab46f9d105e52d7422259ebc63
3
+ metadata.gz: 640c91af9741127b748f530d102751a73f71b4c9
4
+ data.tar.gz: b341bf79dc207745b63f7a419711d402f2fc8cc0
5
5
  SHA512:
6
- metadata.gz: 1f0a217bd790fff2b55e1e6395ea940079b2a457efc1328c61a054d6a3835f0d6fcb9c154eae7f3496f8a79559282cc3d9b1eefb2db4ce651d74d6c14dce536a
7
- data.tar.gz: 6789de07f914f49b05f72b4b5517935571368be2e43987421e170dd8da838d78a1fa48e1d878424a9800f53ea779b5dcd8b3523432977f7aec4a29e296941a41
6
+ metadata.gz: 9f154fb9aefbee54089fc9c6e269c26e7f09eb4229c211ccd073d9d8a25fb191c875155a687e358966ff20b9dc3c39bf00e1a6701eda787ed212a800e594408c
7
+ data.tar.gz: ddac0a216a109b50904be1a2553cfa48df607908dacb50a3329f88bf8a7025faaa86df4e067247390dac8c2dbccc2d520fcabe50e072fe4240111682ffb46b5e
@@ -1,3 +1,8 @@
1
+ ## 2.0.1
2
+
3
+ - Added `Ahoy.server_side_visits = :when_needed` to automatically create visits server-side when needed for events and `visitable`
4
+ - Better handling of visit duration and expiration in JavaScript
5
+
1
6
  ## 2.0.0
2
7
 
3
8
  - Removed dependency on jQuery
data/README.md CHANGED
@@ -79,10 +79,10 @@ skip_before_action :track_ahoy_visit
79
79
 
80
80
  This is typically useful for APIs.
81
81
 
82
- You can also defer visit tracking to JavaScript (Ahoy 1.0 behavior) with:
82
+ You can also defer visit tracking to JavaScript. This is useful for preventing bots (that aren’t detected by their user agent) and users with cookies disabled from creating a new visit on each request. `:when_needed` will create visits server-side when needed by events, and `false` will discard events without a visit.
83
83
 
84
84
  ```ruby
85
- Ahoy.server_side_visits = false
85
+ Ahoy.server_side_visits = :when_needed
86
86
  ```
87
87
 
88
88
  ### Events
@@ -131,19 +131,7 @@ See the [API spec](#api-spec).
131
131
 
132
132
  ### Associated Models
133
133
 
134
- Say we want to associate orders with visits. Ahoy can do this automatically.
135
-
136
- First, generate a migration and add a `visit_id` column (not needed for Mongoid).
137
-
138
- ```ruby
139
- class AddVisitIdToOrders < ActiveRecord::Migration[5.1]
140
- def change
141
- add_column :orders, :visit_id, :bigint
142
- end
143
- end
144
- ```
145
-
146
- Then, add `visitable` to the model.
134
+ Say we want to associate orders with visits. Just add `visitable` to the model.
147
135
 
148
136
  ```ruby
149
137
  class Order < ApplicationRecord
@@ -161,6 +149,16 @@ Order.joins(:visit).group("city").count
161
149
  Order.joins(:visit).group("device_type").count
162
150
  ```
163
151
 
152
+ Here’s what the migration to add the `visit_id` column should look like:
153
+
154
+ ```ruby
155
+ class AddVisitIdToOrders < ActiveRecord::Migration[5.1]
156
+ def change
157
+ add_column :orders, :visit_id, :bigint
158
+ end
159
+ end
160
+ ```
161
+
164
162
  Customize the column and class name with:
165
163
 
166
164
  ```ruby
@@ -205,7 +203,7 @@ or use a proc
205
203
  Ahoy.user_method = ->(controller) { controller.true_user }
206
204
  ```
207
205
 
208
- ### Doorkeeper
206
+ #### Doorkeeper
209
207
 
210
208
  To attach the user with [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper), be sure you have a `current_resource_owner` method in `ApplicationController`.
211
209
 
@@ -221,7 +219,7 @@ end
221
219
 
222
220
  ### Exclusions
223
221
 
224
- Bots are excluded from tracking by default. To enable, use:
222
+ Bots are excluded from tracking by default. To include them, use:
225
223
 
226
224
  ```ruby
227
225
  Ahoy.track_bots = true
@@ -474,6 +472,20 @@ Send a `POST` request to `/ahoy/events` with `Content-Type: application/json` an
474
472
  }
475
473
  ```
476
474
 
475
+ ## Webpacker
476
+
477
+ For Webpacker, use Yarn to install the JavaScript library:
478
+
479
+ ```sh
480
+ yarn add ahoy.js
481
+ ```
482
+
483
+ Then include it in your pack.
484
+
485
+ ```es6
486
+ import ahoy from "ahoy.js";
487
+ ```
488
+
477
489
  ## History
478
490
 
479
491
  View the [changelog](https://github.com/ankane/ahoy/blob/master/CHANGELOG.md)
@@ -5,11 +5,11 @@ module Ahoy
5
5
  skip_before_action(*filters, raise: false)
6
6
  skip_after_action(*filters, raise: false)
7
7
  skip_around_action(*filters, raise: false)
8
- before_action :verify_request_size
9
8
  else
10
9
  skip_action_callback *filters
11
- before_action :verify_request_size
12
10
  end
11
+ before_action :verify_request_size
12
+ before_action :renew_cookies
13
13
 
14
14
  if respond_to?(:protect_from_forgery)
15
15
  protect_from_forgery with: :null_session, if: -> { Ahoy.protect_from_forgery }
@@ -21,6 +21,13 @@ module Ahoy
21
21
  @ahoy ||= Ahoy::Tracker.new(controller: self, api: true)
22
22
  end
23
23
 
24
+ # set proper ttl if cookie generated from JavaScript
25
+ # approach is not perfect, as user must reload the page
26
+ # for new cookie settings to take effect
27
+ def renew_cookies
28
+ set_ahoy_cookies if params[:js] && !Ahoy.api_only
29
+ end
30
+
24
31
  def verify_request_size
25
32
  if request.content_length > Ahoy.max_content_length
26
33
  logger.info "[ahoy] Payload too large"
@@ -2,6 +2,7 @@ module Ahoy
2
2
  class VisitsController < BaseController
3
3
  def create
4
4
  ahoy.track_visit
5
+
5
6
  render json: {
6
7
  visit_token: ahoy.visit_token,
7
8
  visitor_token: ahoy.visitor_token,
@@ -7,7 +7,7 @@ module Ahoy
7
7
  begin
8
8
  Geocoder.search(ip).first
9
9
  rescue => e
10
- $stderr.puts e.message
10
+ Rails.logger.warn "[ahoy] Geocode error: #{e.class.name}: #{e.message}"
11
11
  nil
12
12
  end
13
13
 
@@ -27,6 +27,8 @@ Ahoy.api = true
27
27
  Ahoy.server_side_visits = false
28
28
  ```
29
29
 
30
+ You can also try the new `Ahoy.server_side_visits = :when_needed` to automatically create visits server-side when needed for events and `visitable`.
31
+
30
32
  If you use `visitable`, add `class_name` to each instance:
31
33
 
32
34
  ```ruby
@@ -39,6 +39,10 @@ module Ahoy
39
39
  Ahoy.token_generator.call
40
40
  end
41
41
 
42
+ def visit_or_create
43
+ visit
44
+ end
45
+
42
46
  protected
43
47
 
44
48
  def bot?
@@ -27,7 +27,7 @@ module Ahoy
27
27
 
28
28
  def track_ahoy_visit
29
29
  if ahoy.new_visit?
30
- ahoy.track_visit(defer: !Ahoy.server_side_visits)
30
+ ahoy.track_visit(defer: Ahoy.server_side_visits != true)
31
31
  end
32
32
  end
33
33
 
@@ -4,19 +4,21 @@ module Ahoy
4
4
  @visit = visit_model.create!(slice_data(visit_model, data))
5
5
  rescue => e
6
6
  raise e unless unique_exception?(e)
7
- @visit = nil
7
+ remove_instance_variable(:@visit)
8
8
  end
9
9
 
10
10
  def track_event(data)
11
- # if we don't have a visit, let's try to create one first
12
- ahoy.track_visit unless visit
13
-
14
- event = event_model.new(slice_data(event_model, data))
15
- event.visit = visit
16
- begin
17
- event.save!
18
- rescue => e
19
- raise e unless unique_exception?(e)
11
+ visit = visit_or_create
12
+ if visit
13
+ event = event_model.new(slice_data(event_model, data))
14
+ event.visit = visit
15
+ begin
16
+ event.save!
17
+ rescue => e
18
+ raise e unless unique_exception?(e)
19
+ end
20
+ else
21
+ Rails.logger.warn "[ahoy] Event excluded since visit not created: #{data[:visit_token]}"
20
22
  end
21
23
  end
22
24
 
@@ -28,7 +30,7 @@ module Ahoy
28
30
  elsif visit
29
31
  visit.update_attributes(data)
30
32
  else
31
- $stderr.puts "[ahoy] Visit for geocode not found: #{data[:visit_token]}"
33
+ Rails.logger.warn "[ahoy] Visit for geocode not found: #{data[:visit_token]}"
32
34
  end
33
35
  end
34
36
 
@@ -44,7 +46,16 @@ module Ahoy
44
46
  end
45
47
 
46
48
  def visit
47
- @visit ||= visit_model.where(visit_token: ahoy.visit_token).first if ahoy.visit_token
49
+ unless defined?(@visit)
50
+ @visit = visit_model.where(visit_token: ahoy.visit_token).first if ahoy.visit_token
51
+ end
52
+ @visit
53
+ end
54
+
55
+ # if we don't have a visit, let's try to create one first
56
+ def visit_or_create
57
+ ahoy.track_visit if !visit && Ahoy.server_side_visits
58
+ visit
48
59
  end
49
60
 
50
61
  protected
@@ -7,7 +7,7 @@ module Ahoy
7
7
  end
8
8
  class_eval %{
9
9
  def set_ahoy_visit
10
- self.#{name} ||= RequestStore.store[:ahoy].try(:visit)
10
+ self.#{name} ||= RequestStore.store[:ahoy].try(:visit_or_create)
11
11
  end
12
12
  }
13
13
  end
@@ -42,6 +42,8 @@ module Ahoy
42
42
  if defer
43
43
  set_cookie("ahoy_track", true, nil, false)
44
44
  else
45
+ delete_cookie("ahoy_track")
46
+
45
47
  data = {
46
48
  visit_token: visit_token,
47
49
  visitor_token: visitor_token,
@@ -91,6 +93,10 @@ module Ahoy
91
93
  @visit ||= @store.visit
92
94
  end
93
95
 
96
+ def visit_or_create
97
+ @visit ||= @store.visit_or_create
98
+ end
99
+
94
100
  def new_visit?
95
101
  !existing_visit_token
96
102
  end
@@ -130,13 +136,13 @@ module Ahoy
130
136
 
131
137
  def reset
132
138
  reset_visit
133
- request.cookie_jar.delete("ahoy_visitor")
139
+ delete_cookie("ahoy_visitor")
134
140
  end
135
141
 
136
142
  def reset_visit
137
- request.cookie_jar.delete("ahoy_visit")
138
- request.cookie_jar.delete("ahoy_events")
139
- request.cookie_jar.delete("ahoy_track")
143
+ delete_cookie("ahoy_visit")
144
+ delete_cookie("ahoy_events")
145
+ delete_cookie("ahoy_track")
140
146
  end
141
147
 
142
148
  protected
@@ -163,6 +169,10 @@ module Ahoy
163
169
  request.cookie_jar[name] = cookie
164
170
  end
165
171
 
172
+ def delete_cookie(name)
173
+ request.cookie_jar.delete(name)
174
+ end
175
+
166
176
  def trusted_time(time = nil)
167
177
  if !time || (api? && !(1.minute.ago..Time.now).cover?(time))
168
178
  Time.zone.now
@@ -1,3 +1,3 @@
1
1
  module Ahoy
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -1,76 +1,76 @@
1
1
  (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define([], factory);
6
- else if(typeof exports === 'object')
7
- exports["ahoy"] = factory();
8
- else
9
- root["ahoy"] = factory();
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define([], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["ahoy"] = factory();
8
+ else
9
+ root["ahoy"] = factory();
10
10
  })(typeof self !== 'undefined' ? self : this, function() {
11
11
  return /******/ (function(modules) { // webpackBootstrap
12
- /******/ // The module cache
13
- /******/ var installedModules = {};
12
+ /******/ // The module cache
13
+ /******/ var installedModules = {};
14
14
  /******/
15
- /******/ // The require function
16
- /******/ function __webpack_require__(moduleId) {
15
+ /******/ // The require function
16
+ /******/ function __webpack_require__(moduleId) {
17
17
  /******/
18
- /******/ // Check if module is in cache
19
- /******/ if(installedModules[moduleId]) {
20
- /******/ return installedModules[moduleId].exports;
21
- /******/ }
22
- /******/ // Create a new module (and put it into the cache)
23
- /******/ var module = installedModules[moduleId] = {
24
- /******/ i: moduleId,
25
- /******/ l: false,
26
- /******/ exports: {}
27
- /******/ };
18
+ /******/ // Check if module is in cache
19
+ /******/ if(installedModules[moduleId]) {
20
+ /******/ return installedModules[moduleId].exports;
21
+ /******/ }
22
+ /******/ // Create a new module (and put it into the cache)
23
+ /******/ var module = installedModules[moduleId] = {
24
+ /******/ i: moduleId,
25
+ /******/ l: false,
26
+ /******/ exports: {}
27
+ /******/ };
28
28
  /******/
29
- /******/ // Execute the module function
30
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
29
+ /******/ // Execute the module function
30
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31
31
  /******/
32
- /******/ // Flag the module as loaded
33
- /******/ module.l = true;
32
+ /******/ // Flag the module as loaded
33
+ /******/ module.l = true;
34
34
  /******/
35
- /******/ // Return the exports of the module
36
- /******/ return module.exports;
37
- /******/ }
35
+ /******/ // Return the exports of the module
36
+ /******/ return module.exports;
37
+ /******/ }
38
38
  /******/
39
39
  /******/
40
- /******/ // expose the modules object (__webpack_modules__)
41
- /******/ __webpack_require__.m = modules;
40
+ /******/ // expose the modules object (__webpack_modules__)
41
+ /******/ __webpack_require__.m = modules;
42
42
  /******/
43
- /******/ // expose the module cache
44
- /******/ __webpack_require__.c = installedModules;
43
+ /******/ // expose the module cache
44
+ /******/ __webpack_require__.c = installedModules;
45
45
  /******/
46
- /******/ // define getter function for harmony exports
47
- /******/ __webpack_require__.d = function(exports, name, getter) {
48
- /******/ if(!__webpack_require__.o(exports, name)) {
49
- /******/ Object.defineProperty(exports, name, {
50
- /******/ configurable: false,
51
- /******/ enumerable: true,
52
- /******/ get: getter
53
- /******/ });
54
- /******/ }
55
- /******/ };
46
+ /******/ // define getter function for harmony exports
47
+ /******/ __webpack_require__.d = function(exports, name, getter) {
48
+ /******/ if(!__webpack_require__.o(exports, name)) {
49
+ /******/ Object.defineProperty(exports, name, {
50
+ /******/ configurable: false,
51
+ /******/ enumerable: true,
52
+ /******/ get: getter
53
+ /******/ });
54
+ /******/ }
55
+ /******/ };
56
56
  /******/
57
- /******/ // getDefaultExport function for compatibility with non-harmony modules
58
- /******/ __webpack_require__.n = function(module) {
59
- /******/ var getter = module && module.__esModule ?
60
- /******/ function getDefault() { return module['default']; } :
61
- /******/ function getModuleExports() { return module; };
62
- /******/ __webpack_require__.d(getter, 'a', getter);
63
- /******/ return getter;
64
- /******/ };
57
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
58
+ /******/ __webpack_require__.n = function(module) {
59
+ /******/ var getter = module && module.__esModule ?
60
+ /******/ function getDefault() { return module['default']; } :
61
+ /******/ function getModuleExports() { return module; };
62
+ /******/ __webpack_require__.d(getter, 'a', getter);
63
+ /******/ return getter;
64
+ /******/ };
65
65
  /******/
66
- /******/ // Object.prototype.hasOwnProperty.call
67
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
66
+ /******/ // Object.prototype.hasOwnProperty.call
67
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
68
68
  /******/
69
- /******/ // __webpack_public_path__
70
- /******/ __webpack_require__.p = "";
69
+ /******/ // __webpack_public_path__
70
+ /******/ __webpack_require__.p = "";
71
71
  /******/
72
- /******/ // Load entry module and return exports
73
- /******/ return __webpack_require__(__webpack_require__.s = 0);
72
+ /******/ // Load entry module and return exports
73
+ /******/ return __webpack_require__(__webpack_require__.s = 0);
74
74
  /******/ })
75
75
  /************************************************************************/
76
76
  /******/ ([
@@ -88,8 +88,20 @@ var _objectToFormdata = __webpack_require__(1);
88
88
 
89
89
  var _objectToFormdata2 = _interopRequireDefault(_objectToFormdata);
90
90
 
91
+ var _cookies = __webpack_require__(2);
92
+
93
+ var _cookies2 = _interopRequireDefault(_cookies);
94
+
91
95
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
92
96
 
97
+ /*
98
+ * Ahoy.js
99
+ * Simple, powerful JavaScript analytics
100
+ * https://github.com/ankane/ahoy.js
101
+ * v0.3.0
102
+ * MIT License
103
+ */
104
+
93
105
  var config = {
94
106
  urlPrefix: "",
95
107
  visitsUrl: "/ahoy/visits",
@@ -99,13 +111,7 @@ var config = {
99
111
  platform: "Web",
100
112
  useBeacon: true,
101
113
  startOnReady: true
102
- }; /*
103
- * Ahoy.js
104
- * Simple, powerful JavaScript analytics
105
- * https://github.com/ankane/ahoy.js
106
- * v0.3.0
107
- * MIT License
108
- */
114
+ };
109
115
 
110
116
  var ahoy = window.ahoy || window.Ahoy || {};
111
117
 
@@ -145,41 +151,16 @@ function canTrackNow() {
145
151
 
146
152
  // cookies
147
153
 
148
- // http://www.quirksmode.org/js/cookies.html
149
154
  function setCookie(name, value, ttl) {
150
- var expires = "";
151
- var cookieDomain = "";
152
- if (ttl) {
153
- var date = new Date();
154
- date.setTime(date.getTime() + ttl * 60 * 1000);
155
- expires = "; expires=" + date.toGMTString();
156
- }
157
- var domain = config.cookieDomain || config.domain;
158
- if (domain) {
159
- cookieDomain = "; domain=" + domain;
160
- }
161
- document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/";
155
+ _cookies2.default.set(name, value, ttl, config.cookieDomain || config.domain);
162
156
  }
163
157
 
164
158
  function getCookie(name) {
165
- var i = void 0,
166
- c = void 0;
167
- var nameEQ = name + "=";
168
- var ca = document.cookie.split(';');
169
- for (i = 0; i < ca.length; i++) {
170
- c = ca[i];
171
- while (c.charAt(0) === ' ') {
172
- c = c.substring(1, c.length);
173
- }
174
- if (c.indexOf(nameEQ) === 0) {
175
- return unescape(c.substring(nameEQ.length, c.length));
176
- }
177
- }
178
- return null;
159
+ return _cookies2.default.get(name);
179
160
  }
180
161
 
181
162
  function destroyCookie(name) {
182
- setCookie(name, "", -1);
163
+ _cookies2.default.set(name, "", -1);
183
164
  }
184
165
 
185
166
  function log(message) {
@@ -376,10 +357,6 @@ function createVisit() {
376
357
  log("Active visit");
377
358
  setReady();
378
359
  } else {
379
- if (track) {
380
- destroyCookie("ahoy_track");
381
- }
382
-
383
360
  if (!visitId) {
384
361
  visitId = generateId();
385
362
  setCookie("ahoy_visit", visitId, visitTtl);
@@ -400,7 +377,8 @@ function createVisit() {
400
377
  platform: config.platform,
401
378
  landing_page: window.location.href,
402
379
  screen_width: window.screen.width,
403
- screen_height: window.screen.height
380
+ screen_height: window.screen.height,
381
+ js: true
404
382
  };
405
383
 
406
384
  // referrer
@@ -410,7 +388,11 @@ function createVisit() {
410
388
 
411
389
  log(data);
412
390
 
413
- sendRequest(visitsUrl(), data, setReady);
391
+ sendRequest(visitsUrl(), data, function () {
392
+ // wait until successful to destroy
393
+ destroyCookie("ahoy_track");
394
+ setReady();
395
+ });
414
396
  } else {
415
397
  log("Cookies disabled");
416
398
  setReady();
@@ -449,34 +431,36 @@ ahoy.track = function (name, properties) {
449
431
  name: name,
450
432
  properties: properties || {},
451
433
  time: new Date().getTime() / 1000.0,
452
- id: generateId()
434
+ id: generateId(),
435
+ js: true
453
436
  };
454
437
 
455
- // wait for createVisit to log
456
- documentReady(function () {
457
- log(event);
458
- });
459
-
460
438
  ready(function () {
461
439
  if (!ahoy.getVisitId()) {
462
440
  createVisit();
463
441
  }
464
442
 
465
- event.visit_token = ahoy.getVisitId();
466
- event.visitor_token = ahoy.getVisitorId();
443
+ ready(function () {
444
+ log(event);
467
445
 
468
- if (canTrackNow()) {
469
- trackEventNow(event);
470
- } else {
471
- eventQueue.push(event);
472
- saveEventQueue();
446
+ event.visit_token = ahoy.getVisitId();
447
+ event.visitor_token = ahoy.getVisitorId();
473
448
 
474
- // wait in case navigating to reduce duplicate events
475
- setTimeout(function () {
476
- trackEvent(event);
477
- }, 1000);
478
- }
449
+ if (canTrackNow()) {
450
+ trackEventNow(event);
451
+ } else {
452
+ eventQueue.push(event);
453
+ saveEventQueue();
454
+
455
+ // wait in case navigating to reduce duplicate events
456
+ setTimeout(function () {
457
+ trackEvent(event);
458
+ }, 1000);
459
+ }
460
+ });
479
461
  });
462
+
463
+ return true;
480
464
  };
481
465
 
482
466
  ahoy.trackView = function (additionalProperties) {
@@ -623,6 +607,50 @@ function objectToFormData (obj, fd, pre) {
623
607
  module.exports = objectToFormData
624
608
 
625
609
 
610
+ /***/ }),
611
+ /* 2 */
612
+ /***/ (function(module, exports, __webpack_require__) {
613
+
614
+ "use strict";
615
+
616
+
617
+ Object.defineProperty(exports, "__esModule", {
618
+ value: true
619
+ });
620
+ // http://www.quirksmode.org/js/cookies.html
621
+
622
+ exports.default = {
623
+ set: function set(name, value, ttl, domain) {
624
+ var expires = "";
625
+ var cookieDomain = "";
626
+ if (ttl) {
627
+ var date = new Date();
628
+ date.setTime(date.getTime() + ttl * 60 * 1000);
629
+ expires = "; expires=" + date.toGMTString();
630
+ }
631
+ if (domain) {
632
+ cookieDomain = "; domain=" + domain;
633
+ }
634
+ document.cookie = name + "=" + escape(value) + expires + cookieDomain + "; path=/";
635
+ },
636
+ get: function get(name) {
637
+ var i = void 0,
638
+ c = void 0;
639
+ var nameEQ = name + "=";
640
+ var ca = document.cookie.split(';');
641
+ for (i = 0; i < ca.length; i++) {
642
+ c = ca[i];
643
+ while (c.charAt(0) === ' ') {
644
+ c = c.substring(1, c.length);
645
+ }
646
+ if (c.indexOf(nameEQ) === 0) {
647
+ return unescape(c.substring(nameEQ.length, c.length));
648
+ }
649
+ }
650
+ return null;
651
+ }
652
+ };
653
+
626
654
  /***/ })
627
655
  /******/ ])["default"];
628
- });
656
+ });
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ahoy_matey
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties