Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

fm-timepicker

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fm-timepicker - npm Package Compare versions

Comparing version 3.0.4 to 3.0.5

.grunt/grunt-gh-pages/gh-pages/src/demo.html

6

bower.json
{
"name": "fm-timepicker",
"description": "FairManager Time Picker Component",
"version": "3.0.4",
"homepage": "https://github.com/hartwig-at/fm-timepicker",
"version": "3.0.5",
"homepage": "https://github.com/fairmanager/fm-timepicker",
"authors": [

@@ -15,3 +15,3 @@ "Oliver Salzburg <oliver.salzburg@gmail.com>"

"bootstrap": ">=3.0.3",
"hamsterjs": "~1.0.4",
"hamsterjs": "^1.1.0",
"moment": ">=2.5.0",

@@ -18,0 +18,0 @@ "jquery": ">=2.0.3"

/**
* Copyright (C) 2014, HARTWIG Communication & Events
* Copyright (C) 2014-2015, HARTWIG Communication & Events GmbH & Co. KG
*

@@ -24,4 +24,4 @@ * Permission is hereby granted, free of charge, to any person obtaining a copy

*
* @author Oliver Salzburg
* @copyright Copyright (C) 2015, HARTWIG Communication & Events GmbH & Co. KG
* @author Oliver Salzburg <oliver.salzburg@gmail.com>
* @copyright Copyright (C) 2014-2015, HARTWIG Communication & Events GmbH & Co. KG
* @license http://opensource.org/licenses/mit-license.php MIT License

@@ -33,2 +33,4 @@ */

/* globals $, angular, Hamster, moment */
// Declare fmComponents module if it doesn't exist.

@@ -57,4 +59,4 @@ try {

start = moment( start );
end = moment( end );
start = moment( start );
end = moment( end );
interval = interval || moment.duration( 30, "minutes" );

@@ -78,11 +80,11 @@

$scope.style = $scope.style || "dropdown";
$scope.isOpen = $scope.isOpen || false;
$scope.format = $scope.format || "LT";
$scope.startTime = $scope.startTime || moment( $scope.reference ).startOf( "day" );
$scope.endTime = $scope.endTime || moment( $scope.reference ).endOf( "day" );
$scope.interval = $scope.interval || moment.duration( 30, "minutes" );
$scope.style = $scope.style || "dropdown";
$scope.isOpen = $scope.isOpen || false;
$scope.format = $scope.format || "LT";
$scope.startTime = $scope.startTime || moment( $scope.reference ).startOf( "day" );
$scope.endTime = $scope.endTime || moment( $scope.reference ).endOf( "day" );
$scope.interval = $scope.interval || moment.duration( 30, "minutes" );
$scope.largeInterval = $scope.largeInterval || moment.duration( 60, "minutes" );
$scope.strict = $scope.strict || false;
$scope.btnClass = $scope.btnClass || "btn-default";
$scope.strict = $scope.strict || false;
$scope.btnClass = $scope.btnClass || "btn-default";

@@ -96,3 +98,3 @@ if( moment.tz ) {

// Round the model value up to the next valid time that fits the configured interval.
var modelMilliseconds = $scope.ngModel.valueOf();
var modelMilliseconds = $scope.ngModel.valueOf();
var intervalMilliseconds = $scope.interval.asMilliseconds();

@@ -167,2 +169,6 @@

$scope.activeIndex = 0;
if( !model ) {
return;
}
// We step through each possible value instead of calculating the index directly,

@@ -197,3 +203,4 @@ // to make sure we account for DST changes in the reference day.

if( newInterval.asMilliseconds() < 1 ) {
console.error( "[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default." );
console.error(
"[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default." );
$scope.interval = moment.duration( 30, "minutes" );

@@ -205,3 +212,4 @@ }

if( newInterval.asMilliseconds() < 10 ) {
console.error( "[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default." );
console.error(
"[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default." );
$scope.largeInterval = moment.duration( 60, "minutes" );

@@ -213,11 +221,12 @@ }

// Pick array apart.
var newInterval = newValues[ 0 ];
var newInterval = newValues[ 0 ];
var newLargeInterval = newValues[ 1 ];
// Get millisecond values for the intervals.
var newIntervalMilliseconds = newInterval.asMilliseconds();
var newIntervalMilliseconds = newInterval.asMilliseconds();
var newLargeIntervalMilliseconds = newLargeInterval.asMilliseconds();
// Check if the large interval is a multiple of the interval.
if( 0 !== ( newLargeIntervalMilliseconds % newIntervalMilliseconds ) ) {
console.warn( "[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead." );
$scope.largeInterval = moment.duration( newIntervalMilliseconds * 5 );
console.warn(
"[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead." );
$scope.largeInterval = moment.duration( newIntervalMilliseconds * 5 );
newLargeIntervalMilliseconds = $scope.largeInterval.asMilliseconds();

@@ -252,34 +261,33 @@ }

template : "<div>" +
" <div class='input-group'>" +
" <span class='input-group-btn' ng-if='style==\"sequential\"'>" +
" <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'>" +
" <span class='glyphicon glyphicon-minus'></span>" +
" </button>" +
" </span>" +
" <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()' ng-click='handleInputClick()'>" +
" <span class='input-group-btn'>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'>" +
" <span class='glyphicon glyphicon-plus'></span>" +
" </button>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle>" +
" <span class='glyphicon glyphicon-time'></span>" +
" </button>" +
" </span>" +
" </div>" +
" <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'>" +
" <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\">" +
// Fill an empty array with time values between start and end time with the given interval, then iterate over that array.
" <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'>" +
// For each item, check if it is the last item. If it is, communicate the index to a method in the scope.
// empty string on false instead of noop to avoid false as every other option in angular 1.4.x
" {{$last?largestPossibleIndexIs($index):''}}" +
// Render a link into the list item, with the formatted time value.
" <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a>" +
" </li>" +
" </ul>" +
" </div>" +
"</div>",
replace : true,
restrict : "E",
scope : {
" <div class='input-group'>" +
" <span class='input-group-btn' ng-if='style==\"sequential\"'>" +
" <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'>" +
" <span class='glyphicon glyphicon-minus'></span>" +
" </button>" +
" </span>" +
" <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()'>" +
" <span class='input-group-btn'>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'>" +
" <span class='glyphicon glyphicon-plus'></span>" +
" </button>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle>" +
" <span class='glyphicon glyphicon-time'></span>" +
" </button>" +
" </span>" +
" </div>" +
" <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'>" +
" <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\">" +
// Fill an empty array with time values between start and end time with the given interval, then iterate over that array.
" <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'>" +
// For each item, check if it is the last item. If it is, communicate the index to a method in the scope.
" {{$last?largestPossibleIndexIs($index):angular.noop()}}" +
// Render a link into the list item, with the formatted time value.
" <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a>" +
" </li>" +
" </ul>" +
" </div>" +
"</div>",
replace : true,
restrict : "E",
scope : {
ngModel : "=",

@@ -321,3 +329,4 @@ format : "=?",

if( scope.strict ) {
timeValid = timeValid && checkTimeValueWithinBounds( time ) && checkTimeValueFitsInterval( time );
timeValid = timeValid && checkTimeValueWithinBounds( time ) && checkTimeValueFitsInterval(
time );
}

@@ -341,2 +350,4 @@

controller.$setValidity( "interval", to );
controller.$setValidity( "start", to );
controller.$setValidity( "end", to );
}

@@ -353,5 +364,13 @@

if( scope.strict ) {
timeValid = timeValid && checkTimeValueWithinBounds( scope.time ) && checkTimeValueFitsInterval( scope.time );
timeValid = timeValid && checkTimeValueWithinBounds( scope.time ) && checkTimeValueFitsInterval(
scope.time );
}
if( !scope.startDate.isValid() ) {
controller.$setValidity( "start", false );
}
if( !scope.endDate.isValid() ) {
controller.$setValidity( "end", false );
}
if( timeValid ) {

@@ -494,3 +513,3 @@ // If the string is valid, convert it to a moment instance, store in the model and...

// Retrieve offset from the top and height of the list element.
var top = selectedListElement.length ? selectedListElement.position().top : 0;
var top = selectedListElement.length ? selectedListElement.position().top : 0;
var height = selectedListElement.length ? selectedListElement.outerHeight( true ) : 0;

@@ -506,3 +525,3 @@ // Scroll the list to bring the selected list element into the view.

if( !scope.isOpen ) {
scope.isOpen = true;
scope.isOpen = true;
scope.modelPreview = scope.ngModel ? scope.ngModel.clone() : scope.startTime.clone();

@@ -532,18 +551,2 @@ $timeout( ensureUpdatedView );

/**
* This function is meant to handle clicking on the time input
* box if it is already focused. Previously nothing would happen
* and you would have to click the button or leave focus and
* reclick to get the popup to open again. Adding this as a click
* event makes it pop open again even if the input is focused.
*/
scope.handleInputClick = function handleInputClick( $event ) {
// bail if we aren't doing a dropdown
if (scope.style !== "dropdown") {
return;
}
openPopup();
};
scope.handleListClick = function handleListClick( $event ) {

@@ -587,3 +590,3 @@ // When the list scrollbar is clicked, this can cause the list to lose focus.

scope.ngModel = scope.ensureTimeIsWithinBounds( scope.ngModel );
scope.time = scope.ngModel.format( scope.format );
scope.time = scope.ngModel.format( scope.format );
}

@@ -600,3 +603,3 @@ scope.activeIndex = Math.min( scope.largestPossibleIndex, scope.activeIndex + 1 );

scope.ngModel = scope.ensureTimeIsWithinBounds( scope.ngModel );
scope.time = scope.ngModel.format( scope.format );
scope.time = scope.ngModel.format( scope.format );
}

@@ -631,3 +634,3 @@ scope.activeIndex = Math.max( 0, scope.activeIndex - 1 );

scope.ngModel = scope.modelPreview;
scope.isOpen = false;
scope.isOpen = false;
}

@@ -644,3 +647,4 @@ break;

scope.modelPreview = scope.ensureTimeIsWithinBounds( scope.modelPreview );
scope.activeIndex = Math.max( 0, scope.activeIndex - scope.largeIntervalIndexJump );
scope.activeIndex = Math.max( 0,
scope.activeIndex - scope.largeIntervalIndexJump );
break;

@@ -652,3 +656,3 @@ case 34:

scope.modelPreview = scope.ensureTimeIsWithinBounds( scope.modelPreview );
scope.activeIndex = Math.min( scope.largestPossibleIndex,
scope.activeIndex = Math.min( scope.largestPossibleIndex,
scope.activeIndex + scope.largeIntervalIndexJump );

@@ -692,3 +696,3 @@ break;

var inputElement = element.find( "input" );
var inputElement = element.find( "input" );
var popupListElement = element.find( "ul" );

@@ -695,0 +699,0 @@

@@ -1,1 +0,1 @@

!function(){"use strict";try{angular.module("fm.components")}catch(a){angular.module("fm.components",[])}angular.module("fm.components").filter("fmTimeFormat",function(){return function(a,b){return"number"==typeof a&&(a=moment(a)),moment(a).format(b)}}).filter("fmTimeInterval",function(){return function(a,b,c,d){if(!b||!c)return a;b=moment(b),c=moment(c),d=d||moment.duration(30,"minutes");for(var e=b.clone();+c>=+e;e.add(d))a.push(+e);return a}}).controller("fmTimepickerController",["$scope",function(a){if(a.reference=a.reference?moment(a.reference):moment(),a.style=a.style||"dropdown",a.isOpen=a.isOpen||!1,a.format=a.format||"LT",a.startTime=a.startTime||moment(a.reference).startOf("day"),a.endTime=a.endTime||moment(a.reference).endOf("day"),a.interval=a.interval||moment.duration(30,"minutes"),a.largeInterval=a.largeInterval||moment.duration(60,"minutes"),a.strict=a.strict||!1,a.btnClass=a.btnClass||"btn-default",moment.tz&&(a.startTime.tz(a.reference.tz()),a.endTime.tz(a.reference.tz())),a.strict){var b=a.ngModel.valueOf(),c=a.interval.asMilliseconds();b-=b%c,b+=c,a.ngModel=moment(b)}a.constrainToReference=function(b){return b?(moment.tz&&b.tz(a.reference.tz()),b.isSame(a.reference,"day")||b.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),b):(a.startTime.isSame(a.reference,"day")||a.startTime.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),a.endTime.isSame(a.reference,"day")||a.endTime.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),a.ngModel&&!a.ngModel.isSame(a.reference,"day")&&a.ngModel.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),null)},a.constrainToReference(),a.ensureTimeIsWithinBounds=function(b){return b&&moment.isMoment(b)?b.isBefore(a.startTime)?moment(a.startTime):b.isAfter(a.endTime)?moment(a.endTime):b:b},a.ngModel=a.ensureTimeIsWithinBounds(a.ngModel),a.findActiveIndex=function(b){a.activeIndex=0;for(var c=a.startTime.clone();+c<=+a.endTime&&!c.isSame(b);c.add(a.interval),++a.activeIndex)if(c.isAfter(b)){a.strict&&(a.activeIndex=-1),a.activeIndex-=1;break}},a.largestPossibleIndex=Number.MAX_VALUE,a.largeIntervalIndexJump=Number.MAX_VALUE,a.findActiveIndex(a.ngModel),a.$watch("interval",function(b){b.asMilliseconds()<1&&(console.error("[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default."),a.interval=moment.duration(30,"minutes"))}),a.$watch("largeInterval",function(b){b.asMilliseconds()<10&&(console.error("[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default."),a.largeInterval=moment.duration(60,"minutes"))}),a.$watchCollection("[interval,largeInterval]",function(b){var c=b[0],d=b[1],e=c.asMilliseconds(),f=d.asMilliseconds();0!==f%e&&(console.warn("[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead."),a.largeInterval=moment.duration(5*e),f=a.largeInterval.asMilliseconds()),a.largeIntervalIndexJump=f/e})}]).directive("fmTimepickerToggle",function(){return{restrict:"A",link:function(a,b){b.bind("click",function(){a.isOpen?(a.focusInputElement(),a.closePopup()):a.focusInputElement()})}}}).directive("fmTimepicker",["$timeout",function(a){return{template:"<div> <div class='input-group'> <span class='input-group-btn' ng-if='style==\"sequential\"'> <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'> <span class='glyphicon glyphicon-minus'></span> </button> </span> <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()' ng-click='handleInputClick()'> <span class='input-group-btn'> <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'> <span class='glyphicon glyphicon-plus'></span> </button> <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle> <span class='glyphicon glyphicon-time'></span> </button> </span> </div> <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'> <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\"> <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'> {{$last?largestPossibleIndexIs($index):''}} <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a> </li> </ul> </div></div>",replace:!0,restrict:"E",scope:{ngModel:"=",format:"=?",startTime:"=?",endTime:"=?",reference:"=?",interval:"=?",largeInterval:"=?",isOpen:"=?",style:"=?",strict:"=?",btnClass:"=?"},controller:"fmTimepickerController",require:"ngModel",link:function(b,c,d,e){function f(a){e.$setValidity("time",a),e.$setValidity("bounds",a),e.$setValidity("interval",a)}function g(){f(!0);var a=h(b.time);if(b.strict&&(a=a&&i(b.time)&&j(b.time)),a){var c;c=moment.tz?moment.tz(b.time,b.format,b.reference.tz()):moment(b.time,b.format),c=b.constrainToReference(c),e.$setViewValue(c),b.time=moment.tz?moment.tz(b.time,b.format,b.reference.tz()).format(b.format):moment(b.time,b.format).format(b.format)}}function h(a){var c;return c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid(),c.isValid()?(e.$setValidity("time",!0),!0):(e.$setValidity("time",!1),e.$setViewValue(null),!1)}function i(a){var c;return c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid(),c=b.constrainToReference(c),!c.isValid()||c.isBefore(b.startTime)||c.isAfter(b.endTime)?(e.$setValidity("bounds",!1),e.$setViewValue(null),!1):(e.$setValidity("bounds",!0),!0)}function j(a){var c;c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid();var d=c.isValid();if(d){var f=c.diff(b.startTime),g=b.interval.asMilliseconds();d=0===f%g}return d?(e.$setValidity("interval",!0),!0):(e.$setValidity("interval",!1),e.$setViewValue(null),!1)}function k(){a(function(){b.$apply()}),b.isOpen&&a(l)}function l(){var a=c.find("ul");$(a).scrollTop(0);var b=$("li.active",a),d=b.length?b.position().top:0,e=b.length?b.outerHeight(!0):0;$(a).scrollTop(d-e)}function m(){b.isOpen||(b.isOpen=!0,b.modelPreview=b.ngModel?b.ngModel.clone():b.startTime.clone(),a(k))}b.$watchCollection("[startTime,endTime,interval,strict]",function(){b.constrainToReference(),g()}),b.$watchCollection("[startTime,endTime,interval,ngModel]",function(){b.findActiveIndex(b.ngModel)}),e.$render=function(){var a=moment(e.$modelValue).format(b.format),c=h(a);if(b.strict&&(c=c&&i(a)&&j(a)),!c)throw new Error("The provided time value is invalid.");b.time=a},b.closePopup=function(c){c?a(function(){b.isOpen=!1},200):(b.isOpen=!1,a(k))},b.handleInputClick=function(){"dropdown"===b.style&&m()},b.handleListClick=function(a){return a.preventDefault(),!1},b.select=function(a,c){var d;d=moment.tz?moment(a).tz(b.reference.tz()):moment(a),b.time=d.format(b.format),b.activeIndex=c,b.update(),b.closePopup()},b.increment=function(){b.isOpen?(b.modelPreview.add(b.interval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview)):(b.ngModel.add(b.interval),b.ngModel=b.ensureTimeIsWithinBounds(b.ngModel),b.time=b.ngModel.format(b.format)),b.activeIndex=Math.min(b.largestPossibleIndex,b.activeIndex+1)},b.decrement=function(){b.isOpen?(b.modelPreview.subtract(b.interval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview)):(b.ngModel.subtract(b.interval),b.ngModel=b.ensureTimeIsWithinBounds(b.ngModel),b.time=b.ngModel.format(b.format)),b.activeIndex=Math.max(0,b.activeIndex-1)},b.update=function(){var a=h(b.time)&&i(b.time);if(a){var c;c=moment.tz?moment.tz(b.time,b.format,b.reference.tz()):moment(b.time,b.format),c=b.constrainToReference(c),e.$setViewValue(c)}},b.handleKeyboardInput=function(c){switch(c.keyCode){case 13:b.modelPreview&&(b.ngModel=b.modelPreview,b.isOpen=!1);break;case 27:b.closePopup();break;case 33:m(),b.modelPreview.subtract(b.largeInterval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview),b.activeIndex=Math.max(0,b.activeIndex-b.largeIntervalIndexJump);break;case 34:m(),b.modelPreview.add(b.largeInterval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview),b.activeIndex=Math.min(b.largestPossibleIndex,b.activeIndex+b.largeIntervalIndexJump);break;case 38:m(),b.decrement();break;case 40:m(),b.increment()}a(k)},b.preventDefault=function(a){a.preventDefault()},b.largestPossibleIndexIs=function(a){b.largestPossibleIndex=a},b.focusInputElement=function(){$(n).focus()};var n=c.find("input"),o=c.find("ul");n.bind("focus",function(){a(m,150),b.isFocused=!0}),n.bind("blur",function(){a(function(){$(n).is(":focus")||(b.closePopup(),g())},150),b.isFocused=!1}),o.bind("mousedown",function(a){a.preventDefault()}),"function"==typeof Hamster&&Hamster(n[0]).wheel(function(c,d){b.isFocused&&(c.preventDefault(),b.activeIndex-=d,b.activeIndex=Math.min(b.largestPossibleIndex,Math.max(0,b.activeIndex)),b.select(b.dropDownOptions[b.activeIndex],b.activeIndex),a(k))})}}}])}();
!function(){"use strict";try{angular.module("fm.components")}catch(a){angular.module("fm.components",[])}angular.module("fm.components").filter("fmTimeFormat",function(){return function(a,b){return"number"==typeof a&&(a=moment(a)),moment(a).format(b)}}).filter("fmTimeInterval",function(){return function(a,b,c,d){if(!b||!c)return a;b=moment(b),c=moment(c),d=d||moment.duration(30,"minutes");for(var e=b.clone();+c>=+e;e.add(d))a.push(+e);return a}}).controller("fmTimepickerController",["$scope",function(a){if(a.reference=a.reference?moment(a.reference):moment(),a.style=a.style||"dropdown",a.isOpen=a.isOpen||!1,a.format=a.format||"LT",a.startTime=a.startTime||moment(a.reference).startOf("day"),a.endTime=a.endTime||moment(a.reference).endOf("day"),a.interval=a.interval||moment.duration(30,"minutes"),a.largeInterval=a.largeInterval||moment.duration(60,"minutes"),a.strict=a.strict||!1,a.btnClass=a.btnClass||"btn-default",moment.tz&&(a.startTime.tz(a.reference.tz()),a.endTime.tz(a.reference.tz())),a.strict){var b=a.ngModel.valueOf(),c=a.interval.asMilliseconds();b-=b%c,b+=c,a.ngModel=moment(b)}a.constrainToReference=function(b){return b?(moment.tz&&b.tz(a.reference.tz()),b.isSame(a.reference,"day")||b.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),b):(a.startTime.isSame(a.reference,"day")||a.startTime.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),a.endTime.isSame(a.reference,"day")||a.endTime.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),a.ngModel&&!a.ngModel.isSame(a.reference,"day")&&a.ngModel.year(a.reference.year()).month(a.reference.month()).date(a.reference.date()),null)},a.constrainToReference(),a.ensureTimeIsWithinBounds=function(b){return b&&moment.isMoment(b)?b.isBefore(a.startTime)?moment(a.startTime):b.isAfter(a.endTime)?moment(a.endTime):b:b},a.ngModel=a.ensureTimeIsWithinBounds(a.ngModel),a.findActiveIndex=function(b){if(a.activeIndex=0,b)for(var c=a.startTime.clone();+c<=+a.endTime&&!c.isSame(b);c.add(a.interval),++a.activeIndex)if(c.isAfter(b)){a.strict&&(a.activeIndex=-1),a.activeIndex-=1;break}},a.largestPossibleIndex=Number.MAX_VALUE,a.largeIntervalIndexJump=Number.MAX_VALUE,a.findActiveIndex(a.ngModel),a.$watch("interval",function(b,c){b.asMilliseconds()<1&&(console.error("[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default."),a.interval=moment.duration(30,"minutes"))}),a.$watch("largeInterval",function(b,c){b.asMilliseconds()<10&&(console.error("[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default."),a.largeInterval=moment.duration(60,"minutes"))}),a.$watchCollection("[interval,largeInterval]",function(b){var c=b[0],d=b[1],e=c.asMilliseconds(),f=d.asMilliseconds();0!==f%e&&(console.warn("[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead."),a.largeInterval=moment.duration(5*e),f=a.largeInterval.asMilliseconds()),a.largeIntervalIndexJump=f/e})}]).directive("fmTimepickerToggle",function(){return{restrict:"A",link:function(a,b,c){b.bind("click",function(){a.isOpen?(a.focusInputElement(),a.closePopup()):a.focusInputElement()})}}}).directive("fmTimepicker",["$timeout",function(a){return{template:"<div> <div class='input-group'> <span class='input-group-btn' ng-if='style==\"sequential\"'> <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'> <span class='glyphicon glyphicon-minus'></span> </button> </span> <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()'> <span class='input-group-btn'> <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'> <span class='glyphicon glyphicon-plus'></span> </button> <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle> <span class='glyphicon glyphicon-time'></span> </button> </span> </div> <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'> <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\"> <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'> {{$last?largestPossibleIndexIs($index):angular.noop()}} <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a> </li> </ul> </div></div>",replace:!0,restrict:"E",scope:{ngModel:"=",format:"=?",startTime:"=?",endTime:"=?",reference:"=?",interval:"=?",largeInterval:"=?",isOpen:"=?",style:"=?",strict:"=?",btnClass:"=?"},controller:"fmTimepickerController",require:"ngModel",link:function(b,c,d,e){function f(a){e.$setValidity("time",a),e.$setValidity("bounds",a),e.$setValidity("interval",a),e.$setValidity("start",a),e.$setValidity("end",a)}function g(){f(!0);var a=h(b.time);if(b.strict&&(a=a&&i(b.time)&&j(b.time)),b.startDate.isValid()||e.$setValidity("start",!1),b.endDate.isValid()||e.$setValidity("end",!1),a){var c;c=moment.tz?moment.tz(b.time,b.format,b.reference.tz()):moment(b.time,b.format),c=b.constrainToReference(c),e.$setViewValue(c),moment.tz?b.time=moment.tz(b.time,b.format,b.reference.tz()).format(b.format):b.time=moment(b.time,b.format).format(b.format)}}function h(a){var c;return c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid(),c.isValid()?(e.$setValidity("time",!0),!0):(e.$setValidity("time",!1),e.$setViewValue(null),!1)}function i(a){var c;return c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid(),c=b.constrainToReference(c),!c.isValid()||c.isBefore(b.startTime)||c.isAfter(b.endTime)?(e.$setValidity("bounds",!1),e.$setViewValue(null),!1):(e.$setValidity("bounds",!0),!0)}function j(a){var c;c=moment.tz?a?moment.tz(a,b.format,b.reference.tz()):moment.invalid():a?moment(a,b.format):moment.invalid();var d=c.isValid();if(d){var f=c.diff(b.startTime),g=b.interval.asMilliseconds();d=0===f%g}return d?(e.$setValidity("interval",!0),!0):(e.$setValidity("interval",!1),e.$setViewValue(null),!1)}function k(){a(function(){b.$apply()}),b.isOpen&&a(l)}function l(){var a=c.find("ul");$(a).scrollTop(0);var b=$("li.active",a),d=b.length?b.position().top:0,e=b.length?b.outerHeight(!0):0;$(a).scrollTop(d-e)}function m(){b.isOpen||(b.isOpen=!0,b.modelPreview=b.ngModel?b.ngModel.clone():b.startTime.clone(),a(k))}b.$watchCollection("[startTime,endTime,interval,strict]",function(){b.constrainToReference(),g()}),b.$watchCollection("[startTime,endTime,interval,ngModel]",function(){b.findActiveIndex(b.ngModel)}),e.$render=function(){var a=moment(e.$modelValue).format(b.format),c=h(a);if(b.strict&&(c=c&&i(a)&&j(a)),!c)throw new Error("The provided time value is invalid.");b.time=a},b.closePopup=function(c){c?a(function(){b.isOpen=!1},200):(b.isOpen=!1,a(k))},b.handleListClick=function(a){return a.preventDefault(),!1},b.select=function(a,c){var d;d=moment.tz?moment(a).tz(b.reference.tz()):moment(a),b.time=d.format(b.format),b.activeIndex=c,b.update(),b.closePopup()},b.increment=function(){b.isOpen?(b.modelPreview.add(b.interval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview)):(b.ngModel.add(b.interval),b.ngModel=b.ensureTimeIsWithinBounds(b.ngModel),b.time=b.ngModel.format(b.format)),b.activeIndex=Math.min(b.largestPossibleIndex,b.activeIndex+1)},b.decrement=function(){b.isOpen?(b.modelPreview.subtract(b.interval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview)):(b.ngModel.subtract(b.interval),b.ngModel=b.ensureTimeIsWithinBounds(b.ngModel),b.time=b.ngModel.format(b.format)),b.activeIndex=Math.max(0,b.activeIndex-1)},b.update=function(){var a=h(b.time)&&i(b.time);if(a){var c;c=moment.tz?moment.tz(b.time,b.format,b.reference.tz()):moment(b.time,b.format),c=b.constrainToReference(c),e.$setViewValue(c)}},b.handleKeyboardInput=function(c){switch(c.keyCode){case 13:b.modelPreview&&(b.ngModel=b.modelPreview,b.isOpen=!1);break;case 27:b.closePopup();break;case 33:m(),b.modelPreview.subtract(b.largeInterval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview),b.activeIndex=Math.max(0,b.activeIndex-b.largeIntervalIndexJump);break;case 34:m(),b.modelPreview.add(b.largeInterval),b.modelPreview=b.ensureTimeIsWithinBounds(b.modelPreview),b.activeIndex=Math.min(b.largestPossibleIndex,b.activeIndex+b.largeIntervalIndexJump);break;case 38:m(),b.decrement();break;case 40:m(),b.increment()}a(k)},b.preventDefault=function(a){a.preventDefault()},b.largestPossibleIndexIs=function(a){b.largestPossibleIndex=a},b.focusInputElement=function(){$(n).focus()};var n=c.find("input"),o=c.find("ul");n.bind("focus",function(){a(m,150),b.isFocused=!0}),n.bind("blur",function(){a(function(){$(n).is(":focus")||(b.closePopup(),g())},150),b.isFocused=!1}),o.bind("mousedown",function(a){a.preventDefault()}),"function"==typeof Hamster&&Hamster(n[0]).wheel(function(c,d,e,f){b.isFocused&&(c.preventDefault(),b.activeIndex-=d,b.activeIndex=Math.min(b.largestPossibleIndex,Math.max(0,b.activeIndex)),b.select(b.dropDownOptions[b.activeIndex],b.activeIndex),a(k))})}}}])}();

