Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
Loading items

Target

Select target project
  • to/keycloak-theme-pirati
  • marek.krejpsky/keycloak-theme-pirati
2 results
Select Git revision
Loading items
Show changes
Showing
with 0 additions and 2116 deletions
// stylelint-disable value-keyword-case
//
// Variables
// --------------------------------------------------
//== Colors
//
//## Gray and brand colors for use across Bootstrap.
@gray-base: #000;
@gray-darker: lighten(@gray-base, 13.5%); // #222
@gray-dark: lighten(@gray-base, 20%); // #333
@gray: lighten(@gray-base, 33.5%); // #555
@gray-light: lighten(@gray-base, 46.7%); // #777
@gray-lighter: lighten(@gray-base, 93.5%); // #eee
@brand-primary: darken(#428bca, 6.5%); // #337ab7
@brand-success: #5cb85c;
@brand-info: #5bc0de;
@brand-warning: #f0ad4e;
@brand-danger: #d9534f;
//== Scaffolding
//
//## Settings for some of the most global styles.
//** Background color for `<body>`.
@body-bg: #fff;
//** Global text color on `<body>`.
@text-color: @gray-dark;
//** Global textual link color.
@link-color: @brand-primary;
//** Link hover color set via `darken()` function.
@link-hover-color: darken(@link-color, 15%);
//** Link hover decoration.
@link-hover-decoration: underline;
//== Typography
//
//## Font, line-height, and color for body text, headings, and more.
@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
@font-family-serif: Georgia, "Times New Roman", Times, serif;
//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
@font-family-base: @font-family-sans-serif;
@font-size-base: 14px;
@font-size-large: ceil((@font-size-base * 1.25)); // ~18px
@font-size-small: ceil((@font-size-base * .85)); // ~12px
@font-size-h1: floor((@font-size-base * 2.6)); // ~36px
@font-size-h2: floor((@font-size-base * 2.15)); // ~30px
@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px
@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px
@font-size-h5: @font-size-base;
@font-size-h6: ceil((@font-size-base * .85)); // ~12px
//** Unit-less `line-height` for use in components like buttons.
@line-height-base: 1.428571429; // 20/14
//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px
//** By default, this inherits from the `<body>`.
@headings-font-family: inherit;
@headings-font-weight: 500;
@headings-line-height: 1.1;
@headings-color: inherit;
//== Iconography
//
//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
//** Load fonts from this directory.
@icon-font-path: "../fonts/";
//** File name for all font files.
@icon-font-name: "glyphicons-halflings-regular";
//** Element ID within SVG icon file.
@icon-font-svg-id: "glyphicons_halflingsregular";
//== Components
//
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
@padding-base-vertical: 6px;
@padding-base-horizontal: 12px;
@padding-large-vertical: 10px;
@padding-large-horizontal: 16px;
@padding-small-vertical: 5px;
@padding-small-horizontal: 10px;
@padding-xs-vertical: 1px;
@padding-xs-horizontal: 5px;
@line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome
@line-height-small: 1.5;
@border-radius-base: 4px;
@border-radius-large: 6px;
@border-radius-small: 3px;
//** Global color for active items (e.g., navs or dropdowns).
@component-active-color: #fff;
//** Global background color for active items (e.g., navs or dropdowns).
@component-active-bg: @brand-primary;
//** Width of the `border` for generating carets that indicate dropdowns.
@caret-width-base: 4px;
//** Carets increase slightly in size for larger components.
@caret-width-large: 5px;
//== Tables
//
//## Customizes the `.table` component with basic values, each used across all table variations.
//** Padding for `<th>`s and `<td>`s.
@table-cell-padding: 8px;
//** Padding for cells in `.table-condensed`.
@table-condensed-cell-padding: 5px;
//** Default background color used for all tables.
@table-bg: transparent;
//** Background color used for `.table-striped`.
@table-bg-accent: #f9f9f9;
//** Background color used for `.table-hover`.
@table-bg-hover: #f5f5f5;
@table-bg-active: @table-bg-hover;
//** Border color for table and cell borders.
@table-border-color: #ddd;
//== Buttons
//
//## For each of Bootstrap's buttons, define text, background and border color.
@btn-font-weight: normal;
@btn-default-color: #333;
@btn-default-bg: #fff;
@btn-default-border: #ccc;
@btn-primary-color: #fff;
@btn-primary-bg: @brand-primary;
@btn-primary-border: darken(@btn-primary-bg, 5%);
@btn-success-color: #fff;
@btn-success-bg: @brand-success;
@btn-success-border: darken(@btn-success-bg, 5%);
@btn-info-color: #fff;
@btn-info-bg: @brand-info;
@btn-info-border: darken(@btn-info-bg, 5%);
@btn-warning-color: #fff;
@btn-warning-bg: @brand-warning;
@btn-warning-border: darken(@btn-warning-bg, 5%);
@btn-danger-color: #fff;
@btn-danger-bg: @brand-danger;
@btn-danger-border: darken(@btn-danger-bg, 5%);
@btn-link-disabled-color: @gray-light;
// Allows for customizing button radius independently from global border radius
@btn-border-radius-base: @border-radius-base;
@btn-border-radius-large: @border-radius-large;
@btn-border-radius-small: @border-radius-small;
//== Forms
//
//##
//** `<input>` background color
@input-bg: #fff;
//** `<input disabled>` background color
@input-bg-disabled: @gray-lighter;
//** Text color for `<input>`s
@input-color: @gray;
//** `<input>` border color
@input-border: #ccc;
// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
//** Default `.form-control` border radius
// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
@input-border-radius: @border-radius-base;
//** Large `.form-control` border radius
@input-border-radius-large: @border-radius-large;
//** Small `.form-control` border radius
@input-border-radius-small: @border-radius-small;
//** Border color for inputs on focus
@input-border-focus: #66afe9;
//** Placeholder text color
@input-color-placeholder: #999;
//** Default `.form-control` height
@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);
//** Large `.form-control` height
@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
//** Small `.form-control` height
@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
//** `.form-group` margin
@form-group-margin-bottom: 15px;
@legend-color: @gray-dark;
@legend-border-color: #e5e5e5;
//** Background color for textual input addons
@input-group-addon-bg: @gray-lighter;
//** Border color for textual input addons
@input-group-addon-border-color: @input-border;
//** Disabled cursor for form controls and buttons.
@cursor-disabled: not-allowed;
//== Dropdowns
//
//## Dropdown menu container and contents.
//** Background for the dropdown menu.
@dropdown-bg: #fff;
//** Dropdown menu `border-color`.
@dropdown-border: rgba(0, 0, 0, .15);
//** Dropdown menu `border-color` **for IE8**.
@dropdown-fallback-border: #ccc;
//** Divider color for between dropdown items.
@dropdown-divider-bg: #e5e5e5;
//** Dropdown link text color.
@dropdown-link-color: @gray-dark;
//** Hover color for dropdown links.
@dropdown-link-hover-color: darken(@gray-dark, 5%);
//** Hover background for dropdown links.
@dropdown-link-hover-bg: #f5f5f5;
//** Active dropdown menu item text color.
@dropdown-link-active-color: @component-active-color;
//** Active dropdown menu item background color.
@dropdown-link-active-bg: @component-active-bg;
//** Disabled dropdown menu item background color.
@dropdown-link-disabled-color: @gray-light;
//** Text color for headers within dropdown menus.
@dropdown-header-color: @gray-light;
//** Deprecated `@dropdown-caret-color` as of v3.1.0
@dropdown-caret-color: #000;
//-- Z-index master list
//
// Warning: Avoid customizing these values. They're used for a bird's eye view
// of components dependent on the z-axis and are designed to all work together.
//
// Note: These variables are not generated into the Customizer.
@zindex-navbar: 1000;
@zindex-dropdown: 1000;
@zindex-popover: 1060;
@zindex-tooltip: 1070;
@zindex-navbar-fixed: 1030;
@zindex-modal-background: 1040;
@zindex-modal: 1050;
//== Media queries breakpoints
//
//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
// Extra small screen / phone
//** Deprecated `@screen-xs` as of v3.0.1
@screen-xs: 480px;
//** Deprecated `@screen-xs-min` as of v3.2.0
@screen-xs-min: @screen-xs;
//** Deprecated `@screen-phone` as of v3.0.1
@screen-phone: @screen-xs-min;
// Small screen / tablet
//** Deprecated `@screen-sm` as of v3.0.1
@screen-sm: 768px;
@screen-sm-min: @screen-sm;
//** Deprecated `@screen-tablet` as of v3.0.1
@screen-tablet: @screen-sm-min;
// Medium screen / desktop
//** Deprecated `@screen-md` as of v3.0.1
@screen-md: 992px;
@screen-md-min: @screen-md;
//** Deprecated `@screen-desktop` as of v3.0.1
@screen-desktop: @screen-md-min;
// Large screen / wide desktop
//** Deprecated `@screen-lg` as of v3.0.1
@screen-lg: 1200px;
@screen-lg-min: @screen-lg;
//** Deprecated `@screen-lg-desktop` as of v3.0.1
@screen-lg-desktop: @screen-lg-min;
// So media queries don't overlap when required, provide a maximum
@screen-xs-max: (@screen-sm-min - 1);
@screen-sm-max: (@screen-md-min - 1);
@screen-md-max: (@screen-lg-min - 1);
//== Grid system
//
//## Define your custom responsive grid.
//** Number of columns in the grid.
@grid-columns: 12;
//** Padding between columns. Gets divided in half for the left and right.
@grid-gutter-width: 30px;
// Navbar collapse
//** Point at which the navbar becomes uncollapsed.
@grid-float-breakpoint: @screen-sm-min;
//** Point at which the navbar begins collapsing.
@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
//== Container sizes
//
//## Define the maximum width of `.container` for different screen sizes.
// Small screen / tablet
@container-tablet: (720px + @grid-gutter-width);
//** For `@screen-sm-min` and up.
@container-sm: @container-tablet;
// Medium screen / desktop
@container-desktop: (940px + @grid-gutter-width);
//** For `@screen-md-min` and up.
@container-md: @container-desktop;
// Large screen / wide desktop
@container-large-desktop: (1140px + @grid-gutter-width);
//** For `@screen-lg-min` and up.
@container-lg: @container-large-desktop;
//== Navbar
//
//##
// Basics of a navbar
@navbar-height: 50px;
@navbar-margin-bottom: @line-height-computed;
@navbar-border-radius: @border-radius-base;
@navbar-padding-horizontal: floor((@grid-gutter-width / 2));
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
@navbar-collapse-max-height: 340px;
@navbar-default-color: #777;
@navbar-default-bg: #f8f8f8;
@navbar-default-border: darken(@navbar-default-bg, 6.5%);
// Navbar links
@navbar-default-link-color: #777;
@navbar-default-link-hover-color: #333;
@navbar-default-link-hover-bg: transparent;
@navbar-default-link-active-color: #555;
@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);
@navbar-default-link-disabled-color: #ccc;
@navbar-default-link-disabled-bg: transparent;
// Navbar brand label
@navbar-default-brand-color: @navbar-default-link-color;
@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%);
@navbar-default-brand-hover-bg: transparent;
// Navbar toggle
@navbar-default-toggle-hover-bg: #ddd;
@navbar-default-toggle-icon-bar-bg: #888;
@navbar-default-toggle-border-color: #ddd;
//=== Inverted navbar
// Reset inverted navbar basics
@navbar-inverse-color: lighten(@gray-light, 15%);
@navbar-inverse-bg: #222;
@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);
// Inverted navbar links
@navbar-inverse-link-color: lighten(@gray-light, 15%);
@navbar-inverse-link-hover-color: #fff;
@navbar-inverse-link-hover-bg: transparent;
@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;
@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);
@navbar-inverse-link-disabled-color: #444;
@navbar-inverse-link-disabled-bg: transparent;
// Inverted navbar brand label
@navbar-inverse-brand-color: @navbar-inverse-link-color;
@navbar-inverse-brand-hover-color: #fff;
@navbar-inverse-brand-hover-bg: transparent;
// Inverted navbar toggle
@navbar-inverse-toggle-hover-bg: #333;
@navbar-inverse-toggle-icon-bar-bg: #fff;
@navbar-inverse-toggle-border-color: #333;
//== Navs
//
//##
//=== Shared nav styles
@nav-link-padding: 10px 15px;
@nav-link-hover-bg: @gray-lighter;
@nav-disabled-link-color: @gray-light;
@nav-disabled-link-hover-color: @gray-light;
//== Tabs
@nav-tabs-border-color: #ddd;
@nav-tabs-link-hover-border-color: @gray-lighter;
@nav-tabs-active-link-hover-bg: @body-bg;
@nav-tabs-active-link-hover-color: @gray;
@nav-tabs-active-link-hover-border-color: #ddd;
@nav-tabs-justified-link-border-color: #ddd;
@nav-tabs-justified-active-link-border-color: @body-bg;
//== Pills
@nav-pills-border-radius: @border-radius-base;
@nav-pills-active-link-hover-bg: @component-active-bg;
@nav-pills-active-link-hover-color: @component-active-color;
//== Pagination
//
//##
@pagination-color: @link-color;
@pagination-bg: #fff;
@pagination-border: #ddd;
@pagination-hover-color: @link-hover-color;
@pagination-hover-bg: @gray-lighter;
@pagination-hover-border: #ddd;
@pagination-active-color: #fff;
@pagination-active-bg: @brand-primary;
@pagination-active-border: @brand-primary;
@pagination-disabled-color: @gray-light;
@pagination-disabled-bg: #fff;
@pagination-disabled-border: #ddd;
//== Pager
//
//##
@pager-bg: @pagination-bg;
@pager-border: @pagination-border;
@pager-border-radius: 15px;
@pager-hover-bg: @pagination-hover-bg;
@pager-active-bg: @pagination-active-bg;
@pager-active-color: @pagination-active-color;
@pager-disabled-color: @pagination-disabled-color;
//== Jumbotron
//
//##
@jumbotron-padding: 30px;
@jumbotron-color: inherit;
@jumbotron-bg: @gray-lighter;
@jumbotron-heading-color: inherit;
@jumbotron-font-size: ceil((@font-size-base * 1.5));
@jumbotron-heading-font-size: ceil((@font-size-base * 4.5));
//== Form states and alerts
//
//## Define colors for form feedback states and, by default, alerts.
@state-success-text: #3c763d;
@state-success-bg: #dff0d8;
@state-success-border: darken(spin(@state-success-bg, -10), 5%);
@state-info-text: #31708f;
@state-info-bg: #d9edf7;
@state-info-border: darken(spin(@state-info-bg, -10), 7%);
@state-warning-text: #8a6d3b;
@state-warning-bg: #fcf8e3;
@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);
@state-danger-text: #a94442;
@state-danger-bg: #f2dede;
@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);
//== Tooltips
//
//##
//** Tooltip max width
@tooltip-max-width: 200px;
//** Tooltip text color
@tooltip-color: #fff;
//** Tooltip background color
@tooltip-bg: #000;
@tooltip-opacity: .9;
//** Tooltip arrow width
@tooltip-arrow-width: 5px;
//** Tooltip arrow color
@tooltip-arrow-color: @tooltip-bg;
//== Popovers
//
//##
//** Popover body background color
@popover-bg: #fff;
//** Popover maximum width
@popover-max-width: 276px;
//** Popover border color
@popover-border-color: rgba(0, 0, 0, .2);
//** Popover fallback border color
@popover-fallback-border-color: #ccc;
//** Popover title background color
@popover-title-bg: darken(@popover-bg, 3%);
//** Popover arrow width
@popover-arrow-width: 10px;
//** Popover arrow color
@popover-arrow-color: @popover-bg;
//** Popover outer arrow width
@popover-arrow-outer-width: (@popover-arrow-width + 1);
//** Popover outer arrow color
@popover-arrow-outer-color: fadein(@popover-border-color, 5%);
//** Popover outer arrow fallback color
@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%);
//== Labels
//
//##
//** Default label background color
@label-default-bg: @gray-light;
//** Primary label background color
@label-primary-bg: @brand-primary;
//** Success label background color
@label-success-bg: @brand-success;
//** Info label background color
@label-info-bg: @brand-info;
//** Warning label background color
@label-warning-bg: @brand-warning;
//** Danger label background color
@label-danger-bg: @brand-danger;
//** Default label text color
@label-color: #fff;
//** Default text color of a linked label
@label-link-hover-color: #fff;
//== Modals
//
//##
//** Padding applied to the modal body
@modal-inner-padding: 15px;
//** Padding applied to the modal title
@modal-title-padding: 15px;
//** Modal title line-height
@modal-title-line-height: @line-height-base;
//** Background color of modal content area
@modal-content-bg: #fff;
//** Modal content border color
@modal-content-border-color: rgba(0, 0, 0, .2);
//** Modal content border color **for IE8**
@modal-content-fallback-border-color: #999;
//** Modal backdrop background color
@modal-backdrop-bg: #000;
//** Modal backdrop opacity
@modal-backdrop-opacity: .5;
//** Modal header border color
@modal-header-border-color: #e5e5e5;
//** Modal footer border color
@modal-footer-border-color: @modal-header-border-color;
@modal-lg: 900px;
@modal-md: 600px;
@modal-sm: 300px;
//== Alerts
//
//## Define alert colors, border radius, and padding.
@alert-padding: 15px;
@alert-border-radius: @border-radius-base;
@alert-link-font-weight: bold;
@alert-success-bg: @state-success-bg;
@alert-success-text: @state-success-text;
@alert-success-border: @state-success-border;
@alert-info-bg: @state-info-bg;
@alert-info-text: @state-info-text;
@alert-info-border: @state-info-border;
@alert-warning-bg: @state-warning-bg;
@alert-warning-text: @state-warning-text;
@alert-warning-border: @state-warning-border;
@alert-danger-bg: @state-danger-bg;
@alert-danger-text: @state-danger-text;
@alert-danger-border: @state-danger-border;
//== Progress bars
//
//##
//** Background color of the whole progress component
@progress-bg: #f5f5f5;
//** Progress bar text color
@progress-bar-color: #fff;
//** Variable for setting rounded corners on progress bar.
@progress-border-radius: @border-radius-base;
//** Default progress bar color
@progress-bar-bg: @brand-primary;
//** Success progress bar color
@progress-bar-success-bg: @brand-success;
//** Warning progress bar color
@progress-bar-warning-bg: @brand-warning;
//** Danger progress bar color
@progress-bar-danger-bg: @brand-danger;
//** Info progress bar color
@progress-bar-info-bg: @brand-info;
//== List group
//
//##
//** Background color on `.list-group-item`
@list-group-bg: #fff;
//** `.list-group-item` border color
@list-group-border: #ddd;
//** List group border radius
@list-group-border-radius: @border-radius-base;
//** Background color of single list items on hover
@list-group-hover-bg: #f5f5f5;
//** Text color of active list items
@list-group-active-color: @component-active-color;
//** Background color of active list items
@list-group-active-bg: @component-active-bg;
//** Border color of active list elements
@list-group-active-border: @list-group-active-bg;
//** Text color for content within active list items
@list-group-active-text-color: lighten(@list-group-active-bg, 40%);
//** Text color of disabled list items
@list-group-disabled-color: @gray-light;
//** Background color of disabled list items
@list-group-disabled-bg: @gray-lighter;
//** Text color for content within disabled list items
@list-group-disabled-text-color: @list-group-disabled-color;
@list-group-link-color: #555;
@list-group-link-hover-color: @list-group-link-color;
@list-group-link-heading-color: #333;
//== Panels
//
//##
@panel-bg: #fff;
@panel-body-padding: 15px;
@panel-heading-padding: 10px 15px;
@panel-footer-padding: @panel-heading-padding;
@panel-border-radius: @border-radius-base;
//** Border color for elements within panels
@panel-inner-border: #ddd;
@panel-footer-bg: #f5f5f5;
@panel-default-text: @gray-dark;
@panel-default-border: #ddd;
@panel-default-heading-bg: #f5f5f5;
@panel-primary-text: #fff;
@panel-primary-border: @brand-primary;
@panel-primary-heading-bg: @brand-primary;
@panel-success-text: @state-success-text;
@panel-success-border: @state-success-border;
@panel-success-heading-bg: @state-success-bg;
@panel-info-text: @state-info-text;
@panel-info-border: @state-info-border;
@panel-info-heading-bg: @state-info-bg;
@panel-warning-text: @state-warning-text;
@panel-warning-border: @state-warning-border;
@panel-warning-heading-bg: @state-warning-bg;
@panel-danger-text: @state-danger-text;
@panel-danger-border: @state-danger-border;
@panel-danger-heading-bg: @state-danger-bg;
//== Thumbnails
//
//##
//** Padding around the thumbnail image
@thumbnail-padding: 4px;
//** Thumbnail background color
@thumbnail-bg: @body-bg;
//** Thumbnail border color
@thumbnail-border: #ddd;
//** Thumbnail border radius
@thumbnail-border-radius: @border-radius-base;
//** Custom text color for thumbnail captions
@thumbnail-caption-color: @text-color;
//** Padding around the thumbnail caption
@thumbnail-caption-padding: 9px;
//== Wells
//
//##
@well-bg: #f5f5f5;
@well-border: darken(@well-bg, 7%);
//== Badges
//
//##
@badge-color: #fff;
//** Linked badge text color on hover
@badge-link-hover-color: #fff;
@badge-bg: @gray-light;
//** Badge text color in active nav link
@badge-active-color: @link-color;
//** Badge background color in active nav link
@badge-active-bg: #fff;
@badge-font-weight: bold;
@badge-line-height: 1;
@badge-border-radius: 10px;
//== Breadcrumbs
//
//##
@breadcrumb-padding-vertical: 8px;
@breadcrumb-padding-horizontal: 15px;
//** Breadcrumb background color
@breadcrumb-bg: #f5f5f5;
//** Breadcrumb text color
@breadcrumb-color: #ccc;
//** Text color of current page in the breadcrumb
@breadcrumb-active-color: @gray-light;
//** Textual separator for between breadcrumb elements
@breadcrumb-separator: "/";
//== Carousel
//
//##
@carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
@carousel-control-color: #fff;
@carousel-control-width: 15%;
@carousel-control-opacity: .5;
@carousel-control-font-size: 20px;
@carousel-indicator-active-bg: #fff;
@carousel-indicator-border-color: #fff;
@carousel-caption-color: #fff;
//== Close
//
//##
@close-font-weight: bold;
@close-color: #000;
@close-text-shadow: 0 1px 0 #fff;
//== Code
//
//##
@code-color: #c7254e;
@code-bg: #f9f2f4;
@kbd-color: #fff;
@kbd-bg: #333;
@pre-bg: #f5f5f5;
@pre-color: @gray-dark;
@pre-border-color: #ccc;
@pre-scrollable-max-height: 340px;
//== Type
//
//##
//** Horizontal offset for forms and lists.
@component-offset-horizontal: 180px;
//** Text muted color
@text-muted: @gray-light;
//** Abbreviations and acronyms border color
@abbr-border-color: @gray-light;
//** Headings small color
@headings-small-color: @gray-light;
//** Blockquote small color
@blockquote-small-color: @gray-light;
//** Blockquote font size
@blockquote-font-size: (@font-size-base * 1.25);
//** Blockquote border color
@blockquote-border-color: @gray-lighter;
//** Page header border color
@page-header-border-color: @gray-lighter;
//** Width of horizontal description list titles
@dl-horizontal-offset: @component-offset-horizontal;
//** Point at which .dl-horizontal becomes horizontal
@dl-horizontal-breakpoint: @grid-float-breakpoint;
//** Horizontal line color.
@hr-border: @gray-lighter;
//
// Wells
// --------------------------------------------------
// Base class
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: @well-bg;
border: 1px solid @well-border;
border-radius: @border-radius-base;
.box-shadow(inset 0 1px 1px rgba(0, 0, 0, .05));
blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, .15);
}
}
// Sizes
.well-lg {
padding: 24px;
border-radius: @border-radius-large;
}
.well-sm {
padding: 9px;
border-radius: @border-radius-small;
}
{
"_from": "bootstrap@3.4.1",
"_id": "bootstrap@3.4.1",
"_inBundle": false,
"_integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
"_location": "/bootstrap",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "bootstrap@3.4.1",
"name": "bootstrap",
"escapedName": "bootstrap",
"rawSpec": "3.4.1",
"saveSpec": null,
"fetchSpec": "3.4.1"
},
"_requiredBy": [
"/",
"/eonasdan-bootstrap-datetimepicker",
"/patternfly",
"/patternfly-bootstrap-treeview"
],
"_resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
"_shasum": "c3a347d419e289ad11f4033e3c4132b87c081d72",
"_spec": "bootstrap@3.4.1",
"_where": "/home/abstractj/github/keycloak/keycloak-server-pull-requests/themes/src/main/resources/theme/keycloak/common/resources",
"author": {
"name": "Twitter, Inc."
},
"bugs": {
"url": "https://github.com/twbs/bootstrap/issues"
},
"bundleDependencies": false,
"dependencies": {},
"deprecated": false,
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
"devDependencies": {
"autoprefixer": "^9.4.7",
"btoa": "^1.2.1",
"cross-env": "^5.2.0",
"glob": "^7.1.3",
"grunt": "^1.0.3",
"grunt-contrib-clean": "^2.0.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-connect": "^2.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^3.0.0",
"grunt-contrib-jshint": "^2.0.0",
"grunt-contrib-less": "^2.0.0",
"grunt-contrib-pug": "^2.0.0",
"grunt-contrib-uglify": "^4.0.0",
"grunt-contrib-watch": "^1.1.0",
"grunt-exec": "^3.0.0",
"grunt-html": "^10.1.0",
"grunt-jekyll": "^1.0.0",
"grunt-jscs": "^3.0.1",
"grunt-postcss": "^0.9.0",
"grunt-stylelint": "^0.10.1",
"ip": "^1.1.5",
"karma": "^3.1.3",
"karma-browserstack-launcher": "^1.4.0",
"karma-chrome-launcher": "^2.2.0",
"karma-detect-browsers": "^2.3.3",
"karma-firefox-launcher": "^1.1.0",
"karma-qunit": "^1.2.1",
"load-grunt-tasks": "^4.0.0",
"markdown-it": "^8.4.2",
"qunitjs": "^1.23.1",
"replace-in-file": "^3.4.3",
"shelljs": "^0.8.3",
"shx": "^0.3.2",
"stylelint": "~9.6.0",
"stylelint-config-standard": "^18.2.0",
"stylelint-order": "^1.0.0",
"time-grunt": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"files": [
"dist",
"fonts",
"grunt",
"js/*.js",
"less/**/*.less",
"Gruntfile.js",
"LICENSE"
],
"homepage": "https://getbootstrap.com/",
"jspm": {
"main": "js/bootstrap",
"shim": {
"js/bootstrap": {
"deps": "jquery",
"exports": "$"
}
},
"files": [
"css",
"fonts",
"js"
]
},
"keywords": [
"css",
"less",
"mobile-first",
"responsive",
"front-end",
"framework",
"web"
],
"less": "less/bootstrap.less",
"license": "MIT",
"main": "./dist/js/npm",
"name": "bootstrap",
"repository": {
"type": "git",
"url": "git+https://github.com/twbs/bootstrap.git"
},
"scripts": {
"change-version": "node grunt/change-version.js",
"release": "grunt prep-release && npm run sri && npm run release-zip",
"release-zip": "cross-env-shell \"shx rm -rf bootstrap-$npm_package_version-dist && shx cp -r dist/ bootstrap-$npm_package_version-dist && zip -r9 bootstrap-$npm_package_version-dist.zip bootstrap-$npm_package_version-dist && shx rm -rf bootstrap-$npm_package_version-dist\"",
"sri": "node grunt/generate-sri.js",
"test": "grunt test"
},
"style": "dist/css/bootstrap.css",
"version": "3.4.1"
}
{
"undef": true,
"unused": true,
"node": true,
"esnext": true,
"bitwise": true,
"camelcase": true,
"curly": true,
"eqeqeq": true,
"immed": true,
"indent": 4,
"latedef": true,
"newcap": true,
"noarg": true,
"quotmark": "single",
"regexp": true,
"strict": true,
"trailing": true,
"smarttabs": true,
"globals": {
"require": false,
"module": false
}
}
\ No newline at end of file
.subl
node_modules
\ No newline at end of file
language: node_js
node_js:
- "0.10"
The MIT License (MIT)
Copyright (c) 2014 jacoborus
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.
node-filesaver
==============
Manage collections of files easily with node.js
[![Build Status](https://travis-ci.org/jacoborus/node-filesaver.svg?branch=master)](https://travis-ci.org/jacoborus/node-filesaver)
## Installation
Install with npm
```
$ npm install filesaver
```
## Features
- Add files avoiding duplicated names
- Put files overwriting old ones if exists
- Use safe file names
## Example
```js
var Filesaver = require( 'filesaver' );
var folders = {
images: './images'
}
var filesaver = new Filesaver({ folders: folders, safenames: true });
filesaver.add( 'images', ./path/to/file.jpg, 'photo.jpg', function (err, data) {
console.log( data );
// => {filename: 'photo_2.jpg', filepath: './images/photo_2.jpg'}
});
```
Filesaver API
============
- [Filesaver](#Filesaver)
- [folder](#folder)
- [put](#put)
- [add](#add)
<a name="Filesaver"></a>
Filesaver( options )
------------------------------------------------------------
Filesaver constructor.
**Parameters:**
- **options** *Object*: folders and safenames
Options:
- folders: *Object* with folder routes
- safename: *Boolean* use safe name for files
Example:
```js
var folders = {
images: './images',
books: './books'
}
var filesaver = new Filesaver({
folders: folders,
safenames: true
});
```
<a name="folder"></a>
folder( name, path, callback )
------------------------------------------------------------
Add a new folder
**Parameters:**
- **name** *String*: name of new folder collection
- **path** *Object*: path to its folder
- **callback** *Function*: no signature callback
Example:
```js
filesaver.folder( 'documents', './path/to/folder', function () {
// do something
});
```
<a name="put"></a>
put( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write or overwrite file
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: name of newPath file
- **callback** *Function*: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.put( 'images', '/path/temp/file.jpg', 'photo.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo.jpg',
// filepath: './images/photo.jpg'
});
```
<a name="add"></a>
add( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write a file without overwriting anyone.
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: Optional: name of newPath file
- **callback** *Function*: Optional: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.add( 'images', '/path/temp/file.jpg', 'photo_1.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo_2.jpg',
// filepath: './images/photo_2.jpg'
});
```
Tests
-----
```
npm install && npm test
```
Build API docs
--------------
```
npm install && npm run build-docs
```
<br><br>
---
© 2014 [jacoborus](https://github.com/jacoborus)
Released under [MIT License](https://raw.github.com/jacoborus/node-filesaver/master/LICENSE)
\ No newline at end of file
Filesaver API
============
- [Filesaver](#Filesaver)
- [folder](#folder)
- [put](#put)
- [add](#add)
<a name="Filesaver"></a>
Filesaver( folders )
------------------------------------------------------------
Filesaver constructor.
**Parameters:**
- **folders** *Object*: Folders schema
Options:
- folders: *Object* with folder routes
- safename: *Boolean* use safe name for files
Example:
```js
var folders = {
images: './images',
books: './books'
}
var filesaver = new Filesaver({
folders: folders,
safenames: true
});
```
<a name="folder"></a>
folder( name, path, callback )
------------------------------------------------------------
Add a new folder
**Parameters:**
- **name** *String*: name of new folder collection
- **path** *Object*: path to its folder
- **callback** *Function*: no signature callback
Example:
```js
filesaver.folder( 'documents', './path/to/folder', function () {
// do something
});
```
<a name="put"></a>
put( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write or overwrite file
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: name of newPath file
- **callback** *Function*: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.put( 'images', '/path/temp/file.jpg', 'photo.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo.jpg',
// filepath: './images/photo.jpg'
});
```
<a name="add"></a>
add( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write a file without overwriting any file
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: Optional: name of newPath file
- **callback** *Function*: Optional: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.add( 'images', '/path/temp/file.jpg', 'photo_1.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo_2.jpg',
// filepath: './images/photo_2.jpg'
});
```
require('updox')('./src/Filesaver.js', {dest: './docs', destname: 'api' });
\ No newline at end of file
Filesaver API
============
- [Filesaver](#Filesaver)
- [folder](#folder)
- [put](#put)
- [add](#add)
<a name="Filesaver"></a>
Filesaver( options )
------------------------------------------------------------
Filesaver constructor.
**Parameters:**
- **options** *Object*: folders and safenames
Options:
- folders: *Object* with folder routes
- safename: *Boolean* use safe name for files
Example:
```js
var folders = {
images: './images',
books: './books'
}
var filesaver = new Filesaver({
folders: folders,
safenames: true
});
```
<a name="folder"></a>
folder( name, path, callback )
------------------------------------------------------------
Add a new folder
**Parameters:**
- **name** *String*: name of new folder collection
- **path** *Object*: path to its folder
- **callback** *Function*: no signature callback
Example:
```js
filesaver.folder( 'documents', './path/to/folder', function () {
// do something
});
```
<a name="put"></a>
put( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write or overwrite file
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: name of newPath file
- **callback** *Function*: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.put( 'images', '/path/temp/file.jpg', 'photo.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo.jpg',
// filepath: './images/photo.jpg'
});
```
<a name="add"></a>
add( folder, oldPath, newPath, callback )
------------------------------------------------------------
Write a file without overwriting anyone.
**Parameters:**
- **folder** *String*: name of parent folder folder
- **oldPath** *String*: path to origin file
- **newPath** *String*: Optional: name of newPath file
- **callback** *Function*: Optional: Signature: error, data. Data signature:{filename, filepath}
Example:
```js
filesaver.add( 'images', '/path/temp/file.jpg', 'photo_1.jpg', function (err, data) {
console.log( data );
// ->
// filename: 'photo_2.jpg',
// filepath: './images/photo_2.jpg'
});
```
Tests
-----
```
npm install && npm test
```
Build API docs
--------------
```
npm install && npm run build-docs
```
<br><br>
---
© 2014 [jacoborus](https://github.com/jacoborus)
Released under [MIT License](https://raw.github.com/jacoborus/node-filesaver/master/LICENSE)
\ No newline at end of file
node-filesaver
==============
Manage collections of files easily with node.js
[![Build Status](https://travis-ci.org/jacoborus/node-filesaver.svg?branch=master)](https://travis-ci.org/jacoborus/node-filesaver)
## Installation
Install with npm
```
$ npm install filesaver
```
## Features
- Add files avoiding duplicated names
- Put files overwriting old ones if exists
- Use safe file names
## Example
```js
var Filesaver = require( 'filesaver' );
var folders = {
images: './images'
}
var filesaver = new Filesaver({ folders: folders, safenames: true });
filesaver.add( 'images', ./path/to/file.jpg, 'photo.jpg', function (err, data) {
console.log( data );
// => {filename: 'photo_2.jpg', filepath: './images/photo_2.jpg'}
});
```
{
"_from": "filesaver@0.0.13",
"_id": "filesaver@0.0.13",
"_inBundle": false,
"_integrity": "sha1-+psqwTcdQ2/l7ckoXtmY0eJ4K+4=",
"_location": "/filesaver",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "filesaver@0.0.13",
"name": "filesaver",
"escapedName": "filesaver",
"rawSpec": "0.0.13",
"saveSpec": null,
"fetchSpec": "0.0.13"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/filesaver/-/filesaver-0.0.13.tgz",
"_shasum": "fa9b2ac1371d436fe5edc9285ed998d1e2782bee",
"_spec": "filesaver@0.0.13",
"_where": "/home/abstractj/github/keycloak/keycloak-server-pull-requests/themes/src/main/resources/theme/keycloak/common/resources",
"author": {
"name": "Jacobo Tabernero"
},
"bugs": {
"url": "https://github.com/jacoborus/node-filesaver/issues"
},
"bundleDependencies": false,
"dependencies": {
"mkdirp": "^0.5.0",
"safename": "0.0.4"
},
"deprecated": false,
"description": "Stores files in folders easily",
"devDependencies": {
"chai": "^1.9.1",
"mocha": "latest",
"updox": "0.0.5"
},
"homepage": "https://github.com/jacoborus/node-filesaver",
"keywords": [
"storage",
"safe",
"filename",
"collections",
"fs"
],
"license": "MIT",
"main": "./src/Filesaver.js",
"name": "filesaver",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/jacoborus/node-filesaver.git"
},
"scripts": {
"build-docs": "node ./devtools/createdocs.js && cat ./docs/readme.md ./docs/api.md ./docs/footer.md > ./README.md",
"test": "node ./node_modules/mocha/bin/mocha"
},
"version": "0.0.13"
}
'use strict';
var mkdirp = require('mkdirp'),
fs = require('fs'),
changeName = require('./changename'),
path = require('path'),
safename = require('safename');
/*!
* Rename file and launch callback
* @param {String} oldPath path to file to move
* @param {String} newPath path of destination
* @param {Function} callback signature: null, {filename, filepath}
*/
var move = function (oldPath, newPath, callback) {
fs.rename( oldPath, newPath, function (err) {
if (err) {
callback( err );
} else {
callback( null, {
filename: newPath.split( '/' ).pop(),
filepath: newPath
});
}
});
};
/*!
* return safename file path
* @param {String} route target to analyze
* @return {String} route analyze
*/
var checkSafeName = function (route) {
if ( this.safenames ) {
route = route.split( '/' );
var name = route.pop();
name = safename( name );
route.push( name );
return route.join( '/' );
} else {
return route;
}
};
/*!
* check if params are right
*/
var checker = function (folder, oldPath, newPath, callback) {
var cb = callback || function () {};
if (typeof newPath === 'function') {
cb = newPath;
newPath = oldPath.split( '/' ).pop();
} else if (!newPath) {
newPath = oldPath.split( '/' ).pop();
}
// check for valid arguments
if (folder && oldPath && (typeof folder === 'string') && (typeof oldPath === 'string') && fs.existsSync( oldPath )) {
// check for existing folder
if (this.folders[folder]) {
// set target
newPath = path.resolve( this.folders[folder], newPath );
newPath = checkSafeName.call( this, newPath );
return {newPath: newPath, callback: cb};
} else {
cb( 'invalid folder' );
return false;
}
} else {
cb( 'folder or origin not valid' );
return false;
}
};
/**
* Filesaver constructor.
*
* Options:
*
* - folders: *Object* with folder routes
* - safename: *Boolean* use safe name for files
*
* Example:
*
* ```js
* var folders = {
* images: './images',
* books: './books'
* }
* var filesaver = new Filesaver({
* folders: folders,
* safenames: true
* });
* ```
*
* @param {Object} options folders and safenames
*/
var Filesaver = function (options) {
var x;
options = options || {};
// Store folders
this.folders = options.folders || {};
this.safenames = options.safenames || false;
// check for existing folders
for (x in this.folders) {
if (!fs.existsSync( this.folders[x] )){
// create folder if not exists
mkdirp( this.folders[x] );
}
}
};
/**
* Add a new folder
*
* Example:
*
* ```js
* filesaver.folder( 'documents', './path/to/folder', function () {
* // do something
* });
* ```
* @param {String} name name of new folder collection
* @param {Object} path path to its folder
* @param {Function} callback no signature callback
*/
Filesaver.prototype.folder = function (name, folderPath, callback) {
var _this = this;
fs.exists( folderPath, function (exists) {
if (!exists) {
// create folder if not exists
mkdirp( folderPath );
}
// add folder
_this.folders[name] = folderPath;
// optional callback
if (callback){
callback();
}
});
};
/**
* Write or overwrite file
*
* Example:
*
* ```js
* filesaver.put( 'images', '/path/temp/file.jpg', 'photo.jpg', function (err, data) {
* console.log( data );
* // ->
* // filename: 'photo.jpg',
* // filepath: './images/photo.jpg'
* });
* ```
*
* @param {String} folder name of parent folder folder
* @param {String} oldPath path to origin file
* @param {String} newPath name of newPath file
* @param {Function} callback Signature: error, data. Data signature:{filename, filepath}
*/
Filesaver.prototype.put = function (folder, oldPath, newPath, callback) {
var data = checker.call( this, folder, oldPath, newPath, callback );
if (data) {
move( oldPath, data.newPath, data.callback );
}
};
/**
* Write a file without overwriting anyone.
*
* Example:
*
* ```js
* filesaver.add( 'images', '/path/temp/file.jpg', 'photo_1.jpg', function (err, data) {
* console.log( data );
* // ->
* // filename: 'photo_2.jpg',
* // filepath: './images/photo_2.jpg'
* });
* ```
*
* @param {String} folder name of parent folder folder
* @param {String} oldPath path to origin file
* @param {String} newPath Optional: name of newPath file
* @param {Function} callback Optional: Signature: error, data. Data signature:{filename, filepath}
*/
Filesaver.prototype.add = function (folder, oldPath, newPath, callback) {
var data = checker.call( this, folder, oldPath, newPath, callback );
if (data) {
newPath = changeName( data.newPath );
move( oldPath, newPath, data.callback );
}
};
module.exports = Filesaver;
var fs = require('fs');
/*!
* add 1 to suffix number
* @param {String} name file basename
* @return {String} name with addition
*/
var addOne = function (name) {
name = name.split( '_' );
var n = Number( name.pop()) + 1;
name.push( n );
return name.join( '_' );
};
/*!
* detect if name has a number suffix after '_'
* (example: picture_5.jpg)
* @param {string} name basename to examinate
* @return {Boolean|Number} if has not suffix: false, else: name with addition
*/
var hasSuffix = function (name) {
var suffix, splitted;
if (!isNaN( name )) {
return false;
} else {
splitted = name.split( '_' );
if (splitted.length > 1) {
suffix = splitted.pop();
if (isNaN( suffix )) {
return false;
} else {
return addOne( name );
}
} else {
return false;
}
}
};
/*!
* separate basename from file path and send it to rename
* @param {String} route route of the file
* @return {String} new name
*/
var newName = function ( route ) {
// get filename
route = route.split( '/' );
var filename = route.pop();
var splitted = filename.split( '.' );
var basename = splitted.shift();
var ext = splitted.join( '.' );
var suffix = hasSuffix( basename );
// check if filefileName has suffix
if (suffix) {
basename = suffix;
} else {
basename = basename + '_1';
}
filename = [basename, ext].join( '.' );
route.push( filename );
return route.join('/');
};
/*!
* detects if file route exist and send it to rename
* @param {String} route file path
* @return {String} unique path
*/
var finalName = function (route) {
if (fs.existsSync( route )) {
return finalName( newName( route ));
} else {
return route;
}
};
module.exports = finalName;
one.txt
\ No newline at end of file
var expect = require('chai').expect,
Filesaver = require('../src/Filesaver'),
fs = require('fs');
var deleteFolderRecursive = function (path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach( function (file, index) {
var curPath;
curPath = path + "/" + file;
if (fs.statSync( curPath ).isDirectory()) {
return deleteFolderRecursive( curPath );
} else {
return fs.unlinkSync( curPath );
}
});
return fs.rmdirSync( path );
}
};
var folders = {
books: './uploads/books',
images: './uploads/img'
};
after( function (done) {
deleteFolderRecursive('./uploads');
done();
});
before( function (done) {
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/one.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/two'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/three'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/four'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/five.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/six.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/seven.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/eight.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/n a m e.txt'));
fs.createReadStream('./test/assets/test.txt').pipe(fs.createWriteStream('./test/assets/n a m e .txt'));
done();
});
describe( 'Filesaver constructor', function () {
var filesaver = new Filesaver( {folders: folders} );
it('Filesaver constructor create folders if necesary', function() {
expect( fs.existsSync('./uploads/books') && fs.existsSync('./uploads/books') ).to.equal(true);
});
});
describe('filesaver#folder', function () {
var filesaver = new Filesaver();
filesaver.folder( 'things', './uploads/things' );
it( 'add a new folder to filesaver.folders', function () {
expect( filesaver.folders.things ).to.equal( './uploads/things' );
});
it('create folder if necessary', function (done) {
fs.exists( './uploads/things', function (exists){
expect( exists ).to.equal( true );
done();
});
});
});
describe('filesaver#put', function () {
var filesaver = new Filesaver( {folders: folders} );
it('saves a file at newPath argument', function (done) {
filesaver.put( 'books', './test/assets/one.txt', 'ONE.txt', function () {
fs.exists( './uploads/books/ONE.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it('if target is ommited: saves file with same name as origin file', function (done) {
filesaver.put( 'books', './test/assets/two', function () {
fs.exists( './uploads/books/two', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it( 'use safenames', function (done) {
var filesaver = new Filesaver({folders: folders, safenames: true });
filesaver.put( 'books', './test/assets/n a m e .txt', function () {
fs.exists( './uploads/books/n_a_m_e_.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it( 'works without callback', function (done) {
var filesaver = new Filesaver({folders: folders});
filesaver.put( 'books', './test/assets/seven.txt' );
setTimeout( function () {
fs.exists( './uploads/books/seven.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
}, 500);
});
});
describe( 'filesaver#add', function () {
it( 'saves a file at target argument', function (done) {
var filesaver = new Filesaver( {folders: folders} );
filesaver.add( 'books', './test/assets/three', 'three', function () {
fs.exists( './uploads/books/three', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it( 'if target is ommited: saves file with same name as origin file', function (done) {
var filesaver = new Filesaver( {folders: folders} );
filesaver.add( 'books', './test/assets/four', function () {
fs.exists( './uploads/books/four', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it( 'extend basename with suffix', function (done) {
var filesaver = new Filesaver( {folders: folders} );
filesaver.add( 'books', './test/assets/five.txt', 'five.txt', function () {
filesaver.add( 'books', './test/assets/six.txt', 'five.txt', function () {
fs.exists( './uploads/books/five_1.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
});
it( 'use safenames', function (done) {
var filesaver = new Filesaver({folders: folders, safenames: true });
filesaver.add( 'books', './test/assets/n a m e.txt', function () {
fs.exists( './uploads/books/n_a_m_e.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
});
});
it( 'works without callback', function (done) {
var filesaver = new Filesaver({folders: folders});
filesaver.add( 'books', './test/assets/eight.txt' );
setTimeout( function () {
fs.exists( './uploads/books/eight.txt', function (exists) {
expect( exists ).to.equal( true );
done();
});
}, 500);
});
});
*.pyc
*.egg-info
*.db
*.db.old
*.swp
*.db-journal
.coverage
.DS_Store
.installed.cfg
_gh_pages/*
.idea/*
.svn/*
src/website/static/*
src/website/media/*
bin
cfcache
develop-eggs
dist
downloads
eggs
parts
tmp
.sass-cache
node_modules
src/website/settingslocal.py
stunnel.log
.ruby-version
# don't need these in the npm package.
src/
_config.yml
bower.json
component.json
composer.json
CONTRIBUTING.md
Gemfile
Gemfile.lock
I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
comprehensive icon sets or copy and paste your own.
Please. Check it out.
-Dave Gandy