@@ -0,0 +0,0 @@ /*

@@ -0,0 +0,0 @@ module.exports = function( grunt ) {

{
"name": "fm-timepicker",
"version": "3.0.4",
"description": "time picker",
"version": "3.0.5",
"description": "FairManager Time Picker Component",
"main": "src/fm-timepicker.js",

@@ -19,3 +19,3 @@ "devDependencies": {

"type": "git",
"url": "https://github.com/hartwig-at/fm-timepicker.git"
"url": "https://github.com/fairmanager/fm-timepicker.git"
},

@@ -30,5 +30,5 @@ "keywords": [

"bugs": {
"url": "https://github.com/hartwig-at/fm-timepicker/issues"
"url": "https://github.com/fairmanager/fm-timepicker/issues"
},
"homepage": "https://github.com/hartwig-at/fm-timepicker"
"homepage": "https://github.com/fairmanager/fm-timepicker"
}
fm-timepicker
=============
[Demo site](http://hartwig-at.github.io/fm-timepicker/demo.html)
[Demo site](http://fairmanager.github.io/fm-timepicker/demo.html)

@@ -6,0 +6,0 @@ A simple time picker for **AngularJS** based on **Bootstrap** and **Moment**.

/**
* Copyright (C) 2014, HARTWIG Communication & Events
* Copyright (C) 2014-2015, HARTWIG Communication & Events GmbH & Co. KG
*

@@ -24,4 +24,4 @@ * Permission is hereby granted, free of charge, to any person obtaining a copy

*
* @author Oliver Salzburg
* @copyright Copyright (C) 2015, HARTWIG Communication & Events GmbH & Co. KG
* @author Oliver Salzburg <oliver.salzburg@gmail.com>
* @copyright Copyright (C) 2014-2015, HARTWIG Communication & Events GmbH & Co. KG
* @license http://opensource.org/licenses/mit-license.php MIT License

@@ -33,2 +33,4 @@ */

/* globals $, angular, Hamster, moment */
// Declare fmComponents module if it doesn't exist.

@@ -57,4 +59,4 @@ try {

start = moment( start );
end = moment( end );
start = moment( start );
end = moment( end );
interval = interval || moment.duration( 30, "minutes" );

@@ -78,11 +80,11 @@

$scope.style = $scope.style || "dropdown";
$scope.isOpen = $scope.isOpen || false;
$scope.format = $scope.format || "LT";
$scope.startTime = $scope.startTime || moment( $scope.reference ).startOf( "day" );
$scope.endTime = $scope.endTime || moment( $scope.reference ).endOf( "day" );
$scope.interval = $scope.interval || moment.duration( 30, "minutes" );
$scope.style = $scope.style || "dropdown";
$scope.isOpen = $scope.isOpen || false;
$scope.format = $scope.format || "LT";
$scope.startTime = $scope.startTime || moment( $scope.reference ).startOf( "day" );
$scope.endTime = $scope.endTime || moment( $scope.reference ).endOf( "day" );
$scope.interval = $scope.interval || moment.duration( 30, "minutes" );
$scope.largeInterval = $scope.largeInterval || moment.duration( 60, "minutes" );
$scope.strict = $scope.strict || false;
$scope.btnClass = $scope.btnClass || "btn-default";
$scope.strict = $scope.strict || false;
$scope.btnClass = $scope.btnClass || "btn-default";

@@ -96,3 +98,3 @@ if( moment.tz ) {

// Round the model value up to the next valid time that fits the configured interval.
var modelMilliseconds = $scope.ngModel.valueOf();
var modelMilliseconds = $scope.ngModel.valueOf();
var intervalMilliseconds = $scope.interval.asMilliseconds();

@@ -167,2 +169,6 @@

$scope.activeIndex = 0;
if( !model ) {
return;
}
// We step through each possible value instead of calculating the index directly,

@@ -197,3 +203,4 @@ // to make sure we account for DST changes in the reference day.

if( newInterval.asMilliseconds() < 1 ) {
console.error( "[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default." );
console.error(
"[fm-timepicker] Error: Supplied interval length is smaller than 1ms! Reverting to default." );
$scope.interval = moment.duration( 30, "minutes" );

@@ -205,3 +212,4 @@ }

if( newInterval.asMilliseconds() < 10 ) {
console.error( "[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default." );
console.error(
"[fm-timepicker] Error: Supplied large interval length is smaller than 10ms! Reverting to default." );
$scope.largeInterval = moment.duration( 60, "minutes" );

@@ -213,11 +221,12 @@ }

// Pick array apart.
var newInterval = newValues[ 0 ];
var newInterval = newValues[ 0 ];
var newLargeInterval = newValues[ 1 ];
// Get millisecond values for the intervals.
var newIntervalMilliseconds = newInterval.asMilliseconds();
var newIntervalMilliseconds = newInterval.asMilliseconds();
var newLargeIntervalMilliseconds = newLargeInterval.asMilliseconds();
// Check if the large interval is a multiple of the interval.
if( 0 !== ( newLargeIntervalMilliseconds % newIntervalMilliseconds ) ) {
console.warn( "[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead." );
$scope.largeInterval = moment.duration( newIntervalMilliseconds * 5 );
console.warn(
"[fm-timepicker] Warning: Large interval is not a multiple of interval! Using internally computed value instead." );
$scope.largeInterval = moment.duration( newIntervalMilliseconds * 5 );
newLargeIntervalMilliseconds = $scope.largeInterval.asMilliseconds();

@@ -252,34 +261,33 @@ }

template : "<div>" +
" <div class='input-group'>" +
" <span class='input-group-btn' ng-if='style==\"sequential\"'>" +
" <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'>" +
" <span class='glyphicon glyphicon-minus'></span>" +
" </button>" +
" </span>" +
" <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()' ng-click='handleInputClick()'>" +
" <span class='input-group-btn'>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'>" +
" <span class='glyphicon glyphicon-plus'></span>" +
" </button>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle>" +
" <span class='glyphicon glyphicon-time'></span>" +
" </button>" +
" </span>" +
" </div>" +
" <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'>" +
" <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\">" +
// Fill an empty array with time values between start and end time with the given interval, then iterate over that array.
" <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'>" +
// For each item, check if it is the last item. If it is, communicate the index to a method in the scope.
// empty string on false instead of noop to avoid false as every other option in angular 1.4.x
" {{$last?largestPossibleIndexIs($index):''}}" +
// Render a link into the list item, with the formatted time value.
" <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a>" +
" </li>" +
" </ul>" +
" </div>" +
"</div>",
replace : true,
restrict : "E",
scope : {
" <div class='input-group'>" +
" <span class='input-group-btn' ng-if='style==\"sequential\"'>" +
" <button type='button' class='btn {{btnClass}}' ng-click='decrement()' ng-disabled='activeIndex==0'>" +
" <span class='glyphicon glyphicon-minus'></span>" +
" </button>" +
" </span>" +
" <input type='text' class='form-control' ng-model='time' ng-keyup='handleKeyboardInput($event)' ng-change='update()'>" +
" <span class='input-group-btn'>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"sequential\"' ng-click='increment()' ng-disabled='activeIndex==largestPossibleIndex'>" +
" <span class='glyphicon glyphicon-plus'></span>" +
" </button>" +
" <button type='button' class='btn {{btnClass}}' ng-if='style==\"dropdown\"' ng-class='{active:isOpen}' fm-timepicker-toggle>" +
" <span class='glyphicon glyphicon-time'></span>" +
" </button>" +
" </span>" +
" </div>" +
" <div class='dropdown' ng-if='style==\"dropdown\"' ng-class='{open:isOpen}'>" +
" <ul class='dropdown-menu form-control' style='height:auto; max-height:160px; overflow-y:scroll;' ng-mousedown=\"handleListClick($event)\">" +
// Fill an empty array with time values between start and end time with the given interval, then iterate over that array.
" <li ng-repeat='time in ( $parent.dropDownOptions = ( [] | fmTimeInterval:startTime:endTime:interval ) )' ng-click='select(time,$index)' ng-class='{active:(activeIndex==$index)}'>" +
// For each item, check if it is the last item. If it is, communicate the index to a method in the scope.
" {{$last?largestPossibleIndexIs($index):angular.noop()}}" +
// Render a link into the list item, with the formatted time value.
" <a href='#' ng-click='preventDefault($event)'>{{time|fmTimeFormat:format}}</a>" +
" </li>" +
" </ul>" +
" </div>" +
"</div>",
replace : true,
restrict : "E",
scope : {
ngModel : "=",

@@ -321,3 +329,4 @@ format : "=?",

if( scope.strict ) {
timeValid = timeValid && checkTimeValueWithinBounds( time ) && checkTimeValueFitsInterval( time );
timeValid = timeValid && checkTimeValueWithinBounds( time ) && checkTimeValueFitsInterval(
time );
}

@@ -341,2 +350,4 @@

controller.$setValidity( "interval", to );
controller.$setValidity( "start", to );
controller.$setValidity( "end", to );
}

@@ -353,5 +364,13 @@

if( scope.strict ) {
timeValid = timeValid && checkTimeValueWithinBounds( scope.time ) && checkTimeValueFitsInterval( scope.time );
timeValid = timeValid && checkTimeValueWithinBounds( scope.time ) && checkTimeValueFitsInterval(
scope.time );
}
if( !scope.startDate.isValid() ) {
controller.$setValidity( "start", false );
}
if( !scope.endDate.isValid() ) {
controller.$setValidity( "end", false );
}
if( timeValid ) {

@@ -494,3 +513,3 @@ // If the string is valid, convert it to a moment instance, store in the model and...

// Retrieve offset from the top and height of the list element.
var top = selectedListElement.length ? selectedListElement.position().top : 0;
var top = selectedListElement.length ? selectedListElement.position().top : 0;
var height = selectedListElement.length ? selectedListElement.outerHeight( true ) : 0;

@@ -506,3 +525,3 @@ // Scroll the list to bring the selected list element into the view.

if( !scope.isOpen ) {
scope.isOpen = true;
scope.isOpen = true;
scope.modelPreview = scope.ngModel ? scope.ngModel.clone() : scope.startTime.clone();

@@ -532,18 +551,2 @@ $timeout( ensureUpdatedView );

/**
* This function is meant to handle clicking on the time input
* box if it is already focused. Previously nothing would happen
* and you would have to click the button or leave focus and
* reclick to get the popup to open again. Adding this as a click
* event makes it pop open again even if the input is focused.
*/
scope.handleInputClick = function handleInputClick( $event ) {
// bail if we aren't doing a dropdown
if (scope.style !== "dropdown") {
return;
}
openPopup();
};
scope.handleListClick = function handleListClick( $event ) {

@@ -587,3 +590,3 @@ // When the list scrollbar is clicked, this can cause the list to lose focus.

scope.ngModel = scope.ensureTimeIsWithinBounds( scope.ngModel );
scope.time = scope.ngModel.format( scope.format );
scope.time = scope.ngModel.format( scope.format );
}

@@ -600,3 +603,3 @@ scope.activeIndex = Math.min( scope.largestPossibleIndex, scope.activeIndex + 1 );

scope.ngModel = scope.ensureTimeIsWithinBounds( scope.ngModel );
scope.time = scope.ngModel.format( scope.format );
scope.time = scope.ngModel.format( scope.format );
}

@@ -631,3 +634,3 @@ scope.activeIndex = Math.max( 0, scope.activeIndex - 1 );

scope.ngModel = scope.modelPreview;
scope.isOpen = false;
scope.isOpen = false;
}

@@ -644,3 +647,4 @@ break;

scope.modelPreview = scope.ensureTimeIsWithinBounds( scope.modelPreview );
scope.activeIndex = Math.max( 0, scope.activeIndex - scope.largeIntervalIndexJump );
scope.activeIndex = Math.max( 0,
scope.activeIndex - scope.largeIntervalIndexJump );
break;

@@ -652,3 +656,3 @@ case 34:

scope.modelPreview = scope.ensureTimeIsWithinBounds( scope.modelPreview );
scope.activeIndex = Math.min( scope.largestPossibleIndex,
scope.activeIndex = Math.min( scope.largestPossibleIndex,
scope.activeIndex + scope.largeIntervalIndexJump );

@@ -692,3 +696,3 @@ break;

var inputElement = element.find( "input" );
var inputElement = element.find( "input" );
var popupListElement = element.find( "ul" );

@@ -695,0 +699,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc