From b70ca4a4b45ef9587e34fa4b201dee736f6e6d26 Mon Sep 17 00:00:00 2001 From: topal Date: Wed, 23 Mar 2016 22:53:18 +0300 Subject: [PATCH 01/41] doc: updated fs #5862 removed irrelevant data in fs.markdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fs.readFile, fs.writeFile and fs.appendFile doc changes pulled back from master included details not relevant to v4. PR-URL: https://github.com/nodejs/node/pull/5877 Reviewed-By: Benjamin Gruenbaum Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- doc/api/fs.markdown | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown index 9d9d0672b6f488..fb2df9c0a9a890 100644 --- a/doc/api/fs.markdown +++ b/doc/api/fs.markdown @@ -252,7 +252,7 @@ fail, and does nothing otherwise. ## fs.appendFile(file, data[, options], callback) -* `file` {String|Number} filename or file descriptor +* `file` {String} filename * `data` {String|Buffer} * `options` {Object|String} * `encoding` {String|Null} default = `'utf8'` @@ -278,10 +278,6 @@ If `options` is a string, then it specifies the encoding. Example: fs.appendFile('message.txt', 'data to append', 'utf8', callback); ``` -Any specified file descriptor has to have been opened for appending. - -_Note: Specified file descriptors will not be closed automatically._ - ## fs.appendFileSync(file, data[, options]) The synchronous version of [`fs.appendFile()`][]. Returns `undefined`. @@ -620,7 +616,7 @@ Synchronous readdir(3). Returns an array of filenames excluding `'.'` and ## fs.readFile(file[, options], callback) -* `file` {String | Integer} filename or file descriptor +* `file` {String} filename * `options` {Object | String} * `encoding` {String | Null} default = `null` * `flag` {String} default = `'r'` @@ -646,10 +642,6 @@ If `options` is a string, then it specifies the encoding. Example: fs.readFile('/etc/passwd', 'utf8', callback); ``` -Any specified file descriptor has to support reading. - -_Note: Specified file descriptors will not be closed automatically._ - ## fs.readFileSync(file[, options]) Synchronous version of [`fs.readFile`][]. Returns the contents of the `file`. @@ -945,7 +937,7 @@ the end of the file. ## fs.writeFile(file, data[, options], callback) -* `file` {String | Integer} filename or file descriptor +* `file` {String} filename * `data` {String | Buffer} * `options` {Object | String} * `encoding` {String | Null} default = `'utf8'` @@ -974,14 +966,10 @@ If `options` is a string, then it specifies the encoding. Example: fs.writeFile('message.txt', 'Hello Node.js', 'utf8', callback); ``` -Any specified file descriptor has to support writing. - Note that it is unsafe to use `fs.writeFile` multiple times on the same file without waiting for the callback. For this scenario, `fs.createWriteStream` is strongly recommended. -_Note: Specified file descriptors will not be closed automatically._ - ## fs.writeFileSync(file, data[, options]) The synchronous version of [`fs.writeFile()`][]. Returns `undefined`. From eb0ed46665d73ec12933dc4064013120fe0ff51d Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Mon, 29 Feb 2016 16:49:30 -0500 Subject: [PATCH 02/41] doc: reformat & improve node.1 manual page Uses better troff formatting. Removes v8 options from the man page. Also edits `node -h` in node.cc slightly. PR-URL: #5497 Reviewed-By: James Snell Reviewed-By: Benjamin Gruenbaum --- doc/node.1 | 841 +++++++--------------------------------------------- src/node.cc | 3 +- 2 files changed, 105 insertions(+), 739 deletions(-) diff --git a/doc/node.1 b/doc/node.1 index 70ff24954c30de..9835af74a8f40c 100644 --- a/doc/node.1 +++ b/doc/node.1 @@ -1,780 +1,145 @@ -.TH NODE.JS "1" "2010" "" "" +.TH NODE 1 2016 Node.js Node.js +.\ This is a man page comment. +.\ Man page syntax (actually troff syntax) is somewhat obscure, but the +.\ important part is is that . specifies 's syntax for that +.\ line, and \f specifies it for the characters that follow. +.\ See http://liw.fi/manpages/ for more info. -.SH "NAME" -node \- Server-side JavaScript +.SH NAME + +node \- Server-side JavaScript runtime -.SH SYNOPSIS +.SH SYNOPSIS .B node -[ -.B \-v -] -[ -.B \-\-debug -| -.B \-\-debug-brk -] -[ -.B \-\-v8-options -] +[\fIoptions\fR] [\fIv8 options\fR] +[\fIscript.js\fR | \fB\-e \fR"\fIscript\fR"] +[\fIarguments\fR] +.br +.B node debug +[\fIscript.js\fR | \fB\-e \fR"\fIscript\fR" | \fI:\fR] \fI... .br - [ -.B \-e -.I command -| -.I script.js -] -[ -.I arguments -] +.B node +[\fB\-\-v8-options\fR] Execute without arguments to start the REPL. .SH DESCRIPTION -Node.js is a set of libraries for JavaScript which allows -it to be used outside of the browser. It is primarily -focused on creating simple, easy to build network clients -and servers. +Node.js is a set of libraries for JavaScript which allows it to be used outside +of the browser. It is primarily focused on creating simple, easy to build +network clients and servers. .SH OPTIONS - -v, --version print node's version +.TP +.BR \-v ", " \-\-version +Print node's version. + +.TP +.BR \-h ", " \-\-help +Print node command line options. +The output of this option is less detailed than this document. + +.TP +.BR \-e ", " \-\-eval " " \fR"\fIscript\fR" +Evaluate the following argument as JavaScript. + +.TP +.BR \-p ", " \-\-print " " \fR"\fIscript\fR" +Identical to \fB-e\fR but prints the result. - -e, --eval script evaluate script +.TP +.BR \-c ", " \-\-check +Syntax check the script without executing. - -p, --print print result of --eval +.TP +.BR \-i ", " \-\-interactive +Opens the REPL even if stdin does not appear to be a terminal. - -c, --check syntax check script without executing +.TP +.BR \-r ", " \-\-require " " \fImodule\fR +Preload the specified module at startup. Follows `require()`'s module resolution +rules. \fImodule\fR may be either a path to a file, or a node module name. - -i, --interactive always enter the REPL even if stdin - does not appear to be a terminal +.TP +.BR \-\-no\-deprecation +Silence deprecation warnings. - -r, --require module to preload at startup +.TP +.BR \-\-trace\-deprecation +Print stack traces for deprecations. - --no-deprecation silence deprecation warnings +.TP +.BR \-\-throw\-deprecation +Throw errors for deprecations. - --trace-deprecation show stack traces on deprecations +.TP +.BR \-\-trace\-sync\-io +Prints a stack trace whenever synchronous I/O is detected after the first turn +of the event loop. - --throw-deprecation throw errors on deprecations +.TP +.BR \-\-track\-heap-objects +Track heap object allocations for heap snapshots. - --track-heap-objects track heap object allocations for heap snapshots +.TP +.BR \-\-prof\-process +Process v8 profiler output generated using the v8 option \fB\-\-prof\fR - --prof-process process v8 profiler output generated using --prof +.TP +.BR \-\-v8\-options +Print v8 command line options. - --v8-options print v8 command line options +.TP +.BR \-\-tls\-cipher\-list =\fIlist\fR +Specify an alternative default TLS cipher list. (Requires Node.js to be built with crypto support. (Default)) + +.TP +.BR \-\-icu\-data\-dir =\fIfile\fR +Specify ICU data load path. (overrides \fBNODE_ICU_DATA\fR) - --tls-cipher-list=list use an alternative default TLS cipher list - (available only when Node.js is built with - OpenSSL and crypto support enabled) .SH ENVIRONMENT VARIABLES -.IP NODE_PATH +.TP +.BR NODE_DEBUG =\fImodule\fR[,\fI...\fR] +\',\'\-separated list of core modules that should print debug information. + +.TP +.BR NODE_PATH =\fIpath\fR[:\fI...\fR] \':\'\-separated list of directories prefixed to the module search path. -.IP NODE_DISABLE_COLORS -If set to 1 then colors will not be used in the REPL. -.IP NODE_ICU_DATA + +.TP +.BR NODE_DISABLE_COLORS=1 +When set to 1 colors will not be used in the REPL. + +.TP +.BR NODE_ICU_DATA =\fIfile\fR Data path for ICU (Intl object) data. Will extend linked-in data when compiled -with small-icu support. -.IP NODE_REPL_HISTORY +with small\-icu support. + +.TP +.BR NODE_REPL_HISTORY =\fIfile\fR Path to the file used to store the persistent REPL history. The default path is ~/.node_repl_history, which is overridden by this variable. Setting the -value to an empty string ("") disables persistent REPL history. - -.SH V8 OPTIONS - - --use_strict (enforce strict mode) - type: bool default: false - --use_strong (enforce strong mode) - type: bool default: false - --strong_mode (experimental strong language mode) - type: bool default: false - --es_staging (enable all completed harmony features) - type: bool default: false - --harmony (enable all completed harmony features) - type: bool default: false - --harmony_shipping (enable all shipped harmony features) - type: bool default: true - --harmony_modules (enable "harmony modules" (in progress)) - type: bool default: false - --harmony_arrays (enable "harmony array methods" (in progress)) - type: bool default: false - --harmony_array_includes (enable "harmony Array.prototype.includes" (in progress)) - type: bool default: false - --harmony_regexps (enable "harmony regular expression extensions" (in progress)) - type: bool default: false - --harmony_arrow_functions (enable "harmony arrow functions" (in progress)) - type: bool default: false - --harmony_proxies (enable "harmony proxies" (in progress)) - type: bool default: false - --harmony_sloppy (enable "harmony features in sloppy mode" (in progress)) - type: bool default: false - --harmony_unicode (enable "harmony unicode escapes" (in progress)) - type: bool default: false - --harmony_unicode_regexps (enable "harmony unicode regexps" (in progress)) - type: bool default: false - --harmony_rest_parameters (enable "harmony rest parameters" (in progress)) - type: bool default: false - --harmony_reflect (enable "harmony Reflect API" (in progress)) - type: bool default: false - --harmony_computed_property_names (enable "harmony computed property names") - type: bool default: false - --harmony_tostring (enable "harmony toString") - type: bool default: false - --harmony_numeric_literals (enable "harmony numeric literals") - type: bool default: true - --harmony_classes (enable "harmony classes (implies object literal extension)") - type: bool default: true - --harmony_object_literals (enable "harmony object literal extensions") - type: bool default: true - --compiled_keyed_generic_loads (use optimizing compiler to generate keyed generic load stubs) - type: bool default: false - --pretenuring_call_new (pretenure call new) - type: bool default: false - --allocation_site_pretenuring (pretenure with allocation sites) - type: bool default: true - --trace_pretenuring (trace pretenuring decisions of HAllocate instructions) - type: bool default: false - --trace_pretenuring_statistics (trace allocation site pretenuring statistics) - type: bool default: false - --track_fields (track fields with only smi values) - type: bool default: true - --track_double_fields (track fields with double values) - type: bool default: true - --track_heap_object_fields (track fields with heap values) - type: bool default: true - --track_computed_fields (track computed boilerplate fields) - type: bool default: true - --track_field_types (track field types) - type: bool default: true - --smi_binop (support smi representation in binary operations) - type: bool default: true - --vector_ics (support vector-based ics) - type: bool default: false - --optimize_for_size (Enables optimizations which favor memory size over execution speed.) - type: bool default: false - --unbox_double_arrays (automatically unbox arrays of doubles) - type: bool default: true - --string_slices (use string slices) - type: bool default: true - --crankshaft (use crankshaft) - type: bool default: true - --hydrogen_filter (optimization filter) - type: string default: * - --use_gvn (use hydrogen global value numbering) - type: bool default: true - --gvn_iterations (maximum number of GVN fix-point iterations) - type: int default: 3 - --use_canonicalizing (use hydrogen instruction canonicalizing) - type: bool default: true - --use_inlining (use function inlining) - type: bool default: true - --use_escape_analysis (use hydrogen escape analysis) - type: bool default: true - --use_allocation_folding (use allocation folding) - type: bool default: true - --use_local_allocation_folding (only fold in basic blocks) - type: bool default: false - --use_write_barrier_elimination (eliminate write barriers targeting allocations in optimized code) - type: bool default: true - --max_inlining_levels (maximum number of inlining levels) - type: int default: 5 - --max_inlined_source_size (maximum source size in bytes considered for a single inlining) - type: int default: 600 - --max_inlined_nodes (maximum number of AST nodes considered for a single inlining) - type: int default: 196 - --max_inlined_nodes_cumulative (maximum cumulative number of AST nodes considered for inlining) - type: int default: 400 - --loop_invariant_code_motion (loop invariant code motion) - type: bool default: true - --fast_math (faster (but maybe less accurate) math functions) - type: bool default: true - --collect_megamorphic_maps_from_stub_cache (crankshaft harvests type feedback from stub cache) - type: bool default: true - --hydrogen_stats (print statistics for hydrogen) - type: bool default: false - --trace_check_elimination (trace check elimination phase) - type: bool default: false - --trace_environment_liveness (trace liveness of local variable slots) - type: bool default: false - --trace_hydrogen (trace generated hydrogen to file) - type: bool default: false - --trace_hydrogen_filter (hydrogen tracing filter) - type: string default: * - --trace_hydrogen_stubs (trace generated hydrogen for stubs) - type: bool default: false - --trace_hydrogen_file (trace hydrogen to given file name) - type: string default: NULL - --trace_phase (trace generated IR for specified phases) - type: string default: HLZ - --trace_inlining (trace inlining decisions) - type: bool default: false - --trace_load_elimination (trace load elimination) - type: bool default: false - --trace_store_elimination (trace store elimination) - type: bool default: false - --trace_alloc (trace register allocator) - type: bool default: false - --trace_all_uses (trace all use positions) - type: bool default: false - --trace_range (trace range analysis) - type: bool default: false - --trace_gvn (trace global value numbering) - type: bool default: false - --trace_representation (trace representation types) - type: bool default: false - --trace_removable_simulates (trace removable simulates) - type: bool default: false - --trace_escape_analysis (trace hydrogen escape analysis) - type: bool default: false - --trace_allocation_folding (trace allocation folding) - type: bool default: false - --trace_track_allocation_sites (trace the tracking of allocation sites) - type: bool default: false - --trace_migration (trace object migration) - type: bool default: false - --trace_generalization (trace map generalization) - type: bool default: false - --stress_pointer_maps (pointer map for every instruction) - type: bool default: false - --stress_environments (environment for every instruction) - type: bool default: false - --deopt_every_n_times (deoptimize every n times a deopt point is passed) - type: int default: 0 - --deopt_every_n_garbage_collections (deoptimize every n garbage collections) - type: int default: 0 - --print_deopt_stress (print number of possible deopt points) - type: bool default: false - --trap_on_deopt (put a break point before deoptimizing) - type: bool default: false - --trap_on_stub_deopt (put a break point before deoptimizing a stub) - type: bool default: false - --deoptimize_uncommon_cases (deoptimize uncommon cases) - type: bool default: true - --polymorphic_inlining (polymorphic inlining) - type: bool default: true - --use_osr (use on-stack replacement) - type: bool default: true - --array_bounds_checks_elimination (perform array bounds checks elimination) - type: bool default: true - --trace_bce (trace array bounds check elimination) - type: bool default: false - --array_bounds_checks_hoisting (perform array bounds checks hoisting) - type: bool default: false - --array_index_dehoisting (perform array index dehoisting) - type: bool default: true - --analyze_environment_liveness (analyze liveness of environment slots and zap dead values) - type: bool default: true - --load_elimination (use load elimination) - type: bool default: true - --check_elimination (use check elimination) - type: bool default: true - --store_elimination (use store elimination) - type: bool default: false - --dead_code_elimination (use dead code elimination) - type: bool default: true - --fold_constants (use constant folding) - type: bool default: true - --trace_dead_code_elimination (trace dead code elimination) - type: bool default: false - --unreachable_code_elimination (eliminate unreachable code) - type: bool default: true - --trace_osr (trace on-stack replacement) - type: bool default: false - --stress_runs (number of stress runs) - type: int default: 0 - --lookup_sample_by_shared (when picking a function to optimize, watch for shared function info, not JSFunction itself) - type: bool default: true - --cache_optimized_code (cache optimized code for closures) - type: bool default: true - --flush_optimized_code_cache (flushes the cache of optimized code for closures on every GC) - type: bool default: true - --inline_construct (inline constructor calls) - type: bool default: true - --inline_arguments (inline functions with arguments object) - type: bool default: true - --inline_accessors (inline JavaScript accessors) - type: bool default: true - --escape_analysis_iterations (maximum number of escape analysis fix-point iterations) - type: int default: 2 - --optimize_for_in (optimize functions containing for-in loops) - type: bool default: true - --concurrent_recompilation (optimizing hot functions asynchronously on a separate thread) - type: bool default: true - --job_based_recompilation (post tasks to v8::Platform instead of using a thread for concurrent recompilation) - type: bool default: true - --trace_concurrent_recompilation (track concurrent recompilation) - type: bool default: false - --concurrent_recompilation_queue_length (the length of the concurrent compilation queue) - type: int default: 8 - --concurrent_recompilation_delay (artificial compilation delay in ms) - type: int default: 0 - --block_concurrent_recompilation (block queued jobs until released) - type: bool default: false - --concurrent_osr (concurrent on-stack replacement) - type: bool default: true - --omit_map_checks_for_leaf_maps (do not emit check maps for constant values that have a leaf map, deoptimize the optimized code if the layout of the maps changes.) - type: bool default: true - --turbo_filter (optimization filter for TurboFan compiler) - type: string default: ~ - --trace_turbo (trace generated TurboFan IR) - type: bool default: false - --trace_turbo_graph (trace generated TurboFan graphs) - type: bool default: false - --trace_turbo_cfg_file (trace turbo cfg graph (for C1 visualizer) to a given file name) - type: string default: NULL - --trace_turbo_types (trace TurboFan's types) - type: bool default: true - --trace_turbo_scheduler (trace TurboFan's scheduler) - type: bool default: false - --trace_turbo_reduction (trace TurboFan's various reducers) - type: bool default: false - --trace_turbo_jt (trace TurboFan's jump threading) - type: bool default: false - --turbo_asm (enable TurboFan for asm.js code) - type: bool default: true - --turbo_verify (verify TurboFan graphs at each phase) - type: bool default: false - --turbo_stats (print TurboFan statistics) - type: bool default: false - --turbo_splitting (split nodes during scheduling in TurboFan) - type: bool default: true - --turbo_types (use typed lowering in TurboFan) - type: bool default: true - --turbo_type_feedback (use type feedback in TurboFan) - type: bool default: false - --turbo_source_positions (track source code positions when building TurboFan IR) - type: bool default: false - --context_specialization (enable context specialization in TurboFan) - type: bool default: false - --turbo_deoptimization (enable deoptimization in TurboFan) - type: bool default: false - --turbo_inlining (enable inlining in TurboFan) - type: bool default: false - --turbo_builtin_inlining (enable builtin inlining in TurboFan) - type: bool default: true - --trace_turbo_inlining (trace TurboFan inlining) - type: bool default: false - --loop_assignment_analysis (perform loop assignment analysis) - type: bool default: true - --turbo_profiling (enable profiling in TurboFan) - type: bool default: false - --turbo_delay_ssa_decon (delay ssa deconstruction in TurboFan register allocator) - type: bool default: false - --turbo_verify_allocation (verify register allocation in TurboFan) - type: bool default: false - --turbo_move_optimization (optimize gap moves in TurboFan) - type: bool default: true - --turbo_jt (enable jump threading in TurboFan) - type: bool default: true - --turbo_osr (enable OSR in TurboFan) - type: bool default: true - --turbo_exceptions (enable exception handling in TurboFan) - type: bool default: false - --turbo_stress_loop_peeling (stress loop peeling optimization) - type: bool default: false - --turbo_cf_optimization (optimize control flow in TurboFan) - type: bool default: true - --typed_array_max_size_in_heap (threshold for in-heap typed array) - type: int default: 64 - --frame_count (number of stack frames inspected by the profiler) - type: int default: 1 - --interrupt_budget (execution budget before interrupt is triggered) - type: int default: 6144 - --type_info_threshold (percentage of ICs that must have type info to allow optimization) - type: int default: 25 - --generic_ic_threshold (max percentage of megamorphic/generic ICs to allow optimization) - type: int default: 30 - --self_opt_count (call count before self-optimization) - type: int default: 130 - --trace_opt_verbose (extra verbose compilation tracing) - type: bool default: false - --debug_code (generate extra code (assertions) for debugging) - type: bool default: false - --code_comments (emit comments in code disassembly) - type: bool default: false - --enable_sse3 (enable use of SSE3 instructions if available) - type: bool default: true - --enable_sse4_1 (enable use of SSE4.1 instructions if available) - type: bool default: true - --enable_sahf (enable use of SAHF instruction if available (X64 only)) - type: bool default: true - --enable_avx (enable use of AVX instructions if available) - type: bool default: true - --enable_fma3 (enable use of FMA3 instructions if available) - type: bool default: true - --enable_vfp3 (enable use of VFP3 instructions if available) - type: bool default: true - --enable_armv7 (enable use of ARMv7 instructions if available (ARM only)) - type: bool default: true - --enable_armv8 (enable use of ARMv8 instructions if available (ARM 32-bit only)) - type: bool default: true - --enable_neon (enable use of NEON instructions if available (ARM only)) - type: bool default: true - --enable_sudiv (enable use of SDIV and UDIV instructions if available (ARM only)) - type: bool default: true - --enable_mls (enable use of MLS instructions if available (ARM only)) - type: bool default: true - --enable_movw_movt (enable loading 32-bit constant by means of movw/movt instruction pairs (ARM only)) - type: bool default: false - --enable_unaligned_accesses (enable unaligned accesses for ARMv7 (ARM only)) - type: bool default: true - --enable_32dregs (enable use of d16-d31 registers on ARM - this requires VFP3) - type: bool default: true - --enable_vldr_imm (enable use of constant pools for double immediate (ARM only)) - type: bool default: false - --force_long_branches (force all emitted branches to be in long mode (MIPS/PPC only)) - type: bool default: false - --mcpu (enable optimization for specific cpu) - type: string default: auto - --expose_natives_as (expose natives in global object) - type: string default: NULL - --expose_debug_as (expose debug in global object) - type: string default: NULL - --expose_free_buffer (expose freeBuffer extension) - type: bool default: false - --expose_gc (expose gc extension) - type: bool default: false - --expose_gc_as (expose gc extension under the specified name) - type: string default: NULL - --expose_externalize_string (expose externalize string extension) - type: bool default: false - --expose_trigger_failure (expose trigger-failure extension) - type: bool default: false - --stack_trace_limit (number of stack frames to capture) - type: int default: 10 - --builtins_in_stack_traces (show built-in functions in stack traces) - type: bool default: false - --disable_native_files (disable builtin natives files) - type: bool default: false - --inline_new (use fast inline allocation) - type: bool default: true - --trace_codegen (print name of functions for which code is generated) - type: bool default: false - --trace (trace function calls) - type: bool default: false - --mask_constants_with_cookie (use random jit cookie to mask large constants) - type: bool default: true - --lazy (use lazy compilation) - type: bool default: true - --trace_opt (trace lazy optimization) - type: bool default: false - --trace_opt_stats (trace lazy optimization statistics) - type: bool default: false - --opt (use adaptive optimizations) - type: bool default: true - --always_opt (always try to optimize functions) - type: bool default: false - --always_osr (always try to OSR functions) - type: bool default: false - --prepare_always_opt (prepare for turning on always opt) - type: bool default: false - --trace_deopt (trace optimize function deoptimization) - type: bool default: false - --trace_stub_failures (trace deoptimization of generated code stubs) - type: bool default: false - --serialize_toplevel (enable caching of toplevel scripts) - type: bool default: true - --serialize_inner (enable caching of inner functions) - type: bool default: true - --trace_serializer (print code serializer trace) - type: bool default: false - --min_preparse_length (minimum length for automatic enable preparsing) - type: int default: 1024 - --max_opt_count (maximum number of optimization attempts before giving up.) - type: int default: 10 - --compilation_cache (enable compilation cache) - type: bool default: true - --cache_prototype_transitions (cache prototype transitions) - type: bool default: true - --cpu_profiler_sampling_interval (CPU profiler sampling interval in microseconds) - type: int default: 1000 - --trace_debug_json (trace debugging JSON request/response) - type: bool default: false - --trace_js_array_abuse (trace out-of-bounds accesses to JS arrays) - type: bool default: false - --trace_external_array_abuse (trace out-of-bounds-accesses to external arrays) - type: bool default: false - --trace_array_abuse (trace out-of-bounds accesses to all arrays) - type: bool default: false - --enable_liveedit (enable liveedit experimental feature) - type: bool default: true - --hard_abort (abort by crashing) - type: bool default: true - --stack_size (default size of stack region v8 is allowed to use (in kBytes)) - type: int default: 984 - --max_stack_trace_source_length (maximum length of function source code printed in a stack trace.) - type: int default: 300 - --always_inline_smi_code (always inline smi code in non-opt code) - type: bool default: false - --min_semi_space_size (min size of a semi-space (in MBytes), the new space consists of twosemi-spaces) - type: int default: 0 - --target_semi_space_size (target size of a semi-space (in MBytes) before triggering a GC) - type: int default: 0 - --max_semi_space_size (max size of a semi-space (in MBytes), the new space consists of twosemi-spaces) - type: int default: 0 - --semi_space_growth_factor (factor by which to grow the new space) - type: int default: 2 - --experimental_new_space_growth_heuristic (Grow the new space based on the percentage of survivors instead of their absolute value.) - type: bool default: false - --max_old_space_size (max size of the old space (in Mbytes)) - type: int default: 0 - --initial_old_space_size (initial old space size (in Mbytes)) - type: int default: 0 - --max_executable_size (max size of executable memory (in Mbytes)) - type: int default: 0 - --gc_global (always perform global GCs) - type: bool default: false - --gc_interval (garbage collect after allocations) - type: int default: -1 - --retain_maps_for_n_gc (keeps maps alive for old space garbage collections) - type: int default: 2 - --trace_gc (print one trace line following each garbage collection) - type: bool default: false - --trace_gc_nvp (print one detailed trace line in name=value format after each garbage collection) - type: bool default: false - --trace_gc_ignore_scavenger (do not print trace line after scavenger collection) - type: bool default: false - --trace_idle_notification (print one trace line following each idle notification) - type: bool default: false - --trace_idle_notification_verbose (prints the heap state used by the idle notification) - type: bool default: false - --print_cumulative_gc_stat (print cumulative GC statistics in name=value format on exit) - type: bool default: false - --print_max_heap_committed (print statistics of the maximum memory committed for the heap in name=value format on exit) - type: bool default: false - --trace_gc_verbose (print more details following each garbage collection) - type: bool default: false - --trace_fragmentation (report fragmentation for old space) - type: bool default: false - --trace_fragmentation_verbose (report fragmentation for old space (detailed)) - type: bool default: false - --collect_maps (garbage collect maps from which no objects can be reached) - type: bool default: true - --weak_embedded_maps_in_optimized_code (make maps embedded in optimized code weak) - type: bool default: true - --weak_embedded_objects_in_optimized_code (make objects embedded in optimized code weak) - type: bool default: true - --flush_code (flush code that we expect not to use again (during full gc)) - type: bool default: true - --flush_code_incrementally (flush code that we expect not to use again (incrementally)) - type: bool default: true - --trace_code_flushing (trace code flushing progress) - type: bool default: false - --age_code (track un-executed functions to age code and flush only old code (required for code flushing)) - type: bool default: true - --incremental_marking (use incremental marking) - type: bool default: true - --incremental_marking_steps (do incremental marking steps) - type: bool default: true - --overapproximate_weak_closure (overapproximate weak closer to reduce atomic pause time) - type: bool default: true - --min_progress_during_object_groups_marking (keep overapproximating the weak closure as long as we discover at least this many unmarked objects) - type: int default: 128 - --max_object_groups_marking_rounds (at most try this many times to over approximate the weak closure) - type: int default: 3 - --concurrent_sweeping (use concurrent sweeping) - type: bool default: true - --trace_incremental_marking (trace progress of the incremental marking) - type: bool default: false - --track_gc_object_stats (track object counts and memory usage) - type: bool default: false - --track_detached_contexts (track native contexts that are expected to be garbage collected) - type: bool default: true - --trace_detached_contexts (trace native contexts that are expected to be garbage collected) - type: bool default: false - --heap_profiler_trace_objects (Dump heap object allocations/movements/size_updates) - type: bool default: false - --use_idle_notification (Use idle notification to reduce memory footprint.) - type: bool default: true - --use_ic (use inline caching) - type: bool default: true - --trace_ic (trace inline cache state transitions) - type: bool default: false - --native_code_counters (generate extra code for manipulating stats counters) - type: bool default: false - --always_compact (Perform compaction on every full GC) - type: bool default: false - --never_compact (Never perform compaction on full GC - testing only) - type: bool default: false - --compact_code_space (Compact code space on full non-incremental collections) - type: bool default: true - --incremental_code_compaction (Compact code space on full incremental collections) - type: bool default: true - --cleanup_code_caches_at_gc (Flush inline caches prior to mark compact collection and flush code caches in maps during mark compact cycle.) - type: bool default: true - --use_marking_progress_bar (Use a progress bar to scan large objects in increments when incremental marking is active.) - type: bool default: true - --zap_code_space (Zap free memory in code space with 0xCC while sweeping.) - type: bool default: true - --random_seed (Default seed for initializing random generator (0, the default, means to use system random).) - type: int default: 0 - --trace_weak_arrays (trace WeakFixedArray usage) - type: bool default: false - --track_prototype_users (keep track of which maps refer to a given prototype object) - type: bool default: false - --use_verbose_printer (allows verbose printing) - type: bool default: true - --allow_natives_syntax (allow natives syntax) - type: bool default: false - --trace_parse (trace parsing and preparsing) - type: bool default: false - --trace_sim (Trace simulator execution) - type: bool default: false - --debug_sim (Enable debugging the simulator) - type: bool default: false - --check_icache (Check icache flushes in ARM and MIPS simulator) - type: bool default: false - --stop_sim_at (Simulator stop after x number of instructions) - type: int default: 0 - --sim_stack_alignment (Stack alingment in bytes in simulator (4 or 8, 8 is default)) - type: int default: 8 - --sim_stack_size (Stack size of the ARM64 and MIPS64 simulator in kBytes (default is 2 MB)) - type: int default: 2048 - --log_regs_modified (When logging register values, only print modified registers.) - type: bool default: true - --log_colour (When logging, try to use coloured output.) - type: bool default: true - --ignore_asm_unimplemented_break (Don't break for ASM_UNIMPLEMENTED_BREAK macros.) - type: bool default: false - --trace_sim_messages (Trace simulator debug messages. Implied by --trace-sim.) - type: bool default: false - --stack_trace_on_illegal (print stack trace when an illegal exception is thrown) - type: bool default: false - --abort_on_uncaught_exception (abort program (dump core) when an uncaught exception is thrown) - type: bool default: false - --randomize_hashes (randomize hashes to avoid predictable hash collisions (with snapshots this option cannot override the baked-in seed)) - type: bool default: true - --hash_seed (Fixed seed to use to hash property keys (0 means random)(with snapshots this option cannot override the baked-in seed)) - type: int default: 0 - --profile_deserialization (Print the time it takes to deserialize the snapshot.) - type: bool default: false - --regexp_optimization (generate optimized regexp code) - type: bool default: true - --testing_bool_flag (testing_bool_flag) - type: bool default: true - --testing_maybe_bool_flag (testing_maybe_bool_flag) - type: maybe_bool default: unset - --testing_int_flag (testing_int_flag) - type: int default: 13 - --testing_float_flag (float-flag) - type: float default: 2.5 - --testing_string_flag (string-flag) - type: string default: Hello, world! - --testing_prng_seed (Seed used for threading test randomness) - type: int default: 42 - --testing_serialization_file (file in which to serialize heap) - type: string default: /tmp/serdes - --startup_blob (Write V8 startup blob file. (mksnapshot only)) - type: string default: NULL - --profile_hydrogen_code_stub_compilation (Print the time it takes to lazily compile hydrogen code stubs.) - type: bool default: false - --predictable (enable predictable mode) - type: bool default: false - --force_marking_deque_overflows (force overflows of marking deque by reducing it's size to 64 words) - type: bool default: false - --stress_compaction (stress the GC compactor to flush out bugs (implies --force_marking_deque_overflows)) - type: bool default: false - --manual_evacuation_candidates_selection (Test mode only flag. It allows an unit test to select evacuation candidates pages (requires --stress_compaction).) - type: bool default: false - --help (Print usage message, including flags, on console) - type: bool default: true - --dump_counters (Dump counters on exit) - type: bool default: false - --debugger (Enable JavaScript debugger) - type: bool default: false - --map_counters (Map counters to a file) - type: string default: - --js_arguments (Pass all remaining arguments to the script. Alias for "--".) - type: arguments default: - --log (Minimal logging (no API, code, GC, suspect, or handles samples).) - type: bool default: false - --log_all (Log all events to the log file.) - type: bool default: false - --log_api (Log API events to the log file.) - type: bool default: false - --log_code (Log code events to the log file without profiling.) - type: bool default: false - --log_gc (Log heap samples on garbage collection for the hp2ps tool.) - type: bool default: false - --log_handles (Log global handle events.) - type: bool default: false - --log_snapshot_positions (log positions of (de)serialized objects in the snapshot.) - type: bool default: false - --log_suspect (Log suspect operations.) - type: bool default: false - --prof (Log statistical profiling information (implies --log-code).) - type: bool default: false - --prof_cpp (Like --prof, but ignore generated code.) - type: bool default: false - --prof_browser_mode (Used with --prof, turns on browser-compatible mode for profiling.) - type: bool default: true - --log_regexp (Log regular expression execution.) - type: bool default: false - --logfile (Specify the name of the log file.) - type: string default: v8.log - --logfile_per_isolate (Separate log files for each isolate.) - type: bool default: true - --ll_prof (Enable low-level linux profiler.) - type: bool default: false - --perf_basic_prof (Enable perf linux profiler (basic support).) - type: bool default: false - --perf_jit_prof (Enable perf linux profiler (experimental annotate support).) - type: bool default: false - --gc_fake_mmap (Specify the name of the file for fake gc mmap used in ll_prof) - type: string default: /tmp/__v8_gc__ - --log_internal_timer_events (Time internal events.) - type: bool default: false - --log_timer_events (Time events including external callbacks.) - type: bool default: false - --log_instruction_stats (Log AArch64 instruction statistics.) - type: bool default: false - --log_instruction_file (AArch64 instruction statistics log file.) - type: string default: arm64_inst.csv - --log_instruction_period (AArch64 instruction statistics logging period.) - type: int default: 4194304 - --redirect_code_traces (output deopt information and disassembly into file code--.asm) - type: bool default: false - --redirect_code_traces_to (output deopt information and disassembly into the given file) - type: string default: NULL - --hydrogen_track_positions (track source code positions when building IR) - type: bool default: false - --trace_elements_transitions (trace elements transitions) - type: bool default: false - --trace_creation_allocation_sites (trace the creation of allocation sites) - type: bool default: false - --print_code_stubs (print code stubs) - type: bool default: false - --test_secondary_stub_cache (test secondary stub cache by disabling the primary one) - type: bool default: false - --test_primary_stub_cache (test primary stub cache by disabling the secondary one) - type: bool default: false - --print_code (print generated code) - type: bool default: false - --print_opt_code (print optimized code) - type: bool default: false - --print_unopt_code (print unoptimized code before printing optimized code based on it) - type: bool default: false - --print_code_verbose (print more information for code) - type: bool default: false - --print_builtin_code (print generated code for builtins) - type: bool default: false - --sodium (print generated code output suitable for use with the Sodium code viewer) - type: bool default: false - --print_all_code (enable all flags related to printing code) - type: bool default: false +value to an empty string ("" or " ") disables persistent REPL history. + .SH RESOURCES AND DOCUMENTATION -See the website for documentation https://nodejs.org/ +Website: \fBhttps://nodejs.org/\fR + +Documentation: \fBhttps://nodejs.org/api/\fR + +GitHub repository & Issue Tracker: \fBhttps://github.com/nodejs/node\fR -Mailing list: http://groups.google.com/group/nodejs +Mailing list: \fBhttp://groups.google.com/group/nodejs\fR -IRC (general questions): irc.freenode.net #node.js +IRC (general questions): \fBchat.freenode.net #node.js\fR -IRC (node core development): irc.freenode.net #node-dev +IRC (node core development): \fBchat.freenode.net #node-dev\fR diff --git a/src/node.cc b/src/node.cc index 87c82d678093bb..8442e35f923077 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3205,6 +3205,7 @@ static bool ParseDebugOpt(const char* arg) { } static void PrintHelp() { + // XXX: If you add an option here, please also add it to /doc/node.1 printf("Usage: node [options] [ -e script | script.js ] [arguments] \n" " node debug script.js [arguments] \n" "\n" @@ -3217,9 +3218,9 @@ static void PrintHelp() { " does not appear to be a terminal\n" " -r, --require module to preload (option can be repeated)\n" " --no-deprecation silence deprecation warnings\n" + " --trace-deprecation show stack traces on deprecations\n" " --throw-deprecation throw an exception anytime a deprecated " "function is used\n" - " --trace-deprecation show stack traces on deprecations\n" " --trace-sync-io show stack trace when use of sync IO\n" " is detected after the first tick\n" " --track-heap-objects track heap object allocations for heap " From 3c8e59c3965d81ab5c0656423e987665a47ddcdf Mon Sep 17 00:00:00 2001 From: Nathan Woltman Date: Sun, 20 Dec 2015 02:01:34 -0500 Subject: [PATCH 03/41] lib: copy arguments object instead of leaking it Instead of leaking the arguments object by passing it as an argument to a function, copy it's contents to a new array, then pass the array. This allows V8 to optimize the function that contains this code, improving performance. PR-URL: https://github.com/nodejs/node/pull/4361 Reviewed-By: James M Snell Reviewed-By: Brian White --- lib/_http_client.js | 12 ++++++++++-- lib/_tls_wrap.js | 6 +++++- lib/assert.js | 22 ++++++++++++++-------- lib/console.js | 5 ++++- lib/net.js | 12 ++++++++++-- 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/_http_client.js b/lib/_http_client.js index 04740d5dcb1348..cdf0726e78c9e0 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -569,10 +569,18 @@ ClientRequest.prototype.setTimeout = function(msecs, callback) { }; ClientRequest.prototype.setNoDelay = function() { - this._deferToConnect('setNoDelay', arguments); + const argsLen = arguments.length; + const args = new Array(argsLen); + for (var i = 0; i < argsLen; i++) + args[i] = arguments[i]; + this._deferToConnect('setNoDelay', args); }; ClientRequest.prototype.setSocketKeepAlive = function() { - this._deferToConnect('setKeepAlive', arguments); + const argsLen = arguments.length; + const args = new Array(argsLen); + for (var i = 0; i < argsLen; i++) + args[i] = arguments[i]; + this._deferToConnect('setKeepAlive', args); }; ClientRequest.prototype.clearTimeout = function(cb) { diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 39d91984e296ed..e340e4a041b6ee 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -944,7 +944,11 @@ function normalizeConnectArgs(listArgs) { } exports.connect = function(/* [port, host], options, cb */) { - var args = normalizeConnectArgs(arguments); + const argsLen = arguments.length; + var args = new Array(argsLen); + for (var i = 0; i < argsLen; i++) + args[i] = arguments[i]; + args = normalizeConnectArgs(args); var options = args[0]; var cb = args[1]; diff --git a/lib/assert.js b/lib/assert.js index 928420521e03e3..b33dbfa6cd1d4c 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -290,6 +290,16 @@ function expectedException(actual, expected) { return expected.call({}, actual) === true; } +function _tryBlock(block) { + var error; + try { + block(); + } catch (e) { + error = e; + } + return error; +} + function _throws(shouldThrow, block, expected, message) { var actual; @@ -302,11 +312,7 @@ function _throws(shouldThrow, block, expected, message) { expected = null; } - try { - block(); - } catch (e) { - actual = e; - } + actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); @@ -329,12 +335,12 @@ function _throws(shouldThrow, block, expected, message) { // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); + _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); +assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { + _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) throw err; }; diff --git a/lib/console.js b/lib/console.js index 5628c93007dde7..cc8e68c740ff15 100644 --- a/lib/console.js +++ b/lib/console.js @@ -83,7 +83,10 @@ Console.prototype.trace = function trace() { Console.prototype.assert = function(expression) { if (!expression) { - var arr = Array.prototype.slice.call(arguments, 1); + const argsLen = arguments.length || 1; + const arr = new Array(argsLen - 1); + for (var i = 1; i < argsLen; i++) + arr[i - 1] = arguments[i]; require('assert').ok(false, util.format.apply(null, arr)); } }; diff --git a/lib/net.js b/lib/net.js index 4ecc4e28367f9d..1a131e53315fd5 100644 --- a/lib/net.js +++ b/lib/net.js @@ -59,7 +59,11 @@ exports.createServer = function(options, connectionListener) { // connect(path, [cb]); // exports.connect = exports.createConnection = function() { - var args = normalizeConnectArgs(arguments); + const argsLen = arguments.length; + var args = new Array(argsLen); + for (var i = 0; i < argsLen; i++) + args[i] = arguments[i]; + args = normalizeConnectArgs(args); debug('createConnection', args); var s = new Socket(args[0]); return Socket.prototype.connect.apply(s, args); @@ -858,7 +862,11 @@ Socket.prototype.connect = function(options, cb) { // Old API: // connect(port, [host], [cb]) // connect(path, [cb]); - var args = normalizeConnectArgs(arguments); + const argsLen = arguments.length; + var args = new Array(argsLen); + for (var i = 0; i < argsLen; i++) + args[i] = arguments[i]; + args = normalizeConnectArgs(args); return Socket.prototype.connect.apply(this, args); } From f209effe8b9119243a11134b91bc6410b9fda8b5 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Sun, 7 Feb 2016 10:20:50 +0100 Subject: [PATCH 04/41] test: remove timer from test-http-1.0 It's possible that the `end` event is emitted after the timeout fires causing the test to fail. Just remove the timer. If for some reason the `end` would never fire, the test will fail with a timeout. PR-URL: https://github.com/nodejs/node/pull/5129 Reviewed-By: James M Snell Reviewed-By: Rich Trott --- test/parallel/test-http-1.0.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/test/parallel/test-http-1.0.js b/test/parallel/test-http-1.0.js index f9c865f3e630a0..b4cb62534c4f6e 100644 --- a/test/parallel/test-http-1.0.js +++ b/test/parallel/test-http-1.0.js @@ -15,13 +15,6 @@ function test(handler, request_generator, response_validator) { var client_got_eof = false; var server_response = ''; - function cleanup() { - server.close(); - response_validator(server_response, client_got_eof, true); - } - var timer = setTimeout(cleanup, common.platformTimeout(1000)); - process.on('exit', cleanup); - server.listen(port); server.on('listening', function() { var c = net.createConnection(port); @@ -36,14 +29,12 @@ function test(handler, request_generator, response_validator) { server_response += chunk; }); - c.on('end', function() { + c.on('end', common.mustCall(function() { client_got_eof = true; c.end(); server.close(); - clearTimeout(timer); - process.removeListener('exit', cleanup); response_validator(server_response, client_got_eof, false); - }); + })); }); } From 07b7172d76ab5962c2d9c8df54c6974ab183ab68 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Sun, 14 Feb 2016 17:27:17 +0200 Subject: [PATCH 05/41] net: remove unused `var self = this` from old code Removed an unused `var self = this` that is no longer required. PR-URL: https://github.com/nodejs/node/pull/5224 Reviewed-By: Benjamin Gruenbaum Reviewed-By: Evan Lucas Reviewed-By: Sakthipriyan Vairamani --- lib/net.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/net.js b/lib/net.js index 1a131e53315fd5..40d8f27f76db6a 100644 --- a/lib/net.js +++ b/lib/net.js @@ -277,9 +277,8 @@ function writeAfterFIN(chunk, encoding, cb) { var er = new Error('This socket has been ended by the other party'); er.code = 'EPIPE'; - var self = this; // TODO: defer error events consistently everywhere, not just the cb - self.emit('error', er); + this.emit('error', er); if (typeof cb === 'function') { process.nextTick(cb, er); } From 108fc90dd769f22cf373e039424b9fb466023c41 Mon Sep 17 00:00:00 2001 From: Jackson Tian Date: Mon, 15 Feb 2016 12:53:17 +0800 Subject: [PATCH 06/41] lib: reduce usage of `self = this` Remove unnecessary `self = this`. PR-URL: https://github.com/nodejs/node/pull/5231 Reviewed-By: James M Snell --- doc/api/stream.markdown | 5 ++-- lib/dgram.js | 3 +-- lib/https.js | 5 ++-- lib/net.js | 47 +++++++++++++++++--------------------- lib/repl.js | 6 ++--- test/parallel/test-zlib.js | 9 ++++---- 6 files changed, 33 insertions(+), 42 deletions(-) diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index 71f0e7ddf0850e..512466e986eb23 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -1026,15 +1026,14 @@ function SimpleProtocol(source, options) { // source is a readable stream, such as a socket or file this._source = source; - var self = this; source.on('end', () => { - self.push(null); + this.push(null); }); // give it a kick whenever the source is readable // read(0) will not consume any bytes source.on('readable', () => { - self.read(0); + this.read(0); }); this._rawHeader = []; diff --git a/lib/dgram.js b/lib/dgram.js index 93ae5c5ca1df48..a2827df0262800 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -355,8 +355,7 @@ Socket.prototype.close = function(callback) { this._stopReceiving(); this._handle.close(); this._handle = null; - var self = this; - process.nextTick(socketCloseNT, self); + process.nextTick(socketCloseNT, this); return this; }; diff --git a/lib/https.js b/lib/https.js index 25c24a3879443e..e8fa248c04ccce 100644 --- a/lib/https.js +++ b/lib/https.js @@ -69,12 +69,11 @@ function createConnection(port, host, options) { } } - const self = this; - const socket = tls.connect(options, function() { + const socket = tls.connect(options, () => { if (!options._agentKey) return; - self._cacheSession(options._agentKey, socket.getSession()); + this._cacheSession(options._agentKey, socket.getSession()); }); // Evict session on error diff --git a/lib/net.js b/lib/net.js index 40d8f27f76db6a..36ca93c4948c86 100644 --- a/lib/net.js +++ b/lib/net.js @@ -299,9 +299,8 @@ Socket.prototype.read = function(n) { Socket.prototype.listen = function() { debug('socket.listen'); - var self = this; - self.on('connection', arguments[0]); - listen(self, null, null, null); + this.on('connection', arguments[0]); + listen(this, null, null, null); }; @@ -883,7 +882,6 @@ Socket.prototype.connect = function(options, cb) { this._sockname = null; } - var self = this; var pipe = !!options.path; debug('pipe', pipe, options.path); @@ -893,21 +891,20 @@ Socket.prototype.connect = function(options, cb) { } if (typeof cb === 'function') { - self.once('connect', cb); + this.once('connect', cb); } this._unrefTimer(); - self._connecting = true; - self.writable = true; + this._connecting = true; + this.writable = true; if (pipe) { - connect(self, options.path); - + connect(this, options.path); } else { - lookupAndConnect(self, options); + lookupAndConnect(this, options); } - return self; + return this; }; @@ -1194,11 +1191,10 @@ exports._createServerHandle = createServerHandle; Server.prototype._listen2 = function(address, port, addressType, backlog, fd) { debug('listen2', address, port, addressType, backlog, fd); - var self = this; // If there is not yet a handle, we need to create one and bind. // In the case of a server sent via IPC, we don't need to do this. - if (self._handle) { + if (this._handle) { debug('_listen2: have a handle already'); } else { debug('_listen2: create a handle'); @@ -1223,22 +1219,22 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) { if (typeof rval === 'number') { var error = exceptionWithHostPort(rval, 'listen', address, port); - process.nextTick(emitErrorNT, self, error); + process.nextTick(emitErrorNT, this, error); return; } - self._handle = rval; + this._handle = rval; } - self._handle.onconnection = onconnection; - self._handle.owner = self; + this._handle.onconnection = onconnection; + this._handle.owner = this; - var err = _listen(self._handle, backlog); + var err = _listen(this._handle, backlog); if (err) { var ex = exceptionWithHostPort(err, 'listen', address, port); - self._handle.close(); - self._handle = null; - process.nextTick(emitErrorNT, self, ex); + this._handle.close(); + this._handle = null; + process.nextTick(emitErrorNT, this, ex); return; } @@ -1249,7 +1245,7 @@ Server.prototype._listen2 = function(address, port, addressType, backlog, fd) { if (this._unref) this.unref(); - process.nextTick(emitListeningNT, self); + process.nextTick(emitListeningNT, this); }; @@ -1509,15 +1505,14 @@ Server.prototype.close = function(cb) { Server.prototype._emitCloseIfDrained = function() { debug('SERVER _emitCloseIfDrained'); - var self = this; - if (self._handle || self._connections) { + if (this._handle || this._connections) { debug('SERVER handle? %j connections? %d', - !!self._handle, self._connections); + !!this._handle, this._connections); return; } - process.nextTick(emitCloseNT, self); + process.nextTick(emitCloseNT, this); }; diff --git a/lib/repl.js b/lib/repl.js index 6375ab2d2481fe..05585eb0342191 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -1108,7 +1108,7 @@ function regexpEscape(s) { REPLServer.prototype.convertToContext = function(cmd) { const scopeVar = /^\s*var\s*([_\w\$]+)(.*)$/m; const scopeFunc = /^\s*function\s*([_\w\$]+)/; - var self = this, matches; + var matches; // Replaces: var foo = "bar"; with: self.context.foo = bar; matches = scopeVar.exec(cmd); @@ -1117,9 +1117,9 @@ REPLServer.prototype.convertToContext = function(cmd) { } // Replaces: function foo() {}; with: foo = function foo() {}; - matches = scopeFunc.exec(self.bufferedCommand); + matches = scopeFunc.exec(this.bufferedCommand); if (matches && matches.length === 2) { - return matches[1] + ' = ' + self.bufferedCommand; + return matches[1] + ' = ' + this.bufferedCommand; } return cmd; diff --git a/test/parallel/test-zlib.js b/test/parallel/test-zlib.js index 1256d94a61402d..305d28865d992b 100644 --- a/test/parallel/test-zlib.js +++ b/test/parallel/test-zlib.js @@ -125,11 +125,10 @@ SlowStream.prototype.resume = function() { SlowStream.prototype.end = function(chunk) { // walk over the chunk in blocks. - var self = this; - self.chunk = chunk; - self.length = chunk.length; - self.resume(); - return self.ended; + this.chunk = chunk; + this.length = chunk.length; + this.resume(); + return this.ended; }; From 6daebdbd9b46201a7792fcdaba9c89e1adb5f012 Mon Sep 17 00:00:00 2001 From: Jackson Tian Date: Fri, 19 Feb 2016 11:01:11 +0800 Subject: [PATCH 07/41] lib: simplify code with String.prototype.repeat() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit use String.prototype.repeat() to simplify code, less code, more semantically. PR-URL: https://github.com/nodejs/node/pull/5359 Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- benchmark/http_simple.js | 14 +++----------- benchmark/http_simple_auto.js | 12 +++--------- benchmark/static_http_server.js | 5 +---- lib/_debugger.js | 6 +----- test/fixtures/print-chars.js | 7 +------ test/parallel/test-buffer.js | 5 +---- test/parallel/test-fs-realpath.js | 2 +- test/parallel/test-http-full-response.js | 5 +---- test/parallel/test-http-pipeline-regr-2639.js | 5 ++--- test/parallel/test-net-large-string.js | 5 +---- test/pummel/test-https-large-response.js | 5 +---- test/pummel/test-net-many-clients.js | 5 +---- test/pummel/test-net-throttle.js | 5 +---- test/pummel/test-tls-throttle.js | 8 +------- 14 files changed, 19 insertions(+), 70 deletions(-) diff --git a/benchmark/http_simple.js b/benchmark/http_simple.js index 0f36d3b6ce3ebd..9a580de2c0f665 100644 --- a/benchmark/http_simple.js +++ b/benchmark/http_simple.js @@ -4,7 +4,7 @@ var http = require('http'); var port = parseInt(process.env.PORT || 8000); -var fixed = makeString(20 * 1024, 'C'), +var fixed = 'C'.repeat(20 * 1024), storedBytes = {}, storedBuffer = {}, storedUnicode = {}; @@ -42,7 +42,7 @@ var server = module.exports = http.createServer(function(req, res) { if (n <= 0) throw new Error('bytes called with n <= 0'); if (storedBytes[n] === undefined) { - storedBytes[n] = makeString(n, 'C'); + storedBytes[n] = 'C'.repeat(n); } body = storedBytes[n]; @@ -63,7 +63,7 @@ var server = module.exports = http.createServer(function(req, res) { if (n <= 0) throw new Error('unicode called with n <= 0'); if (storedUnicode[n] === undefined) { - storedUnicode[n] = makeString(n, '\u263A'); + storedUnicode[n] = '\u263A'.repeat(n); } body = storedUnicode[n]; @@ -107,14 +107,6 @@ var server = module.exports = http.createServer(function(req, res) { } }); -function makeString(size, c) { - var s = ''; - while (s.length < size) { - s += c; - } - return s; -} - server.listen(port, function() { if (module === require.main) console.error('Listening at http://127.0.0.1:' + port + '/'); diff --git a/benchmark/http_simple_auto.js b/benchmark/http_simple_auto.js index 6f56879cc08aaa..bbdc2ed6d74071 100644 --- a/benchmark/http_simple_auto.js +++ b/benchmark/http_simple_auto.js @@ -13,11 +13,7 @@ var spawn = require('child_process').spawn; var port = parseInt(process.env.PORT || 8000); -var fixed = ''; -var i; -for (i = 0; i < 20 * 1024; i++) { - fixed += 'C'; -} +var fixed = 'C'.repeat(20 * 1024); var stored = {}; var storedBuffer = {}; @@ -30,16 +26,14 @@ var server = http.createServer(function(req, res) { var n_chunks = parseInt(commands[3], 10); var status = 200; var n; + var i; if (command == 'bytes') { n = parseInt(arg, 10); if (n <= 0) throw new Error('bytes called with n <= 0'); if (stored[n] === undefined) { - stored[n] = ''; - for (i = 0; i < n; i++) { - stored[n] += 'C'; - } + stored[n] = 'C'.repeat(n); } body = stored[n]; } else if (command == 'buffer') { diff --git a/benchmark/static_http_server.js b/benchmark/static_http_server.js index 804f83c208bb39..43c493675933e7 100644 --- a/benchmark/static_http_server.js +++ b/benchmark/static_http_server.js @@ -9,10 +9,7 @@ var bytes = 1024 * 5; var requests = 0; var responses = 0; -var body = ''; -for (var i = 0; i < bytes; i++) { - body += 'C'; -} +var body = 'C'.repeat(bytes); var server = http.createServer(function(req, res) { res.writeHead(200, { diff --git a/lib/_debugger.js b/lib/_debugger.js index 5ce1b16960b0ef..3681ce58802a62 100644 --- a/lib/_debugger.js +++ b/lib/_debugger.js @@ -1008,11 +1008,7 @@ function leftPad(n, prefix, maxN) { const nchars = Math.max(2, String(maxN).length) + 1; const nspaces = nchars - s.length - 1; - for (var i = 0; i < nspaces; i++) { - prefix += ' '; - } - - return prefix + s; + return prefix + ' '.repeat(nspaces) + s; } diff --git a/test/fixtures/print-chars.js b/test/fixtures/print-chars.js index e2223e20f25508..b9707fbf75fa67 100644 --- a/test/fixtures/print-chars.js +++ b/test/fixtures/print-chars.js @@ -2,9 +2,4 @@ var assert = require('assert'); var n = parseInt(process.argv[2]); -var s = ''; -for (var i = 0; i < n; i++) { - s += 'c'; -} - -process.stdout.write(s); +process.stdout.write('c'.repeat(n)); diff --git a/test/parallel/test-buffer.js b/test/parallel/test-buffer.js index 61f3aa08b70736..99d1c129ca8805 100644 --- a/test/parallel/test-buffer.js +++ b/test/parallel/test-buffer.js @@ -612,10 +612,7 @@ assert.equal(Buffer('=bad'.repeat(1e4), 'base64').length, 0); { // Creating buffers larger than pool size. const l = Buffer.poolSize + 5; - let s = ''; - for (let i = 0; i < l; i++) { - s += 'h'; - } + const s = 'h'.repeat(l); const b = new Buffer(s); diff --git a/test/parallel/test-fs-realpath.js b/test/parallel/test-fs-realpath.js index dcc28ce4d99afa..aa397e51d16409 100644 --- a/test/parallel/test-fs-realpath.js +++ b/test/parallel/test-fs-realpath.js @@ -219,7 +219,7 @@ function test_cyclic_link_overprotection(callback) { var folder = cycles + '/folder'; var link = folder + '/cycles'; var testPath = cycles; - for (var i = 0; i < 10; i++) testPath += '/folder/cycles'; + testPath += '/folder/cycles'.repeat(10); try {fs.unlinkSync(link);} catch (ex) {} fs.symlinkSync(cycles, link, 'dir'); unlink.push(link); diff --git a/test/parallel/test-http-full-response.js b/test/parallel/test-http-full-response.js index 8472a84fb9fac9..767efa3cd6657e 100644 --- a/test/parallel/test-http-full-response.js +++ b/test/parallel/test-http-full-response.js @@ -7,10 +7,7 @@ var exec = require('child_process').exec; var bodyLength = 12345; -var body = ''; -for (var i = 0; i < bodyLength; i++) { - body += 'c'; -} +var body = 'c'.repeat(bodyLength); var server = http.createServer(function(req, res) { res.writeHead(200, { diff --git a/test/parallel/test-http-pipeline-regr-2639.js b/test/parallel/test-http-pipeline-regr-2639.js index f1f75bff650ac5..c7cebb9d46a19f 100644 --- a/test/parallel/test-http-pipeline-regr-2639.js +++ b/test/parallel/test-http-pipeline-regr-2639.js @@ -22,9 +22,8 @@ var server = http.createServer(function(req, res) { }).listen(common.PORT, function() { const s = net.connect(common.PORT); - var big = ''; - for (var i = 0; i < COUNT; i++) - big += 'GET / HTTP/1.0\r\n\r\n'; + var big = 'GET / HTTP/1.0\r\n\r\n'.repeat(COUNT); + s.write(big); s.resume(); }); diff --git a/test/parallel/test-net-large-string.js b/test/parallel/test-net-large-string.js index 387f3f4f8c1dd3..26227c8e759787 100644 --- a/test/parallel/test-net-large-string.js +++ b/test/parallel/test-net-large-string.js @@ -4,10 +4,7 @@ var assert = require('assert'); var net = require('net'); var kPoolSize = 40 * 1024; -var data = ''; -for (var i = 0; i < kPoolSize; ++i) { - data += 'あ'; // 3bytes -} +var data = 'あ'.repeat(kPoolSize); var receivedSize = 0; var encoding = 'UTF-8'; diff --git a/test/pummel/test-https-large-response.js b/test/pummel/test-https-large-response.js index 4a15b29cd19467..1979c6737f76b3 100644 --- a/test/pummel/test-https-large-response.js +++ b/test/pummel/test-https-large-response.js @@ -16,12 +16,9 @@ var options = { }; var reqCount = 0; -var body = ''; process.stdout.write('build body...'); -for (var i = 0; i < 1024 * 1024; i++) { - body += 'hello world\n'; -} +var body = 'hello world\n'.repeat(1024 * 1024); process.stdout.write('done\n'); var server = https.createServer(options, function(req, res) { diff --git a/test/pummel/test-net-many-clients.js b/test/pummel/test-net-many-clients.js index 6d9dde1ddbc863..cb766ec1a47c63 100644 --- a/test/pummel/test-net-many-clients.js +++ b/test/pummel/test-net-many-clients.js @@ -11,10 +11,7 @@ var connections_per_client = 5; // measured var total_connections = 0; -var body = ''; -for (var i = 0; i < bytes; i++) { - body += 'C'; -} +var body = 'C'.repeat(bytes); var server = net.createServer(function(c) { console.log('connected'); diff --git a/test/pummel/test-net-throttle.js b/test/pummel/test-net-throttle.js index 54956b789aed93..e98a6c765a905e 100644 --- a/test/pummel/test-net-throttle.js +++ b/test/pummel/test-net-throttle.js @@ -9,10 +9,7 @@ var chars_recved = 0; var npauses = 0; console.log('build big string'); -var body = ''; -for (var i = 0; i < N; i++) { - body += 'C'; -} +body = 'C'.repeat(N); console.log('start server on port ' + common.PORT); diff --git a/test/pummel/test-tls-throttle.js b/test/pummel/test-tls-throttle.js index 67efb61b7e66aa..0e5cd455c8c4c4 100644 --- a/test/pummel/test-tls-throttle.js +++ b/test/pummel/test-tls-throttle.js @@ -12,16 +12,10 @@ if (!common.hasCrypto) { var tls = require('tls'); var fs = require('fs'); - -var body = ''; - process.stdout.write('build body...'); -for (var i = 0; i < 1024 * 1024; i++) { - body += 'hello world\n'; -} +var body = 'hello world\n'.repeat(1024 * 1024); process.stdout.write('done\n'); - var options = { key: fs.readFileSync(common.fixturesDir + '/keys/agent2-key.pem'), cert: fs.readFileSync(common.fixturesDir + '/keys/agent2-cert.pem') From acbce4b72b43d5027e8c3e1e5a305908b284384c Mon Sep 17 00:00:00 2001 From: Prince J Wesley Date: Thu, 25 Feb 2016 00:26:41 +0530 Subject: [PATCH 08/41] repl: fix stack trace column number in strict mode On strict mode, "'use strict'; void 0; " is added as prefix in order to prevent "use strict" as the result value for let/const statements. It causes wrong column number in stack trace. PR-URL: https://github.com/nodejs/node/pull/5416 Reviewed-By: Jeremiah Senkpiel Reviewed-By: James M Snell Reviewed-By: Roman Reiss --- lib/repl.js | 6 +++++- test/parallel/test-repl.js | 23 ++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lib/repl.js b/lib/repl.js index 05585eb0342191..0dc8a574523c6d 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -230,7 +230,7 @@ function REPLServer(prompt, (self.replMode === exports.REPL_MODE_STRICT || retry)) { // "void 0" keeps the repl from returning "use strict" as the // result value for let/const statements. - code = `'use strict'; void 0; ${code}`; + code = `'use strict'; void 0;\n${code}`; } var script = vm.createScript(code, { filename: file, @@ -289,6 +289,10 @@ function REPLServer(prompt, debug('domain error'); const top = replMap.get(self); internalUtil.decorateErrorStack(e); + if (e.stack && self.replMode === exports.REPL_MODE_STRICT) { + e.stack = e.stack.replace(/(\s+at\s+repl:)(\d+)/, + (_, pre, line) => pre + (line - 1)); + } top.outputStream.write((e.stack || e) + '\n'); top.lineParser.reset(); top.bufferedCommand = ''; diff --git a/test/parallel/test-repl.js b/test/parallel/test-repl.js index 2d2fdc97bab31a..3d2cab6334bd25 100644 --- a/test/parallel/test-repl.js +++ b/test/parallel/test-repl.js @@ -15,7 +15,7 @@ const prompt_npm = 'npm should be run outside of the ' + 'node repl, in your normal shell.\n' + '(Press Control-D to exit.)\n'; const expect_npm = prompt_npm + prompt_unix; -var server_tcp, server_unix, client_tcp, client_unix, timer; +var server_tcp, server_unix, client_tcp, client_unix, timer, replServer; // absolute path to test/fixtures/a.js @@ -48,9 +48,17 @@ function clean_up() { clearTimeout(timer); } +function strict_mode_error_test() { + send_expect([ + { client: client_unix, send: 'ref = 1', + expect: /^ReferenceError:\sref\sis\snot\sdefined\n\s+at\srepl:1:5/ }, + ]); +} + function error_test() { // The other stuff is done so reuse unix socket var read_buffer = ''; + var run_strict_test = true; client_unix.removeAllListeners('data'); client_unix.on('data', function(data) { @@ -72,6 +80,10 @@ function error_test() { read_buffer = ''; if (client_unix.list && client_unix.list.length > 0) { send_expect(client_unix.list); + } else if (run_strict_test) { + replServer.replMode = repl.REPL_MODE_STRICT; + run_strict_test = false; + strict_mode_error_test(); } else { console.error('End of Error test, running TCP test.'); tcp_test(); @@ -83,6 +95,10 @@ function error_test() { read_buffer = ''; if (client_unix.list && client_unix.list.length > 0) { send_expect(client_unix.list); + } else if (run_strict_test) { + replServer.replMode = repl.REPL_MODE_STRICT; + run_strict_test = false; + strict_mode_error_test(); } else { console.error('End of Error test, running TCP test.\n'); tcp_test(); @@ -369,12 +385,13 @@ function unix_test() { socket.end(); }); - repl.start({ + replServer = repl.start({ prompt: prompt_unix, input: socket, output: socket, useGlobal: true - }).context.message = message; + }); + replServer.context.message = message; }); server_unix.on('listening', function() { From 86484205867a8aac04b4fe44f8c7abc2bd5848aa Mon Sep 17 00:00:00 2001 From: Vladimir Kurchatkin Date: Sun, 28 Feb 2016 19:44:39 +0300 Subject: [PATCH 09/41] net: make `isIPv4` and `isIPv6` more efficient `isIPv4` and `isIPv6` are implemented on top of `isIP`, which in turn checks the sting for being both IPv4 and IPv6, which can be inefficient in some scenarios. This commit makes them use `uv_inet_pton` directly instead. PR-URL: https://github.com/nodejs/node/pull/5478 Reviewed-By: Evan Lucas Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Roman Reiss --- lib/net.js | 4 ++-- src/cares_wrap.cc | 23 +++++++++++++++++++++++ test/parallel/test-net-isip.js | 29 +++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/net.js b/lib/net.js index 36ca93c4948c86..020f9bd4573f4d 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1554,12 +1554,12 @@ exports.isIP = cares.isIP; exports.isIPv4 = function(input) { - return exports.isIP(input) === 4; + return cares.isIPv4(input); }; exports.isIPv6 = function(input) { - return exports.isIP(input) === 6; + return cares.isIPv6(input); }; diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 46636c528b7f81..66d5d08fe656fe 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -1044,6 +1044,27 @@ static void IsIP(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(rc); } +static void IsIPv4(const FunctionCallbackInfo& args) { + node::Utf8Value ip(args.GetIsolate(), args[0]); + char address_buffer[sizeof(struct in_addr)]; + + if (uv_inet_pton(AF_INET, *ip, &address_buffer) == 0) { + args.GetReturnValue().Set(true); + } else { + args.GetReturnValue().Set(false); + } +} + +static void IsIPv6(const FunctionCallbackInfo& args) { + node::Utf8Value ip(args.GetIsolate(), args[0]); + char address_buffer[sizeof(struct in6_addr)]; + + if (uv_inet_pton(AF_INET6, *ip, &address_buffer) == 0) { + args.GetReturnValue().Set(true); + } else { + args.GetReturnValue().Set(false); + } +} static void GetAddrInfo(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -1283,6 +1304,8 @@ static void Initialize(Local target, env->SetMethod(target, "getaddrinfo", GetAddrInfo); env->SetMethod(target, "getnameinfo", GetNameInfo); env->SetMethod(target, "isIP", IsIP); + env->SetMethod(target, "isIPv4", IsIPv4); + env->SetMethod(target, "isIPv6", IsIPv6); env->SetMethod(target, "strerror", StrError); env->SetMethod(target, "getServers", GetServers); diff --git a/test/parallel/test-net-isip.js b/test/parallel/test-net-isip.js index 76432ed3488240..6b159b59d8c8c0 100644 --- a/test/parallel/test-net-isip.js +++ b/test/parallel/test-net-isip.js @@ -31,11 +31,40 @@ assert.equal(net.isIP('0000:0000:0000:0000:0000:0000:12345:0000'), 0); assert.equal(net.isIP('0'), 0); assert.equal(net.isIP(), 0); assert.equal(net.isIP(''), 0); +assert.equal(net.isIP(null), 0); +assert.equal(net.isIP(123), 0); +assert.equal(net.isIP(true), 0); +assert.equal(net.isIP({}), 0); +assert.equal(net.isIP({ toString: () => '::2001:252:1:255.255.255.255' }), 6); +assert.equal(net.isIP({ toString: () => '127.0.0.1' }), 4); +assert.equal(net.isIP({ toString: () => 'bla' }), 0); assert.equal(net.isIPv4('127.0.0.1'), true); assert.equal(net.isIPv4('example.com'), false); assert.equal(net.isIPv4('2001:252:0:1::2008:6'), false); +assert.equal(net.isIPv4(), false); +assert.equal(net.isIPv4(''), false); +assert.equal(net.isIPv4(null), false); +assert.equal(net.isIPv4(123), false); +assert.equal(net.isIPv4(true), false); +assert.equal(net.isIPv4({}), false); +assert.equal(net.isIPv4({ + toString: () => '::2001:252:1:255.255.255.255' +}), false); +assert.equal(net.isIPv4({ toString: () => '127.0.0.1' }), true); +assert.equal(net.isIPv4({ toString: () => 'bla' }), false); assert.equal(net.isIPv6('127.0.0.1'), false); assert.equal(net.isIPv6('example.com'), false); assert.equal(net.isIPv6('2001:252:0:1::2008:6'), true); +assert.equal(net.isIPv6(), false); +assert.equal(net.isIPv6(''), false); +assert.equal(net.isIPv6(null), false); +assert.equal(net.isIPv6(123), false); +assert.equal(net.isIPv6(true), false); +assert.equal(net.isIPv6({}), false); +assert.equal(net.isIPv6({ + toString: () => '::2001:252:1:255.255.255.255' +}), true); +assert.equal(net.isIPv6({ toString: () => '127.0.0.1' }), false); +assert.equal(net.isIPv6({ toString: () => 'bla' }), false); From a6ec8a6cb7e07dc3638c03c1ded3195fc99f8467 Mon Sep 17 00:00:00 2001 From: Brian White Date: Mon, 29 Feb 2016 21:03:14 -0500 Subject: [PATCH 10/41] doc: fix crypto update() signatures PR-URL: https://github.com/nodejs/node/pull/5500 Reviewed-By: Shigeki Ohtsu --- doc/api/crypto.markdown | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/doc/api/crypto.markdown b/doc/api/crypto.markdown index de51bb67f92f22..22f4f549c370a2 100644 --- a/doc/api/crypto.markdown +++ b/doc/api/crypto.markdown @@ -669,10 +669,15 @@ provided a string is returned; otherwise a [`Buffer`][] is returned; The `Hmac` object can not be used again after `hmac.digest()` has been called. Multiple calls to `hmac.digest()` will result in an error being thrown. -### hmac.update(data) +### hmac.update(data[, input_encoding]) -Update the `Hmac` content with the given `data`. This can be called -many times with new data as it is streamed. +Updates the `Hmac` content with the given `data`, the encoding of which +is given in `input_encoding` and can be `'utf8'`, `'ascii'` or +`'binary'`. If `encoding` is not provided, and the `data` is a string, an +encoding of `'utf8'` is enforced. If `data` is a [`Buffer`][] then +`input_encoding` is ignored. + +This can be called many times with new data as it is streamed. ## Class: Sign @@ -733,10 +738,15 @@ returned. The `Sign` object can not be again used after `sign.sign()` method has been called. Multiple calls to `sign.sign()` will result in an error being thrown. -### sign.update(data) +### sign.update(data[, input_encoding]) -Updates the sign object with the given `data`. This can be called many times -with new data as it is streamed. +Updates the `Sign` content with the given `data`, the encoding of which +is given in `input_encoding` and can be `'utf8'`, `'ascii'` or +`'binary'`. If `encoding` is not provided, and the `data` is a string, an +encoding of `'utf8'` is enforced. If `data` is a [`Buffer`][] then +`input_encoding` is ignored. + +This can be called many times with new data as it is streamed. ## Class: Verify @@ -780,10 +790,15 @@ console.log(verify.verify(public_key, signature)); // Prints true or false ``` -### verifier.update(data) +### verifier.update(data[, input_encoding]) -Updates the verifier object with the given `data`. This can be called many -times with new data as it is streamed. +Updates the `Verify` content with the given `data`, the encoding of which +is given in `input_encoding` and can be `'utf8'`, `'ascii'` or +`'binary'`. If `encoding` is not provided, and the `data` is a string, an +encoding of `'utf8'` is enforced. If `data` is a [`Buffer`][] then +`input_encoding` is ignored. + +This can be called many times with new data as it is streamed. ### verifier.verify(object, signature[, signature_format]) From 3b8fc4fddc9d8121eb6c3cf8d976b64d214f25ee Mon Sep 17 00:00:00 2001 From: Bill Automata Date: Tue, 1 Mar 2016 09:26:32 -0800 Subject: [PATCH 11/41] doc: update crypto docs to use good defaults [Diffie-Hellman](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange#Cryptographic_explanation) keys are composed of a `generator` a `prime` a `secret_key` and the `public_key` resulting from the math operation: ``` (generator ^ secret_key) mod prime = public_key ``` Diffie-Hellman keypairs will compute a matching shared secret if and only if the generator and prime match for both recipients. The generator is usually **2** and the prime is what is called a [Safe Prime](https://en.wikipedia.org/wiki/Safe_prime). Usually this matching is accomplished by using [standard published groups](http://tools.ietf.org/html/rfc3526). We expose access those groups with the `crypto.getDiffieHellman` function. `createDiffieHellman` is trickier to use. The original example had the user creating 11 bit keys, and creating random groups of generators and primes. 11 bit keys are very very small, can be cracked by a single person on a single sheet of paper. A byproduct of using such small keys were that it was a high likelihood that two calls of `createDiffieHellman(11)` would result in using the same 11 bit safe prime. The original example code would fail when the safe primes generated at 11 bit lengths did not match for alice and bob. If you want to use your own generated safe `prime` then the proper use of `createDiffieHellman` is to pass the `prime` and `generator` to the recipient's constructor, so that when they compute the shared secret their `prime` and `generator` match, which is fundamental to the algorithm. PR-URL: https://github.com/nodejs/node/pull/5505 Reviewed-By: Brian White Reviewed-By: Fedor Indutny Reviewed-By: James M Snell --- doc/api/crypto.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/api/crypto.markdown b/doc/api/crypto.markdown index 22f4f549c370a2..d176a482274c18 100644 --- a/doc/api/crypto.markdown +++ b/doc/api/crypto.markdown @@ -325,19 +325,19 @@ const crypto = require('crypto'); const assert = require('assert'); // Generate Alice's keys... -const alice = crypto.createDiffieHellman(11); +const alice = crypto.createDiffieHellman(2048); const alice_key = alice.generateKeys(); // Generate Bob's keys... -const bob = crypto.createDiffieHellman(11); +const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator()); const bob_key = bob.generateKeys(); // Exchange and generate the secret... const alice_secret = alice.computeSecret(bob_key); const bob_secret = bob.computeSecret(alice_key); -assert(alice_secret, bob_secret); - // OK +// OK +assert.equal(alice_secret.toString('hex'), bob_secret.toString('hex')); ``` ### diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding]) From b258dddb8c97e3963e16989fda617652f3dad629 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Wed, 2 Mar 2016 21:59:17 +0100 Subject: [PATCH 12/41] test: repl tab completion test It checks that `eval` is called with `.scope` as an input string. PR-URL: https://github.com/nodejs/node/pull/5534 Reviewed-By: Colin Ihrig Reviewed-By: Rich Trott Reviewed-By: James M Snell --- test/parallel/test-repl-eval-scope.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 test/parallel/test-repl-eval-scope.js diff --git a/test/parallel/test-repl-eval-scope.js b/test/parallel/test-repl-eval-scope.js new file mode 100644 index 00000000000000..b9bace5f7d982a --- /dev/null +++ b/test/parallel/test-repl-eval-scope.js @@ -0,0 +1,23 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const repl = require('repl'); + +{ + const stream = new common.ArrayStream(); + const options = { + eval: common.mustCall((cmd, context) => { + assert.strictEqual(cmd, '.scope\n'); + assert.deepStrictEqual(context, {animal: 'Sterrance'}); + }), + input: stream, + output: stream, + terminal: true + }; + + const r = repl.start(options); + r.context = {animal: 'Sterrance'}; + + stream.emit('data', '\t'); + stream.emit('.exit\n'); +} From 7520100e8b9e9d63a76c1d60ac20c9306bc37be6 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Tue, 9 Feb 2016 10:32:32 -0800 Subject: [PATCH 13/41] test: add test-npm-install to parallel tests suite Currently we are not testing that `npm install` works. This is a very naive / basic test that shells out to `npm install` in an empty `tempDir`. While this test will not be able to check that `npm install` is 100% working, it should catch certain edge cases that break it. PR-URL: https://github.com/nodejs/node/pull/5166 Reviewed-By: Rich Trott Reviewed-By: James M Snell Reviewed-By: Alexis Campailla --- test/parallel/test-npm-install.js | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 test/parallel/test-npm-install.js diff --git a/test/parallel/test-npm-install.js b/test/parallel/test-npm-install.js new file mode 100644 index 00000000000000..5275b17b39ebb7 --- /dev/null +++ b/test/parallel/test-npm-install.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common'); + +const path = require('path'); +const spawn = require('child_process').spawn; +const assert = require('assert'); +const fs = require('fs'); + +common.refreshTmpDir(); + +const npmPath = path.join( + common.testDir, + '..', + 'deps', + 'npm', + 'bin', + 'npm-cli.js' +); + +const args = [ + npmPath, + 'install' +]; + +const pkgContent = '{}'; + +const pkgPath = path.join(common.tmpDir, 'package.json'); + +fs.writeFileSync(pkgPath, pkgContent); + +const proc = spawn(process.execPath, args, { + cwd: common.tmpDir +}); + +function handleExit(code, signalCode) { + assert.equal(code, 0, 'npm install should run without an error'); + assert.ok(signalCode === null, 'signalCode should be null'); +} + +proc.on('exit', common.mustCall(handleExit)); From d506eea4b782ae66d84bd877d5e226a2ba027128 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Wed, 9 Mar 2016 00:59:59 +0100 Subject: [PATCH 14/41] test: improve test-npm-install Make npm install a dependency that is defined as a relative path, so it avoids any network interaction. PR-URL: https://github.com/nodejs/node/pull/5613 Reviewed-By: James M Snell Reviewed-By: Claudio Rodriguez --- test/parallel/test-npm-install.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/parallel/test-npm-install.js b/test/parallel/test-npm-install.js index 5275b17b39ebb7..0c2e4df52f9863 100644 --- a/test/parallel/test-npm-install.js +++ b/test/parallel/test-npm-install.js @@ -22,7 +22,11 @@ const args = [ 'install' ]; -const pkgContent = '{}'; +const pkgContent = JSON.stringify({ + dependencies: { + 'package-name': common.fixturesDir + '/packages/main' + } +}); const pkgPath = path.join(common.tmpDir, 'package.json'); @@ -35,6 +39,9 @@ const proc = spawn(process.execPath, args, { function handleExit(code, signalCode) { assert.equal(code, 0, 'npm install should run without an error'); assert.ok(signalCode === null, 'signalCode should be null'); + assert.doesNotThrow(function() { + fs.accessSync(common.tmpDir + '/node_modules/package-name'); + }); } proc.on('exit', common.mustCall(handleExit)); From 1d0e4a987d42bf16c9ac4dc3dd8ce57f08f7fdd1 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 8 Mar 2016 23:21:50 +0100 Subject: [PATCH 15/41] deps: remove unused openssl files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/nodejs/node/issues/5615 PR-URL: https://github.com/nodejs/node/pull/5619 Reviewed-By: Fedor Indutny Reviewed-By: James M Snell Reviewed-By: Johan Bergström Reviewed-By: Rod Vagg --- deps/openssl/openssl/Makefile | 680 ------------------------- deps/openssl/openssl/Makefile.bak | 680 ------------------------- deps/openssl/openssl/apps/CA.pl | 189 ------- deps/openssl/openssl/test/evptests.txt | 401 --------------- deps/openssl/openssl/tools/c_rehash | 210 -------- 5 files changed, 2160 deletions(-) delete mode 100644 deps/openssl/openssl/Makefile delete mode 100644 deps/openssl/openssl/Makefile.bak delete mode 100644 deps/openssl/openssl/apps/CA.pl delete mode 100644 deps/openssl/openssl/test/evptests.txt delete mode 100644 deps/openssl/openssl/tools/c_rehash diff --git a/deps/openssl/openssl/Makefile b/deps/openssl/openssl/Makefile deleted file mode 100644 index ee04c02cc1ca9e..00000000000000 --- a/deps/openssl/openssl/Makefile +++ /dev/null @@ -1,680 +0,0 @@ -### Generated automatically from Makefile.org by Configure. - -## -## Makefile for OpenSSL -## - -VERSION=1.0.2f -MAJOR=1 -MINOR=0.2 -SHLIB_VERSION_NUMBER=1.0.0 -SHLIB_VERSION_HISTORY= -SHLIB_MAJOR=1 -SHLIB_MINOR=0.0 -SHLIB_EXT= -PLATFORM=dist -OPTIONS= no-ec_nistp_64_gcc_128 no-gmp no-jpake no-krb5 no-libunbound no-md2 no-rc5 no-rfc3779 no-sctp no-shared no-ssl-trace no-store no-unit-test no-zlib no-zlib-dynamic static-engine -CONFIGURE_ARGS=dist -SHLIB_TARGET= - -# HERE indicates where this Makefile lives. This can be used to indicate -# where sub-Makefiles are expected to be. Currently has very limited usage, -# and should probably not be bothered with at all. -HERE=. - -# INSTALL_PREFIX is for package builders so that they can configure -# for, say, /usr/ and yet have everything installed to /tmp/somedir/usr/. -# Normally it is left empty. -INSTALL_PREFIX= -INSTALLTOP=/usr/local/ssl - -# Do not edit this manually. Use Configure --openssldir=DIR do change this! -OPENSSLDIR=/usr/local/ssl - -# NO_IDEA - Define to build without the IDEA algorithm -# NO_RC4 - Define to build without the RC4 algorithm -# NO_RC2 - Define to build without the RC2 algorithm -# THREADS - Define when building with threads, you will probably also need any -# system defines as well, i.e. _REENTERANT for Solaris 2.[34] -# TERMIO - Define the termio terminal subsystem, needed if sgtty is missing. -# TERMIOS - Define the termios terminal subsystem, Silicon Graphics. -# LONGCRYPT - Define to use HPUX 10.x's long password modification to crypt(3). -# DEVRANDOM - Give this the value of the 'random device' if your OS supports -# one. 32 bytes will be read from this when the random -# number generator is initalised. -# SSL_FORBID_ENULL - define if you want the server to be not able to use the -# NULL encryption ciphers. -# -# LOCK_DEBUG - turns on lots of lock debug output :-) -# REF_CHECK - turn on some xyz_free() assertions. -# REF_PRINT - prints some stuff on structure free. -# CRYPTO_MDEBUG - turns on my 'memory leak' detecting stuff -# MFUNC - Make all Malloc/Free/Realloc calls call -# CRYPTO_malloc/CRYPTO_free/CRYPTO_realloc which can be setup to -# call application defined callbacks via CRYPTO_set_mem_functions() -# MD5_ASM needs to be defined to use the x86 assembler for MD5 -# SHA1_ASM needs to be defined to use the x86 assembler for SHA1 -# RMD160_ASM needs to be defined to use the x86 assembler for RIPEMD160 -# Do not define B_ENDIAN or L_ENDIAN if 'unsigned long' == 8. It must -# equal 4. -# PKCS1_CHECK - pkcs1 tests. - -CC= cc -CFLAG= -O -DEPFLAG= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_LIBUNBOUND -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST -PEX_LIBS= -EX_LIBS= -EXE_EXT= -ARFLAGS= -AR= ar $(ARFLAGS) r -RANLIB= /usr/bin/ranlib -NM= nm -PERL= /usr/bin/perl -TAR= tar -TARFLAGS= --no-recursion -MAKEDEPPROG=makedepend -LIBDIR=lib - -# We let the C compiler driver to take care of .s files. This is done in -# order to be excused from maintaining a separate set of architecture -# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC -# gcc, then the driver will automatically translate it to -xarch=v8plus -# and pass it down to assembler. -AS=$(CC) -c -ASFLAG=$(CFLAG) - -# For x86 assembler: Set PROCESSOR to 386 if you want to support -# the 80386. -PROCESSOR= - -# CPUID module collects small commonly used assembler snippets -CPUID_OBJ= mem_clr.o -BN_ASM= bn_asm.o -EC_ASM= -DES_ENC= des_enc.o fcrypt_b.o -AES_ENC= aes_core.o aes_cbc.o -BF_ENC= bf_enc.o -CAST_ENC= c_enc.o -RC4_ENC= rc4_enc.o rc4_skey.o -RC5_ENC= rc5_enc.o -MD5_ASM_OBJ= -SHA1_ASM_OBJ= -RMD160_ASM_OBJ= -WP_ASM_OBJ= wp_block.o -CMLL_ENC= camellia.o cmll_misc.o cmll_cbc.o -MODES_ASM_OBJ= -ENGINES_ASM_OBJ= -PERLASM_SCHEME= - -# KRB5 stuff -KRB5_INCLUDES= -LIBKRB5= - -# Zlib stuff -ZLIB_INCLUDE= -LIBZLIB= - -# TOP level FIPS install directory. -FIPSDIR=/usr/local/ssl/fips-2.0 - -# This is the location of fipscanister.o and friends. -# The FIPS module build will place it $(INSTALLTOP)/lib -# but since $(INSTALLTOP) can only take the default value -# when the module is built it will be in /usr/local/ssl/lib -# $(INSTALLTOP) for this build may be different so hard -# code the path. - -FIPSLIBDIR= - -# The location of the library which contains fipscanister.o -# normally it will be libcrypto unless fipsdso is set in which -# case it will be libfips. If not compiling in FIPS mode at all -# this is empty making it a useful test for a FIPS compile. - -FIPSCANLIB= - -# Shared library base address. Currently only used on Windows. -# - -BASEADDR=0xFB00000 - -DIRS= crypto ssl engines apps test tools -ENGDIRS= ccgost -SHLIBDIRS= crypto ssl - -# dirs in crypto to build -SDIRS= \ - objects \ - md4 md5 sha mdc2 hmac ripemd whrlpool \ - des aes rc2 rc4 idea bf cast camellia seed modes \ - bn ec rsa dsa ecdsa dh ecdh dso engine \ - buffer bio stack lhash rand err \ - evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \ - cms pqueue ts srp cmac -# keep in mind that the above list is adjusted by ./Configure -# according to no-xxx arguments... - -# tests to perform. "alltests" is a special word indicating that all tests -# should be performed. -TESTS = alltests - -MAKEFILE= Makefile - -MANDIR=$(OPENSSLDIR)/man -MAN1=1 -MAN3=3 -MANSUFFIX= -HTMLSUFFIX=html -HTMLDIR=$(OPENSSLDIR)/html -SHELL=/bin/sh - -TOP= . -ONEDIRS=out tmp -EDIRS= times doc bugs util include certs ms shlib mt demos perl sf dep VMS -WDIRS= windows -LIBS= libcrypto.a libssl.a -SHARED_CRYPTO=libcrypto$(SHLIB_EXT) -SHARED_SSL=libssl$(SHLIB_EXT) -SHARED_LIBS= -SHARED_LIBS_LINK_EXTS= -SHARED_LDFLAGS= - -GENERAL= Makefile -BASENAME= openssl -NAME= $(BASENAME)-$(VERSION) -TARFILE= ../$(NAME).tar -EXHEADER= e_os2.h -HEADER= e_os.h - -all: Makefile build_all - -# as we stick to -e, CLEARENV ensures that local variables in lower -# Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn -# shell, which [annoyingly enough] terminates unset with error if VAR -# is not present:-( TOP= && unset TOP is tribute to HP-UX /bin/sh, -# which terminates unset with error if no variable was present:-( -CLEARENV= TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS} \ - $${INCLUDE+INCLUDE} $${INCLUDES+INCLUDES} \ - $${DIR+DIR} $${DIRS+DIRS} $${SRC+SRC} \ - $${LIBSRC+LIBSRC} $${LIBOBJ+LIBOBJ} $${ALL+ALL} \ - $${EXHEADER+EXHEADER} $${HEADER+HEADER} \ - $${GENERAL+GENERAL} $${CFLAGS+CFLAGS} \ - $${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS} \ - $${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS} $${SCRIPTS+SCRIPTS} \ - $${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS} \ - $${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS} - -# LC_ALL=C ensures that error [and other] messages are delivered in -# same language for uniform treatment. -BUILDENV= LC_ALL=C PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)'\ - CC='$(CC)' CFLAG='$(CFLAG)' \ - AS='$(CC)' ASFLAG='$(CFLAG) -c' \ - AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)' \ - CROSS_COMPILE='$(CROSS_COMPILE)' \ - PERL='$(PERL)' ENGDIRS='$(ENGDIRS)' \ - SDIRS='$(SDIRS)' LIBRPATH='$(INSTALLTOP)/$(LIBDIR)' \ - INSTALL_PREFIX='$(INSTALL_PREFIX)' \ - INSTALLTOP='$(INSTALLTOP)' OPENSSLDIR='$(OPENSSLDIR)' \ - LIBDIR='$(LIBDIR)' \ - MAKEDEPEND='$$$${TOP}/util/domd $$$${TOP} -MD $(MAKEDEPPROG)' \ - DEPFLAG='-DOPENSSL_NO_DEPRECATED $(DEPFLAG)' \ - MAKEDEPPROG='$(MAKEDEPPROG)' \ - SHARED_LDFLAGS='$(SHARED_LDFLAGS)' \ - KRB5_INCLUDES='$(KRB5_INCLUDES)' LIBKRB5='$(LIBKRB5)' \ - ZLIB_INCLUDE='$(ZLIB_INCLUDE)' LIBZLIB='$(LIBZLIB)' \ - EXE_EXT='$(EXE_EXT)' SHARED_LIBS='$(SHARED_LIBS)' \ - SHLIB_EXT='$(SHLIB_EXT)' SHLIB_TARGET='$(SHLIB_TARGET)' \ - PEX_LIBS='$(PEX_LIBS)' EX_LIBS='$(EX_LIBS)' \ - CPUID_OBJ='$(CPUID_OBJ)' BN_ASM='$(BN_ASM)' \ - EC_ASM='$(EC_ASM)' DES_ENC='$(DES_ENC)' \ - AES_ENC='$(AES_ENC)' CMLL_ENC='$(CMLL_ENC)' \ - BF_ENC='$(BF_ENC)' CAST_ENC='$(CAST_ENC)' \ - RC4_ENC='$(RC4_ENC)' RC5_ENC='$(RC5_ENC)' \ - SHA1_ASM_OBJ='$(SHA1_ASM_OBJ)' \ - MD5_ASM_OBJ='$(MD5_ASM_OBJ)' \ - RMD160_ASM_OBJ='$(RMD160_ASM_OBJ)' \ - WP_ASM_OBJ='$(WP_ASM_OBJ)' \ - MODES_ASM_OBJ='$(MODES_ASM_OBJ)' \ - ENGINES_ASM_OBJ='$(ENGINES_ASM_OBJ)' \ - PERLASM_SCHEME='$(PERLASM_SCHEME)' \ - FIPSLIBDIR='${FIPSLIBDIR}' \ - FIPSDIR='${FIPSDIR}' \ - FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}" \ - THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES= -# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors, -# which in turn eliminates ambiguities in variable treatment with -e. - -# BUILD_CMD is a generic macro to build a given target in a given -# subdirectory. The target must be given through the shell variable -# `target' and the subdirectory to build in must be given through `dir'. -# This macro shouldn't be used directly, use RECURSIVE_BUILD_CMD or -# BUILD_ONE_CMD instead. -# -# BUILD_ONE_CMD is a macro to build a given target in a given -# subdirectory if that subdirectory is part of $(DIRS). It requires -# exactly the same shell variables as BUILD_CMD. -# -# RECURSIVE_BUILD_CMD is a macro to build a given target in all -# subdirectories defined in $(DIRS). It requires that the target -# is given through the shell variable `target'. -BUILD_CMD= if [ -d "$$dir" ]; then \ - ( cd $$dir && echo "making $$target in $$dir..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. DIR=$$dir $$target \ - ) || exit 1; \ - fi -RECURSIVE_BUILD_CMD=for dir in $(DIRS); do $(BUILD_CMD); done -BUILD_ONE_CMD=\ - if expr " $(DIRS) " : ".* $$dir " >/dev/null 2>&1; then \ - $(BUILD_CMD); \ - fi - -reflect: - @[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV) - -sub_all: build_all - -build_all: build_libs build_apps build_tests build_tools - -build_libs: build_libcrypto build_libssl openssl.pc - -build_libcrypto: build_crypto build_engines libcrypto.pc -build_libssl: build_ssl libssl.pc - -build_crypto: - @dir=crypto; target=all; $(BUILD_ONE_CMD) -build_ssl: build_crypto - @dir=ssl; target=all; $(BUILD_ONE_CMD) -build_engines: build_crypto - @dir=engines; target=all; $(BUILD_ONE_CMD) -build_apps: build_libs - @dir=apps; target=all; $(BUILD_ONE_CMD) -build_tests: build_libs - @dir=test; target=all; $(BUILD_ONE_CMD) -build_tools: build_libs - @dir=tools; target=all; $(BUILD_ONE_CMD) - -all_testapps: build_libs build_testapps -build_testapps: - @dir=crypto; target=testapps; $(BUILD_ONE_CMD) - -fips_premain_dso$(EXE_EXT): libcrypto.a - [ -z "$(FIPSCANLIB)" ] || $(CC) $(CFLAG) -Iinclude \ - -DFINGERPRINT_PREMAIN_DSO_LOAD -o $@ \ - $(FIPSLIBDIR)fips_premain.c $(FIPSLIBDIR)fipscanister.o \ - libcrypto.a $(EX_LIBS) - -libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT) - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ - FIPSLD_LIBCRYPTO=libcrypto.a ; \ - FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \ - export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \ - fi; \ - $(MAKE) -e SHLIBDIRS=crypto CC="$${CC:-$(CC)}" build-shared && \ - (touch -c fips_premain_dso$(EXE_EXT) || :); \ - else \ - echo "There's no support for shared libraries on this platform" >&2; \ - exit 1; \ - fi - -libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - $(MAKE) SHLIBDIRS=ssl SHLIBDEPS='-lcrypto' build-shared; \ - else \ - echo "There's no support for shared libraries on this platform" >&2; \ - exit 1; \ - fi - -clean-shared: - @set -e; for i in $(SHLIBDIRS); do \ - if [ -n "$(SHARED_LIBS_LINK_EXTS)" ]; then \ - tmp="$(SHARED_LIBS_LINK_EXTS)"; \ - for j in $${tmp:-x}; do \ - ( set -x; rm -f lib$$i$$j ); \ - done; \ - fi; \ - ( set -x; rm -f lib$$i$(SHLIB_EXT) ); \ - if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ - ( set -x; rm -f cyg$$i$(SHLIB_EXT) lib$$i$(SHLIB_EXT).a ); \ - fi; \ - done - -link-shared: - @ set -e; for i in $(SHLIBDIRS); do \ - $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \ - LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ - LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ - symlink.$(SHLIB_TARGET); \ - libs="$$libs -l$$i"; \ - done - -build-shared: do_$(SHLIB_TARGET) link-shared - -do_$(SHLIB_TARGET): - @ set -e; libs='-L. $(SHLIBDEPS)'; for i in $(SHLIBDIRS); do \ - if [ "$$i" = "ssl" -a -n "$(LIBKRB5)" ]; then \ - libs="$(LIBKRB5) $$libs"; \ - fi; \ - $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \ - LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ - LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ - LIBDEPS="$$libs $(EX_LIBS)" \ - link_a.$(SHLIB_TARGET); \ - libs="-l$$i $$libs"; \ - done - -libcrypto.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL-libcrypto'; \ - echo 'Description: OpenSSL cryptography library'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: '; \ - echo 'Libs: -L$${libdir} -lcrypto'; \ - echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc - -libssl.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL-libssl'; \ - echo 'Description: Secure Sockets Layer and cryptography libraries'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires.private: libcrypto'; \ - echo 'Libs: -L$${libdir} -lssl'; \ - echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc - -openssl.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL'; \ - echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: libssl libcrypto' ) > openssl.pc - -Makefile: Makefile.org Configure config - @echo "Makefile is older than Makefile.org, Configure or config." - @echo "Reconfigure the source tree (via './config' or 'perl Configure'), please." - @false - -libclean: - rm -f *.map *.so *.so.* *.dylib *.dll engines/*.so engines/*.dll engines/*.dylib *.a engines/*.a */lib */*/lib - -clean: libclean - rm -f shlib/*.o *.o core a.out fluff rehash.time testlog make.log cctest cctest.c - @set -e; target=clean; $(RECURSIVE_BUILD_CMD) - rm -f $(LIBS) - rm -f openssl.pc libssl.pc libcrypto.pc - rm -f speed.* .pure - rm -f $(TARFILE) - @set -e; for i in $(ONEDIRS) ;\ - do \ - rm -fr $$i/*; \ - done - -makefile.one: files - $(PERL) util/mk1mf.pl >makefile.one; \ - sh util/do_ms.sh - -files: - $(PERL) $(TOP)/util/files.pl Makefile > $(TOP)/MINFO - @set -e; target=files; $(RECURSIVE_BUILD_CMD) - -links: - @$(PERL) $(TOP)/util/mkdir-p.pl include/openssl - @$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER) - @set -e; target=links; $(RECURSIVE_BUILD_CMD) - -gentests: - @(cd test && echo "generating dummy tests (if needed)..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on generate ); - -dclean: - rm -rf *.bak include/openssl certs/.0 - @set -e; target=dclean; $(RECURSIVE_BUILD_CMD) - -rehash: rehash.time -rehash.time: certs apps - @if [ -z "$(CROSS_COMPILE)" ]; then \ - (OPENSSL="`pwd`/util/opensslwrap.sh"; \ - [ -x "apps/openssl.exe" ] && OPENSSL="apps/openssl.exe" || :; \ - OPENSSL_DEBUG_MEMORY=on; \ - export OPENSSL OPENSSL_DEBUG_MEMORY; \ - $(PERL) tools/c_rehash certs/demo) && \ - touch rehash.time; \ - else :; fi - -test: tests - -tests: rehash - @(cd test && echo "testing..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on OPENSSL_CONF=../apps/openssl.cnf tests ); - OPENSSL_CONF=apps/openssl.cnf util/opensslwrap.sh version -a - -report: - @$(PERL) util/selftest.pl - -update: errors stacks util/libeay.num util/ssleay.num TABLE - @set -e; target=update; $(RECURSIVE_BUILD_CMD) - -depend: - @set -e; target=depend; $(RECURSIVE_BUILD_CMD) - -lint: - @set -e; target=lint; $(RECURSIVE_BUILD_CMD) - -tags: - rm -f TAGS - find . -name '[^.]*.[ch]' | xargs etags -a - -errors: - $(PERL) util/ck_errf.pl -strict */*.c */*/*.c - $(PERL) util/mkerr.pl -recurse -write - (cd engines; $(MAKE) PERL=$(PERL) errors) - -stacks: - $(PERL) util/mkstack.pl -write - -util/libeay.num:: - $(PERL) util/mkdef.pl crypto update - -util/ssleay.num:: - $(PERL) util/mkdef.pl ssl update - -TABLE: Configure - (echo 'Output of `Configure TABLE'"':"; \ - $(PERL) Configure TABLE) > TABLE - -# Build distribution tar-file. As the list of files returned by "find" is -# pretty long, on several platforms a "too many arguments" error or similar -# would occur. Therefore the list of files is temporarily stored into a file -# and read directly, requiring GNU-Tar. Call "make TAR=gtar dist" if the normal -# tar does not support the --files-from option. -TAR_COMMAND=$(TAR) $(TARFLAGS) --files-from $(TARFILE).list \ - --owner 0 --group 0 \ - --transform 's|^|$(NAME)/|' \ - -cvf - - -$(TARFILE).list: - find * \! -name STATUS \! -name TABLE \! -name '*.o' \! -name '*.a' \ - \! -name '*.so' \! -name '*.so.*' \! -name 'openssl' \ - \( \! -name '*test' -o -name bctest -o -name pod2mantest \) \ - \! -name '.#*' \! -name '*~' \! -type l \ - | sort > $(TARFILE).list - -tar: $(TARFILE).list - find . -type d -print | xargs chmod 755 - find . -type f -print | xargs chmod a+r - find . -type f -perm -0100 -print | xargs chmod a+x - $(TAR_COMMAND) | gzip --best > $(TARFILE).gz - rm -f $(TARFILE).list - ls -l $(TARFILE).gz - -tar-snap: $(TARFILE).list - $(TAR_COMMAND) > $(TARFILE) - rm -f $(TARFILE).list - ls -l $(TARFILE) - -dist: - $(PERL) Configure dist - @$(MAKE) SDIRS='$(SDIRS)' clean - @$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar - -install: all install_docs install_sw - -install_sw: - @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig \ - $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/private - @set -e; headerlist="$(EXHEADER)"; for i in $$headerlist;\ - do \ - (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \ - done; - @set -e; target=install; $(RECURSIVE_BUILD_CMD) - @set -e; liblist="$(LIBS)"; for i in $$liblist ;\ - do \ - if [ -f "$$i" ]; then \ - ( echo installing $$i; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - $(RANLIB) $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i ); \ - fi; \ - done; - @set -e; if [ -n "$(SHARED_LIBS)" ]; then \ - tmp="$(SHARED_LIBS)"; \ - for i in $${tmp:-x}; \ - do \ - if [ -f "$$i" -o -f "$$i.a" ]; then \ - ( echo installing $$i; \ - if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ - c=`echo $$i | sed 's/^lib\(.*\)\.dll\.a/cyg\1-$(SHLIB_VERSION_NUMBER).dll/'`; \ - cp $$c $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ - chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ - else \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ - fi ); \ - if expr $(PLATFORM) : 'mingw' > /dev/null; then \ - ( case $$i in \ - *crypto*) i=libeay32.dll;; \ - *ssl*) i=ssleay32.dll;; \ - esac; \ - echo installing $$i; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ - chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i ); \ - fi; \ - fi; \ - done; \ - ( here="`pwd`"; \ - cd $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR); \ - $(MAKE) -f $$here/Makefile HERE="$$here" link-shared ); \ - if [ "$(INSTALLTOP)" != "/usr" ]; then \ - echo 'OpenSSL shared libraries have been installed in:'; \ - echo ' $(INSTALLTOP)'; \ - echo ''; \ - sed -e '1,/^$$/d' doc/openssl-shared.txt; \ - fi; \ - fi - cp libcrypto.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc - cp libssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc - cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc - -install_html_docs: - here="`pwd`"; \ - filecase=; \ - case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ - filecase=-i; \ - esac; \ - for subdir in apps crypto ssl; do \ - mkdir -p $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ - for i in doc/$$subdir/*.pod; do \ - fn=`basename $$i .pod`; \ - echo "installing html/$$fn.$(HTMLSUFFIX)"; \ - cat $$i \ - | sed -r 's/L<([^)]*)(\([0-9]\))?\|([^)]*)(\([0-9]\))?>/L<\1|\3>/g' \ - | pod2html --podroot=doc --htmlroot=.. --podpath=apps:crypto:ssl \ - | sed -r 's/ $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir/$$fn.$(HTMLSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - grep -v $$filecase "^$$fn\$$" | \ - (cd $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$(HTMLSUFFIX) "$$n".$(HTMLSUFFIX); \ - done); \ - done; \ - done - -install_docs: - @$(PERL) $(TOP)/util/mkdir-p.pl \ - $(INSTALL_PREFIX)$(MANDIR)/man1 \ - $(INSTALL_PREFIX)$(MANDIR)/man3 \ - $(INSTALL_PREFIX)$(MANDIR)/man5 \ - $(INSTALL_PREFIX)$(MANDIR)/man7 - @pod2man="`cd ./util; ./pod2mantest $(PERL)`"; \ - here="`pwd`"; \ - filecase=; \ - case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ - filecase=-i; \ - esac; \ - set -e; for i in doc/apps/*.pod; do \ - fn=`basename $$i .pod`; \ - sec=`$(PERL) util/extract-section.pl 1 < $$i`; \ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ - --section=$$sec --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - (grep -v $$filecase "^$$fn\$$"; true) | \ - (grep -v "[ ]"; true) | \ - (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ - done); \ - done; \ - set -e; for i in doc/crypto/*.pod doc/ssl/*.pod; do \ - fn=`basename $$i .pod`; \ - sec=`$(PERL) util/extract-section.pl 3 < $$i`; \ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ - --section=$$sec --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - (grep -v $$filecase "^$$fn\$$"; true) | \ - (grep -v "[ ]"; true) | \ - (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ - done); \ - done - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/deps/openssl/openssl/Makefile.bak b/deps/openssl/openssl/Makefile.bak deleted file mode 100644 index 96d8e0f1999f1e..00000000000000 --- a/deps/openssl/openssl/Makefile.bak +++ /dev/null @@ -1,680 +0,0 @@ -### Generated automatically from Makefile.org by Configure. - -## -## Makefile for OpenSSL -## - -VERSION=1.0.2f-dev -MAJOR=1 -MINOR=0.2 -SHLIB_VERSION_NUMBER=1.0.0 -SHLIB_VERSION_HISTORY= -SHLIB_MAJOR=1 -SHLIB_MINOR=0.0 -SHLIB_EXT= -PLATFORM=gcc -OPTIONS= no-ec_nistp_64_gcc_128 no-gmp no-jpake no-krb5 no-libunbound no-md2 no-rc5 no-rfc3779 no-sctp no-shared no-ssl-trace no-store no-unit-test no-zlib no-zlib-dynamic static-engine -CONFIGURE_ARGS=gcc -SHLIB_TARGET= - -# HERE indicates where this Makefile lives. This can be used to indicate -# where sub-Makefiles are expected to be. Currently has very limited usage, -# and should probably not be bothered with at all. -HERE=. - -# INSTALL_PREFIX is for package builders so that they can configure -# for, say, /usr/ and yet have everything installed to /tmp/somedir/usr/. -# Normally it is left empty. -INSTALL_PREFIX= -INSTALLTOP=/usr/local/ssl - -# Do not edit this manually. Use Configure --openssldir=DIR do change this! -OPENSSLDIR=/usr/local/ssl - -# NO_IDEA - Define to build without the IDEA algorithm -# NO_RC4 - Define to build without the RC4 algorithm -# NO_RC2 - Define to build without the RC2 algorithm -# THREADS - Define when building with threads, you will probably also need any -# system defines as well, i.e. _REENTERANT for Solaris 2.[34] -# TERMIO - Define the termio terminal subsystem, needed if sgtty is missing. -# TERMIOS - Define the termios terminal subsystem, Silicon Graphics. -# LONGCRYPT - Define to use HPUX 10.x's long password modification to crypt(3). -# DEVRANDOM - Give this the value of the 'random device' if your OS supports -# one. 32 bytes will be read from this when the random -# number generator is initalised. -# SSL_FORBID_ENULL - define if you want the server to be not able to use the -# NULL encryption ciphers. -# -# LOCK_DEBUG - turns on lots of lock debug output :-) -# REF_CHECK - turn on some xyz_free() assertions. -# REF_PRINT - prints some stuff on structure free. -# CRYPTO_MDEBUG - turns on my 'memory leak' detecting stuff -# MFUNC - Make all Malloc/Free/Realloc calls call -# CRYPTO_malloc/CRYPTO_free/CRYPTO_realloc which can be setup to -# call application defined callbacks via CRYPTO_set_mem_functions() -# MD5_ASM needs to be defined to use the x86 assembler for MD5 -# SHA1_ASM needs to be defined to use the x86 assembler for SHA1 -# RMD160_ASM needs to be defined to use the x86 assembler for RIPEMD160 -# Do not define B_ENDIAN or L_ENDIAN if 'unsigned long' == 8. It must -# equal 4. -# PKCS1_CHECK - pkcs1 tests. - -CC= gcc -CFLAG= -O3 -DEPFLAG= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_LIBUNBOUND -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_SSL_TRACE -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST -PEX_LIBS= -EX_LIBS= -EXE_EXT= -ARFLAGS= -AR= ar $(ARFLAGS) r -RANLIB= /usr/bin/ranlib -NM= nm -PERL= /usr/bin/perl -TAR= tar -TARFLAGS= --no-recursion -MAKEDEPPROG= gcc -LIBDIR=lib - -# We let the C compiler driver to take care of .s files. This is done in -# order to be excused from maintaining a separate set of architecture -# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC -# gcc, then the driver will automatically translate it to -xarch=v8plus -# and pass it down to assembler. -AS=$(CC) -c -ASFLAG=$(CFLAG) - -# For x86 assembler: Set PROCESSOR to 386 if you want to support -# the 80386. -PROCESSOR= - -# CPUID module collects small commonly used assembler snippets -CPUID_OBJ= mem_clr.o -BN_ASM= bn_asm.o -EC_ASM= -DES_ENC= des_enc.o fcrypt_b.o -AES_ENC= aes_core.o aes_cbc.o -BF_ENC= bf_enc.o -CAST_ENC= c_enc.o -RC4_ENC= rc4_enc.o rc4_skey.o -RC5_ENC= rc5_enc.o -MD5_ASM_OBJ= -SHA1_ASM_OBJ= -RMD160_ASM_OBJ= -WP_ASM_OBJ= wp_block.o -CMLL_ENC= camellia.o cmll_misc.o cmll_cbc.o -MODES_ASM_OBJ= -ENGINES_ASM_OBJ= -PERLASM_SCHEME= - -# KRB5 stuff -KRB5_INCLUDES= -LIBKRB5= - -# Zlib stuff -ZLIB_INCLUDE= -LIBZLIB= - -# TOP level FIPS install directory. -FIPSDIR=/usr/local/ssl/fips-2.0 - -# This is the location of fipscanister.o and friends. -# The FIPS module build will place it $(INSTALLTOP)/lib -# but since $(INSTALLTOP) can only take the default value -# when the module is built it will be in /usr/local/ssl/lib -# $(INSTALLTOP) for this build may be different so hard -# code the path. - -FIPSLIBDIR= - -# The location of the library which contains fipscanister.o -# normally it will be libcrypto unless fipsdso is set in which -# case it will be libfips. If not compiling in FIPS mode at all -# this is empty making it a useful test for a FIPS compile. - -FIPSCANLIB= - -# Shared library base address. Currently only used on Windows. -# - -BASEADDR=0xFB00000 - -DIRS= crypto ssl engines apps test tools -ENGDIRS= ccgost -SHLIBDIRS= crypto ssl - -# dirs in crypto to build -SDIRS= \ - objects \ - md4 md5 sha mdc2 hmac ripemd whrlpool \ - des aes rc2 rc4 idea bf cast camellia seed modes \ - bn ec rsa dsa ecdsa dh ecdh dso engine \ - buffer bio stack lhash rand err \ - evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \ - cms pqueue ts srp cmac -# keep in mind that the above list is adjusted by ./Configure -# according to no-xxx arguments... - -# tests to perform. "alltests" is a special word indicating that all tests -# should be performed. -TESTS = alltests - -MAKEFILE= Makefile - -MANDIR=$(OPENSSLDIR)/man -MAN1=1 -MAN3=3 -MANSUFFIX= -HTMLSUFFIX=html -HTMLDIR=$(OPENSSLDIR)/html -SHELL=/bin/sh - -TOP= . -ONEDIRS=out tmp -EDIRS= times doc bugs util include certs ms shlib mt demos perl sf dep VMS -WDIRS= windows -LIBS= libcrypto.a libssl.a -SHARED_CRYPTO=libcrypto$(SHLIB_EXT) -SHARED_SSL=libssl$(SHLIB_EXT) -SHARED_LIBS= -SHARED_LIBS_LINK_EXTS= -SHARED_LDFLAGS= - -GENERAL= Makefile -BASENAME= openssl -NAME= $(BASENAME)-$(VERSION) -TARFILE= ../$(NAME).tar -EXHEADER= e_os2.h -HEADER= e_os.h - -all: Makefile build_all - -# as we stick to -e, CLEARENV ensures that local variables in lower -# Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn -# shell, which [annoyingly enough] terminates unset with error if VAR -# is not present:-( TOP= && unset TOP is tribute to HP-UX /bin/sh, -# which terminates unset with error if no variable was present:-( -CLEARENV= TOP= && unset TOP $${LIB+LIB} $${LIBS+LIBS} \ - $${INCLUDE+INCLUDE} $${INCLUDES+INCLUDES} \ - $${DIR+DIR} $${DIRS+DIRS} $${SRC+SRC} \ - $${LIBSRC+LIBSRC} $${LIBOBJ+LIBOBJ} $${ALL+ALL} \ - $${EXHEADER+EXHEADER} $${HEADER+HEADER} \ - $${GENERAL+GENERAL} $${CFLAGS+CFLAGS} \ - $${ASFLAGS+ASFLAGS} $${AFLAGS+AFLAGS} \ - $${LDCMD+LDCMD} $${LDFLAGS+LDFLAGS} $${SCRIPTS+SCRIPTS} \ - $${SHAREDCMD+SHAREDCMD} $${SHAREDFLAGS+SHAREDFLAGS} \ - $${SHARED_LIB+SHARED_LIB} $${LIBEXTRAS+LIBEXTRAS} - -# LC_ALL=C ensures that error [and other] messages are delivered in -# same language for uniform treatment. -BUILDENV= LC_ALL=C PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)'\ - CC='$(CC)' CFLAG='$(CFLAG)' \ - AS='$(CC)' ASFLAG='$(CFLAG) -c' \ - AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)' \ - CROSS_COMPILE='$(CROSS_COMPILE)' \ - PERL='$(PERL)' ENGDIRS='$(ENGDIRS)' \ - SDIRS='$(SDIRS)' LIBRPATH='$(INSTALLTOP)/$(LIBDIR)' \ - INSTALL_PREFIX='$(INSTALL_PREFIX)' \ - INSTALLTOP='$(INSTALLTOP)' OPENSSLDIR='$(OPENSSLDIR)' \ - LIBDIR='$(LIBDIR)' \ - MAKEDEPEND='$$$${TOP}/util/domd $$$${TOP} -MD $(MAKEDEPPROG)' \ - DEPFLAG='-DOPENSSL_NO_DEPRECATED $(DEPFLAG)' \ - MAKEDEPPROG='$(MAKEDEPPROG)' \ - SHARED_LDFLAGS='$(SHARED_LDFLAGS)' \ - KRB5_INCLUDES='$(KRB5_INCLUDES)' LIBKRB5='$(LIBKRB5)' \ - ZLIB_INCLUDE='$(ZLIB_INCLUDE)' LIBZLIB='$(LIBZLIB)' \ - EXE_EXT='$(EXE_EXT)' SHARED_LIBS='$(SHARED_LIBS)' \ - SHLIB_EXT='$(SHLIB_EXT)' SHLIB_TARGET='$(SHLIB_TARGET)' \ - PEX_LIBS='$(PEX_LIBS)' EX_LIBS='$(EX_LIBS)' \ - CPUID_OBJ='$(CPUID_OBJ)' BN_ASM='$(BN_ASM)' \ - EC_ASM='$(EC_ASM)' DES_ENC='$(DES_ENC)' \ - AES_ENC='$(AES_ENC)' CMLL_ENC='$(CMLL_ENC)' \ - BF_ENC='$(BF_ENC)' CAST_ENC='$(CAST_ENC)' \ - RC4_ENC='$(RC4_ENC)' RC5_ENC='$(RC5_ENC)' \ - SHA1_ASM_OBJ='$(SHA1_ASM_OBJ)' \ - MD5_ASM_OBJ='$(MD5_ASM_OBJ)' \ - RMD160_ASM_OBJ='$(RMD160_ASM_OBJ)' \ - WP_ASM_OBJ='$(WP_ASM_OBJ)' \ - MODES_ASM_OBJ='$(MODES_ASM_OBJ)' \ - ENGINES_ASM_OBJ='$(ENGINES_ASM_OBJ)' \ - PERLASM_SCHEME='$(PERLASM_SCHEME)' \ - FIPSLIBDIR='${FIPSLIBDIR}' \ - FIPSDIR='${FIPSDIR}' \ - FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}" \ - THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES= -# MAKEOVERRIDES= effectively "equalizes" GNU-ish and SysV-ish make flavors, -# which in turn eliminates ambiguities in variable treatment with -e. - -# BUILD_CMD is a generic macro to build a given target in a given -# subdirectory. The target must be given through the shell variable -# `target' and the subdirectory to build in must be given through `dir'. -# This macro shouldn't be used directly, use RECURSIVE_BUILD_CMD or -# BUILD_ONE_CMD instead. -# -# BUILD_ONE_CMD is a macro to build a given target in a given -# subdirectory if that subdirectory is part of $(DIRS). It requires -# exactly the same shell variables as BUILD_CMD. -# -# RECURSIVE_BUILD_CMD is a macro to build a given target in all -# subdirectories defined in $(DIRS). It requires that the target -# is given through the shell variable `target'. -BUILD_CMD= if [ -d "$$dir" ]; then \ - ( cd $$dir && echo "making $$target in $$dir..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. DIR=$$dir $$target \ - ) || exit 1; \ - fi -RECURSIVE_BUILD_CMD=for dir in $(DIRS); do $(BUILD_CMD); done -BUILD_ONE_CMD=\ - if expr " $(DIRS) " : ".* $$dir " >/dev/null 2>&1; then \ - $(BUILD_CMD); \ - fi - -reflect: - @[ -n "$(THIS)" ] && $(CLEARENV) && $(MAKE) $(THIS) -e $(BUILDENV) - -sub_all: build_all - -build_all: build_libs build_apps build_tests build_tools - -build_libs: build_libcrypto build_libssl openssl.pc - -build_libcrypto: build_crypto build_engines libcrypto.pc -build_libssl: build_ssl libssl.pc - -build_crypto: - @dir=crypto; target=all; $(BUILD_ONE_CMD) -build_ssl: build_crypto - @dir=ssl; target=all; $(BUILD_ONE_CMD) -build_engines: build_crypto - @dir=engines; target=all; $(BUILD_ONE_CMD) -build_apps: build_libs - @dir=apps; target=all; $(BUILD_ONE_CMD) -build_tests: build_libs - @dir=test; target=all; $(BUILD_ONE_CMD) -build_tools: build_libs - @dir=tools; target=all; $(BUILD_ONE_CMD) - -all_testapps: build_libs build_testapps -build_testapps: - @dir=crypto; target=testapps; $(BUILD_ONE_CMD) - -fips_premain_dso$(EXE_EXT): libcrypto.a - [ -z "$(FIPSCANLIB)" ] || $(CC) $(CFLAG) -Iinclude \ - -DFINGERPRINT_PREMAIN_DSO_LOAD -o $@ \ - $(FIPSLIBDIR)fips_premain.c $(FIPSLIBDIR)fipscanister.o \ - libcrypto.a $(EX_LIBS) - -libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT) - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ - FIPSLD_LIBCRYPTO=libcrypto.a ; \ - FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \ - export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \ - fi; \ - $(MAKE) -e SHLIBDIRS=crypto CC="$${CC:-$(CC)}" build-shared && \ - (touch -c fips_premain_dso$(EXE_EXT) || :); \ - else \ - echo "There's no support for shared libraries on this platform" >&2; \ - exit 1; \ - fi - -libssl$(SHLIB_EXT): libcrypto$(SHLIB_EXT) libssl.a - @if [ "$(SHLIB_TARGET)" != "" ]; then \ - $(MAKE) SHLIBDIRS=ssl SHLIBDEPS='-lcrypto' build-shared; \ - else \ - echo "There's no support for shared libraries on this platform" >&2; \ - exit 1; \ - fi - -clean-shared: - @set -e; for i in $(SHLIBDIRS); do \ - if [ -n "$(SHARED_LIBS_LINK_EXTS)" ]; then \ - tmp="$(SHARED_LIBS_LINK_EXTS)"; \ - for j in $${tmp:-x}; do \ - ( set -x; rm -f lib$$i$$j ); \ - done; \ - fi; \ - ( set -x; rm -f lib$$i$(SHLIB_EXT) ); \ - if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ - ( set -x; rm -f cyg$$i$(SHLIB_EXT) lib$$i$(SHLIB_EXT).a ); \ - fi; \ - done - -link-shared: - @ set -e; for i in $(SHLIBDIRS); do \ - $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \ - LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ - LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ - symlink.$(SHLIB_TARGET); \ - libs="$$libs -l$$i"; \ - done - -build-shared: do_$(SHLIB_TARGET) link-shared - -do_$(SHLIB_TARGET): - @ set -e; libs='-L. $(SHLIBDEPS)'; for i in $(SHLIBDIRS); do \ - if [ "$$i" = "ssl" -a -n "$(LIBKRB5)" ]; then \ - libs="$(LIBKRB5) $$libs"; \ - fi; \ - $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \ - LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \ - LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \ - LIBDEPS="$$libs $(EX_LIBS)" \ - link_a.$(SHLIB_TARGET); \ - libs="-l$$i $$libs"; \ - done - -libcrypto.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL-libcrypto'; \ - echo 'Description: OpenSSL cryptography library'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: '; \ - echo 'Libs: -L$${libdir} -lcrypto'; \ - echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc - -libssl.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL-libssl'; \ - echo 'Description: Secure Sockets Layer and cryptography libraries'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires.private: libcrypto'; \ - echo 'Libs: -L$${libdir} -lssl'; \ - echo 'Libs.private: $(EX_LIBS)'; \ - echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc - -openssl.pc: Makefile - @ ( echo 'prefix=$(INSTALLTOP)'; \ - echo 'exec_prefix=$${prefix}'; \ - echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \ - echo 'includedir=$${prefix}/include'; \ - echo ''; \ - echo 'Name: OpenSSL'; \ - echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \ - echo 'Version: '$(VERSION); \ - echo 'Requires: libssl libcrypto' ) > openssl.pc - -Makefile: Makefile.org Configure config - @echo "Makefile is older than Makefile.org, Configure or config." - @echo "Reconfigure the source tree (via './config' or 'perl Configure'), please." - @false - -libclean: - rm -f *.map *.so *.so.* *.dylib *.dll engines/*.so engines/*.dll engines/*.dylib *.a engines/*.a */lib */*/lib - -clean: libclean - rm -f shlib/*.o *.o core a.out fluff rehash.time testlog make.log cctest cctest.c - @set -e; target=clean; $(RECURSIVE_BUILD_CMD) - rm -f $(LIBS) - rm -f openssl.pc libssl.pc libcrypto.pc - rm -f speed.* .pure - rm -f $(TARFILE) - @set -e; for i in $(ONEDIRS) ;\ - do \ - rm -fr $$i/*; \ - done - -makefile.one: files - $(PERL) util/mk1mf.pl >makefile.one; \ - sh util/do_ms.sh - -files: - $(PERL) $(TOP)/util/files.pl Makefile > $(TOP)/MINFO - @set -e; target=files; $(RECURSIVE_BUILD_CMD) - -links: - @$(PERL) $(TOP)/util/mkdir-p.pl include/openssl - @$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER) - @set -e; target=links; $(RECURSIVE_BUILD_CMD) - -gentests: - @(cd test && echo "generating dummy tests (if needed)..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on generate ); - -dclean: - rm -rf *.bak include/openssl certs/.0 - @set -e; target=dclean; $(RECURSIVE_BUILD_CMD) - -rehash: rehash.time -rehash.time: certs apps - @if [ -z "$(CROSS_COMPILE)" ]; then \ - (OPENSSL="`pwd`/util/opensslwrap.sh"; \ - [ -x "apps/openssl.exe" ] && OPENSSL="apps/openssl.exe" || :; \ - OPENSSL_DEBUG_MEMORY=on; \ - export OPENSSL OPENSSL_DEBUG_MEMORY; \ - $(PERL) tools/c_rehash certs/demo) && \ - touch rehash.time; \ - else :; fi - -test: tests - -tests: rehash - @(cd test && echo "testing..." && \ - $(CLEARENV) && $(MAKE) -e $(BUILDENV) TOP=.. TESTS='$(TESTS)' OPENSSL_DEBUG_MEMORY=on OPENSSL_CONF=../apps/openssl.cnf tests ); - OPENSSL_CONF=apps/openssl.cnf util/opensslwrap.sh version -a - -report: - @$(PERL) util/selftest.pl - -update: errors stacks util/libeay.num util/ssleay.num TABLE - @set -e; target=update; $(RECURSIVE_BUILD_CMD) - -depend: - @set -e; target=depend; $(RECURSIVE_BUILD_CMD) - -lint: - @set -e; target=lint; $(RECURSIVE_BUILD_CMD) - -tags: - rm -f TAGS - find . -name '[^.]*.[ch]' | xargs etags -a - -errors: - $(PERL) util/ck_errf.pl -strict */*.c */*/*.c - $(PERL) util/mkerr.pl -recurse -write - (cd engines; $(MAKE) PERL=$(PERL) errors) - -stacks: - $(PERL) util/mkstack.pl -write - -util/libeay.num:: - $(PERL) util/mkdef.pl crypto update - -util/ssleay.num:: - $(PERL) util/mkdef.pl ssl update - -TABLE: Configure - (echo 'Output of `Configure TABLE'"':"; \ - $(PERL) Configure TABLE) > TABLE - -# Build distribution tar-file. As the list of files returned by "find" is -# pretty long, on several platforms a "too many arguments" error or similar -# would occur. Therefore the list of files is temporarily stored into a file -# and read directly, requiring GNU-Tar. Call "make TAR=gtar dist" if the normal -# tar does not support the --files-from option. -TAR_COMMAND=$(TAR) $(TARFLAGS) --files-from $(TARFILE).list \ - --owner 0 --group 0 \ - --transform 's|^|$(NAME)/|' \ - -cvf - - -$(TARFILE).list: - find * \! -name STATUS \! -name TABLE \! -name '*.o' \! -name '*.a' \ - \! -name '*.so' \! -name '*.so.*' \! -name 'openssl' \ - \( \! -name '*test' -o -name bctest -o -name pod2mantest \) \ - \! -name '.#*' \! -name '*~' \! -type l \ - | sort > $(TARFILE).list - -tar: $(TARFILE).list - find . -type d -print | xargs chmod 755 - find . -type f -print | xargs chmod a+r - find . -type f -perm -0100 -print | xargs chmod a+x - $(TAR_COMMAND) | gzip --best > $(TARFILE).gz - rm -f $(TARFILE).list - ls -l $(TARFILE).gz - -tar-snap: $(TARFILE).list - $(TAR_COMMAND) > $(TARFILE) - rm -f $(TARFILE).list - ls -l $(TARFILE) - -dist: - $(PERL) Configure dist - @$(MAKE) SDIRS='$(SDIRS)' clean - @$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar - -install: all install_docs install_sw - -install_sw: - @$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ - $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig \ - $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ - $(INSTALL_PREFIX)$(OPENSSLDIR)/private - @set -e; headerlist="$(EXHEADER)"; for i in $$headerlist;\ - do \ - (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \ - done; - @set -e; target=install; $(RECURSIVE_BUILD_CMD) - @set -e; liblist="$(LIBS)"; for i in $$liblist ;\ - do \ - if [ -f "$$i" ]; then \ - ( echo installing $$i; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - $(RANLIB) $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i ); \ - fi; \ - done; - @set -e; if [ -n "$(SHARED_LIBS)" ]; then \ - tmp="$(SHARED_LIBS)"; \ - for i in $${tmp:-x}; \ - do \ - if [ -f "$$i" -o -f "$$i.a" ]; then \ - ( echo installing $$i; \ - if expr "$(PLATFORM)" : "Cygwin" >/dev/null; then \ - c=`echo $$i | sed 's/^lib\(.*\)\.dll\.a/cyg\1-$(SHLIB_VERSION_NUMBER).dll/'`; \ - cp $$c $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ - chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$c; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ - else \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/$$i; \ - fi ); \ - if expr $(PLATFORM) : 'mingw' > /dev/null; then \ - ( case $$i in \ - *crypto*) i=libeay32.dll;; \ - *ssl*) i=ssleay32.dll;; \ - esac; \ - echo installing $$i; \ - cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ - chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ - mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i ); \ - fi; \ - fi; \ - done; \ - ( here="`pwd`"; \ - cd $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR); \ - $(MAKE) -f $$here/Makefile HERE="$$here" link-shared ); \ - if [ "$(INSTALLTOP)" != "/usr" ]; then \ - echo 'OpenSSL shared libraries have been installed in:'; \ - echo ' $(INSTALLTOP)'; \ - echo ''; \ - sed -e '1,/^$$/d' doc/openssl-shared.txt; \ - fi; \ - fi - cp libcrypto.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc - cp libssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc - cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig - chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc - -install_html_docs: - here="`pwd`"; \ - filecase=; \ - case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ - filecase=-i; \ - esac; \ - for subdir in apps crypto ssl; do \ - mkdir -p $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ - for i in doc/$$subdir/*.pod; do \ - fn=`basename $$i .pod`; \ - echo "installing html/$$fn.$(HTMLSUFFIX)"; \ - cat $$i \ - | sed -r 's/L<([^)]*)(\([0-9]\))?\|([^)]*)(\([0-9]\))?>/L<\1|\3>/g' \ - | pod2html --podroot=doc --htmlroot=.. --podpath=apps:crypto:ssl \ - | sed -r 's/ $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir/$$fn.$(HTMLSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - grep -v $$filecase "^$$fn\$$" | \ - (cd $(INSTALL_PREFIX)$(HTMLDIR)/$$subdir; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$(HTMLSUFFIX) "$$n".$(HTMLSUFFIX); \ - done); \ - done; \ - done - -install_docs: - @$(PERL) $(TOP)/util/mkdir-p.pl \ - $(INSTALL_PREFIX)$(MANDIR)/man1 \ - $(INSTALL_PREFIX)$(MANDIR)/man3 \ - $(INSTALL_PREFIX)$(MANDIR)/man5 \ - $(INSTALL_PREFIX)$(MANDIR)/man7 - @pod2man="`cd ./util; ./pod2mantest $(PERL)`"; \ - here="`pwd`"; \ - filecase=; \ - case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \ - filecase=-i; \ - esac; \ - set -e; for i in doc/apps/*.pod; do \ - fn=`basename $$i .pod`; \ - sec=`$(PERL) util/extract-section.pl 1 < $$i`; \ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ - --section=$$sec --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - (grep -v $$filecase "^$$fn\$$"; true) | \ - (grep -v "[ ]"; true) | \ - (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ - done); \ - done; \ - set -e; for i in doc/crypto/*.pod doc/ssl/*.pod; do \ - fn=`basename $$i .pod`; \ - sec=`$(PERL) util/extract-section.pl 3 < $$i`; \ - echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ - (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$$pod2man \ - --section=$$sec --center=OpenSSL \ - --release=$(VERSION) `basename $$i`") \ - > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ - $(PERL) util/extract-names.pl < $$i | \ - (grep -v $$filecase "^$$fn\$$"; true) | \ - (grep -v "[ ]"; true) | \ - (cd $(INSTALL_PREFIX)$(MANDIR)/man$$sec/; \ - while read n; do \ - PLATFORM=$(PLATFORM) $$here/util/point.sh $$fn.$${sec}$(MANSUFFIX) "$$n".$${sec}$(MANSUFFIX); \ - done); \ - done - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/deps/openssl/openssl/apps/CA.pl b/deps/openssl/openssl/apps/CA.pl deleted file mode 100644 index a3965ecea96eda..00000000000000 --- a/deps/openssl/openssl/apps/CA.pl +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/perl -# -# CA - wrapper around ca to make it easier to use ... basically ca requires -# some setup stuff to be done before you can use it and this makes -# things easier between now and when Eric is convinced to fix it :-) -# -# CA -newca ... will setup the right stuff -# CA -newreq[-nodes] ... will generate a certificate request -# CA -sign ... will sign the generated request and output -# -# At the end of that grab newreq.pem and newcert.pem (one has the key -# and the other the certificate) and cat them together and that is what -# you want/need ... I'll make even this a little cleaner later. -# -# -# 12-Jan-96 tjh Added more things ... including CA -signcert which -# converts a certificate to a request and then signs it. -# 10-Jan-96 eay Fixed a few more bugs and added the SSLEAY_CONFIG -# environment variable so this can be driven from -# a script. -# 25-Jul-96 eay Cleaned up filenames some more. -# 11-Jun-96 eay Fixed a few filename missmatches. -# 03-May-96 eay Modified to use 'ssleay cmd' instead of 'cmd'. -# 18-Apr-96 tjh Original hacking -# -# Tim Hudson -# tjh@cryptsoft.com -# - -# 27-Apr-98 snh Translation into perl, fix existing CA bug. -# -# -# Steve Henson -# shenson@bigfoot.com - -# default openssl.cnf file has setup as per the following -# demoCA ... where everything is stored - -my $openssl; -if(defined $ENV{OPENSSL}) { - $openssl = $ENV{OPENSSL}; -} else { - $openssl = "openssl"; - $ENV{OPENSSL} = $openssl; -} - -$SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"}; -$DAYS="-days 365"; # 1 year -$CADAYS="-days 1095"; # 3 years -$REQ="$openssl req $SSLEAY_CONFIG"; -$CA="$openssl ca $SSLEAY_CONFIG"; -$VERIFY="$openssl verify"; -$X509="$openssl x509"; -$PKCS12="$openssl pkcs12"; - -$CATOP="./demoCA"; -$CAKEY="cakey.pem"; -$CAREQ="careq.pem"; -$CACERT="cacert.pem"; - -$DIRMODE = 0777; - -$RET = 0; - -foreach (@ARGV) { - if ( /^(-\?|-h|-help)$/ ) { - print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; - exit 0; - } elsif (/^-newcert$/) { - # create a certificate - system ("$REQ -new -x509 -keyout newkey.pem -out newcert.pem $DAYS"); - $RET=$?; - print "Certificate is in newcert.pem, private key is in newkey.pem\n" - } elsif (/^-newreq$/) { - # create a certificate request - system ("$REQ -new -keyout newkey.pem -out newreq.pem $DAYS"); - $RET=$?; - print "Request is in newreq.pem, private key is in newkey.pem\n"; - } elsif (/^-newreq-nodes$/) { - # create a certificate request - system ("$REQ -new -nodes -keyout newkey.pem -out newreq.pem $DAYS"); - $RET=$?; - print "Request is in newreq.pem, private key is in newkey.pem\n"; - } elsif (/^-newca$/) { - # if explicitly asked for or it doesn't exist then setup the - # directory structure that Eric likes to manage things - $NEW="1"; - if ( "$NEW" || ! -f "${CATOP}/serial" ) { - # create the directory hierarchy - mkdir $CATOP, $DIRMODE; - mkdir "${CATOP}/certs", $DIRMODE; - mkdir "${CATOP}/crl", $DIRMODE ; - mkdir "${CATOP}/newcerts", $DIRMODE; - mkdir "${CATOP}/private", $DIRMODE; - open OUT, ">${CATOP}/index.txt"; - close OUT; - open OUT, ">${CATOP}/crlnumber"; - print OUT "01\n"; - close OUT; - } - if ( ! -f "${CATOP}/private/$CAKEY" ) { - print "CA certificate filename (or enter to create)\n"; - $FILE = ; - - chop $FILE; - - # ask user for existing CA certificate - if ($FILE) { - cp_pem($FILE,"${CATOP}/private/$CAKEY", "PRIVATE"); - cp_pem($FILE,"${CATOP}/$CACERT", "CERTIFICATE"); - $RET=$?; - } else { - print "Making CA certificate ...\n"; - system ("$REQ -new -keyout " . - "${CATOP}/private/$CAKEY -out ${CATOP}/$CAREQ"); - system ("$CA -create_serial " . - "-out ${CATOP}/$CACERT $CADAYS -batch " . - "-keyfile ${CATOP}/private/$CAKEY -selfsign " . - "-extensions v3_ca " . - "-infiles ${CATOP}/$CAREQ "); - $RET=$?; - } - } - } elsif (/^-pkcs12$/) { - my $cname = $ARGV[1]; - $cname = "My Certificate" unless defined $cname; - system ("$PKCS12 -in newcert.pem -inkey newkey.pem " . - "-certfile ${CATOP}/$CACERT -out newcert.p12 " . - "-export -name \"$cname\""); - $RET=$?; - print "PKCS #12 file is in newcert.p12\n"; - exit $RET; - } elsif (/^-xsign$/) { - system ("$CA -policy policy_anything -infiles newreq.pem"); - $RET=$?; - } elsif (/^(-sign|-signreq)$/) { - system ("$CA -policy policy_anything -out newcert.pem " . - "-infiles newreq.pem"); - $RET=$?; - print "Signed certificate is in newcert.pem\n"; - } elsif (/^(-signCA)$/) { - system ("$CA -policy policy_anything -out newcert.pem " . - "-extensions v3_ca -infiles newreq.pem"); - $RET=$?; - print "Signed CA certificate is in newcert.pem\n"; - } elsif (/^-signcert$/) { - system ("$X509 -x509toreq -in newreq.pem -signkey newreq.pem " . - "-out tmp.pem"); - system ("$CA -policy policy_anything -out newcert.pem " . - "-infiles tmp.pem"); - $RET = $?; - print "Signed certificate is in newcert.pem\n"; - } elsif (/^-verify$/) { - if (shift) { - foreach $j (@ARGV) { - system ("$VERIFY -CAfile $CATOP/$CACERT $j"); - $RET=$? if ($? != 0); - } - exit $RET; - } else { - system ("$VERIFY -CAfile $CATOP/$CACERT newcert.pem"); - $RET=$?; - exit 0; - } - } else { - print STDERR "Unknown arg $_\n"; - print STDERR "usage: CA -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify\n"; - exit 1; - } -} - -exit $RET; - -sub cp_pem { -my ($infile, $outfile, $bound) = @_; -open IN, $infile; -open OUT, ">$outfile"; -my $flag = 0; -while () { - $flag = 1 if (/^-----BEGIN.*$bound/) ; - print OUT $_ if ($flag); - if (/^-----END.*$bound/) { - close IN; - close OUT; - return; - } -} -} - diff --git a/deps/openssl/openssl/test/evptests.txt b/deps/openssl/openssl/test/evptests.txt deleted file mode 100644 index 4e9958b3b5bc07..00000000000000 --- a/deps/openssl/openssl/test/evptests.txt +++ /dev/null @@ -1,401 +0,0 @@ -#cipher:key:iv:plaintext:ciphertext:0/1(decrypt/encrypt) -#aadcipher:key:iv:plaintext:ciphertext:aad:tag:0/1(decrypt/encrypt) -#digest:::input:output - -# SHA(1) tests (from shatest.c) -SHA1:::616263:a9993e364706816aba3e25717850c26c9cd0d89d - -# MD5 tests (from md5test.c) -MD5::::d41d8cd98f00b204e9800998ecf8427e -MD5:::61:0cc175b9c0f1b6a831c399e269772661 -MD5:::616263:900150983cd24fb0d6963f7d28e17f72 -MD5:::6d65737361676520646967657374:f96b697d7cb7938d525a2f31aaf161d0 -MD5:::6162636465666768696a6b6c6d6e6f707172737475767778797a:c3fcd3d76192e4007dfb496cca67e13b -MD5:::4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a30313233343536373839:d174ab98d277d9f5a5611c2c9f419d9f -MD5:::3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930:57edf4a22be3c955ac49da2e2107b67a - -# AES 128 ECB tests (from FIPS-197 test vectors, encrypt) - -AES-128-ECB:000102030405060708090A0B0C0D0E0F::00112233445566778899AABBCCDDEEFF:69C4E0D86A7B0430D8CDB78070B4C55A:1 - -# AES 192 ECB tests (from FIPS-197 test vectors, encrypt) - -AES-192-ECB:000102030405060708090A0B0C0D0E0F1011121314151617::00112233445566778899AABBCCDDEEFF:DDA97CA4864CDFE06EAF70A0EC0D7191:1 - -# AES 256 ECB tests (from FIPS-197 test vectors, encrypt) - -AES-256-ECB:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F::00112233445566778899AABBCCDDEEFF:8EA2B7CA516745BFEAFC49904B496089:1 - -# AES 128 ECB tests (from NIST test vectors, encrypt) - -#AES-128-ECB:00000000000000000000000000000000::00000000000000000000000000000000:C34C052CC0DA8D73451AFE5F03BE297F:1 - -# AES 128 ECB tests (from NIST test vectors, decrypt) - -#AES-128-ECB:00000000000000000000000000000000::44416AC2D1F53C583303917E6BE9EBE0:00000000000000000000000000000000:0 - -# AES 192 ECB tests (from NIST test vectors, decrypt) - -#AES-192-ECB:000000000000000000000000000000000000000000000000::48E31E9E256718F29229319C19F15BA4:00000000000000000000000000000000:0 - -# AES 256 ECB tests (from NIST test vectors, decrypt) - -#AES-256-ECB:0000000000000000000000000000000000000000000000000000000000000000::058CCFFDBBCB382D1F6F56585D8A4ADE:00000000000000000000000000000000:0 - -# AES 128 CBC tests (from NIST test vectors, encrypt) - -#AES-128-CBC:00000000000000000000000000000000:00000000000000000000000000000000:00000000000000000000000000000000:8A05FC5E095AF4848A08D328D3688E3D:1 - -# AES 192 CBC tests (from NIST test vectors, encrypt) - -#AES-192-CBC:000000000000000000000000000000000000000000000000:00000000000000000000000000000000:00000000000000000000000000000000:7BD966D53AD8C1BB85D2ADFAE87BB104:1 - -# AES 256 CBC tests (from NIST test vectors, encrypt) - -#AES-256-CBC:0000000000000000000000000000000000000000000000000000000000000000:00000000000000000000000000000000:00000000000000000000000000000000:FE3C53653E2F45B56FCD88B2CC898FF0:1 - -# AES 128 CBC tests (from NIST test vectors, decrypt) - -#AES-128-CBC:00000000000000000000000000000000:00000000000000000000000000000000:FACA37E0B0C85373DF706E73F7C9AF86:00000000000000000000000000000000:0 - -# AES tests from NIST document SP800-38A -# For all ECB encrypts and decrypts, the transformed sequence is -# AES-bits-ECB:key::plaintext:ciphertext:encdec -# ECB-AES128.Encrypt and ECB-AES128.Decrypt -AES-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::6BC1BEE22E409F96E93D7E117393172A:3AD77BB40D7A3660A89ECAF32466EF97 -AES-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::AE2D8A571E03AC9C9EB76FAC45AF8E51:F5D3D58503B9699DE785895A96FDBAAF -AES-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::30C81C46A35CE411E5FBC1191A0A52EF:43B1CD7F598ECE23881B00E3ED030688 -AES-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::F69F2445DF4F9B17AD2B417BE66C3710:7B0C785E27E8AD3F8223207104725DD4 -# ECB-AES192.Encrypt and ECB-AES192.Decrypt -AES-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::6BC1BEE22E409F96E93D7E117393172A:BD334F1D6E45F25FF712A214571FA5CC -AES-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::AE2D8A571E03AC9C9EB76FAC45AF8E51:974104846D0AD3AD7734ECB3ECEE4EEF -AES-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::30C81C46A35CE411E5FBC1191A0A52EF:EF7AFD2270E2E60ADCE0BA2FACE6444E -AES-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::F69F2445DF4F9B17AD2B417BE66C3710:9A4B41BA738D6C72FB16691603C18E0E -# ECB-AES256.Encrypt and ECB-AES256.Decrypt -AES-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::6BC1BEE22E409F96E93D7E117393172A:F3EED1BDB5D2A03C064B5A7E3DB181F8 -AES-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::AE2D8A571E03AC9C9EB76FAC45AF8E51:591CCB10D410ED26DC5BA74A31362870 -AES-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::30C81C46A35CE411E5FBC1191A0A52EF:B6ED21B99CA6F4F9F153E7B1BEAFED1D -AES-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::F69F2445DF4F9B17AD2B417BE66C3710:23304B7A39F9F3FF067D8D8F9E24ECC7 -# For all CBC encrypts and decrypts, the transformed sequence is -# AES-bits-CBC:key:IV/ciphertext':plaintext:ciphertext:encdec -# CBC-AES128.Encrypt and CBC-AES128.Decrypt -AES-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:7649ABAC8119B246CEE98E9B12E9197D -AES-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:7649ABAC8119B246CEE98E9B12E9197D:AE2D8A571E03AC9C9EB76FAC45AF8E51:5086CB9B507219EE95DB113A917678B2 -AES-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:5086CB9B507219EE95DB113A917678B2:30C81C46A35CE411E5FBC1191A0A52EF:73BED6B8E3C1743B7116E69E22229516 -AES-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:73BED6B8E3C1743B7116E69E22229516:F69F2445DF4F9B17AD2B417BE66C3710:3FF1CAA1681FAC09120ECA307586E1A7 -# CBC-AES192.Encrypt and CBC-AES192.Decrypt -AES-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:4F021DB243BC633D7178183A9FA071E8 -AES-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:4F021DB243BC633D7178183A9FA071E8:AE2D8A571E03AC9C9EB76FAC45AF8E51:B4D9ADA9AD7DEDF4E5E738763F69145A -AES-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:B4D9ADA9AD7DEDF4E5E738763F69145A:30C81C46A35CE411E5FBC1191A0A52EF:571B242012FB7AE07FA9BAAC3DF102E0 -AES-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:571B242012FB7AE07FA9BAAC3DF102E0:F69F2445DF4F9B17AD2B417BE66C3710:08B0E27988598881D920A9E64F5615CD -# CBC-AES256.Encrypt and CBC-AES256.Decrypt -AES-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:F58C4C04D6E5F1BA779EABFB5F7BFBD6 -AES-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:F58C4C04D6E5F1BA779EABFB5F7BFBD6:AE2D8A571E03AC9C9EB76FAC45AF8E51:9CFC4E967EDB808D679F777BC6702C7D -AES-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:9CFC4E967EDB808D679F777BC6702C7D:30C81C46A35CE411E5FBC1191A0A52EF:39F23369A9D9BACFA530E26304231461 -AES-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:39F23369A9D9BACFA530E26304231461:F69F2445DF4F9B17AD2B417BE66C3710:B2EB05E2C39BE9FCDA6C19078C6A9D1B -# We don't support CFB{1,8}-AESxxx.{En,De}crypt -# For all CFB128 encrypts and decrypts, the transformed sequence is -# AES-bits-CFB:key:IV/ciphertext':plaintext:ciphertext:encdec -# CFB128-AES128.Encrypt -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:3B3FD92EB72DAD20333449F8E83CFB4A:1 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:3B3FD92EB72DAD20333449F8E83CFB4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:C8A64537A0B3A93FCDE3CDAD9F1CE58B:1 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:C8A64537A0B3A93FCDE3CDAD9F1CE58B:30C81C46A35CE411E5FBC1191A0A52EF:26751F67A3CBB140B1808CF187A4F4DF:1 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:26751F67A3CBB140B1808CF187A4F4DF:F69F2445DF4F9B17AD2B417BE66C3710:C04B05357C5D1C0EEAC4C66F9FF7F2E6:1 -# CFB128-AES128.Decrypt -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:3B3FD92EB72DAD20333449F8E83CFB4A:0 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:3B3FD92EB72DAD20333449F8E83CFB4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:C8A64537A0B3A93FCDE3CDAD9F1CE58B:0 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:C8A64537A0B3A93FCDE3CDAD9F1CE58B:30C81C46A35CE411E5FBC1191A0A52EF:26751F67A3CBB140B1808CF187A4F4DF:0 -AES-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:26751F67A3CBB140B1808CF187A4F4DF:F69F2445DF4F9B17AD2B417BE66C3710:C04B05357C5D1C0EEAC4C66F9FF7F2E6:0 -# CFB128-AES192.Encrypt -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CDC80D6FDDF18CAB34C25909C99A4174:1 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:CDC80D6FDDF18CAB34C25909C99A4174:AE2D8A571E03AC9C9EB76FAC45AF8E51:67CE7F7F81173621961A2B70171D3D7A:1 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:67CE7F7F81173621961A2B70171D3D7A:30C81C46A35CE411E5FBC1191A0A52EF:2E1E8A1DD59B88B1C8E60FED1EFAC4C9:1 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:2E1E8A1DD59B88B1C8E60FED1EFAC4C9:F69F2445DF4F9B17AD2B417BE66C3710:C05F9F9CA9834FA042AE8FBA584B09FF:1 -# CFB128-AES192.Decrypt -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CDC80D6FDDF18CAB34C25909C99A4174:0 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:CDC80D6FDDF18CAB34C25909C99A4174:AE2D8A571E03AC9C9EB76FAC45AF8E51:67CE7F7F81173621961A2B70171D3D7A:0 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:67CE7F7F81173621961A2B70171D3D7A:30C81C46A35CE411E5FBC1191A0A52EF:2E1E8A1DD59B88B1C8E60FED1EFAC4C9:0 -AES-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:2E1E8A1DD59B88B1C8E60FED1EFAC4C9:F69F2445DF4F9B17AD2B417BE66C3710:C05F9F9CA9834FA042AE8FBA584B09FF:0 -# CFB128-AES256.Encrypt -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:DC7E84BFDA79164B7ECD8486985D3860:1 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:DC7E84BFDA79164B7ECD8486985D3860:AE2D8A571E03AC9C9EB76FAC45AF8E51:39FFED143B28B1C832113C6331E5407B:1 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:39FFED143B28B1C832113C6331E5407B:30C81C46A35CE411E5FBC1191A0A52EF:DF10132415E54B92A13ED0A8267AE2F9:1 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:DF10132415E54B92A13ED0A8267AE2F9:F69F2445DF4F9B17AD2B417BE66C3710:75A385741AB9CEF82031623D55B1E471:1 -# CFB128-AES256.Decrypt -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:DC7E84BFDA79164B7ECD8486985D3860:0 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:DC7E84BFDA79164B7ECD8486985D3860:AE2D8A571E03AC9C9EB76FAC45AF8E51:39FFED143B28B1C832113C6331E5407B:0 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:39FFED143B28B1C832113C6331E5407B:30C81C46A35CE411E5FBC1191A0A52EF:DF10132415E54B92A13ED0A8267AE2F9:0 -AES-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:DF10132415E54B92A13ED0A8267AE2F9:F69F2445DF4F9B17AD2B417BE66C3710:75A385741AB9CEF82031623D55B1E471:0 -# For all OFB encrypts and decrypts, the transformed sequence is -# AES-bits-CFB:key:IV/output':plaintext:ciphertext:encdec -# OFB-AES128.Encrypt -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:3B3FD92EB72DAD20333449F8E83CFB4A:1 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:50FE67CC996D32B6DA0937E99BAFEC60:AE2D8A571E03AC9C9EB76FAC45AF8E51:7789508D16918F03F53C52DAC54ED825:1 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:D9A4DADA0892239F6B8B3D7680E15674:30C81C46A35CE411E5FBC1191A0A52EF:9740051E9C5FECF64344F7A82260EDCC:1 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:A78819583F0308E7A6BF36B1386ABF23:F69F2445DF4F9B17AD2B417BE66C3710:304C6528F659C77866A510D9C1D6AE5E:1 -# OFB-AES128.Decrypt -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:3B3FD92EB72DAD20333449F8E83CFB4A:0 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:50FE67CC996D32B6DA0937E99BAFEC60:AE2D8A571E03AC9C9EB76FAC45AF8E51:7789508D16918F03F53C52DAC54ED825:0 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:D9A4DADA0892239F6B8B3D7680E15674:30C81C46A35CE411E5FBC1191A0A52EF:9740051E9C5FECF64344F7A82260EDCC:0 -AES-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:A78819583F0308E7A6BF36B1386ABF23:F69F2445DF4F9B17AD2B417BE66C3710:304C6528F659C77866A510D9C1D6AE5E:0 -# OFB-AES192.Encrypt -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CDC80D6FDDF18CAB34C25909C99A4174:1 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:A609B38DF3B1133DDDFF2718BA09565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:FCC28B8D4C63837C09E81700C1100401:1 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:52EF01DA52602FE0975F78AC84BF8A50:30C81C46A35CE411E5FBC1191A0A52EF:8D9A9AEAC0F6596F559C6D4DAF59A5F2:1 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:BD5286AC63AABD7EB067AC54B553F71D:F69F2445DF4F9B17AD2B417BE66C3710:6D9F200857CA6C3E9CAC524BD9ACC92A:1 -# OFB-AES192.Decrypt -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CDC80D6FDDF18CAB34C25909C99A4174:0 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:A609B38DF3B1133DDDFF2718BA09565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:FCC28B8D4C63837C09E81700C1100401:0 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:52EF01DA52602FE0975F78AC84BF8A50:30C81C46A35CE411E5FBC1191A0A52EF:8D9A9AEAC0F6596F559C6D4DAF59A5F2:0 -AES-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:BD5286AC63AABD7EB067AC54B553F71D:F69F2445DF4F9B17AD2B417BE66C3710:6D9F200857CA6C3E9CAC524BD9ACC92A:0 -# OFB-AES256.Encrypt -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:DC7E84BFDA79164B7ECD8486985D3860:1 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:B7BF3A5DF43989DD97F0FA97EBCE2F4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:4FEBDC6740D20B3AC88F6AD82A4FB08D:1 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E1C656305ED1A7A6563805746FE03EDC:30C81C46A35CE411E5FBC1191A0A52EF:71AB47A086E86EEDF39D1C5BBA97C408:1 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:41635BE625B48AFC1666DD42A09D96E7:F69F2445DF4F9B17AD2B417BE66C3710:0126141D67F37BE8538F5A8BE740E484:1 -# OFB-AES256.Decrypt -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:DC7E84BFDA79164B7ECD8486985D3860:0 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:B7BF3A5DF43989DD97F0FA97EBCE2F4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:4FEBDC6740D20B3AC88F6AD82A4FB08D:0 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E1C656305ED1A7A6563805746FE03EDC:30C81C46A35CE411E5FBC1191A0A52EF:71AB47A086E86EEDF39D1C5BBA97C408:0 -AES-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:41635BE625B48AFC1666DD42A09D96E7:F69F2445DF4F9B17AD2B417BE66C3710:0126141D67F37BE8538F5A8BE740E484:0 - -# AES Counter test vectors from RFC3686 -aes-128-ctr:AE6852F8121067CC4BF7A5765577F39E:00000030000000000000000000000001:53696E676C6520626C6F636B206D7367:E4095D4FB7A7B3792D6175A3261311B8:1 -aes-128-ctr:7E24067817FAE0D743D6CE1F32539163:006CB6DBC0543B59DA48D90B00000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F:5104A106168A72D9790D41EE8EDAD388EB2E1EFC46DA57C8FCE630DF9141BE28:1 -aes-128-ctr:7691BE035E5020A8AC6E618529F9A0DC:00E0017B27777F3F4A1786F000000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223:C1CF48A89F2FFDD9CF4652E9EFDB72D74540A42BDE6D7836D59A5CEAAEF3105325B2072F:1 - -aes-192-ctr:16AF5B145FC9F579C175F93E3BFB0EED863D06CCFDB78515:0000004836733C147D6D93CB00000001:53696E676C6520626C6F636B206D7367:4B55384FE259C9C84E7935A003CBE928:1 -aes-192-ctr:7C5CB2401B3DC33C19E7340819E0F69C678C3DB8E6F6A91A:0096B03B020C6EADC2CB500D00000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F:453243FC609B23327EDFAAFA7131CD9F8490701C5AD4A79CFC1FE0FF42F4FB00:1 -aes-192-ctr:02BF391EE8ECB159B959617B0965279BF59B60A786D3E0FE:0007BDFD5CBD60278DCC091200000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223:96893FC55E5C722F540B7DD1DDF7E758D288BC95C69165884536C811662F2188ABEE0935:1 - -aes-256-ctr:776BEFF2851DB06F4C8A0542C8696F6C6A81AF1EEC96B4D37FC1D689E6C1C104:00000060DB5672C97AA8F0B200000001:53696E676C6520626C6F636B206D7367:145AD01DBF824EC7560863DC71E3E0C0:1 -aes-256-ctr:F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884:00FAAC24C1585EF15A43D87500000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F:F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1C:1 -aes-256-ctr:FF7A617CE69148E4F1726E2F43581DE2AA62D9F805532EDFF1EED687FB54153D:001CC5B751A51D70A1C1114800000001:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223:EB6C52821D0BBBF7CE7594462ACA4FAAB407DF866569FD07F48CC0B583D6071F1EC0E6B8:1 - -# DES ECB tests (from destest) - -DES-ECB:0000000000000000::0000000000000000:8CA64DE9C1B123A7 -DES-ECB:FFFFFFFFFFFFFFFF::FFFFFFFFFFFFFFFF:7359B2163E4EDC58 -DES-ECB:3000000000000000::1000000000000001:958E6E627A05557B -DES-ECB:1111111111111111::1111111111111111:F40379AB9E0EC533 -DES-ECB:0123456789ABCDEF::1111111111111111:17668DFC7292532D -DES-ECB:1111111111111111::0123456789ABCDEF:8A5AE1F81AB8F2DD -DES-ECB:FEDCBA9876543210::0123456789ABCDEF:ED39D950FA74BCC4 - -# DESX-CBC tests (from destest) -DESX-CBC:0123456789abcdeff1e0d3c2b5a49786fedcba9876543210:fedcba9876543210:37363534333231204E6F77206973207468652074696D6520666F722000000000:846B2914851E9A2954732F8AA0A611C115CDC2D7951B1053A63C5E03B21AA3C4 - -# DES EDE3 CBC tests (from destest) -DES-EDE3-CBC:0123456789abcdeff1e0d3c2b5a49786fedcba9876543210:fedcba9876543210:37363534333231204E6F77206973207468652074696D6520666F722000000000:3FE301C962AC01D02213763C1CBD4CDC799657C064ECF5D41C673812CFDE9675 - -# RC4 tests (from rc4test) -RC4:0123456789abcdef0123456789abcdef::0123456789abcdef:75b7878099e0c596 -RC4:0123456789abcdef0123456789abcdef::0000000000000000:7494c2e7104b0879 -RC4:00000000000000000000000000000000::0000000000000000:de188941a3375d3a -RC4:ef012345ef012345ef012345ef012345::0000000000000000000000000000000000000000:d6a141a7ec3c38dfbd615a1162e1c7ba36b67858 -RC4:0123456789abcdef0123456789abcdef::123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345678:66a0949f8af7d6891f7f832ba833c00c892ebe30143ce28740011ecf -RC4:ef012345ef012345ef012345ef012345::00000000000000000000:d6a141a7ec3c38dfbd61 - - -# Camellia tests from RFC3713 -# For all ECB encrypts and decrypts, the transformed sequence is -# CAMELLIA-bits-ECB:key::plaintext:ciphertext:encdec -CAMELLIA-128-ECB:0123456789abcdeffedcba9876543210::0123456789abcdeffedcba9876543210:67673138549669730857065648eabe43 -CAMELLIA-192-ECB:0123456789abcdeffedcba98765432100011223344556677::0123456789abcdeffedcba9876543210:b4993401b3e996f84ee5cee7d79b09b9 -CAMELLIA-256-ECB:0123456789abcdeffedcba987654321000112233445566778899aabbccddeeff::0123456789abcdeffedcba9876543210:9acc237dff16d76c20ef7c919e3a7509 - -# ECB-CAMELLIA128.Encrypt -CAMELLIA-128-ECB:000102030405060708090A0B0C0D0E0F::00112233445566778899AABBCCDDEEFF:77CF412067AF8270613529149919546F:1 -CAMELLIA-192-ECB:000102030405060708090A0B0C0D0E0F1011121314151617::00112233445566778899AABBCCDDEEFF:B22F3C36B72D31329EEE8ADDC2906C68:1 -CAMELLIA-256-ECB:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F::00112233445566778899AABBCCDDEEFF:2EDF1F3418D53B88841FC8985FB1ECF2:1 - -# ECB-CAMELLIA128.Encrypt and ECB-CAMELLIA128.Decrypt -CAMELLIA-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::6BC1BEE22E409F96E93D7E117393172A:432FC5DCD628115B7C388D770B270C96 -CAMELLIA-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::AE2D8A571E03AC9C9EB76FAC45AF8E51:0BE1F14023782A22E8384C5ABB7FAB2B -CAMELLIA-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::30C81C46A35CE411E5FBC1191A0A52EF:A0A1ABCD1893AB6FE0FE5B65DF5F8636 -CAMELLIA-128-ECB:2B7E151628AED2A6ABF7158809CF4F3C::F69F2445DF4F9B17AD2B417BE66C3710:E61925E0D5DFAA9BB29F815B3076E51A - -# ECB-CAMELLIA192.Encrypt and ECB-CAMELLIA192.Decrypt -CAMELLIA-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::6BC1BEE22E409F96E93D7E117393172A:CCCC6C4E138B45848514D48D0D3439D3 -CAMELLIA-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::AE2D8A571E03AC9C9EB76FAC45AF8E51:5713C62C14B2EC0F8393B6AFD6F5785A -CAMELLIA-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::30C81C46A35CE411E5FBC1191A0A52EF:B40ED2B60EB54D09D030CF511FEEF366 -CAMELLIA-192-ECB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B::F69F2445DF4F9B17AD2B417BE66C3710:909DBD95799096748CB27357E73E1D26 - -# ECB-CAMELLIA256.Encrypt and ECB-CAMELLIA256.Decrypt -CAMELLIA-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::6BC1BEE22E409F96E93D7E117393172A:BEFD219B112FA00098919CD101C9CCFA -CAMELLIA-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::AE2D8A571E03AC9C9EB76FAC45AF8E51:C91D3A8F1AEA08A9386CF4B66C0169EA -CAMELLIA-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::30C81C46A35CE411E5FBC1191A0A52EF:A623D711DC5F25A51BB8A80D56397D28 -CAMELLIA-256-ECB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4::F69F2445DF4F9B17AD2B417BE66C3710:7960109FB6DC42947FCFE59EA3C5EB6B - -# For all CBC encrypts and decrypts, the transformed sequence is -# CAMELLIA-bits-CBC:key:IV/ciphertext':plaintext:ciphertext:encdec -# CBC-CAMELLIA128.Encrypt and CBC-CAMELLIA128.Decrypt -CAMELLIA-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:1607CF494B36BBF00DAEB0B503C831AB -CAMELLIA-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:1607CF494B36BBF00DAEB0B503C831AB:AE2D8A571E03AC9C9EB76FAC45AF8E51:A2F2CF671629EF7840C5A5DFB5074887 -CAMELLIA-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:A2F2CF671629EF7840C5A5DFB5074887:30C81C46A35CE411E5FBC1191A0A52EF:0F06165008CF8B8B5A63586362543E54 -CAMELLIA-128-CBC:2B7E151628AED2A6ABF7158809CF4F3C:36A84CDAFD5F9A85ADA0F0A993D6D577:F69F2445DF4F9B17AD2B417BE66C3710:74C64268CDB8B8FAF5B34E8AF3732980 - -# CBC-CAMELLIA192.Encrypt and CBC-CAMELLIA192.Decrypt -CAMELLIA-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:2A4830AB5AC4A1A2405955FD2195CF93 -CAMELLIA-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:2A4830AB5AC4A1A2405955FD2195CF93:AE2D8A571E03AC9C9EB76FAC45AF8E51:5D5A869BD14CE54264F892A6DD2EC3D5 -CAMELLIA-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:5D5A869BD14CE54264F892A6DD2EC3D5:30C81C46A35CE411E5FBC1191A0A52EF:37D359C3349836D884E310ADDF68C449 -CAMELLIA-192-CBC:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:37D359C3349836D884E310ADDF68C449:F69F2445DF4F9B17AD2B417BE66C3710:01FAAA930B4AB9916E9668E1428C6B08 - -# CBC-CAMELLIA256.Encrypt and CBC-CAMELLIA256.Decrypt -CAMELLIA-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:E6CFA35FC02B134A4D2C0B6737AC3EDA -CAMELLIA-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E6CFA35FC02B134A4D2C0B6737AC3EDA:AE2D8A571E03AC9C9EB76FAC45AF8E51:36CBEB73BD504B4070B1B7DE2B21EB50 -CAMELLIA-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:36CBEB73BD504B4070B1B7DE2B21EB50:30C81C46A35CE411E5FBC1191A0A52EF:E31A6055297D96CA3330CDF1B1860A83 -CAMELLIA-256-CBC:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E31A6055297D96CA3330CDF1B1860A83:F69F2445DF4F9B17AD2B417BE66C3710:5D563F6D1CCCF236051C0C5C1C58F28F - -# We don't support CFB{1,8}-CAMELLIAxxx.{En,De}crypt -# For all CFB128 encrypts and decrypts, the transformed sequence is -# CAMELLIA-bits-CFB:key:IV/ciphertext':plaintext:ciphertext:encdec -# CFB128-CAMELLIA128.Encrypt -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:14F7646187817EB586599146B82BD719:1 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:14F7646187817EB586599146B82BD719:AE2D8A571E03AC9C9EB76FAC45AF8E51:A53D28BB82DF741103EA4F921A44880B:1 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:A53D28BB82DF741103EA4F921A44880B:30C81C46A35CE411E5FBC1191A0A52EF:9C2157A664626D1DEF9EA420FDE69B96:1 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:9C2157A664626D1DEF9EA420FDE69B96:F69F2445DF4F9B17AD2B417BE66C3710:742A25F0542340C7BAEF24CA8482BB09:1 - -# CFB128-CAMELLIA128.Decrypt -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:14F7646187817EB586599146B82BD719:0 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:14F7646187817EB586599146B82BD719:AE2D8A571E03AC9C9EB76FAC45AF8E51:A53D28BB82DF741103EA4F921A44880B:0 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:A53D28BB82DF741103EA4F921A44880B:30C81C46A35CE411E5FBC1191A0A52EF:9C2157A664626D1DEF9EA420FDE69B96:0 -CAMELLIA-128-CFB:2B7E151628AED2A6ABF7158809CF4F3C:9C2157A664626D1DEF9EA420FDE69B96:F69F2445DF4F9B17AD2B417BE66C3710:742A25F0542340C7BAEF24CA8482BB09:0 - -# CFB128-CAMELLIA192.Encrypt -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:C832BB9780677DAA82D9B6860DCD565E:1 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:C832BB9780677DAA82D9B6860DCD565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:86F8491627906D780C7A6D46EA331F98:1 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:86F8491627906D780C7A6D46EA331F98:30C81C46A35CE411E5FBC1191A0A52EF:69511CCE594CF710CB98BB63D7221F01:1 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:69511CCE594CF710CB98BB63D7221F01:F69F2445DF4F9B17AD2B417BE66C3710:D5B5378A3ABED55803F25565D8907B84:1 - -# CFB128-CAMELLIA192.Decrypt -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:C832BB9780677DAA82D9B6860DCD565E:0 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:C832BB9780677DAA82D9B6860DCD565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:86F8491627906D780C7A6D46EA331F98:0 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:86F8491627906D780C7A6D46EA331F98:30C81C46A35CE411E5FBC1191A0A52EF:69511CCE594CF710CB98BB63D7221F01:0 -CAMELLIA-192-CFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:69511CCE594CF710CB98BB63D7221F01:F69F2445DF4F9B17AD2B417BE66C3710:D5B5378A3ABED55803F25565D8907B84:0 - -# CFB128-CAMELLIA256.Encrypt -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CF6107BB0CEA7D7FB1BD31F5E7B06C93:1 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:CF6107BB0CEA7D7FB1BD31F5E7B06C93:AE2D8A571E03AC9C9EB76FAC45AF8E51:89BEDB4CCDD864EA11BA4CBE849B5E2B:1 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:89BEDB4CCDD864EA11BA4CBE849B5E2B:30C81C46A35CE411E5FBC1191A0A52EF:555FC3F34BDD2D54C62D9E3BF338C1C4:1 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:555FC3F34BDD2D54C62D9E3BF338C1C4:F69F2445DF4F9B17AD2B417BE66C3710:5953ADCE14DB8C7F39F1BD39F359BFFA:1 - -# CFB128-CAMELLIA256.Decrypt -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CF6107BB0CEA7D7FB1BD31F5E7B06C93:0 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:CF6107BB0CEA7D7FB1BD31F5E7B06C93:AE2D8A571E03AC9C9EB76FAC45AF8E51:89BEDB4CCDD864EA11BA4CBE849B5E2B:0 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:89BEDB4CCDD864EA11BA4CBE849B5E2B:30C81C46A35CE411E5FBC1191A0A52EF:555FC3F34BDD2D54C62D9E3BF338C1C4:0 -CAMELLIA-256-CFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:555FC3F34BDD2D54C62D9E3BF338C1C4:F69F2445DF4F9B17AD2B417BE66C3710:5953ADCE14DB8C7F39F1BD39F359BFFA:0 - -# For all OFB encrypts and decrypts, the transformed sequence is -# CAMELLIA-bits-OFB:key:IV/output':plaintext:ciphertext:encdec -# OFB-CAMELLIA128.Encrypt -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:14F7646187817EB586599146B82BD719:1 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:50FE67CC996D32B6DA0937E99BAFEC60:AE2D8A571E03AC9C9EB76FAC45AF8E51:25623DB569CA51E01482649977E28D84:1 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:D9A4DADA0892239F6B8B3D7680E15674:30C81C46A35CE411E5FBC1191A0A52EF:C776634A60729DC657D12B9FCA801E98:1 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:A78819583F0308E7A6BF36B1386ABF23:F69F2445DF4F9B17AD2B417BE66C3710:D776379BE0E50825E681DA1A4C980E8E:1 - -# OFB-CAMELLIA128.Decrypt -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:14F7646187817EB586599146B82BD719:0 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:50FE67CC996D32B6DA0937E99BAFEC60:AE2D8A571E03AC9C9EB76FAC45AF8E51:25623DB569CA51E01482649977E28D84:0 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:D9A4DADA0892239F6B8B3D7680E15674:30C81C46A35CE411E5FBC1191A0A52EF:C776634A60729DC657D12B9FCA801E98:0 -CAMELLIA-128-OFB:2B7E151628AED2A6ABF7158809CF4F3C:A78819583F0308E7A6BF36B1386ABF23:F69F2445DF4F9B17AD2B417BE66C3710:D776379BE0E50825E681DA1A4C980E8E:0 - -# OFB-CAMELLIA192.Encrypt -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:C832BB9780677DAA82D9B6860DCD565E:1 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:A609B38DF3B1133DDDFF2718BA09565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:8ECEB7D0350D72C7F78562AEBDF99339:1 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:52EF01DA52602FE0975F78AC84BF8A50:30C81C46A35CE411E5FBC1191A0A52EF:BDD62DBBB9700846C53B507F544696F0:1 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:BD5286AC63AABD7EB067AC54B553F71D:F69F2445DF4F9B17AD2B417BE66C3710:E28014E046B802F385C4C2E13EAD4A72:1 - -# OFB-CAMELLIA192.Decrypt -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:C832BB9780677DAA82D9B6860DCD565E:0 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:A609B38DF3B1133DDDFF2718BA09565E:AE2D8A571E03AC9C9EB76FAC45AF8E51:8ECEB7D0350D72C7F78562AEBDF99339:0 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:52EF01DA52602FE0975F78AC84BF8A50:30C81C46A35CE411E5FBC1191A0A52EF:BDD62DBBB9700846C53B507F544696F0:0 -CAMELLIA-192-OFB:8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B:BD5286AC63AABD7EB067AC54B553F71D:F69F2445DF4F9B17AD2B417BE66C3710:E28014E046B802F385C4C2E13EAD4A72:0 - -# OFB-CAMELLIA256.Encrypt -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CF6107BB0CEA7D7FB1BD31F5E7B06C93:1 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:B7BF3A5DF43989DD97F0FA97EBCE2F4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:127AD97E8E3994E4820027D7BA109368:1 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E1C656305ED1A7A6563805746FE03EDC:30C81C46A35CE411E5FBC1191A0A52EF:6BFF6265A6A6B7A535BC65A80B17214E:1 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:41635BE625B48AFC1666DD42A09D96E7:F69F2445DF4F9B17AD2B417BE66C3710:0A4A0404E26AA78A27CB271E8BF3CF20:1 - -# OFB-CAMELLIA256.Decrypt -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:000102030405060708090A0B0C0D0E0F:6BC1BEE22E409F96E93D7E117393172A:CF6107BB0CEA7D7FB1BD31F5E7B06C93:0 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:B7BF3A5DF43989DD97F0FA97EBCE2F4A:AE2D8A571E03AC9C9EB76FAC45AF8E51:127AD97E8E3994E4820027D7BA109368:0 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:E1C656305ED1A7A6563805746FE03EDC:30C81C46A35CE411E5FBC1191A0A52EF:6BFF6265A6A6B7A535BC65A80B17214E:0 -CAMELLIA-256-OFB:603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4:41635BE625B48AFC1666DD42A09D96E7:F69F2445DF4F9B17AD2B417BE66C3710:0A4A0404E26AA78A27CB271E8BF3CF20:0 - -# SEED test vectors from RFC4269 -SEED-ECB:00000000000000000000000000000000::000102030405060708090A0B0C0D0E0F:5EBAC6E0054E166819AFF1CC6D346CDB:0 -SEED-ECB:000102030405060708090A0B0C0D0E0F::00000000000000000000000000000000:C11F22F20140505084483597E4370F43:0 -SEED-ECB:4706480851E61BE85D74BFB3FD956185::83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:0 -SEED-ECB:28DBC3BC49FFD87DCFA509B11D422BE7::B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:0 -SEED-ECB:00000000000000000000000000000000::000102030405060708090A0B0C0D0E0F:5EBAC6E0054E166819AFF1CC6D346CDB:1 -SEED-ECB:000102030405060708090A0B0C0D0E0F::00000000000000000000000000000000:C11F22F20140505084483597E4370F43:1 -SEED-ECB:4706480851E61BE85D74BFB3FD956185::83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:1 -SEED-ECB:28DBC3BC49FFD87DCFA509B11D422BE7::B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:1 - -# AES CCM 256 bit key -aes-256-ccm:1bde3251d41a8b5ea013c195ae128b218b3e0306376357077ef1c1c78548b92e:5b8e40746f6b98e00f1d13ff41:53bd72a97089e312422bf72e242377b3c6ee3e2075389b999c4ef7f28bd2b80a:9a5fcccdb4cf04e7293d2775cc76a488f042382d949b43b7d6bb2b9864786726:c17a32514eb6103f3249e076d4c871dc97e04b286699e54491dc18f6d734d4c0:2024931d73bca480c24a24ece6b6c2bf - -# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000::::58e2fccefa7e3061367f1d57a4e7455a -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000:00000000000000000000000000000000:0388dace60b6a392f328c2b971b2fe78::ab6e47d42cec13bdf53a67b21257bddf -aes-128-gcm:feffe9928665731c6d6a8f9467308308:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255:42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985::4d5c2af327cd64a62cf35abd2ba6fab4 -aes-128-gcm:feffe9928665731c6d6a8f9467308308:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091:feedfacedeadbeeffeedfacedeadbeefabaddad2:5bc94fbc3221a5db94fae95ae7121a47 -aes-128-gcm:feffe9928665731c6d6a8f9467308308:cafebabefacedbad:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598:feedfacedeadbeeffeedfacedeadbeefabaddad2:3612d2e79e3b0785561be14aaca2fccb -aes-128-gcm:feffe9928665731c6d6a8f9467308308:9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5:feedfacedeadbeeffeedfacedeadbeefabaddad2:619cc5aefffe0bfa462af43c1699d050 -aes-192-gcm:000000000000000000000000000000000000000000000000:000000000000000000000000::::cd33b28ac773f74ba00ed1f312572435 -aes-192-gcm:000000000000000000000000000000000000000000000000:000000000000000000000000:00000000000000000000000000000000:98e7247c07f0fe411c267e4384b0f600::2ff58d80033927ab8ef4d4587514f0fb -aes-192-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255:3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256::9924a7c8587336bfb118024db8674a14 -aes-192-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710:feedfacedeadbeeffeedfacedeadbeefabaddad2:2519498e80f1478f37ba55bd6d27618c -aes-192-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c:cafebabefacedbad:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7:feedfacedeadbeeffeedfacedeadbeefabaddad2:65dcc57fcf623a24094fcca40d3533f8 -aes-192-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c:9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b:feedfacedeadbeeffeedfacedeadbeefabaddad2:dcf566ff291c25bbb8568fc3d376a6d9 -aes-256-gcm:0000000000000000000000000000000000000000000000000000000000000000:000000000000000000000000::::530f8afbc74536b9a963b4f1c4cb738b -aes-256-gcm:0000000000000000000000000000000000000000000000000000000000000000:000000000000000000000000:00000000000000000000000000000000:cea7403d4d606b6e074ec5d3baf39d18::d0d1c8a799996bf0265b98b5d48ab919 -aes-256-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255:522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad::b094dac5d93471bdec1a502270e3cc6c -aes-256-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308:cafebabefacedbaddecaf888:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662:feedfacedeadbeeffeedfacedeadbeefabaddad2:76fc6ece0f4e1768cddf8853bb2d551b -aes-256-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308:cafebabefacedbad:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f:feedfacedeadbeeffeedfacedeadbeefabaddad2:3a337dbf46a792c45e454913fe2ea8f2 -aes-256-gcm:feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308:9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b:d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39:5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f:feedfacedeadbeeffeedfacedeadbeefabaddad2:a44a8266ee1c8eb0c8b5d4cf5ae9f19a -# local add-ons, primarily streaming ghash tests -# 128 bytes aad -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000:::d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad:5fea793a2d6f974d37e68e0cb8ff9492 -# 48 bytes plaintext -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0::9dd0a376b08e40eb00c35f29f9ea61a4 -# 80 bytes plaintext -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d5270291::98885a3a22bd4742fe7b72172193b163 -# 128 bytes plaintext -aes-128-gcm:00000000000000000000000000000000:000000000000000000000000:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d527029195b84d1b96c690ff2f2de30bf2ec89e00253786e126504f0dab90c48a30321de3345e6b0461e7c9e6c6b7afedde83f40::cac45f60e31efd3b5a43b98a22ce1aa1 -# 192 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF -aes-128-gcm:00000000000000000000000000000000:ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606::566f8ef683078bfdeeffa869d751a017 -# 80 bytes plaintext, submitted by Intel -aes-128-gcm:843ffcf5d2b72694d19ed01d01249412:dbcca32ebf9b804617c3aa9e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f:6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5:00000000000000000000000000000000101112131415161718191a1b1c1d1e1f:3b629ccfbc1119b7319e1dce2cd6fd6d - -# AES XTS test vectors from IEEE Std 1619-2007 -aes-128-xts:0000000000000000000000000000000000000000000000000000000000000000:00000000000000000000000000000000:0000000000000000000000000000000000000000000000000000000000000000:917cf69ebd68b2ec9b9fe9a3eadda692cd43d2f59598ed858c02c2652fbf922e -aes-128-xts:1111111111111111111111111111111122222222222222222222222222222222:33333333330000000000000000000000:4444444444444444444444444444444444444444444444444444444444444444:c454185e6a16936e39334038acef838bfb186fff7480adc4289382ecd6d394f0 -aes-128-xts:fffefdfcfbfaf9f8f7f6f5f4f3f2f1f022222222222222222222222222222222:33333333330000000000000000000000:4444444444444444444444444444444444444444444444444444444444444444:af85336b597afc1a900b2eb21ec949d292df4c047e0b21532186a5971a227a89 -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:00000000000000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568 -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:01000000000000000000000000000000:27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568:264d3ca8512194fec312c8c9891f279fefdd608d0c027b60483a3fa811d65ee59d52d9e40ec5672d81532b38b6b089ce951f0f9c35590b8b978d175213f329bb1c2fd30f2f7f30492a61a532a79f51d36f5e31a7c9a12c286082ff7d2394d18f783e1a8e72c722caaaa52d8f065657d2631fd25bfd8e5baad6e527d763517501c68c5edc3cdd55435c532d7125c8614deed9adaa3acade5888b87bef641c4c994c8091b5bcd387f3963fb5bc37aa922fbfe3df4e5b915e6eb514717bdd2a74079a5073f5c4bfd46adf7d282e7a393a52579d11a028da4d9cd9c77124f9648ee383b1ac763930e7162a8d37f350b2f74b8472cf09902063c6b32e8c2d9290cefbd7346d1c779a0df50edcde4531da07b099c638e83a755944df2aef1aa31752fd323dcb710fb4bfbb9d22b925bc3577e1b8949e729a90bbafeacf7f7879e7b1147e28ba0bae940db795a61b15ecf4df8db07b824bb062802cc98a9545bb2aaeed77cb3fc6db15dcd7d80d7d5bc406c4970a3478ada8899b329198eb61c193fb6275aa8ca340344a75a862aebe92eee1ce032fd950b47d7704a3876923b4ad62844bf4a09c4dbe8b4397184b7471360c9564880aedddb9baa4af2e75394b08cd32ff479c57a07d3eab5d54de5f9738b8d27f27a9f0ab11799d7b7ffefb2704c95c6ad12c39f1e867a4b7b1d7818a4b753dfd2a89ccb45e001a03a867b187f225dd -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:02000000000000000000000000000000:264d3ca8512194fec312c8c9891f279fefdd608d0c027b60483a3fa811d65ee59d52d9e40ec5672d81532b38b6b089ce951f0f9c35590b8b978d175213f329bb1c2fd30f2f7f30492a61a532a79f51d36f5e31a7c9a12c286082ff7d2394d18f783e1a8e72c722caaaa52d8f065657d2631fd25bfd8e5baad6e527d763517501c68c5edc3cdd55435c532d7125c8614deed9adaa3acade5888b87bef641c4c994c8091b5bcd387f3963fb5bc37aa922fbfe3df4e5b915e6eb514717bdd2a74079a5073f5c4bfd46adf7d282e7a393a52579d11a028da4d9cd9c77124f9648ee383b1ac763930e7162a8d37f350b2f74b8472cf09902063c6b32e8c2d9290cefbd7346d1c779a0df50edcde4531da07b099c638e83a755944df2aef1aa31752fd323dcb710fb4bfbb9d22b925bc3577e1b8949e729a90bbafeacf7f7879e7b1147e28ba0bae940db795a61b15ecf4df8db07b824bb062802cc98a9545bb2aaeed77cb3fc6db15dcd7d80d7d5bc406c4970a3478ada8899b329198eb61c193fb6275aa8ca340344a75a862aebe92eee1ce032fd950b47d7704a3876923b4ad62844bf4a09c4dbe8b4397184b7471360c9564880aedddb9baa4af2e75394b08cd32ff479c57a07d3eab5d54de5f9738b8d27f27a9f0ab11799d7b7ffefb2704c95c6ad12c39f1e867a4b7b1d7818a4b753dfd2a89ccb45e001a03a867b187f225dd:fa762a3680b76007928ed4a4f49a9456031b704782e65e16cecb54ed7d017b5e18abd67b338e81078f21edb7868d901ebe9c731a7c18b5e6dec1d6a72e078ac9a4262f860beefa14f4e821018272e411a951502b6e79066e84252c3346f3aa62344351a291d4bedc7a07618bdea2af63145cc7a4b8d4070691ae890cd65733e7946e9021a1dffc4c59f159425ee6d50ca9b135fa6162cea18a939838dc000fb386fad086acce5ac07cb2ece7fd580b00cfa5e98589631dc25e8e2a3daf2ffdec26531659912c9d8f7a15e5865ea8fb5816d6207052bd7128cd743c12c8118791a4736811935eb982a532349e31dd401e0b660a568cb1a4711f552f55ded59f1f15bf7196b3ca12a91e488ef59d64f3a02bf45239499ac6176ae321c4a211ec545365971c5d3f4f09d4eb139bfdf2073d33180b21002b65cc9865e76cb24cd92c874c24c18350399a936ab3637079295d76c417776b94efce3a0ef7206b15110519655c956cbd8b2489405ee2b09a6b6eebe0c53790a12a8998378b33a5b71159625f4ba49d2a2fdba59fbf0897bc7aabd8d707dc140a80f0f309f835d3da54ab584e501dfa0ee977fec543f74186a802b9a37adb3e8291eca04d66520d229e60401e7282bef486ae059aa70696e0e305d777140a7a883ecdcb69b9ff938e8a4231864c69ca2c2043bed007ff3e605e014bcf518138dc3a25c5e236171a2d01d6 -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:fd000000000000000000000000000000:8e41b78c390b5af9d758bb214a67e9f6bf7727b09ac6124084c37611398fa45daad94868600ed391fb1acd4857a95b466e62ef9f4b377244d1c152e7b30d731aad30c716d214b707aed99eb5b5e580b3e887cf7497465651d4b60e6042051da3693c3b78c14489543be8b6ad0ba629565bba202313ba7b0d0c94a3252b676f46cc02ce0f8a7d34c0ed229129673c1f61aed579d08a9203a25aac3a77e9db60267996db38df637356d9dcd1632e369939f2a29d89345c66e05066f1a3677aef18dea4113faeb629e46721a66d0a7e785d3e29af2594eb67dfa982affe0aac058f6e15864269b135418261fc3afb089472cf68c45dd7f231c6249ba0255e1e033833fc4d00a3fe02132d7bc3873614b8aee34273581ea0325c81f0270affa13641d052d36f0757d484014354d02d6883ca15c24d8c3956b1bd027bcf41f151fd8023c5340e5606f37e90fdb87c86fb4fa634b3718a30bace06a66eaf8f63c4aa3b637826a87fe8cfa44282e92cb1615af3a28e53bc74c7cba1a0977be9065d0c1a5dec6c54ae38d37f37aa35283e048e5530a85c4e7a29d7b92ec0c3169cdf2a805c7604bce60049b9fb7b8eaac10f51ae23794ceba68bb58112e293b9b692ca721b37c662f8574ed4dba6f88e170881c82cddc1034a0ca7e284bf0962b6b26292d836fa9f73c1ac770eef0f2d3a1eaf61d3e03555fd424eedd67e18a18094f888:d55f684f81f4426e9fde92a5ff02df2ac896af63962888a97910c1379e20b0a3b1db613fb7fe2e07004329ea5c22bfd33e3dbe4cf58cc608c2c26c19a2e2fe22f98732c2b5cb844cc6c0702d91e1d50fc4382a7eba5635cd602432a2306ac4ce82f8d70c8d9bc15f918fe71e74c622d5cf71178bf6e0b9cc9f2b41dd8dbe441c41cd0c73a6dc47a348f6702f9d0e9b1b1431e948e299b9ec2272ab2c5f0c7be86affa5dec87a0bee81d3d50007edaa2bcfccb35605155ff36ed8edd4a40dcd4b243acd11b2b987bdbfaf91a7cac27e9c5aea525ee53de7b2d3332c8644402b823e94a7db26276d2d23aa07180f76b4fd29b9c0823099c9d62c519880aee7e9697617c1497d47bf3e571950311421b6b734d38b0db91eb85331b91ea9f61530f54512a5a52a4bad589eb69781d537f23297bb459bdad2948a29e1550bf4787e0be95bb173cf5fab17dab7a13a052a63453d97ccec1a321954886b7a1299faaeecae35c6eaaca753b041b5e5f093bf83397fd21dd6b3012066fcc058cc32c3b09d7562dee29509b5839392c9ff05f51f3166aaac4ac5f238038a3045e6f72e48ef0fe8bc675e82c318a268e43970271bf119b81bf6a982746554f84e72b9f00280a320a08142923c23c883423ff949827f29bbacdc1ccdb04938ce6098c95ba6b32528f4ef78eed778b2e122ddfd1cbdd11d1c0a6783e011fc536d63d053260637 -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:fe000000000000000000000000000000:d55f684f81f4426e9fde92a5ff02df2ac896af63962888a97910c1379e20b0a3b1db613fb7fe2e07004329ea5c22bfd33e3dbe4cf58cc608c2c26c19a2e2fe22f98732c2b5cb844cc6c0702d91e1d50fc4382a7eba5635cd602432a2306ac4ce82f8d70c8d9bc15f918fe71e74c622d5cf71178bf6e0b9cc9f2b41dd8dbe441c41cd0c73a6dc47a348f6702f9d0e9b1b1431e948e299b9ec2272ab2c5f0c7be86affa5dec87a0bee81d3d50007edaa2bcfccb35605155ff36ed8edd4a40dcd4b243acd11b2b987bdbfaf91a7cac27e9c5aea525ee53de7b2d3332c8644402b823e94a7db26276d2d23aa07180f76b4fd29b9c0823099c9d62c519880aee7e9697617c1497d47bf3e571950311421b6b734d38b0db91eb85331b91ea9f61530f54512a5a52a4bad589eb69781d537f23297bb459bdad2948a29e1550bf4787e0be95bb173cf5fab17dab7a13a052a63453d97ccec1a321954886b7a1299faaeecae35c6eaaca753b041b5e5f093bf83397fd21dd6b3012066fcc058cc32c3b09d7562dee29509b5839392c9ff05f51f3166aaac4ac5f238038a3045e6f72e48ef0fe8bc675e82c318a268e43970271bf119b81bf6a982746554f84e72b9f00280a320a08142923c23c883423ff949827f29bbacdc1ccdb04938ce6098c95ba6b32528f4ef78eed778b2e122ddfd1cbdd11d1c0a6783e011fc536d63d053260637:72efc1ebfe1ee25975a6eb3aa8589dda2b261f1c85bdab442a9e5b2dd1d7c3957a16fc08e526d4b1223f1b1232a11af274c3d70dac57f83e0983c498f1a6f1aecb021c3e70085a1e527f1ce41ee5911a82020161529cd82773762daf5459de94a0a82adae7e1703c808543c29ed6fb32d9e004327c1355180c995a07741493a09c21ba01a387882da4f62534b87bb15d60d197201c0fd3bf30c1500a3ecfecdd66d8721f90bcc4c17ee925c61b0a03727a9c0d5f5ca462fbfa0af1c2513a9d9d4b5345bd27a5f6e653f751693e6b6a2b8ead57d511e00e58c45b7b8d005af79288f5c7c22fd4f1bf7a898b03a5634c6a1ae3f9fae5de4f296a2896b23e7ed43ed14fa5a2803f4d28f0d3ffcf24757677aebdb47bb388378708948a8d4126ed1839e0da29a537a8c198b3c66ab00712dd261674bf45a73d67f76914f830ca014b65596f27e4cf62de66125a5566df9975155628b400fbfb3a29040ed50faffdbb18aece7c5c44693260aab386c0a37b11b114f1c415aebb653be468179428d43a4d8bc3ec38813eca30a13cf1bb18d524f1992d44d8b1a42ea30b22e6c95b199d8d182f8840b09d059585c31ad691fa0619ff038aca2c39a943421157361717c49d322028a74648113bd8c9d7ec77cf3c89c1ec8718ceff8516d96b34c3c614f10699c9abc4ed0411506223bea16af35c883accdbe1104eef0cfdb54e12fb230a -aes-128-xts:2718281828459045235360287471352631415926535897932384626433832795:ff000000000000000000000000000000:72efc1ebfe1ee25975a6eb3aa8589dda2b261f1c85bdab442a9e5b2dd1d7c3957a16fc08e526d4b1223f1b1232a11af274c3d70dac57f83e0983c498f1a6f1aecb021c3e70085a1e527f1ce41ee5911a82020161529cd82773762daf5459de94a0a82adae7e1703c808543c29ed6fb32d9e004327c1355180c995a07741493a09c21ba01a387882da4f62534b87bb15d60d197201c0fd3bf30c1500a3ecfecdd66d8721f90bcc4c17ee925c61b0a03727a9c0d5f5ca462fbfa0af1c2513a9d9d4b5345bd27a5f6e653f751693e6b6a2b8ead57d511e00e58c45b7b8d005af79288f5c7c22fd4f1bf7a898b03a5634c6a1ae3f9fae5de4f296a2896b23e7ed43ed14fa5a2803f4d28f0d3ffcf24757677aebdb47bb388378708948a8d4126ed1839e0da29a537a8c198b3c66ab00712dd261674bf45a73d67f76914f830ca014b65596f27e4cf62de66125a5566df9975155628b400fbfb3a29040ed50faffdbb18aece7c5c44693260aab386c0a37b11b114f1c415aebb653be468179428d43a4d8bc3ec38813eca30a13cf1bb18d524f1992d44d8b1a42ea30b22e6c95b199d8d182f8840b09d059585c31ad691fa0619ff038aca2c39a943421157361717c49d322028a74648113bd8c9d7ec77cf3c89c1ec8718ceff8516d96b34c3c614f10699c9abc4ed0411506223bea16af35c883accdbe1104eef0cfdb54e12fb230a:3260ae8dad1f4a32c5cafe3ab0eb95549d461a67ceb9e5aa2d3afb62dece0553193ba50c75be251e08d1d08f1088576c7efdfaaf3f459559571e12511753b07af073f35da06af0ce0bbf6b8f5ccc5cea500ec1b211bd51f63b606bf6528796ca12173ba39b8935ee44ccce646f90a45bf9ccc567f0ace13dc2d53ebeedc81f58b2e41179dddf0d5a5c42f5d8506c1a5d2f8f59f3ea873cbcd0eec19acbf325423bd3dcb8c2b1bf1d1eaed0eba7f0698e4314fbeb2f1566d1b9253008cbccf45a2b0d9c5c9c21474f4076e02be26050b99dee4fd68a4cf890e496e4fcae7b70f94ea5a9062da0daeba1993d2ccd1dd3c244b8428801495a58b216547e7e847c46d1d756377b6242d2e5fb83bf752b54e0df71e889f3a2bb0f4c10805bf3c590376e3c24e22ff57f7fa965577375325cea5d920db94b9c336b455f6e894c01866fe9fbb8c8d3f70a2957285f6dfb5dcd8cbf54782f8fe7766d4723819913ac773421e3a31095866bad22c86a6036b2518b2059b4229d18c8c2ccbdf906c6cc6e82464ee57bddb0bebcb1dc645325bfb3e665ef7251082c88ebb1cf203bd779fdd38675713c8daadd17e1cabee432b09787b6ddf3304e38b731b45df5df51b78fcfb3d32466028d0ba36555e7e11ab0ee0666061d1645d962444bc47a38188930a84b4d561395c73c087021927ca638b7afc8a8679ccb84c26555440ec7f10445cd - -aes-256-xts:27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592:ff000000000000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:1c3b3a102f770386e4836c99e370cf9bea00803f5e482357a4ae12d414a3e63b5d31e276f8fe4a8d66b317f9ac683f44680a86ac35adfc3345befecb4bb188fd5776926c49a3095eb108fd1098baec70aaa66999a72a82f27d848b21d4a741b0c5cd4d5fff9dac89aeba122961d03a757123e9870f8acf1000020887891429ca2a3e7a7d7df7b10355165c8b9a6d0a7de8b062c4500dc4cd120c0f7418dae3d0b5781c34803fa75421c790dfe1de1834f280d7667b327f6c8cd7557e12ac3a0f93ec05c52e0493ef31a12d3d9260f79a289d6a379bc70c50841473d1a8cc81ec583e9645e07b8d9670655ba5bbcfecc6dc3966380ad8fecb17b6ba02469a020a84e18e8f84252070c13e9f1f289be54fbc481457778f616015e1327a02b140f1505eb309326d68378f8374595c849d84f4c333ec4423885143cb47bd71c5edae9be69a2ffeceb1bec9de244fbe15992b11b77c040f12bd8f6a975a44a0f90c29a9abc3d4d893927284c58754cce294529f8614dcd2aba991925fedc4ae74ffac6e333b93eb4aff0479da9a410e4450e0dd7ae4c6e2910900575da401fc07059f645e8b7e9bfdef33943054ff84011493c27b3429eaedb4ed5376441a77ed43851ad77f16f541dfd269d50d6a5f14fb0aab1cbb4c1550be97f7ab4066193c4caa773dad38014bd2092fa755c824bb5e54c4f36ffda9fcea70b9c6e693e148c151 -aes-256-xts:27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592:ffff0000000000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:77a31251618a15e6b92d1d66dffe7b50b50bad552305ba0217a610688eff7e11e1d0225438e093242d6db274fde801d4cae06f2092c728b2478559df58e837c2469ee4a4fa794e4bbc7f39bc026e3cb72c33b0888f25b4acf56a2a9804f1ce6d3d6e1dc6ca181d4b546179d55544aa7760c40d06741539c7e3cd9d2f6650b2013fd0eeb8c2b8e3d8d240ccae2d4c98320a7442e1c8d75a42d6e6cfa4c2eca1798d158c7aecdf82490f24bb9b38e108bcda12c3faf9a21141c3613b58367f922aaa26cd22f23d708dae699ad7cb40a8ad0b6e2784973dcb605684c08b8d6998c69aac049921871ebb65301a4619ca80ecb485a31d744223ce8ddc2394828d6a80470c092f5ba413c3378fa6054255c6f9df4495862bbb3287681f931b687c888abf844dfc8fc28331e579928cd12bd2390ae123cf03818d14dedde5c0c24c8ab018bfca75ca096f2d531f3d1619e785f1ada437cab92e980558b3dce1474afb75bfedbf8ff54cb2618e0244c9ac0d3c66fb51598cd2db11f9be39791abe447c63094f7c453b7ff87cb5bb36b7c79efb0872d17058b83b15ab0866ad8a58656c5a7e20dbdf308b2461d97c0ec0024a2715055249cf3b478ddd4740de654f75ca686e0d7345c69ed50cdc2a8b332b1f8824108ac937eb050585608ee734097fc09054fbff89eeaeea791f4a7ab1f9868294a4f9e27b42af8100cb9d59cef9645803 -aes-256-xts:27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592:ffffff00000000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:e387aaa58ba483afa7e8eb469778317ecf4cf573aa9d4eac23f2cdf914e4e200a8b490e42ee646802dc6ee2b471b278195d60918ececb44bf79966f83faba0499298ebc699c0c8634715a320bb4f075d622e74c8c932004f25b41e361025b5a87815391f6108fc4afa6a05d9303c6ba68a128a55705d415985832fdeaae6c8e19110e84d1b1f199a2692119edc96132658f09da7c623efcec712537a3d94c0bf5d7e352ec94ae5797fdb377dc1551150721adf15bd26a8efc2fcaad56881fa9e62462c28f30ae1ceaca93c345cf243b73f542e2074a705bd2643bb9f7cc79bb6e7091ea6e232df0f9ad0d6cf502327876d82207abf2115cdacf6d5a48f6c1879a65b115f0f8b3cb3c59d15dd8c769bc014795a1837f3901b5845eb491adfefe097b1fa30a12fc1f65ba22905031539971a10f2f36c321bb51331cdefb39e3964c7ef079994f5b69b2edd83a71ef549971ee93f44eac3938fcdd61d01fa71799da3a8091c4c48aa9ed263ff0749df95d44fef6a0bb578ec69456aa5408ae32c7af08ad7ba8921287e3bbee31b767be06a0e705c864a769137df28292283ea81a2480241b44d9921cdbec1bc28dc1fda114bd8e5217ac9d8ebafa720e9da4f9ace231cc949e5b96fe76ffc21063fddc83a6b8679c00d35e09576a875305bed5f36ed242c8900dd1fa965bc950dfce09b132263a1eef52dd6888c309f5a7d712826 -aes-256-xts:27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592:ffffffff000000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:bf53d2dade78e822a4d949a9bc6766b01b06a8ef70d26748c6a7fc36d80ae4c5520f7c4ab0ac8544424fa405162fef5a6b7f229498063618d39f0003cb5fb8d1c86b643497da1ff945c8d3bedeca4f479702a7a735f043ddb1d6aaade3c4a0ac7ca7f3fa5279bef56f82cd7a2f38672e824814e10700300a055e1630b8f1cb0e919f5e942010a416e2bf48cb46993d3cb6a51c19bacf864785a00bc2ecff15d350875b246ed53e68be6f55bd7e05cfc2b2ed6432198a6444b6d8c247fab941f569768b5c429366f1d3f00f0345b96123d56204c01c63b22ce78baf116e525ed90fdea39fa469494d3866c31e05f295ff21fea8d4e6e13d67e47ce722e9698a1c1048d68ebcde76b86fcf976eab8aa9790268b7068e017a8b9b749409514f1053027fd16c3786ea1bac5f15cb79711ee2abe82f5cf8b13ae73030ef5b9e4457e75d1304f988d62dd6fc4b94ed38ba831da4b7634971b6cd8ec325d9c61c00f1df73627ed3745a5e8489f3a95c69639c32cd6e1d537a85f75cc844726e8a72fc0077ad22000f1d5078f6b866318c668f1ad03d5a5fced5219f2eabbd0aa5c0f460d183f04404a0d6f469558e81fab24a167905ab4c7878502ad3e38fdbe62a41556cec37325759533ce8f25f367c87bb5578d667ae93f9e2fd99bcbc5f2fbba88cf6516139420fcff3b7361d86322c4bd84c82f335abb152c4a93411373aaa8220 -aes-256-xts:27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592:ffffffffff0000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:64497e5a831e4a932c09be3e5393376daa599548b816031d224bbf50a818ed2350eae7e96087c8a0db51ad290bd00c1ac1620857635bf246c176ab463be30b808da548081ac847b158e1264be25bb0910bbc92647108089415d45fab1b3d2604e8a8eff1ae4020cfa39936b66827b23f371b92200be90251e6d73c5f86de5fd4a950781933d79a28272b782a2ec313efdfcc0628f43d744c2dc2ff3dcb66999b50c7ca895b0c64791eeaa5f29499fb1c026f84ce5b5c72ba1083cddb5ce45434631665c333b60b11593fb253c5179a2c8db813782a004856a1653011e93fb6d876c18366dd8683f53412c0c180f9c848592d593f8609ca736317d356e13e2bff3a9f59cd9aeb19cd482593d8c46128bb32423b37a9adfb482b99453fbe25a41bf6feb4aa0bef5ed24bf73c762978025482c13115e4015aac992e5613a3b5c2f685b84795cb6e9b2656d8c88157e52c42f978d8634c43d06fea928f2822e465aa6576e9bf419384506cc3ce3c54ac1a6f67dc66f3b30191e698380bc999b05abce19dc0c6dcc2dd001ec535ba18deb2df1a101023108318c75dc98611a09dc48a0acdec676fabdf222f07e026f059b672b56e5cbc8e1d21bbd867dd927212054681d70ea737134cdfce93b6f82ae22423274e58a0821cc5502e2d0ab4585e94de6975be5e0b4efce51cd3e70c25a1fbbbd609d273ad5b0d59631c531f6a0a57b9 - -aes-128-xts:fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0:9a785634120000000000000000000000:000102030405060708090a0b0c0d0e0f10:6c1625db4671522d3d7599601de7ca09ed -aes-128-xts:fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0:9a785634120000000000000000000000:000102030405060708090a0b0c0d0e0f1011:d069444b7a7e0cab09e24447d24deb1fedbf -aes-128-xts:fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0:9a785634120000000000000000000000:000102030405060708090a0b0c0d0e0f101112:e5df1351c0544ba1350b3363cd8ef4beedbf9d -aes-128-xts:fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0:9a785634120000000000000000000000:000102030405060708090a0b0c0d0e0f10111213:9d84c813f719aa2c7be3f66171c7c5c2edbf9dac -aes-128-xts:e0e1e2e3e4e5e6e7e8e9eaebecedeeefc0c1c2c3c4c5c6c7c8c9cacbcccdcecf:21436587a90000000000000000000000:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff:38b45812ef43a05bd957e545907e223b954ab4aaf088303ad910eadf14b42be68b2461149d8c8ba85f992be970bc621f1b06573f63e867bf5875acafa04e42ccbd7bd3c2a0fb1fff791ec5ec36c66ae4ac1e806d81fbf709dbe29e471fad38549c8e66f5345d7c1eb94f405d1ec785cc6f6a68f6254dd8339f9d84057e01a17741990482999516b5611a38f41bb6478e6f173f320805dd71b1932fc333cb9ee39936beea9ad96fa10fb4112b901734ddad40bc1878995f8e11aee7d141a2f5d48b7a4e1e7f0b2c04830e69a4fd1378411c2f287edf48c6c4e5c247a19680f7fe41cefbd49b582106e3616cbbe4dfb2344b2ae9519391f3e0fb4922254b1d6d2d19c6d4d537b3a26f3bcc51588b32f3eca0829b6a5ac72578fb814fb43cf80d64a233e3f997a3f02683342f2b33d25b492536b93becb2f5e1a8b82f5b883342729e8ae09d16938841a21a97fb543eea3bbff59f13c1a18449e398701c1ad51648346cbc04c27bb2da3b93a1372ccae548fb53bee476f9e9c91773b1bb19828394d55d3e1a20ed69113a860b6829ffa847224604435070221b257e8dff783615d2cae4803a93aa4334ab482a0afac9c0aeda70b45a481df5dec5df8cc0f423c77a5fd46cd312021d4b438862419a791be03bb4d97c0e59578542531ba466a83baf92cefc151b5cc1611a167893819b63fb8a6b18e86de60290fa72b797b0ce59f3 -# AES wrap tests from RFC3394 -id-aes128-wrap:000102030405060708090A0B0C0D0E0F::00112233445566778899AABBCCDDEEFF:1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5 -id-aes192-wrap:000102030405060708090A0B0C0D0E0F1011121314151617::00112233445566778899AABBCCDDEEFF:96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D -id-aes256-wrap:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F::00112233445566778899AABBCCDDEEFF:64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7 -id-aes192-wrap:000102030405060708090A0B0C0D0E0F1011121314151617::00112233445566778899AABBCCDDEEFF0001020304050607:031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2 -id-aes256-wrap:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F::00112233445566778899AABBCCDDEEFF0001020304050607:A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1 -id-aes256-wrap:000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F::00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F:28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21 diff --git a/deps/openssl/openssl/tools/c_rehash b/deps/openssl/openssl/tools/c_rehash deleted file mode 100644 index 6a27c02245e917..00000000000000 --- a/deps/openssl/openssl/tools/c_rehash +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/perl - -# Perl c_rehash script, scan all files in a directory -# and add symbolic links to their hash values. - -my $dir = "/usr/local/ssl"; -my $prefix = "/usr/local/ssl"; - -my $openssl = $ENV{OPENSSL} || "openssl"; -my $pwd; -my $x509hash = "-subject_hash"; -my $crlhash = "-hash"; -my $verbose = 0; -my $symlink_exists=eval {symlink("",""); 1}; -my $removelinks = 1; - -## Parse flags. -while ( $ARGV[0] =~ /^-/ ) { - my $flag = shift @ARGV; - last if ( $flag eq '--'); - if ( $flag eq '-old') { - $x509hash = "-subject_hash_old"; - $crlhash = "-hash_old"; - } elsif ( $flag eq '-h') { - help(); - } elsif ( $flag eq '-n' ) { - $removelinks = 0; - } elsif ( $flag eq '-v' ) { - $verbose++; - } - else { - print STDERR "Usage error; try -help.\n"; - exit 1; - } -} - -sub help { - print "Usage: c_rehash [-old] [-h] [-v] [dirs...]\n"; - print " -old use old-style digest\n"; - print " -h print this help text\n"; - print " -v print files removed and linked\n"; - exit 0; -} - -eval "require Cwd"; -if (defined(&Cwd::getcwd)) { - $pwd=Cwd::getcwd(); -} else { - $pwd=`pwd`; - chomp($pwd); -} - -# DOS/Win32 or Unix delimiter? Prefix our installdir, then search. -my $path_delim = ($pwd =~ /^[a-z]\:/i) ? ';' : ':'; -$ENV{PATH} = "$prefix/bin" . ($ENV{PATH} ? $path_delim . $ENV{PATH} : ""); - -if(! -x $openssl) { - my $found = 0; - foreach (split /$path_delim/, $ENV{PATH}) { - if(-x "$_/$openssl") { - $found = 1; - $openssl = "$_/$openssl"; - last; - } - } - if($found == 0) { - print STDERR "c_rehash: rehashing skipped ('openssl' program not available)\n"; - exit 0; - } -} - -if(@ARGV) { - @dirlist = @ARGV; -} elsif($ENV{SSL_CERT_DIR}) { - @dirlist = split /$path_delim/, $ENV{SSL_CERT_DIR}; -} else { - $dirlist[0] = "$dir/certs"; -} - -if (-d $dirlist[0]) { - chdir $dirlist[0]; - $openssl="$pwd/$openssl" if (!-x $openssl); - chdir $pwd; -} - -foreach (@dirlist) { - if(-d $_ and -w $_) { - hash_dir($_); - } -} - -sub hash_dir { - my %hashlist; - print "Doing $_[0]\n"; - chdir $_[0]; - opendir(DIR, "."); - my @flist = readdir(DIR); - closedir DIR; - if ( $removelinks ) { - # Delete any existing symbolic links - foreach (grep {/^[\da-f]+\.r{0,1}\d+$/} @flist) { - if(-l $_) { - unlink $_; - print "unlink $_" if $verbose; - } - } - } - FILE: foreach $fname (grep {/\.(pem)|(crt)|(cer)|(crl)$/} @flist) { - # Check to see if certificates and/or CRLs present. - my ($cert, $crl) = check_file($fname); - if(!$cert && !$crl) { - print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; - next; - } - link_hash_cert($fname) if($cert); - link_hash_crl($fname) if($crl); - } -} - -sub check_file { - my ($is_cert, $is_crl) = (0,0); - my $fname = $_[0]; - open IN, $fname; - while() { - if(/^-----BEGIN (.*)-----/) { - my $hdr = $1; - if($hdr =~ /^(X509 |TRUSTED |)CERTIFICATE$/) { - $is_cert = 1; - last if($is_crl); - } elsif($hdr eq "X509 CRL") { - $is_crl = 1; - last if($is_cert); - } - } - } - close IN; - return ($is_cert, $is_crl); -} - - -# Link a certificate to its subject name hash value, each hash is of -# the form . where n is an integer. If the hash value already exists -# then we need to up the value of n, unless its a duplicate in which -# case we skip the link. We check for duplicates by comparing the -# certificate fingerprints - -sub link_hash_cert { - my $fname = $_[0]; - $fname =~ s/'/'\\''/g; - my ($hash, $fprint) = `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`; - chomp $hash; - chomp $fprint; - $fprint =~ s/^.*=//; - $fprint =~ tr/://d; - my $suffix = 0; - # Search for an unused hash filename - while(exists $hashlist{"$hash.$suffix"}) { - # Hash matches: if fingerprint matches its a duplicate cert - if($hashlist{"$hash.$suffix"} eq $fprint) { - print STDERR "WARNING: Skipping duplicate certificate $fname\n"; - return; - } - $suffix++; - } - $hash .= ".$suffix"; - if ($symlink_exists) { - symlink $fname, $hash; - print "link $fname -> $hash\n" if $verbose; - } else { - open IN,"<$fname" or die "can't open $fname for read"; - open OUT,">$hash" or die "can't open $hash for write"; - print OUT ; # does the job for small text files - close OUT; - close IN; - print "copy $fname -> $hash\n" if $verbose; - } - $hashlist{$hash} = $fprint; -} - -# Same as above except for a CRL. CRL links are of the form .r - -sub link_hash_crl { - my $fname = $_[0]; - $fname =~ s/'/'\\''/g; - my ($hash, $fprint) = `"$openssl" crl $crlhash -fingerprint -noout -in '$fname'`; - chomp $hash; - chomp $fprint; - $fprint =~ s/^.*=//; - $fprint =~ tr/://d; - my $suffix = 0; - # Search for an unused hash filename - while(exists $hashlist{"$hash.r$suffix"}) { - # Hash matches: if fingerprint matches its a duplicate cert - if($hashlist{"$hash.r$suffix"} eq $fprint) { - print STDERR "WARNING: Skipping duplicate CRL $fname\n"; - return; - } - $suffix++; - } - $hash .= ".r$suffix"; - if ($symlink_exists) { - symlink $fname, $hash; - print "link $fname -> $hash\n" if $verbose; - } else { - system ("cp", $fname, $hash); - print "cp $fname -> $hash\n" if $verbose; - } - $hashlist{$hash} = $fprint; -} - From 0c6f6742f250f10a0e47a1f0c69a50abcd9b28ac Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 9 Mar 2016 15:26:34 -0800 Subject: [PATCH 16/41] console: check that stderr is writable `Console` constructor checks that `stdout.write()` is a function but does not do an equivalent check for `stderr.write()`. If `stderr` is not specified in the constructor, then `stderr` is set to be `stdout`. However, if `stderr` is specified, but `stderr.write()` is not a function, then an exception is not thrown until `console.error()` is called. This change adds the same check for 'stderr' in the constructor that is there for `stdout`. If `stderr` fails the check, then a `TypeError` is thrown. Took the opportunity to copyedit the `console` doc a little too. PR-URL: https://github.com/nodejs/node/pull/5635 Reviewed-By: James M Snell Reviewed-By: Rod Vagg --- doc/api/console.markdown | 8 ++++---- lib/console.js | 3 +++ test/parallel/test-console-instance.js | 19 +++++++++++++------ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/doc/api/console.markdown b/doc/api/console.markdown index f64d227d0604da..d0e6385cca6731 100644 --- a/doc/api/console.markdown +++ b/doc/api/console.markdown @@ -48,8 +48,8 @@ myConsole.warn(`Danger ${name}! Danger!`); ``` While the API for the `Console` class is designed fundamentally around the -Web browser `console` object, the `Console` in Node.js is *not* intended to -duplicate the browsers functionality exactly. +browser `console` object, the `Console` in Node.js is *not* intended to +duplicate the browser's functionality exactly. ## Asynchronous vs Synchronous Consoles @@ -75,8 +75,8 @@ const Console = console.Console; Creates a new `Console` by passing one or two writable stream instances. `stdout` is a writable stream to print log or info output. `stderr` -is used for warning or error output. If `stderr` isn't passed, the warning -and error output will be sent to the `stdout`. +is used for warning or error output. If `stderr` isn't passed, warning and error +output will be sent to `stdout`. ```js const output = fs.createWriteStream('./stdout.log'); diff --git a/lib/console.js b/lib/console.js index cc8e68c740ff15..3d2314035e6841 100644 --- a/lib/console.js +++ b/lib/console.js @@ -11,7 +11,10 @@ function Console(stdout, stderr) { } if (!stderr) { stderr = stdout; + } else if (typeof stderr.write !== 'function') { + throw new TypeError('Console expects writable stream instances'); } + var prop = { writable: true, enumerable: false, diff --git a/test/parallel/test-console-instance.js b/test/parallel/test-console-instance.js index 1ab038df48e432..2a8a6e3678f58a 100644 --- a/test/parallel/test-console-instance.js +++ b/test/parallel/test-console-instance.js @@ -1,10 +1,13 @@ 'use strict'; require('../common'); -var assert = require('assert'); -var Stream = require('stream'); -var Console = require('console').Console; +const assert = require('assert'); +const Stream = require('stream'); +const Console = require('console').Console; var called = false; +const out = new Stream(); +const err = new Stream(); + // ensure the Console instance doesn't write to the // process' "stdout" or "stderr" streams process.stdout.write = process.stderr.write = function() { @@ -20,9 +23,13 @@ assert.throws(function() { new Console(); }, /Console expects a writable stream/); -var out = new Stream(); -var err = new Stream(); -out.writable = err.writable = true; +// Console constructor should throw if stderr exists but is not writable +assert.throws(function() { + out.write = function() {}; + err.write = undefined; + new Console(out, err); +}, /Console expects writable stream instances/); + out.write = err.write = function(d) {}; var c = new Console(out, err); From 78effc3484646c4497434246fe8f1badb7b4f12b Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 10 Mar 2016 21:08:35 -0500 Subject: [PATCH 17/41] test: add batch of known issue tests This commit adds tests for several known issues. Refs: https://github.com/nodejs/node/issues/1901 Refs: https://github.com/nodejs/node/issues/728 Refs: https://github.com/nodejs/node/issues/4778 Refs: https://github.com/nodejs/node/issues/947 Refs: https://github.com/nodejs/node/issues/2734 PR-URL: https://github.com/nodejs/node/pull/5653 Reviewed-By: James M Snell Reviewed-By: Rich Trott --- .../test-child-process-max-buffer.js | 16 +++++++++++++ .../test-events-known-properties.js | 12 ++++++++++ .../test-module-deleted-extensions.js | 17 ++++++++++++++ .../test-process-external-stdio-close.js | 23 +++++++++++++++++++ test/known_issues/test-vm-getters.js | 19 +++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 test/known_issues/test-child-process-max-buffer.js create mode 100644 test/known_issues/test-events-known-properties.js create mode 100644 test/known_issues/test-module-deleted-extensions.js create mode 100644 test/known_issues/test-process-external-stdio-close.js create mode 100644 test/known_issues/test-vm-getters.js diff --git a/test/known_issues/test-child-process-max-buffer.js b/test/known_issues/test-child-process-max-buffer.js new file mode 100644 index 00000000000000..14a344c7062a5a --- /dev/null +++ b/test/known_issues/test-child-process-max-buffer.js @@ -0,0 +1,16 @@ +'use strict'; +// Refs: https://github.com/nodejs/node/issues/1901 +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); +const unicode = '中文测试'; // Length = 4, Byte length = 13 + +if (process.argv[2] === 'child') { + console.log(unicode); +} else { + const cmd = `${process.execPath} ${__filename} child`; + + cp.exec(cmd, { maxBuffer: 10 }, common.mustCall((err, stdout, stderr) => { + assert.strictEqual(err.message, 'stdout maxBuffer exceeded'); + })); +} diff --git a/test/known_issues/test-events-known-properties.js b/test/known_issues/test-events-known-properties.js new file mode 100644 index 00000000000000..944fa3da2bbd7c --- /dev/null +++ b/test/known_issues/test-events-known-properties.js @@ -0,0 +1,12 @@ +'use strict'; +// Refs: https://github.com/nodejs/node/issues/728 +const common = require('../common'); +const assert = require('assert'); +const EventEmitter = require('events'); +const ee = new EventEmitter(); + +ee.on('__proto__', common.mustCall((data) => { + assert.strictEqual(data, 42); +})); + +ee.emit('__proto__', 42); diff --git a/test/known_issues/test-module-deleted-extensions.js b/test/known_issues/test-module-deleted-extensions.js new file mode 100644 index 00000000000000..45ec41ad6041ad --- /dev/null +++ b/test/known_issues/test-module-deleted-extensions.js @@ -0,0 +1,17 @@ +'use strict'; +// Refs: https://github.com/nodejs/node/issues/4778 +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); +const file = path.join(common.tmpDir, 'test-extensions.foo.bar'); + +common.refreshTmpDir(); +fs.writeFileSync(file, '', 'utf8'); +require.extensions['.foo.bar'] = (module, path) => {}; +delete require.extensions['.foo.bar']; +require.extensions['.bar'] = common.mustCall((module, path) => { + assert.strictEqual(module.id, file); + assert.strictEqual(path, file); +}); +require(path.join(common.tmpDir, 'test-extensions')); diff --git a/test/known_issues/test-process-external-stdio-close.js b/test/known_issues/test-process-external-stdio-close.js new file mode 100644 index 00000000000000..79e3641bdf06fc --- /dev/null +++ b/test/known_issues/test-process-external-stdio-close.js @@ -0,0 +1,23 @@ +'use strict'; +// Refs: https://github.com/nodejs/node/issues/947 +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); + +if (process.argv[2] === 'child') { + process.on('message', common.mustCall((msg) => { + assert.strictEqual(msg, 'go'); + console.log('logging should not cause a crash'); + process.disconnect(); + })); +} else { + const child = cp.fork(__filename, ['child'], {silent: true}); + + child.on('close', common.mustCall((exitCode, signal) => { + assert.strictEqual(exitCode, 0); + assert.strictEqual(signal, null); + })); + + child.stdout.destroy(); + child.send('go'); +} diff --git a/test/known_issues/test-vm-getters.js b/test/known_issues/test-vm-getters.js new file mode 100644 index 00000000000000..f815e6d658351d --- /dev/null +++ b/test/known_issues/test-vm-getters.js @@ -0,0 +1,19 @@ +'use strict'; +// Refs: https://github.com/nodejs/node/issues/2734 +require('../common'); +const assert = require('assert'); +const vm = require('vm'); +const sandbox = {}; + +Object.defineProperty(sandbox, 'prop', { + get() { + return 'foo'; + } +}); + +const descriptor = Object.getOwnPropertyDescriptor(sandbox, 'prop'); +const context = vm.createContext(sandbox); +const code = 'Object.getOwnPropertyDescriptor(this, "prop");'; +const result = vm.runInContext(code, context); + +assert.strictEqual(result, descriptor); From bf1fe4693c5c7f3935f54bfba1b0dfe5b2c51af0 Mon Sep 17 00:00:00 2001 From: Mithun Patel Date: Mon, 14 Mar 2016 10:50:50 -0500 Subject: [PATCH 18/41] doc: Add windows example for Path.format PR-URL: https://github.com/nodejs/node/pull/5700 Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani --- doc/api/path.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/api/path.markdown b/doc/api/path.markdown index 3d9fa5ba9b64c2..530dc440ca9f19 100644 --- a/doc/api/path.markdown +++ b/doc/api/path.markdown @@ -100,6 +100,10 @@ string will be the contents of the `base` property. If the `base` property is not supplied, a concatenation of the `name` property and the `ext` property will be used as the `base` property. +Examples: + +An example on Posix systems: + ```js path.format({ root : "/", @@ -120,6 +124,19 @@ path.format({ // returns '/file.txt' ``` +An example on Windows: + +```js +path.format({ + root : "C:\\", + dir : "C:\\path\\dir", + base : "file.txt", + ext : ".txt", + name : "file" +}) +// returns 'C:\\path\\dir\\file.txt' +``` + ## path.isAbsolute(path) Determines whether `path` is an absolute path. An absolute path will always From c0a24e4a1d8c881caedfaf864b964114cc8554c7 Mon Sep 17 00:00:00 2001 From: Claudio Rodriguez Date: Mon, 14 Mar 2016 18:48:26 -0300 Subject: [PATCH 19/41] doc: fix multiline return comments in querystring Changes the multiline return example commments in querystring which have the example out-of-comment, into single comment lines to remain consistent with other docs. PR-URL: https://github.com/nodejs/node/pull/5705 Reviewed-By: James M Snell Reviewed-By: Rich Trott Reviewed-By: Sakthipriyan Vairamani --- doc/api/querystring.markdown | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/doc/api/querystring.markdown b/doc/api/querystring.markdown index 052bd0ea411e91..3a864e2d4fa1fe 100644 --- a/doc/api/querystring.markdown +++ b/doc/api/querystring.markdown @@ -28,15 +28,13 @@ Example: ```js querystring.parse('foo=bar&baz=qux&baz=quux&corge') -// returns -{ foo: 'bar', baz: ['qux', 'quux'], corge: '' } +// returns { foo: 'bar', baz: ['qux', 'quux'], corge: '' } // Suppose gbkDecodeURIComponent function already exists, // it can decode `gbk` encoding string querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null, { decodeURIComponent: gbkDecodeURIComponent }) -// returns -{ w: '中文', foo: 'bar' } +// returns { w: '中文', foo: 'bar' } ``` ## querystring.stringify(obj[, sep][, eq][, options]) @@ -52,19 +50,16 @@ Example: ```js querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }) -// returns -'foo=bar&baz=qux&baz=quux&corge=' +// returns 'foo=bar&baz=qux&baz=quux&corge=' querystring.stringify({foo: 'bar', baz: 'qux'}, ';', ':') -// returns -'foo:bar;baz:qux' +// returns 'foo:bar;baz:qux' // Suppose gbkEncodeURIComponent function already exists, // it can encode string with `gbk` encoding querystring.stringify({ w: '中文', foo: 'bar' }, null, null, { encodeURIComponent: gbkEncodeURIComponent }) -// returns -'w=%D6%D0%CE%C4&foo=bar' +// returns 'w=%D6%D0%CE%C4&foo=bar' ``` ## querystring.unescape From 81876612f756f76b04e8a4212113e2e226b91375 Mon Sep 17 00:00:00 2001 From: Alexander Penev Date: Mon, 14 Mar 2016 17:56:02 +0200 Subject: [PATCH 20/41] https: fix ssl socket leak when keepalive is used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SSL sockets leak whenever keep alive is enabled, ca option is set in the global agent, and requests are sent without the ca property. In the following case at Agent.prototype.createSocket a socket will be created with a hashtag name that includes data from the global agents’ ca property. On subsequent requests at Agent.prototype.addRequest we do not find the free socket, because the hashtag name generated there does not take into account the global agents’ ca property, thus creating a new socket and leaving the first socket to timeout. closes: #5699 PR-URL: https://github.com/nodejs/node/pull/5713 Reviewed-By: Benjamin Gruenbaum Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- lib/_http_agent.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/_http_agent.js b/lib/_http_agent.js index ddb1c5bfff9b63..aac4b955637e9a 100644 --- a/lib/_http_agent.js +++ b/lib/_http_agent.js @@ -115,6 +115,9 @@ Agent.prototype.addRequest = function(req, options) { }; } + options = util._extend({}, options); + options = util._extend(options, this.options); + var name = this.getName(options); if (!this.sockets[name]) { this.sockets[name] = []; From 7e45d4f0764701c62ede8b07634de3b0e693e7e9 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 15 Mar 2016 15:19:32 -0700 Subject: [PATCH 21/41] test: minimize test-http-get-pipeline-problem Reduce resoures required by test. Clarify comment explaining source of test and what the test is looking for. Fixes: https://github.com/nodejs/node/issues/5725 PR-URL: https://github.com/nodejs/node/pull/5728 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/parallel/test-http-get-pipeline-problem.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-http-get-pipeline-problem.js b/test/parallel/test-http-get-pipeline-problem.js index 4f0d52aad5195d..de339e5b91a322 100644 --- a/test/parallel/test-http-get-pipeline-problem.js +++ b/test/parallel/test-http-get-pipeline-problem.js @@ -1,19 +1,21 @@ 'use strict'; -// We are demonstrating a problem with http.get when queueing up many -// transfers. The server simply introduces some delay and sends a file. -// Note this is demonstrated with connection: close. +// In previous versions of Node.js (e.g., 0.6.0), this sort of thing would halt +// after http.globalAgent.maxSockets number of files. +// See https://groups.google.com/forum/#!topic/nodejs-dev/V5fB69hFa9o var common = require('../common'); var assert = require('assert'); var http = require('http'); var fs = require('fs'); +http.globalAgent.maxSockets = 1; + common.refreshTmpDir(); var image = fs.readFileSync(common.fixturesDir + '/person.jpg'); console.log('image.length = ' + image.length); -var total = 100; +var total = 10; var requests = 0, responses = 0; var server = http.Server(function(req, res) { From 1b266fc15c9f484d9b2dbd8226163e65038dcb78 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Wed, 16 Mar 2016 23:21:11 +0100 Subject: [PATCH 22/41] test: remove the use of curl in the test suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There were 2 tests using curl: `test-http-304.js` is removed because it was initially included to test that the 304 response does not contain a body, and this is already covered by `test-http-chunked-304.js`. `test-http-curl-chunk-problem` has been renamed and refactored so instead of using curl, it uses 2 child node processes: one for sending the HTTP request and the other to calculate the sha1sum. Originally, this test was introduced to fix a bug in `nodejs@0.2.x`, and it was not fixed until `nodejs@0.2.5`. A modified version of this test has been run with `nodejs@0.2.0` and reproduces the problem. This same test has been run with `nodejs@0.2.6` and runs correctly. Fixes: https://github.com/nodejs/node/issues/5174 PR-URL: https://github.com/nodejs/node/pull/5750 Reviewed-By: Ben Noordhuis Reviewed-By: Johan Bergström Reviewed-By: Rich Trott Reviewed-By: Jeremiah Senkpiel --- test/parallel/test-http-304.js | 18 ---- test/parallel/test-http-chunk-problem.js | 93 +++++++++++++++++++ test/parallel/test-http-curl-chunk-problem.js | 71 -------------- 3 files changed, 93 insertions(+), 89 deletions(-) delete mode 100644 test/parallel/test-http-304.js create mode 100644 test/parallel/test-http-chunk-problem.js delete mode 100644 test/parallel/test-http-curl-chunk-problem.js diff --git a/test/parallel/test-http-304.js b/test/parallel/test-http-304.js deleted file mode 100644 index 6ac1c68d0d3665..00000000000000 --- a/test/parallel/test-http-304.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; -var common = require('../common'); - -var http = require('http'); -var childProcess = require('child_process'); - -var s = http.createServer(function(request, response) { - response.writeHead(304); - response.end(); -}); - -s.listen(common.PORT, function() { - childProcess.exec('curl -i http://127.0.0.1:' + common.PORT + '/', - function(err, stdout, stderr) { - if (err) throw err; - s.close(); - }); -}); diff --git a/test/parallel/test-http-chunk-problem.js b/test/parallel/test-http-chunk-problem.js new file mode 100644 index 00000000000000..6a5710e38e9f1b --- /dev/null +++ b/test/parallel/test-http-chunk-problem.js @@ -0,0 +1,93 @@ +'use strict'; +// http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919 +const common = require('../common'); +const assert = require('assert'); +if (!common.hasCrypto) { + console.log('1..0 # Skipped: missing crypto'); + return; +} + +if (process.argv[2] === 'request') { + const http = require('http'); + const options = { + port: common.PORT, + path : '/' + }; + + http.get(options, (res) => { + res.pipe(process.stdout); + }); + + return; +} + +if (process.argv[2] === 'shasum') { + const crypto = require('crypto'); + const shasum = crypto.createHash('sha1'); + process.stdin.on('data', (d) => { + shasum.update(d); + }); + + process.stdin.on('close', () => { + process.stdout.write(shasum.digest('hex')); + }); + + return; +} + +const http = require('http'); +const cp = require('child_process'); + +const filename = require('path').join(common.tmpDir, 'big'); + +function executeRequest(cb) { + cp.exec([process.execPath, + __filename, + 'request', + '|', + process.execPath, + __filename, + 'shasum' ].join(' '), + (err, stdout, stderr) => { + if (err) throw err; + assert.equal('8c206a1a87599f532ce68675536f0b1546900d7a', + stdout.slice(0, 40)); + cb(); + } + ); +} + + +common.refreshTmpDir(); + +const ddcmd = common.ddCommand(filename, 10240); + +cp.exec(ddcmd, function(err, stdout, stderr) { + if (err) throw err; + const server = http.createServer(function(req, res) { + res.writeHead(200); + + // Create the subprocess + const cat = cp.spawn('cat', [filename]); + + // Stream the data through to the response as binary chunks + cat.stdout.on('data', (data) => { + res.write(data); + }); + + cat.stdout.on('end', () => res.end()); + + // End the response on exit (and log errors) + cat.on('exit', (code) => { + if (code !== 0) { + console.error('subprocess exited with code ' + code); + process.exit(1); + } + }); + + }); + + server.listen(common.PORT, () => { + executeRequest(() => server.close()); + }); +}); diff --git a/test/parallel/test-http-curl-chunk-problem.js b/test/parallel/test-http-curl-chunk-problem.js deleted file mode 100644 index f3e3a243287ce1..00000000000000 --- a/test/parallel/test-http-curl-chunk-problem.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict'; -var common = require('../common'); -var assert = require('assert'); -if (!common.opensslCli) { - console.log('1..0 # Skipped: node compiled without OpenSSL CLI.'); - return; -} - -// http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919 -var http = require('http'); -var cp = require('child_process'); -var fs = require('fs'); - -var filename = require('path').join(common.tmpDir, 'big'); - -var count = 0; -function maybeMakeRequest() { - if (++count < 2) return; - console.log('making curl request'); - var cmd = 'curl http://127.0.0.1:' + common.PORT + '/ | ' + - '"' + common.opensslCli + '" sha1'; - cp.exec(cmd, function(err, stdout, stderr) { - if (err) throw err; - var hex = stdout.match(/([A-Fa-f0-9]{40})/)[0]; - assert.equal('8c206a1a87599f532ce68675536f0b1546900d7a', hex); - console.log('got the correct response'); - fs.unlink(filename); - server.close(); - }); -} - - -common.refreshTmpDir(); - -var ddcmd = common.ddCommand(filename, 10240); -console.log('dd command: ', ddcmd); - -cp.exec(ddcmd, function(err, stdout, stderr) { - if (err) throw err; - maybeMakeRequest(); -}); - - -var server = http.createServer(function(req, res) { - res.writeHead(200); - - // Create the subprocess - var cat = cp.spawn('cat', [filename]); - - // Stream the data through to the response as binary chunks - cat.stdout.on('data', function(data) { - res.write(data); - }); - - cat.stdout.on('end', function onStdoutEnd() { - res.end(); - }); - - // End the response on exit (and log errors) - cat.on('exit', function(code) { - if (code !== 0) { - console.error('subprocess exited with code ' + code); - process.exit(1); - } - }); - -}); - -server.listen(common.PORT, maybeMakeRequest); - -console.log('Server running at http://localhost:8080'); From 3a901b0e3e88b12384ade56326c58f40a61d5c2b Mon Sep 17 00:00:00 2001 From: Sakthipriyan Vairamani Date: Fri, 18 Mar 2016 00:01:19 +0530 Subject: [PATCH 23/41] tools: remove unused imports PR-URL: https://github.com/nodejs/node/pull/5765 Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- tools/gyp_node.py | 2 -- tools/install.py | 1 - 2 files changed, 3 deletions(-) diff --git a/tools/gyp_node.py b/tools/gyp_node.py index 064abe30aa209c..0ceb93341f12d3 100755 --- a/tools/gyp_node.py +++ b/tools/gyp_node.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -import glob import os -import shlex import sys script_dir = os.path.dirname(__file__) diff --git a/tools/install.py b/tools/install.py index ead93966f09da1..cb86c65699df88 100755 --- a/tools/install.py +++ b/tools/install.py @@ -10,7 +10,6 @@ import os import re import shutil -import stat import sys # set at init time From e43e8e3a31d3e5cf9e561b4ec2f8796ee6ed6fe9 Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Fri, 18 Mar 2016 13:26:41 -0400 Subject: [PATCH 24/41] doc: add a cli options doc page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This page is mostly a mirror of the updated manual page. PR-URL: https://github.com/nodejs/node/pull/5787 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell jasnell@gmail.com> Reviewed-By: Bryan English Reviewed-By: Robert Lindstädt --- doc/api/_toc.markdown | 1 + doc/api/cli.markdown | 165 ++++++++++++++++++++++++++++++++++++++++++ src/node.cc | 3 +- 3 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 doc/api/cli.markdown diff --git a/doc/api/_toc.markdown b/doc/api/_toc.markdown index dcf715d9f05891..5c8fbdd7901e20 100644 --- a/doc/api/_toc.markdown +++ b/doc/api/_toc.markdown @@ -7,6 +7,7 @@ * [C/C++ Addons](addons.html) * [Child Processes](child_process.html) * [Cluster](cluster.html) +* [Command Line Options](cli.html) * [Console](console.html) * [Crypto](crypto.html) * [Debugger](debugger.html) diff --git a/doc/api/cli.markdown b/doc/api/cli.markdown new file mode 100644 index 00000000000000..2910c782d2ad8e --- /dev/null +++ b/doc/api/cli.markdown @@ -0,0 +1,165 @@ +# Command Line Options + + + +Node.js comes with a wide variety of CLI options. These options expose built-in +debugging, multiple ways to execute scripts, and other helpful runtime options. + +To view this documentation as a manual page in your terminal, run `man node`. + + +## Synopsis + +`node [options] [v8 options] [script.js | -e "script"] [arguments]` + +`node debug [script.js | -e "script" | :] …` + +`node --v8-options` + +Execute without arguments to start the [REPL][]. + +_For more info about `node debug`, please see the [debugger][] documentation._ + + +## Options + +### `-v`, `--version` + +Print node's version. + + +### `-h`, `--help` + +Print node command line options. +The output of this option is less detailed than this document. + + +### `-e`, `--eval "script"` + +Evaluate the following argument as JavaScript. + + +### `-p`, `--print "script"` + +Identical to `-e` but prints the result. + + +### `-c`, `--check` + +Syntax check the script without executing. + + +### `-i`, `--interactive` + +Opens the REPL even if stdin does not appear to be a terminal. + + +### `-r`, `--require module` + +Preload the specified module at startup. + +Follows `require()`'s module resolution +rules. `module` may be either a path to a file, or a node module name. + + +### `--no-deprecation` + +Silence deprecation warnings. + + +### `--trace-deprecation` + +Print stack traces for deprecations. + + +### `--throw-deprecation` + +Throw errors for deprecations. + + +### `--trace-sync-io` + +Prints a stack trace whenever synchronous I/O is detected after the first turn +of the event loop. + + +### `--zero-fill-buffers` + +Automatically zero-fills all newly allocated [Buffer][] and [SlowBuffer][] +instances. + + +### `--track-heap-objects` + +Track heap object allocations for heap snapshots. + + +### `--prof-process` + +Process v8 profiler output generated using the v8 option `--prof`. + + +### `--v8-options` + +Print v8 command line options. + + +### `--tls-cipher-list=list` + +Specify an alternative default TLS cipher list. (Requires Node.js to be built +with crypto support. (Default)) + + +### `--enable-fips` + +Enable FIPS-compliant crypto at startup. (Requires Node.js to be built with +`./configure --openssl-fips`) + + +### `--force-fips` + +Force FIPS-compliant crypto on startup. (Cannot be disabled from script code.) +(Same requirements as `--enable-fips`) + + +### `--icu-data-dir=file` + +Specify ICU data load path. (overrides `NODE_ICU_DATA`) + + +## Environment Variables + +### `NODE_DEBUG=module[,…]` + +`','`-separated list of core modules that should print debug information. + + +### `NODE_PATH=path[:…]` + +`':'`-separated list of directories prefixed to the module search path. + +_Note: on Windows, this is a `';'`-separated list instead._ + + +### `NODE_DISABLE_COLORS=1` + +When set to `1` colors will not be used in the REPL. + + +### `NODE_ICU_DATA=file` + +Data path for ICU (Intl object) data. Will extend linked-in data when compiled +with small-icu support. + + +### `NODE_REPL_HISTORY=file` + +Path to the file used to store the persistent REPL history. The default path is +`~/.node_repl_history`, which is overridden by this variable. Setting the value +to an empty string (`""` or `" "`) disables persistent REPL history. + + +[Buffer]: buffer.html#buffer_buffer +[debugger]: debugger.html +[REPL]: repl.html +[SlowBuffer]: buffer.html#buffer_class_slowbuffer diff --git a/src/node.cc b/src/node.cc index 8442e35f923077..869196f1397ca8 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3205,7 +3205,8 @@ static bool ParseDebugOpt(const char* arg) { } static void PrintHelp() { - // XXX: If you add an option here, please also add it to /doc/node.1 + // XXX: If you add an option here, please also add it to doc/node.1 and + // doc/api/cli.markdown printf("Usage: node [options] [ -e script | script.js ] [arguments] \n" " node debug script.js [arguments] \n" "\n" From e57355c2f499c92a56da616898376db79dcdc3eb Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Fri, 18 Mar 2016 15:57:55 -0400 Subject: [PATCH 25/41] test: make test-net-connect-options-ipv6.js better Improve the robustness of test-net-connect-options-ipv6.js PPC Suse build team encountered intermittent failures related to dns. Improve test to make it more robust in the face of intermittent dns issues. PR-URL: https://github.com/nodejs/node/pull/5791 Reviewed-By: James M Snell --- test/parallel/test-net-connect-options-ipv6.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/parallel/test-net-connect-options-ipv6.js b/test/parallel/test-net-connect-options-ipv6.js index 8b11612a1286f2..5cce7325f91967 100644 --- a/test/parallel/test-net-connect-options-ipv6.js +++ b/test/parallel/test-net-connect-options-ipv6.js @@ -40,7 +40,21 @@ function tryConnect() { server.close(); }); }).on('error', function(err) { - if (err.syscall === 'getaddrinfo' && err.code === 'ENOTFOUND') { + // ENOTFOUND means we don't have the requested address. In this + // case we try the next one in the list and if we run out of + // candidates we assume IPv6 is not supported on the + // machine and skip the test. + // EAI_AGAIN means we tried to remotely resolve the address and + // timed out or hit some intermittent connectivity issue with the + // dns server. Although we are looking for local loopback addresses + // we may go remote since the list we search includes addresses that + // cover more than is available on any one distribution. The + // net is that if we get an EAI_AGAIN we were looking for an + // address which does not exist in this distribution so the error + // is not significant and we should just move on and try the + // next address in the list. + if ((err.syscall === 'getaddrinfo') && ((err.code === 'ENOTFOUND') || + (err.code === 'EAI_AGAIN'))) { if (host !== 'localhost' || --localhostTries === 0) host = hosts[++hostIdx]; if (host) From 79d26ae1964078ffeb8a9d211be7297e0f8b4c30 Mon Sep 17 00:00:00 2001 From: John Eversole Date: Sat, 19 Mar 2016 09:59:15 -0700 Subject: [PATCH 26/41] doc: explain path.format expected properties Explain the expected properties in path.format Fixes: https://github.com/nodejs/node/issues/5746 PR-URL: https://github.com/nodejs/node/pull/5801 Reviewed-By: Rich Trott Reviewed-By: Benjamin Gruenbaum --- doc/api/path.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/api/path.markdown b/doc/api/path.markdown index 530dc440ca9f19..e691d041458cc7 100644 --- a/doc/api/path.markdown +++ b/doc/api/path.markdown @@ -85,9 +85,9 @@ path.extname('.index') Returns a path string from an object. This is the opposite of [`path.parse`][]. -If `pathObject` has all expected properties, the returned string will be a -concatenation of the `dir` property, the platform-dependent path separator, and -the `base` property. +If `pathObject` has `dir` and `base` properties, the returned string will +be a concatenation of the `dir` property, the platform-dependent path separator, +and the `base` property. If the `dir` property is not supplied, the `root` property will be used as the `dir` property. However, it will be assumed that the `root` property already From 0836d7e2fbe7795befa1fa1ad858f51b63c4dbf3 Mon Sep 17 00:00:00 2001 From: Claudio Rodriguez Date: Sat, 19 Mar 2016 15:03:14 -0300 Subject: [PATCH 27/41] test: fix flaky test-cluster-shared-leak Test was flaky on centos7-64 due to an uncaught ECONNRESET on the worker code. This catches the error so the process will exit with code 0. Fixes: https://github.com/nodejs/node/issues/5604 PR-URL: https://github.com/nodejs/node/pull/5802 Reviewed-By: Rich Trott Reviewed-By: James M Snell --- test/parallel/test-cluster-shared-leak.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/parallel/test-cluster-shared-leak.js b/test/parallel/test-cluster-shared-leak.js index 9235c1ea60a672..ad13a869b2b8e0 100644 --- a/test/parallel/test-cluster-shared-leak.js +++ b/test/parallel/test-cluster-shared-leak.js @@ -40,6 +40,11 @@ if (cluster.isMaster) { } const server = net.createServer(function(c) { + c.on('error', function(e) { + // ECONNRESET is OK, so we don't exit with code !== 0 + if (e.code !== 'ECONNRESET') + throw e; + }); c.end('bye'); }); From d55599f4d83b85f60280b43803060cb9e50f34c9 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Sun, 20 Mar 2016 15:13:51 +0200 Subject: [PATCH 28/41] dns: use template literals Prefer the use of template string literals over string concatenation in the dns module, makes dns consistent with other modules basically doing https://github.com/nodejs/node/pull/5778 for it. PR-URL: https://github.com/nodejs/node/pull/5809 Reviewed-By: James M Snell --- lib/dns.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/dns.js b/lib/dns.js index 6683eacf14008f..5a87b8c865f616 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -23,7 +23,8 @@ function errnoException(err, syscall, hostname) { } var ex = null; if (typeof err === 'string') { // c-ares error code. - ex = new Error(syscall + ' ' + err + (hostname ? ' ' + hostname : '')); + const errHost = hostname ? ' ' + hostname : ''; + ex = new Error(`${syscall} ${err}${errHost}`); ex.code = err; ex.errno = err; ex.syscall = syscall; @@ -268,7 +269,7 @@ exports.resolve = function(hostname, type_, callback_) { if (typeof resolver === 'function') { return resolver(hostname, callback); } else { - throw new Error('Unknown type "' + type_ + '"'); + throw new Error(`Unknown type "${type_}"`); } }; @@ -306,7 +307,7 @@ exports.setServers = function(servers) { if (ver) return newSet.push([ver, s]); - throw new Error('IP address is not properly formatted: ' + serv); + throw new Error(`IP address is not properly formatted: ${serv}`); }); var r = cares.setServers(newSet); @@ -316,8 +317,7 @@ exports.setServers = function(servers) { cares.setServers(orig.join(',')); var err = cares.strerror(r); - throw new Error('c-ares failed to set servers: "' + err + - '" [' + servers + ']'); + throw new Error(`c-ares failed to set servers: "${err}" [${servers}]`); } }; From 20faf9097d3ed674f9bdd0bef19423163911ad3b Mon Sep 17 00:00:00 2001 From: Wolfgang Steiner Date: Sun, 20 Mar 2016 19:29:36 +0100 Subject: [PATCH 29/41] doc: explain error message on missing main file Added a hint saying that node uses the default "Cannot find module" error when requiring a module for which the "main" file specified in the package.json is missing. PR-URL: https://github.com/nodejs/node/pull/5812 Reviewed-By: Myles Borins Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell --- doc/api/modules.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/api/modules.markdown b/doc/api/modules.markdown index 4c4cacbaf68ac1..20c8b175cd9340 100644 --- a/doc/api/modules.markdown +++ b/doc/api/modules.markdown @@ -346,6 +346,14 @@ If this was in a folder at `./some-library`, then This is the extent of Node.js's awareness of package.json files. +Note: If the file specified by the `"main"` entry of `package.json` is missing +and can not be resolved, Node.js will report the entire module as missing with +the default error: + +``` +Error: Cannot find module 'some-library' +``` + If there is no package.json file present in the directory, then Node.js will attempt to load an `index.js` or `index.node` file out of that directory. For example, if there was no package.json file in the above From 1135ee97e7fba1ea2d299def46857e678469b612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Lal?= Date: Sun, 20 Mar 2016 15:15:13 +0100 Subject: [PATCH 30/41] test: strip non-free icc profile from person.jpg Fixes: https://github.com/nodejs/node/issues/5749 PR-URL: https://github.com/nodejs/node/pull/5813 Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell Reviewed-By: Rod Vagg --- test/fixtures/person.jpg | Bin 57928 -> 45658 bytes test/fixtures/person.jpg.gz | Bin 50187 -> 45429 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/fixtures/person.jpg b/test/fixtures/person.jpg index 4f71881c5584d824d5993245c839fff1c9636544..96d46888d76c19a976eaed55fb1987183b69bbc7 100644 GIT binary patch delta 24545 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 Q(n@F#~fPj+HN(xA)AdQNMhzN?b3QCET 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 H7hnI`nS>F0 diff --git a/test/fixtures/person.jpg.gz b/test/fixtures/person.jpg.gz index 71788ed1cb97c5cdd9cad19417a73ba68478888c..0d3239a3c842298d4aa98f56e236bf91e1ddbb6c 100644 GIT binary patch delta 44901 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 delta 49703 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 Q$roS$*^@&M)kxw10Q^`(VgLXD From 86b876fe7b759d9e1c174bd8ad6d5f3f8cd326ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Lal?= Date: Sun, 20 Mar 2016 15:16:10 +0100 Subject: [PATCH 31/41] test: smaller chunk size for smaller person.jpg PR-URL: https://github.com/nodejs/node/pull/5813 Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell Reviewed-By: Rod Vagg --- test/parallel/test-zlib-params.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-zlib-params.js b/test/parallel/test-zlib-params.js index 4e02b7bdb9461c..8a2b7da851225a 100644 --- a/test/parallel/test-zlib-params.js +++ b/test/parallel/test-zlib-params.js @@ -6,13 +6,13 @@ var path = require('path'); var fs = require('fs'); const file = fs.readFileSync(path.resolve(common.fixturesDir, 'person.jpg')); -const chunkSize = 24 * 1024; +const chunkSize = 12 * 1024; const opts = { level: 9, strategy: zlib.Z_DEFAULT_STRATEGY }; const deflater = zlib.createDeflate(opts); const chunk1 = file.slice(0, chunkSize); const chunk2 = file.slice(chunkSize); -const blkhdr = new Buffer([0x00, 0x48, 0x82, 0xb7, 0x7d]); +const blkhdr = new Buffer([0x00, 0x5a, 0x82, 0xa5, 0x7d]); const expected = Buffer.concat([blkhdr, chunk2]); let actual; From 0a1eb168e00ee7abd43ada4dc23ea0445b1bf1c9 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Sun, 20 Mar 2016 21:11:36 +0100 Subject: [PATCH 32/41] test: fix `test-cluster-worker-kill` Don't check that the `disconnect` event is emitted before the `exit` event as the order is not guaranteed. PR-URL: https://github.com/nodejs/node/pull/5814 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/parallel/test-cluster-worker-kill.js | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/test/parallel/test-cluster-worker-kill.js b/test/parallel/test-cluster-worker-kill.js index 1ad9433f1ac940..1f44c93488b1e6 100644 --- a/test/parallel/test-cluster-worker-kill.js +++ b/test/parallel/test-cluster-worker-kill.js @@ -60,8 +60,6 @@ if (cluster.isWorker) { results.cluster_exitCode = worker.process.exitCode; results.cluster_signalCode = worker.process.signalCode; results.cluster_emitExit += 1; - assert.ok(results.cluster_emitDisconnect, - "cluster: 'exit' event before 'disconnect' event"); }); // Check worker events and properties @@ -77,26 +75,11 @@ if (cluster.isWorker) { results.worker_signalCode = signalCode; results.worker_emitExit += 1; results.worker_died = !alive(worker.process.pid); - assert.ok(results.worker_emitDisconnect, - "worker: 'exit' event before 'disconnect' event"); - - process.nextTick(function() { finish_test(); }); }); - var finish_test = function() { - try { - checkResults(expected_results, results); - } catch (exc) { - console.error('FAIL: ' + exc.message); - if (exc.name != 'AssertionError') { - console.trace(exc); - } - - process.exit(1); - return; - } - process.exit(0); - }; + process.on('exit', function() { + checkResults(expected_results, results); + }); } // some helper functions ... From 7c837028dae4533542175acb5ba1d14521dde0e4 Mon Sep 17 00:00:00 2001 From: Benjamin Gruenbaum Date: Tue, 22 Mar 2016 23:21:46 +0200 Subject: [PATCH 33/41] doc: use consistent event name parameter Implementing the suggestion in https://github.com/nodejs/node/issues/4554 this pull request renames the parameter name in all the places that accept an event name as a parameter. Previously, the parameter has been called `event` or `type`. Now as suggested it is consistently called `eventName`. PR-URL: https://github.com/nodejs/node/pull/5850 Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Jeremiah Senkpiel --- doc/api/events.markdown | 60 +++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/doc/api/events.markdown b/doc/api/events.markdown index 797b969ecc2824..7b7ff57ee028f5 100644 --- a/doc/api/events.markdown +++ b/doc/api/events.markdown @@ -201,7 +201,7 @@ added and `'removeListener'` when a listener is removed. ### Event: 'newListener' -* `event` {String|Symbol} The event name +* `eventName` {String|Symbol} The name of the event being listened for * `listener` {Function} The event handler function The `EventEmitter` instance will emit it's own `'newListener'` event *before* @@ -237,16 +237,16 @@ myEmitter.emit('event'); ### Event: 'removeListener' -* `event` {String|Symbol} The event name +* `eventName` {String|Symbol} The event name * `listener` {Function} The event handler function The `'removeListener'` event is emitted *after* a listener is removed. -### EventEmitter.listenerCount(emitter, event) +### EventEmitter.listenerCount(emitter, eventName) Stability: 0 - Deprecated: Use [`emitter.listenerCount()`][] instead. -A class method that returns the number of listeners for the given `event` +A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`. ```js @@ -284,16 +284,17 @@ emitter.once('event', () => { }); ``` -### emitter.addListener(event, listener) +### emitter.addListener(eventName, listener) -Alias for `emitter.on(event, listener)`. +Alias for `emitter.on(eventName, listener)`. -### emitter.emit(event[, arg1][, arg2][, ...]) +### emitter.emit(eventName[, arg1][, arg2][, ...]) -Synchronously calls each of the listeners registered for `event`, in the order -they were registered, passing the supplied arguments to each. +Synchronously calls each of the listeners registered for the event named +`eventName`, in the order they were registered, passing the supplied arguments +to each. -Returns `true` if event had listeners, `false` otherwise. +Returns `true` if the event had listeners, `false` otherwise. ### emitter.getMaxListeners() @@ -301,15 +302,15 @@ Returns the current max listener value for the `EventEmitter` which is either set by [`emitter.setMaxListeners(n)`][] or defaults to [`EventEmitter.defaultMaxListeners`][]. -### emitter.listenerCount(event) +### emitter.listenerCount(eventName) -* `event` {Value} The type of event +* `eventName` {Value} The name of the event being listened for -Returns the number of listeners listening to the `event` type. +Returns the number of listeners listening to the event named `eventName`. -### emitter.listeners(event) +### emitter.listeners(eventName) -Returns a copy of the array of listeners for the specified `event`. +Returns a copy of the array of listeners for the event named `eventName`. ```js server.on('connection', (stream) => { @@ -319,12 +320,12 @@ console.log(util.inspect(server.listeners('connection'))); // Prints: [ [Function] ] ``` -### emitter.on(event, listener) +### emitter.on(eventName, listener) Adds the `listener` function to the end of the listeners array for the -specified `event`. No checks are made to see if the `listener` has already -been added. Multiple calls passing the same combination of `event` and -`listener` will result in the `listener` being added, and called, multiple +event named `eventName`. No checks are made to see if the `listener` has +already been added. Multiple calls passing the same combination of `eventName` +and `listener` will result in the `listener` being added, and called, multiple times. ```js @@ -335,10 +336,11 @@ server.on('connection', (stream) => { Returns a reference to the `EventEmitter` so calls can be chained. -### emitter.once(event, listener) +### emitter.once(eventName, listener) -Adds a **one time** `listener` function for the `event`. This listener is -invoked only the next time `event` is triggered, after which it is removed. +Adds a **one time** `listener` function for the event named `eventName`. This +listener is invoked only the next time `eventName` is triggered, after which +it is removed. ```js server.once('connection', (stream) => { @@ -348,9 +350,9 @@ server.once('connection', (stream) => { Returns a reference to the `EventEmitter` so calls can be chained. -### emitter.removeAllListeners([event]) +### emitter.removeAllListeners([eventName]) -Removes all listeners, or those of the specified `event`. +Removes all listeners, or those of the specified `eventName`. Note that it is bad practice to remove listeners added elsewhere in the code, particularly when the `EventEmitter` instance was created by some other @@ -358,10 +360,10 @@ component or module (e.g. sockets or file streams). Returns a reference to the `EventEmitter` so calls can be chained. -### emitter.removeListener(event, listener) +### emitter.removeListener(eventName, listener) -Removes the specified `listener` from the listener array for the specified -`event`. +Removes the specified `listener` from the listener array for the event named +`eventName`. ```js var callback = (stream) => { @@ -374,8 +376,8 @@ server.removeListener('connection', callback); `removeListener` will remove, at most, one instance of a listener from the listener array. If any single listener has been added multiple times to the -listener array for the specified `event`, then `removeListener` must be called -multiple times to remove each instance. +listener array for the specified `eventName`, then `removeListener` must be +called multiple times to remove each instance. Note that once an event has been emitted, all listeners attached to it at the time of emitting will be called in order. This implies that any `removeListener()` From 8c24bd25a6c6b4c92f8f7f6b4626de9b1c942516 Mon Sep 17 00:00:00 2001 From: firedfox Date: Thu, 3 Mar 2016 16:18:09 +0800 Subject: [PATCH 34/41] doc: fix order of end tags of list after heading Current html result of a list after heading is
    ...
. Correct it to
    ...
. PR-URL: https://github.com/nodejs/node/pull/5874 Fixes: https://github.com/nodejs/node/issues/5873 Reviewed-By: Roman Reiss --- tools/doc/html.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/doc/html.js b/tools/doc/html.js index 8de9f49987c000..327c9f080e2bfe 100644 --- a/tools/doc/html.js +++ b/tools/doc/html.js @@ -159,11 +159,11 @@ function parseLists(input) { } if (tok.type === 'list_end') { depth--; + output.push(tok); if (depth === 0) { state = null; output.push({ type:'html', text: '' }); } - output.push(tok); return; } if (tok.text) { From 96e163a79f15c47663a9505f25b3d9ca0b30f71c Mon Sep 17 00:00:00 2001 From: Gareth Ellis Date: Mon, 21 Mar 2016 09:46:42 +0000 Subject: [PATCH 35/41] buffer: changing let in for loops back to var Using let in for loops showed a regression in 4.4.0. @ofrobots suggested that we avoid using let in for loops until TurboFan becomes the default optimiser. The regression that was detected was when looking at how long it took to create a new buffer from an array of data. When using `for (let i=0; i Reviewed-By: Michael Dawson Reviewed-By: Jeremiah Senkpiel Reviewed-By: Trevor Norris Reviewed-By: Myles Borins Ref: http://github.com/nodejs/benchmarking/issues/38 --- lib/buffer.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index f8ab2b22282338..a24bdd0e006f9f 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -120,7 +120,7 @@ function fromString(string, encoding) { function fromArrayLike(obj) { const length = obj.length; const b = allocate(length); - for (let i = 0; i < length; i++) + for (var i = 0; i < length; i++) b[i] = obj[i] & 255; return b; } @@ -208,6 +208,7 @@ Buffer.isEncoding = function(encoding) { Buffer.concat = function(list, length) { + var i; if (!Array.isArray(list)) throw new TypeError('list argument must be an Array of Buffers.'); @@ -216,7 +217,7 @@ Buffer.concat = function(list, length) { if (length === undefined) { length = 0; - for (let i = 0; i < list.length; i++) + for (i = 0; i < list.length; i++) length += list[i].length; } else { length = length >>> 0; @@ -224,7 +225,7 @@ Buffer.concat = function(list, length) { var buffer = new Buffer(length); var pos = 0; - for (let i = 0; i < list.length; i++) { + for (i = 0; i < list.length; i++) { var buf = list[i]; buf.copy(buffer, pos); pos += buf.length; From 040263e0f3dcec93d3f90506c01c043c7e693443 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Fri, 18 Mar 2016 13:00:20 -0700 Subject: [PATCH 36/41] doc: grammar, clarity and links in timers doc Added appropriate in-document links. Clarified a bit of `setImmediate`, including a quick grammar fix (plural possessive apostrophe). PR-URL: https://github.com/nodejs/node/pull/5792 Reviewed-By: James M Snell Reviewed-By: Benjamin Gruenbaum --- doc/api/timers.markdown | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/doc/api/timers.markdown b/doc/api/timers.markdown index cf2f24ae938adb..7859e7fecd6273 100644 --- a/doc/api/timers.markdown +++ b/doc/api/timers.markdown @@ -7,19 +7,19 @@ this module in order to use them. ## clearImmediate(immediateObject) -Stops an immediate from triggering. +Stops an `immediateObject`, as created by [`setImmediate`][], from triggering. ## clearInterval(intervalObject) -Stops an interval from triggering. +Stops an `intervalObject`, as created by [`setInterval`][], from triggering. ## clearTimeout(timeoutObject) -Prevents a timeout from triggering. +Prevents a `timeoutObject`, as created by [`setTimeout`][], from triggering. ## ref() -If you had previously `unref()`d a timer you can call `ref()` to explicitly +If a timer was previously `unref()`d, then `ref()` can be called to explicitly request the timer hold the program open. If the timer is already `ref`d calling `ref` again will have no effect. @@ -27,21 +27,22 @@ Returns the timer. ## setImmediate(callback[, arg][, ...]) -To schedule the "immediate" execution of `callback` after I/O events -callbacks and before [`setTimeout`][] and [`setInterval`][]. Returns an -`immediateObject` for possible use with `clearImmediate()`. Optionally you -can also pass arguments to the callback. +To schedule the "immediate" execution of `callback` after I/O events' +callbacks and before timers set by [`setTimeout`][] and [`setInterval`][] are +triggered. Returns an `immediateObject` for possible use with +[`clearImmediate`][]. Additional optional arguments may be passed to the +callback. Callbacks for immediates are queued in the order in which they were created. -The entire callback queue is processed every event loop iteration. If you queue -an immediate from inside an executing callback, that immediate won't fire +The entire callback queue is processed every event loop iteration. If an +immediate is queued from inside an executing callback, that immediate won't fire until the next event loop iteration. ## setInterval(callback, delay[, arg][, ...]) To schedule the repeated execution of `callback` every `delay` milliseconds. -Returns a `intervalObject` for possible use with `clearInterval()`. Optionally -you can also pass arguments to the callback. +Returns a `intervalObject` for possible use with [`clearInterval`][]. Additional +optional arguments may be passed to the callback. To follow browser behavior, when using delays larger than 2147483647 milliseconds (approximately 25 days) or less than 1, Node.js will use 1 as the @@ -50,8 +51,8 @@ milliseconds (approximately 25 days) or less than 1, Node.js will use 1 as the ## setTimeout(callback, delay[, arg][, ...]) To schedule execution of a one-time `callback` after `delay` milliseconds. -Returns a `timeoutObject` for possible use with `clearTimeout()`. Optionally you -can also pass arguments to the callback. +Returns a `timeoutObject` for possible use with [`clearTimeout`][]. Additional +optional arguments may be passed to the callback. The callback will likely not be invoked in precisely `delay` milliseconds. Node.js makes no guarantees about the exact timing of when callbacks will fire, @@ -65,16 +66,20 @@ immediately, as if the `delay` was set to 1. ## unref() The opaque value returned by [`setTimeout`][] and [`setInterval`][] also has the -method `timer.unref()` which will allow you to create a timer that is active but +method `timer.unref()` which allows the creation of a timer that is active but if it is the only item left in the event loop, it won't keep the program running. If the timer is already `unref`d calling `unref` again will have no effect. -In the case of `setTimeout` when you `unref` you create a separate timer that -will wakeup the event loop, creating too many of these may adversely effect -event loop performance -- use wisely. +In the case of [`setTimeout`][], `unref` creates a separate timer that will +wakeup the event loop, creating too many of these may adversely effect event +loop performance -- use wisely. Returns the timer. +[`clearImmediate`]: timers.html#timers_clearimmediate_immediateobject +[`clearInterval`]: timers.html#timers_clearinterval_intervalobject +[`clearTimeout`]: timers.html#timers_cleartimeout_timeoutobject +[`setImmediate`]: timers.html#timers_setimmediate_callback_arg [`setInterval`]: timers.html#timers_setinterval_callback_delay_arg [`setTimeout`]: timers.html#timers_settimeout_callback_delay_arg From 55c3f804c4a077873a438846931fd0fcea0caba2 Mon Sep 17 00:00:00 2001 From: Forrest L Norvell Date: Tue, 29 Mar 2016 22:43:40 -0700 Subject: [PATCH 37/41] deps: upgrade npm in LTS to 2.15.1 PR-URL: https://github.com/npm/node/pull/5 Reviewed-By: Myles Borins --- deps/npm/.npmignore | 1 + deps/npm/.travis.yml | 2 +- deps/npm/AUTHORS | 8 + deps/npm/CHANGELOG.md | 166 +++ deps/npm/bin/npm | 7 + deps/npm/doc/cli/npm-adduser.md | 10 +- deps/npm/doc/cli/npm-bugs.md | 2 + deps/npm/doc/cli/npm-config.md | 2 + deps/npm/doc/cli/npm-dedupe.md | 2 + deps/npm/doc/cli/npm-dist-tag.md | 2 + deps/npm/doc/cli/npm-install.md | 9 +- deps/npm/doc/cli/npm-link.md | 11 +- deps/npm/doc/cli/npm-owner.md | 2 + deps/npm/doc/cli/npm-search.md | 15 +- deps/npm/doc/cli/npm-test.md | 3 +- deps/npm/doc/cli/npm-update.md | 17 +- deps/npm/doc/cli/npm.md | 8 +- deps/npm/doc/files/package.json.md | 23 +- deps/npm/doc/misc/npm-config.md | 8 + deps/npm/doc/misc/npm-scope.md | 3 +- deps/npm/html/doc/README.html | 2 +- deps/npm/html/doc/api/npm-bin.html | 2 +- deps/npm/html/doc/api/npm-bugs.html | 2 +- deps/npm/html/doc/api/npm-cache.html | 2 +- deps/npm/html/doc/api/npm-commands.html | 2 +- deps/npm/html/doc/api/npm-config.html | 2 +- deps/npm/html/doc/api/npm-deprecate.html | 2 +- deps/npm/html/doc/api/npm-docs.html | 2 +- deps/npm/html/doc/api/npm-edit.html | 2 +- deps/npm/html/doc/api/npm-explore.html | 2 +- deps/npm/html/doc/api/npm-help-search.html | 2 +- deps/npm/html/doc/api/npm-init.html | 2 +- deps/npm/html/doc/api/npm-install.html | 2 +- deps/npm/html/doc/api/npm-link.html | 2 +- deps/npm/html/doc/api/npm-load.html | 2 +- deps/npm/html/doc/api/npm-ls.html | 2 +- deps/npm/html/doc/api/npm-outdated.html | 2 +- deps/npm/html/doc/api/npm-owner.html | 2 +- deps/npm/html/doc/api/npm-pack.html | 2 +- deps/npm/html/doc/api/npm-ping.html | 2 +- deps/npm/html/doc/api/npm-prefix.html | 2 +- deps/npm/html/doc/api/npm-prune.html | 2 +- deps/npm/html/doc/api/npm-publish.html | 2 +- deps/npm/html/doc/api/npm-rebuild.html | 2 +- deps/npm/html/doc/api/npm-repo.html | 2 +- deps/npm/html/doc/api/npm-restart.html | 2 +- deps/npm/html/doc/api/npm-root.html | 2 +- deps/npm/html/doc/api/npm-run-script.html | 2 +- deps/npm/html/doc/api/npm-search.html | 2 +- deps/npm/html/doc/api/npm-shrinkwrap.html | 2 +- deps/npm/html/doc/api/npm-start.html | 2 +- deps/npm/html/doc/api/npm-stop.html | 2 +- deps/npm/html/doc/api/npm-tag.html | 2 +- deps/npm/html/doc/api/npm-test.html | 2 +- deps/npm/html/doc/api/npm-uninstall.html | 2 +- deps/npm/html/doc/api/npm-unpublish.html | 2 +- deps/npm/html/doc/api/npm-update.html | 2 +- deps/npm/html/doc/api/npm-version.html | 2 +- deps/npm/html/doc/api/npm-view.html | 2 +- deps/npm/html/doc/api/npm-whoami.html | 2 +- deps/npm/html/doc/api/npm.html | 4 +- deps/npm/html/doc/cli/npm-access.html | 2 +- deps/npm/html/doc/cli/npm-adduser.html | 12 +- deps/npm/html/doc/cli/npm-bin.html | 2 +- deps/npm/html/doc/cli/npm-bugs.html | 4 +- deps/npm/html/doc/cli/npm-build.html | 2 +- deps/npm/html/doc/cli/npm-bundle.html | 2 +- deps/npm/html/doc/cli/npm-cache.html | 2 +- deps/npm/html/doc/cli/npm-completion.html | 2 +- deps/npm/html/doc/cli/npm-config.html | 4 +- deps/npm/html/doc/cli/npm-dedupe.html | 4 +- deps/npm/html/doc/cli/npm-deprecate.html | 2 +- deps/npm/html/doc/cli/npm-dist-tag.html | 4 +- deps/npm/html/doc/cli/npm-docs.html | 2 +- deps/npm/html/doc/cli/npm-edit.html | 2 +- deps/npm/html/doc/cli/npm-explore.html | 2 +- deps/npm/html/doc/cli/npm-help-search.html | 2 +- deps/npm/html/doc/cli/npm-help.html | 2 +- deps/npm/html/doc/cli/npm-init.html | 2 +- deps/npm/html/doc/cli/npm-install-test.html | 45 - deps/npm/html/doc/cli/npm-install.html | 12 +- deps/npm/html/doc/cli/npm-link.html | 13 +- deps/npm/html/doc/cli/npm-logout.html | 2 +- deps/npm/html/doc/cli/npm-ls.html | 4 +- deps/npm/html/doc/cli/npm-outdated.html | 2 +- deps/npm/html/doc/cli/npm-owner.html | 4 +- deps/npm/html/doc/cli/npm-pack.html | 2 +- deps/npm/html/doc/cli/npm-ping.html | 2 +- deps/npm/html/doc/cli/npm-prefix.html | 2 +- deps/npm/html/doc/cli/npm-prune.html | 2 +- deps/npm/html/doc/cli/npm-publish.html | 2 +- deps/npm/html/doc/cli/npm-rebuild.html | 2 +- deps/npm/html/doc/cli/npm-repo.html | 2 +- deps/npm/html/doc/cli/npm-restart.html | 2 +- deps/npm/html/doc/cli/npm-rm.html | 2 +- deps/npm/html/doc/cli/npm-root.html | 2 +- deps/npm/html/doc/cli/npm-run-script.html | 2 +- deps/npm/html/doc/cli/npm-search.html | 16 +- deps/npm/html/doc/cli/npm-shrinkwrap.html | 2 +- deps/npm/html/doc/cli/npm-star.html | 2 +- deps/npm/html/doc/cli/npm-stars.html | 2 +- deps/npm/html/doc/cli/npm-start.html | 2 +- deps/npm/html/doc/cli/npm-stop.html | 2 +- deps/npm/html/doc/cli/npm-tag.html | 2 +- deps/npm/html/doc/cli/npm-team.html | 2 +- deps/npm/html/doc/cli/npm-test.html | 5 +- deps/npm/html/doc/cli/npm-uninstall.html | 2 +- deps/npm/html/doc/cli/npm-unpublish.html | 2 +- deps/npm/html/doc/cli/npm-update.html | 17 +- deps/npm/html/doc/cli/npm-version.html | 2 +- deps/npm/html/doc/cli/npm-view.html | 2 +- deps/npm/html/doc/cli/npm-whoami.html | 2 +- deps/npm/html/doc/cli/npm.html | 14 +- deps/npm/html/doc/files/npm-folders.html | 2 +- deps/npm/html/doc/files/npm-global.html | 2 +- deps/npm/html/doc/files/npm-json.html | 18 +- deps/npm/html/doc/files/npmrc.html | 2 +- deps/npm/html/doc/files/package.json.html | 18 +- deps/npm/html/doc/index.html | 2 +- deps/npm/html/doc/misc/npm-coding-style.html | 2 +- deps/npm/html/doc/misc/npm-config.html | 9 +- deps/npm/html/doc/misc/npm-developers.html | 2 +- deps/npm/html/doc/misc/npm-disputes.html | 8 +- deps/npm/html/doc/misc/npm-index.html | 2 +- deps/npm/html/doc/misc/npm-orgs.html | 2 +- deps/npm/html/doc/misc/npm-registry.html | 2 +- deps/npm/html/doc/misc/npm-scope.html | 5 +- deps/npm/html/doc/misc/npm-scripts.html | 2 +- deps/npm/html/doc/misc/removing-npm.html | 2 +- deps/npm/html/doc/misc/semver.html | 2 +- deps/npm/lib/cache.js | 2 +- deps/npm/lib/cache/caching-client.js | 3 +- deps/npm/lib/config/defaults.js | 2 + deps/npm/lib/config/get-credentials-by-uri.js | 19 +- deps/npm/lib/npm.js | 2 +- deps/npm/lib/utils/lifecycle.js | 3 + deps/npm/lib/utils/map-to-registry.js | 52 +- deps/npm/man/man1/npm-adduser.1 | 10 +- deps/npm/man/man1/npm-bugs.1 | 2 + deps/npm/man/man1/npm-config.1 | 2 + deps/npm/man/man1/npm-dedupe.1 | 2 + deps/npm/man/man1/npm-dist-tag.1 | 2 + deps/npm/man/man1/npm-install-test.1 | 32 - deps/npm/man/man1/npm-install.1 | 10 +- deps/npm/man/man1/npm-link.1 | 11 +- deps/npm/man/man1/npm-ls.1 | 2 +- deps/npm/man/man1/npm-owner.1 | 2 + deps/npm/man/man1/npm-search.1 | 18 +- deps/npm/man/man1/npm-test.1 | 3 +- deps/npm/man/man1/npm-update.1 | 19 +- deps/npm/man/man1/npm.1 | 13 +- deps/npm/man/man3/npm.3 | 2 +- deps/npm/man/man5/npm-json.5 | 25 +- deps/npm/man/man5/package.json.5 | 25 +- deps/npm/man/man7/npm-config.7 | 11 + deps/npm/man/man7/npm-scope.7 | 3 +- deps/npm/node_modules/glob/README.md | 82 +- deps/npm/node_modules/glob/changelog.md | 67 + deps/npm/node_modules/glob/common.js | 48 +- deps/npm/node_modules/glob/glob.js | 38 +- deps/npm/node_modules/glob/package.json | 29 +- deps/npm/node_modules/glob/sync.js | 9 +- .../gyp/pylib/gyp/generator/android.py | 4 +- .../node-gyp/node_modules/glob/package.json | 3 +- .../debug/node_modules/ms/package.json | 3 +- .../node_modules/array-index/package.json | 3 +- .../node_modules/path-array/package.json | 3 +- deps/npm/node_modules/node-gyp/package.json | 28 +- .../npm-registry-client/README.md | 6 +- .../node_modules/npm-registry-client/index.js | 1 + .../npm-registry-client/lib/initialize.js | 33 +- .../readable-stream/doc/stream.markdown | 1182 +++++++++-------- .../readable-stream/lib/_stream_readable.js | 6 +- .../readable-stream/lib/_stream_writable.js | 6 +- .../node_modules/core-util-is/package.json | 23 +- .../process-nextick-args/package.json | 2 +- .../node_modules/string_decoder/package.json | 26 +- .../node_modules/util-deprecate/package.json | 23 +- .../node_modules/readable-stream/package.json | 45 +- .../node_modules/typedarray/package.json | 21 +- .../node_modules/concat-stream/package.json | 23 +- .../npm-registry-client/package.json | 29 +- .../@npm/npm-registry-client/cache.json | 1 + .../test/fixtures/underscore/1.3.3/cache.json | 1 + .../fixtures/underscore/1.3.3/package.tgz | Bin 0 -> 58692 bytes .../test/fixtures/underscore/cache.json | 1 + .../npm-registry-client/test/initialize.js | 34 + deps/npm/node_modules/request/.eslintrc | 45 + deps/npm/node_modules/strip-ansi/package.json | 39 +- deps/npm/node_modules/strip-ansi/readme.md | 10 +- deps/npm/package.json | 12 +- .../test/fixtures/config/userconfig-with-gc | 2 +- .../npm-test-files/1.2.5/package.tgz | Bin 241 -> 0 bytes .../npm-test-files/1.2.5/package/package.json | 1 - .../test/packages/npm-test-array-bin/README | 1 - .../packages/npm-test-array-bin/bin/array-bin | 2 - .../packages/npm-test-array-bin/package.json | 4 - deps/npm/test/packages/npm-test-blerg/README | 1 - .../test/packages/npm-test-blerg/package.json | 5 - deps/npm/test/packages/npm-test-blerg3/README | 1 - .../packages/npm-test-blerg3/package.json | 5 - .../test/packages/npm-test-bundled-git/README | 1 - .../npm-test-bundled-git/package.json | 5 - .../npm/test/packages/npm-test-dir-bin/README | 1 - .../packages/npm-test-dir-bin/bin/dir-bin | 2 - .../packages/npm-test-dir-bin/package.json | 4 - .../test/packages/npm-test-env-reader/README | 1 - .../packages/npm-test-env-reader/package.json | 14 - .../test/packages/npm-test-env-reader/test.js | 9 - .../test/packages/npm-test-files/.npmignore | 7 - .../npm/test/packages/npm-test-files/include4 | 0 .../test/packages/npm-test-files/package.json | 10 - .../test/packages/npm-test-files/sub/include | 0 .../test/packages/npm-test-files/sub/include2 | 0 .../test/packages/npm-test-files/sub/include4 | 1 - deps/npm/test/packages/npm-test-files/test.sh | 27 - .../packages/npm-test-ignore-nested-nm/README | 1 - .../lib/node_modules/foo | 1 - .../npm-test-ignore-nested-nm/package.json | 3 - .../test/packages/npm-test-ignore/.npmignore | 7 - deps/npm/test/packages/npm-test-ignore/README | 1 - .../test/packages/npm-test-ignore/include4 | 0 .../packages/npm-test-ignore/package.json | 3 - .../test/packages/npm-test-ignore/sub/include | 0 .../packages/npm-test-ignore/sub/include2 | 0 .../packages/npm-test-ignore/sub/include4 | 1 - .../npm/test/packages/npm-test-ignore/test.sh | 29 - .../packages/npm-test-missing-bindir/README | 1 - .../npm-test-missing-bindir/package.json | 4 - .../packages/npm-test-optional-deps/README | 1 - .../npm-test-optional-deps/package.json | 11 - .../packages/npm-test-platform-all/README | 1 - .../npm-test-platform-all/package.json | 5 - .../test/packages/npm-test-platform/README | 1 - .../packages/npm-test-platform/package.json | 5 - .../npm/test/packages/npm-test-private/README | 1 - .../packages/npm-test-private/package.json | 4 - .../test/packages/npm-test-shrinkwrap/README | 1 - .../packages/npm-test-shrinkwrap/package.json | 13 - .../packages/npm-test-test-package/README | 1 - .../npm-test-test-package/package.json | 5 - .../npm/test/packages/npm-test-url-dep/README | 1 - .../packages/npm-test-url-dep/package.json | 7 - deps/npm/test/tap/bearer-token-check.js | 119 ++ deps/npm/test/tap/config-credentials.js | 14 +- deps/npm/test/tap/files-and-ignores.js | 558 ++++++++ deps/npm/test/tap/legacy-array-bin.js | 80 ++ deps/npm/test/tap/legacy-bundled-git.js | 103 ++ deps/npm/test/tap/legacy-dir-bin.js | 79 ++ deps/npm/test/tap/legacy-ignore-nested-nm.js | 64 + deps/npm/test/tap/legacy-missing-bindir.js | 82 ++ deps/npm/test/tap/legacy-no-auth-leak.js | 75 ++ deps/npm/test/tap/legacy-npm-self-install.js | 107 ++ deps/npm/test/tap/legacy-optional-deps.js | 80 ++ deps/npm/test/tap/legacy-platform-all.js | 73 + deps/npm/test/tap/legacy-platform.js | 64 + deps/npm/test/tap/legacy-private.js | 58 + deps/npm/test/tap/legacy-shrinkwrap.js | 132 ++ deps/npm/test/tap/legacy-test-package.js | 76 ++ deps/npm/test/tap/legacy-url-dep.js | 61 + deps/npm/test/tap/lifecycle-path.js | 3 +- deps/npm/test/tap/map-to-registry.js | 81 +- deps/npm/test/tap/peer-deps-invalid.js | 106 +- deps/npm/test/tap/run-script.js | 67 +- 264 files changed, 3778 insertions(+), 1380 deletions(-) delete mode 100644 deps/npm/html/doc/cli/npm-install-test.html delete mode 100644 deps/npm/man/man1/npm-install-test.1 create mode 100644 deps/npm/node_modules/glob/changelog.md create mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json create mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json create mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz create mode 100644 deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json create mode 100644 deps/npm/node_modules/request/.eslintrc delete mode 100644 deps/npm/test/npm_cache/npm-test-files/1.2.5/package.tgz delete mode 100644 deps/npm/test/npm_cache/npm-test-files/1.2.5/package/package.json delete mode 100644 deps/npm/test/packages/npm-test-array-bin/README delete mode 100644 deps/npm/test/packages/npm-test-array-bin/bin/array-bin delete mode 100644 deps/npm/test/packages/npm-test-array-bin/package.json delete mode 100644 deps/npm/test/packages/npm-test-blerg/README delete mode 100644 deps/npm/test/packages/npm-test-blerg/package.json delete mode 100644 deps/npm/test/packages/npm-test-blerg3/README delete mode 100644 deps/npm/test/packages/npm-test-blerg3/package.json delete mode 100644 deps/npm/test/packages/npm-test-bundled-git/README delete mode 100644 deps/npm/test/packages/npm-test-bundled-git/package.json delete mode 100644 deps/npm/test/packages/npm-test-dir-bin/README delete mode 100644 deps/npm/test/packages/npm-test-dir-bin/bin/dir-bin delete mode 100644 deps/npm/test/packages/npm-test-dir-bin/package.json delete mode 100644 deps/npm/test/packages/npm-test-env-reader/README delete mode 100644 deps/npm/test/packages/npm-test-env-reader/package.json delete mode 100755 deps/npm/test/packages/npm-test-env-reader/test.js delete mode 100644 deps/npm/test/packages/npm-test-files/.npmignore delete mode 100644 deps/npm/test/packages/npm-test-files/include4 delete mode 100644 deps/npm/test/packages/npm-test-files/package.json delete mode 100644 deps/npm/test/packages/npm-test-files/sub/include delete mode 100644 deps/npm/test/packages/npm-test-files/sub/include2 delete mode 100644 deps/npm/test/packages/npm-test-files/sub/include4 delete mode 100644 deps/npm/test/packages/npm-test-files/test.sh delete mode 100644 deps/npm/test/packages/npm-test-ignore-nested-nm/README delete mode 100644 deps/npm/test/packages/npm-test-ignore-nested-nm/lib/node_modules/foo delete mode 100644 deps/npm/test/packages/npm-test-ignore-nested-nm/package.json delete mode 100644 deps/npm/test/packages/npm-test-ignore/.npmignore delete mode 100644 deps/npm/test/packages/npm-test-ignore/README delete mode 100644 deps/npm/test/packages/npm-test-ignore/include4 delete mode 100644 deps/npm/test/packages/npm-test-ignore/package.json delete mode 100644 deps/npm/test/packages/npm-test-ignore/sub/include delete mode 100644 deps/npm/test/packages/npm-test-ignore/sub/include2 delete mode 100644 deps/npm/test/packages/npm-test-ignore/sub/include4 delete mode 100644 deps/npm/test/packages/npm-test-ignore/test.sh delete mode 100644 deps/npm/test/packages/npm-test-missing-bindir/README delete mode 100644 deps/npm/test/packages/npm-test-missing-bindir/package.json delete mode 100644 deps/npm/test/packages/npm-test-optional-deps/README delete mode 100644 deps/npm/test/packages/npm-test-optional-deps/package.json delete mode 100644 deps/npm/test/packages/npm-test-platform-all/README delete mode 100644 deps/npm/test/packages/npm-test-platform-all/package.json delete mode 100644 deps/npm/test/packages/npm-test-platform/README delete mode 100644 deps/npm/test/packages/npm-test-platform/package.json delete mode 100644 deps/npm/test/packages/npm-test-private/README delete mode 100644 deps/npm/test/packages/npm-test-private/package.json delete mode 100644 deps/npm/test/packages/npm-test-shrinkwrap/README delete mode 100644 deps/npm/test/packages/npm-test-shrinkwrap/package.json delete mode 100644 deps/npm/test/packages/npm-test-test-package/README delete mode 100644 deps/npm/test/packages/npm-test-test-package/package.json delete mode 100644 deps/npm/test/packages/npm-test-url-dep/README delete mode 100644 deps/npm/test/packages/npm-test-url-dep/package.json create mode 100644 deps/npm/test/tap/bearer-token-check.js create mode 100644 deps/npm/test/tap/files-and-ignores.js create mode 100644 deps/npm/test/tap/legacy-array-bin.js create mode 100644 deps/npm/test/tap/legacy-bundled-git.js create mode 100644 deps/npm/test/tap/legacy-dir-bin.js create mode 100644 deps/npm/test/tap/legacy-ignore-nested-nm.js create mode 100644 deps/npm/test/tap/legacy-missing-bindir.js create mode 100644 deps/npm/test/tap/legacy-no-auth-leak.js create mode 100644 deps/npm/test/tap/legacy-npm-self-install.js create mode 100644 deps/npm/test/tap/legacy-optional-deps.js create mode 100644 deps/npm/test/tap/legacy-platform-all.js create mode 100644 deps/npm/test/tap/legacy-platform.js create mode 100644 deps/npm/test/tap/legacy-private.js create mode 100644 deps/npm/test/tap/legacy-shrinkwrap.js create mode 100644 deps/npm/test/tap/legacy-test-package.js create mode 100644 deps/npm/test/tap/legacy-url-dep.js diff --git a/deps/npm/.npmignore b/deps/npm/.npmignore index a128c9b604b34d..6f97b5dc0dcb48 100644 --- a/deps/npm/.npmignore +++ b/deps/npm/.npmignore @@ -7,6 +7,7 @@ npm-debug.log /test/packages/npm-test-depends-on-spark/which-spark.log /test/packages/test-package/random-data.txt /test/root +/test/npm_cache node_modules/marked node_modules/ronn node_modules/tap diff --git a/deps/npm/.travis.yml b/deps/npm/.travis.yml index eff4750f3efb95..bea2fec243ef18 100644 --- a/deps/npm/.travis.yml +++ b/deps/npm/.travis.yml @@ -13,6 +13,6 @@ before_install: - "npm config set spin false" - "npm install -g npm/npm#2.x" - "mkdir -p /var/run/couchdb" -script: "npm run-script test-all" +script: "npm test" notifications: slack: npm-inc:kRqQjto7YbINqHPb1X6nS3g8 diff --git a/deps/npm/AUTHORS b/deps/npm/AUTHORS index fcfe1b696a4420..e4fd0f37c9db50 100644 --- a/deps/npm/AUTHORS +++ b/deps/npm/AUTHORS @@ -344,3 +344,11 @@ Vedat Mahir YILMAZ Jan Schär Xcat Liu Neil Kistner +Hutson Betts +Sergey Simonchik +Lewis Cowper +Arturo Coronel +Scott Plumlee +gnerkus +Robert Ludwig +Adam Byrne diff --git a/deps/npm/CHANGELOG.md b/deps/npm/CHANGELOG.md index f09094b85584d1..ac02e7436923a3 100644 --- a/deps/npm/CHANGELOG.md +++ b/deps/npm/CHANGELOG.md @@ -1,3 +1,169 @@ +### v2.15.1 (2016-03-17): + +It's another one of those releases again! Docs and tests, it turns out, have a +pretty easy time getting into LTS releases, and boring is exactly how LTS should +be. 💁 + +#### DOCS + +* [`981c89c`](https://github.com/npm/npm/commit/981c89c8e398ca22ab6bf466123b25728ef6f543) + [#11820](https://github.com/npm/npm/pull/11820) + The basic explanation for how `npm link` works was a bit confusing, and + somewhat incorrect. It should be clearer now. + ([@rhgb](https://github.com/rhgb)) +* [`35b2b45`](https://github.com/npm/npm/commit/35b2b45f181dcbfb297f53b577dc1f26efcf3aba) + [#11787](https://github.com/npm/npm/pull/11787) + The `verison` alias for `npm version` no longer shows up in the command list + when you do `npm -h`. + ([@doug-wade](https://github.com/doug-wade)) +* [`1c9d00f`](https://github.com/npm/npm/commit/1c9d00f788298a81a8a7293d7dcf430f01bdd7fd) + [#11786](https://github.com/npm/npm/pull/11786) + Add a comment to the `npm-scope.md` docs about `npm@>=2` being required in + order to use scoped packaged. + ([@doug-wade](https://github.com/doug-wade)) +* [`7d64fb1`](https://github.com/npm/npm/commit/7d64fb1452d360aa736f31c85d6776ce570b2365) + [#11762](https://github.com/npm/npm/pull/11762) + Roll back patch that previously advised people to use `--depth Infinity` + instead of `--depth 9999`. Just keep using `--depth 9999`. + ([@GriffinSchneider](https://github.com/GriffinSchneider)) + +#### TESTS + +* [`98a9ee4`](https://github.com/npm/npm/commit/98a9ee4773f83994b8eb63c0ff75a9283408ba1a) + [#11912](https://github.com/npm/npm/pull/11912) + Did you know npm can install itself? `npm install -g npm` is the way to + upgrade! Turns out that one of the tests that verified this functionality got + rewritten as part of our recent push for better tests, and in the process + omitted a detail about *how* the test ran. We're testing that corner case + again, now, by moving the install folder to `/tmp`, where the original legacy + test ran. + ([@iarna](https://github.com/iarna)) + +### v2.15.0 (2016-03-10): + +#### WHY IS THIS SEMVER-MINOR I THOUGHT THIS WAS LTS + +A brief note about LTS this week! + +npm, as you may know if you're using this `2.x` branch, has an LTS process for +releases. We also try and play nice with [Node.js' own LTS release +process](https://github.com/nodejs/LTS#lts-plan). That means we generally try to +avoid things like minor version bumps on our `2.x` branch (which is also tagged +`lts` in the `dist-tag`s). + +That said, we had a minor-bump update recently for `npm@3.8.0` which added a +`maxsockets` option to allow users to configure the number of concurrent sockets +that npm would keep open at a time -- a setting that has the potential to help a +bunch for people with fussy routers or internet connections that aren't very +happy with Node.js applications' usual concurrency storm. This change was done +to `npm-registry-client`, which we don't have a parallel LTS-tracking branch +for. + +After talking it over, we ended up deciding that this was a reasonable enough +addition to LTS, even though it's *technically* a `semver-minor` bump, taking +into account both its potential for bugfixing (specially on `2.x`!) and the +general hassle it would be to maintain another branch for `npm-registry-client`. + + +* [`6dd61e7`](https://github.com/npm/npm/commit/6dd61e781c145480dc255a3e6a748729868443fd) + Expose `maxsockets` config setting from new `npm-registry-client`. + ([@misterbyrne](https://github.com/misterbyrne)) +* [`8a021c3`](https://github.com/npm/npm/commit/8a021c35184e665bd1f3f70ae2f478af812ab614) + `npm-registry-client@7.1.0`: + Adds support for configuring the max number of concurrent sockets, defaulting + to `50`. + ([@iarna](https://github.com/iarna)) + +#### DOC PATCH IS HERE TOO + +* [`0ae9f74`](https://github.com/npm/npm/commit/0ae9f740001a1bdf5920bc464cf9e284d5d139f0) + [#11748](https://github.com/npm/npm/pull/11748) + Add command aliases as a separate section in documentation for npm + subcommands. + ([@watilde](https://github.com/watilde)) + +#### DEP UPDATES + +* [`bfc3888`](https://github.com/npm/npm/commit/bfc38887f832f701c16b7ee410c4e0220a90399f) + `strip-ansi@3.0.1` + ([@jbnicolai](https://github.com/jbnicolai)) +* [`d5f4d51`](https://github.com/npm/npm/commit/d5f4d51a1b7ea78d7431c7ed4fed30200b2622f8) + `node-gyp@3.3.1`: Fixes Android generator + ([@bnoordhuis](https://github.com/bnoordhuis)) +* [`4119df8`](https://github.com/npm/npm/commit/4119df8aecd2ae57b0492ad8c9a480d900833008) + `glob@7.0.3`: Some path-related fixes for Windows. + ([@isaacs](https://github.com/isaacs)) + +### v2.14.22 (2016-03-03): + +This week is all documentation improvements. In case you hadn't noticed, we +*love* doc patches. We love them so much, we give socks away if you submit +documentation PRs! + +These folks are all getting socks if they ask for them. The socks are +super-sweet. Do you have yours yet? 👣 + +* [`3f3c7d0`](https://github.com/npm/npm/commit/3f3c7d080f052a5db91ff6091f8b1b13f26b53d6) + [#11441](https://github.com/npm/npm/pull/11441) + Add a link to the [Contribution + Guidelines](https://github.com/npm/npm/wiki/Contributing-Guidelines) to the + main npm docs. + ([@watilde](https://github.com/watilde)) +* [`9f87bb1`](https://github.com/npm/npm/commit/9f87bb1934acb33b678c17b7827165b17c071a82) + [#11441](https://github.com/npm/npm/pull/11441) + Remove Google Group email from npm docs about contributing. + ([@watilde](https://github.com/watilde)) +* [`93eaab3`](https://github.com/npm/npm/commit/93eaab3ee5ad16c7d90d1a4b38a95403fcf3f0f6) + [#11474](https://github.com/npm/npm/pull/11474) + Fix an invalid JSON error overlooked in + [#11196](https://github.com/npm/npm/pull/11196). + ([@robludwig](https://github.com/robludwig)) +* [`a407ca2`](https://github.com/npm/npm/commit/a407ca2bcf6a05117e55cf2ab69376e09094995e) + [#11483](https://github.com/npm/npm/pull/11483) + Add more details and an example to the documentation for bundledDependencies. + ([@gnerkus](https://github.com/gnerkus)) +* [`2c851a2`](https://github.com/npm/npm/commit/2c851a231afd874baa77c42ea5ba539c454ac79c) + [#11490](https://github.com/npm/npm/pull/11490) + Document the `--registry` flag for `npm search`. + ([@plumlee](https://github.com/plumlee)) + +### v2.14.21 (2016-02-25): + +Good news, everyone! There's a new LTS release with a few shinies here and there! + +#### USE THIS ONE INSTEAD + +We had some cases where the versions of npm and node used in some scripting situations were different than the ideal, or what folks actually expected. These should be particularly helpful to our Windows friends! <3 + +* [`02813c5`](https://github.com/npm/npm/commit/02813c55782a9def23f7f1e614edc38c6c88aed3) [#9253](https://github.com/npm/npm/issues/9253) Fix a bug where, when running lifecycle scripts, if the Node.js binary you ran `npm` with wasn't in your `PATH`, `npm` wouldn't use it to run your scripts. ([@segrey](https://github.com/segrey) and [@narqo](https://github.com/narqo)) +* [`a985dd5`](https://github.com/npm/npm/commit/a985dd50e06ee51ba5544577f977c7440c227ba2) [#11526](https://github.com/npm/npm/pull/11526) Prefer locally installed npm in Git Bash -- previous behavior was to use the global one. This was done previously for other shells, but not for Git Bash. ([@destroyerofbuilds](https://github.com/destroyerofbuilds)) + +#### SOCKS FOR THE SOCK GOD + +* [`f961092`](https://github.com/npm/npm/commit/f9610920079d8b88ae464b30007a92c594bd85a8) + [#11636.](https://github.com/npm/npm/issues/11636.) + Document the `--save-bundle` option for `npm install`. + ([@datyayu](https://github.com/datyayu)) +* [`7c908b6`](https://github.com/npm/npm/commit/7c908b618f7123f0a3b860c71eb779e33df35964) + [#11644](https://github.com/npm/npm/pull/11644) + Add documentation for the `test` directory for packages. + ([@lewiscowper](https://github.com/lewiscowper)) + +#### INTERNAL TEST IMPROVEMENTS + +The npm CLI team's time recently has been sunk into npm's many years of tech debt. Specifically, we've been working on improving the test suite. This isn't user visible, but in future should mean a more stable, easier to contribute to npm. Ordinarily we don't report these kinds of changes in the change log, but I thought I might share this week as this chunk is bigger than usual. + +These patches were previously released for `npm@3`, and then ported back to `npm@2` LTS. + +* [`437c537`](https://github.com/npm/npm/commit/437c537e2be5923c6d2c2753154564ba13db8fd9) [#11613](https://github.com/npm/npm/pull/11613) Fix up one of the tests after rebasing the legacy test rewrite to `npm@2`. ([@zkat](https://github.com/zkat)) +* [`55abd0c`](https://github.com/npm/npm/commit/55abd0cc20e87a144d33ce2d459f65e7506da576) [#11613](https://github.com/npm/npm/pull/11613) Test that the `package.json` `files` section and `.npmignore` do what they're supposed to. ([@zkat](https://github.com/zkat)) +* [`a2b99b6`](https://github.com/npm/npm/commit/a2b99b6273ada14b2121ebc0acb7933e630edd9d) [#11613](https://github.com/npm/npm/pull/11613) Test that npm's distribution binary is complete and can be installed and used. ([@iarna](https://github.com/iarna)) +* [`8a8c36c`](https://github.com/npm/npm/commit/8a8c36ce51166006022e5c5d4f8655bbc458d651) [#11613](https://github.com/npm/npm/pull/11613) Test that environment variables are properly passed into scripts. + ([@iarna](https://github.com/zkat)) +* [`a95b550`](https://github.com/npm/npm/commit/a95b5507616bd51e83d7eab5f2337b1aff6480b1) [#11613](https://github.com/npm/npm/pull/11613) Test that we don't leak auth info into the environment. ([@iarna](https://github.com/iarna)) +* [`a1c1c52`](https://github.com/npm/npm/commit/a1c1c52efeab24f6dba154d054f85d9efc833486) [#11613](https://github.com/npm/npm/pull/11613) Remove all the relatively cryptic legacy tests and creates new tap tests that check the same functionality. The *legacy* tests were tests that were originally a shell script that was ported to javascript early in `npm`'s history. ([@iarna](https:\\github.com/iarna) and [@zkat](https://github.com/zkat)) +* [`9d89581`](https://github.com/npm/npm/commit/9d895811d3ee70c2e672f3d8fa06574495b5b488) [#11613](https://github.com/npm/npm/pull/11613) `tacks@1.0.9`: Add a package that provides a tool to generate fixtures from folders and, relatedly, a module that an create and tear down filesystem fixtures easily. ([@iarna](https://github.com/iarna)) + ### v2.14.20 (2016-02-18): Hope y'all are having a nice week! As usual, it's a fairly limited release. The diff --git a/deps/npm/bin/npm b/deps/npm/bin/npm index 45e8e41031cd27..5acd6fb61a7985 100755 --- a/deps/npm/bin/npm +++ b/deps/npm/bin/npm @@ -15,6 +15,13 @@ fi NPM_CLI_JS="$basedir/node_modules/npm/bin/npm-cli.js" case `uname` in + *MINGW*) + NPM_PREFIX=`"$NODE_EXE" "$NPM_CLI_JS" prefix -g` + NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js" + if [ -f "$NPM_PREFIX_NPM_CLI_JS" ]; then + NPM_CLI_JS="$NPM_PREFIX_NPM_CLI_JS" + fi + ;; *CYGWIN*) NPM_PREFIX=`"$NODE_EXE" "$NPM_CLI_JS" prefix -g` NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js" diff --git a/deps/npm/doc/cli/npm-adduser.md b/deps/npm/doc/cli/npm-adduser.md index 24d3611e61c604..9afece598faf95 100644 --- a/deps/npm/doc/cli/npm-adduser.md +++ b/deps/npm/doc/cli/npm-adduser.md @@ -5,6 +5,8 @@ npm-adduser(1) -- Add a registry user account npm adduser [--registry=url] [--scope=@orgname] [--always-auth] + aliases: login, add-user + ## DESCRIPTION Create or verify a user named `` in the specified registry, and @@ -57,9 +59,11 @@ registries. Can be used with `--registry` and / or `--scope`, e.g. npm adduser --registry=http://private-registry.example.com --always-auth This will ensure that all requests to that registry (including for tarballs) -include an authorization header. See `always-auth` in `npm-config(7)` for more -details on always-auth. Registry-specific configuration of `always-auth` takes -precedence over any global configuration. +include an authorization header. This setting may be necessary for use with +private registries where metadata and package tarballs are stored on hosts with +different hostnames. See `always-auth` in `npm-config(7)` for more details on +always-auth. Registry-specific configuration of `always-auth` takes precedence +over any global configuration. ## SEE ALSO diff --git a/deps/npm/doc/cli/npm-bugs.md b/deps/npm/doc/cli/npm-bugs.md index 002d9f7556f31a..0278e2975a980d 100644 --- a/deps/npm/doc/cli/npm-bugs.md +++ b/deps/npm/doc/cli/npm-bugs.md @@ -6,6 +6,8 @@ npm-bugs(1) -- Bugs for a package in a web browser maybe npm bugs npm bugs (with no args in a package dir) + aliases: issues + ## DESCRIPTION This command tries to guess at the likely location of a package's diff --git a/deps/npm/doc/cli/npm-config.md b/deps/npm/doc/cli/npm-config.md index 1d978c9dea0b45..cd6e5949b5c056 100644 --- a/deps/npm/doc/cli/npm-config.md +++ b/deps/npm/doc/cli/npm-config.md @@ -12,6 +12,8 @@ npm-config(1) -- Manage the npm configuration files npm get npm set [--global] + aliases: c + ## DESCRIPTION npm gets its config settings from the command line, environment diff --git a/deps/npm/doc/cli/npm-dedupe.md b/deps/npm/doc/cli/npm-dedupe.md index d3be01050c7f5b..610ea6b38a853f 100644 --- a/deps/npm/doc/cli/npm-dedupe.md +++ b/deps/npm/doc/cli/npm-dedupe.md @@ -6,6 +6,8 @@ npm-dedupe(1) -- Reduce duplication npm dedupe [package names...] npm ddp [package names...] + aliases: find-dupes, ddp + ## DESCRIPTION Searches the local package tree and attempts to simplify the overall diff --git a/deps/npm/doc/cli/npm-dist-tag.md b/deps/npm/doc/cli/npm-dist-tag.md index 06721bbae6ab3b..a88fc35a5e8e7a 100644 --- a/deps/npm/doc/cli/npm-dist-tag.md +++ b/deps/npm/doc/cli/npm-dist-tag.md @@ -7,6 +7,8 @@ npm-dist-tag(1) -- Modify package distribution tags npm dist-tag rm npm dist-tag ls [] + aliases: dist-tags + ## DESCRIPTION Add, remove, and enumerate distribution tags on a package: diff --git a/deps/npm/doc/cli/npm-install.md b/deps/npm/doc/cli/npm-install.md index 3ae1f0aae381ed..f0cca201e44f64 100644 --- a/deps/npm/doc/cli/npm-install.md +++ b/deps/npm/doc/cli/npm-install.md @@ -7,7 +7,7 @@ npm-install(1) -- Install a package npm install npm install npm install - npm install [@/] [--save|--save-dev|--save-optional] [--save-exact] + npm install [@/] [--save|--save-dev|--save-optional] [--save-exact] [--save-bundle] npm install [@/]@ npm install [@/]@ npm install [@/]@ @@ -95,15 +95,13 @@ after packing it up into a tarball (b). * `--save-optional`: Package will appear in your `optionalDependencies`. When using any of the above options to save dependencies to your - package.json, there is an additional, optional flag: + package.json, there are two additional, optional flags: * `--save-exact`: Saved dependencies will be configured with an exact version rather than using npm's default semver range operator. - `` is optional. The package will be downloaded from the registry - associated with the specified scope. If no registry is associated with - the given scope the default registry is assumed. See `npm-scope(7)`. + * `-B, --save-bundle`: Saved dependencies will also be added to your `bundleDependencies` list. Note: if you do not include the @-symbol on your scope name, npm will interpret this as a GitHub repository instead, see below. Scopes names @@ -117,6 +115,7 @@ after packing it up into a tarball (b). npm install node-tap --save-dev npm install dtrace-provider --save-optional npm install readable-stream --save --save-exact + npm install ansi-regex --save --save-bundle **Note**: If there is a file or folder named `` in the current diff --git a/deps/npm/doc/cli/npm-link.md b/deps/npm/doc/cli/npm-link.md index b6d0c143ad4c15..1f3d63a0d924af 100644 --- a/deps/npm/doc/cli/npm-link.md +++ b/deps/npm/doc/cli/npm-link.md @@ -11,12 +11,13 @@ npm-link(1) -- Symlink a package folder Package linking is a two-step process. -First, `npm link` in a package folder will create a globally-installed -symbolic link from `prefix/package-name` to the current folder (see -`npm-config(7)` for the value of `prefix`). +First, `npm link` in a package folder will create a symlink in the global folder +`{prefix}/lib/node_modules/` that links to the package where the `npm +link` command was executed. (see `npm-config(7)` for the value of `prefix`). Next, in some other location, `npm link package-name` will create a -symlink from the local `node_modules` folder to the global symlink. +symbolic link from globally-installed `package-name` to `node_modules/` +of the current folder. Note that `package-name` is taken from `package.json`, not from directory name. @@ -39,7 +40,7 @@ For example: Now, any changes to ~/projects/node-redis will be reflected in ~/projects/node-bloggy/node_modules/node-redis/. Note that the link should -be to the package name, not the directory name for that package. +be to the package name, not the directory name for that package. You may also shortcut the two steps in one. For example, to do the above use-case in a shorter way: diff --git a/deps/npm/doc/cli/npm-owner.md b/deps/npm/doc/cli/npm-owner.md index b400f76378f531..0741d83a400654 100644 --- a/deps/npm/doc/cli/npm-owner.md +++ b/deps/npm/doc/cli/npm-owner.md @@ -7,6 +7,8 @@ npm-owner(1) -- Manage package owners npm owner add npm owner rm + aliases: author + ## DESCRIPTION Manage ownership of published packages. diff --git a/deps/npm/doc/cli/npm-search.md b/deps/npm/doc/cli/npm-search.md index 4757ad3202941e..78967f14eb019f 100644 --- a/deps/npm/doc/cli/npm-search.md +++ b/deps/npm/doc/cli/npm-search.md @@ -3,9 +3,9 @@ npm-search(1) -- Search for packages ## SYNOPSIS - npm search [--long] [search terms ...] - npm s [search terms ...] - npm se [search terms ...] + npm search [-l|--long] [search terms ...] + + aliases: s, se, find ## DESCRIPTION @@ -27,6 +27,15 @@ lines. When disabled (default) search results are truncated to fit neatly on a single line. Modules with extremely long names will fall on multiple lines. +### registry + + * Default: https://registry.npmjs.org/ + * Type : url + +Search the specified registry for modules. If you have configured npm to point to a different default registry, +such as your internal private module repository, `npm search` will default to that registry when searching. +Pass a different registry url such as the default above in order to override this setting. + ## SEE ALSO * npm-registry(7) diff --git a/deps/npm/doc/cli/npm-test.md b/deps/npm/doc/cli/npm-test.md index c2267082dfbe98..fe746cc73f17ff 100644 --- a/deps/npm/doc/cli/npm-test.md +++ b/deps/npm/doc/cli/npm-test.md @@ -4,7 +4,8 @@ npm-test(1) -- Test a package ## SYNOPSIS npm test [-- ] - npm tst [-- ] + + aliases: t, tst ## DESCRIPTION diff --git a/deps/npm/doc/cli/npm-update.md b/deps/npm/doc/cli/npm-update.md index 035cbff2939d05..775342f31c1b64 100644 --- a/deps/npm/doc/cli/npm-update.md +++ b/deps/npm/doc/cli/npm-update.md @@ -5,6 +5,8 @@ npm-update(1) -- Update a package npm update [-g] [ [ ...]] + aliases: up, upgrade + ## DESCRIPTION This command will update all the packages listed to the latest version @@ -22,16 +24,7 @@ or local) will be updated. As of `npm@2.6.1`, the `npm update` will only inspect top-level packages. Prior versions of `npm` would also recursively inspect all dependencies. -To get the old behavior, use `npm --depth Infinity update`, but be warned that -simultaneous asynchronous update of all packages, including `npm` itself -and packages that `npm` depends on, often causes problems up to and including -the uninstallation of `npm` itself. - -To restore a missing `npm`, use the command: - -``` -curl -L https://npmjs.com/install.sh | sh -``` +To get the old behavior, use `npm --depth 9999 update`. ## EXAMPLES @@ -45,7 +38,7 @@ on dependencies, `dep1` (`dep2`, .. etc.). The published versions of `dep1` are ``` { "dist-tags": { "latest": "1.2.2" }, - "versions": { + "versions": [ "1.2.2", "1.2.1", "1.2.0", @@ -55,7 +48,7 @@ on dependencies, `dep1` (`dep2`, .. etc.). The published versions of `dep1` are "0.4.1", "0.4.0", "0.2.0" - } + ] } ``` diff --git a/deps/npm/doc/cli/npm.md b/deps/npm/doc/cli/npm.md index ae3a41d84bb3de..e23354ac86f147 100644 --- a/deps/npm/doc/cli/npm.md +++ b/deps/npm/doc/cli/npm.md @@ -127,11 +127,11 @@ Patches welcome! Contributors are listed in npm's `package.json` file. You can view them easily by doing `npm view npm contributors`. -If you would like to contribute, but don't know what to work on, check -the issues list or ask on the mailing list. +If you would like to contribute, but don't know what to work on, read +the contributing guidelines and check the issues list. +* https://github.com/npm/npm/wiki/Contributing-Guidelines * -* ## BUGS @@ -139,8 +139,6 @@ When you find issues, please report them: * web: -* email: - Be sure to include *all* of the output from the npm command that didn't work as expected. The `npm-debug.log` file is also helpful to provide. diff --git a/deps/npm/doc/files/package.json.md b/deps/npm/doc/files/package.json.md index ccbc6715acb7ed..f8c30068592a63 100644 --- a/deps/npm/doc/files/package.json.md +++ b/deps/npm/doc/files/package.json.md @@ -327,6 +327,11 @@ maybe, someday. Put example scripts in here. Someday, it might be exposed in some clever way. +### directories.test + +Put your tests in here. It is currently not exposed, but it might be in the +future. + ## repository Specify the place where your code lives. This is helpful for people who @@ -571,7 +576,23 @@ this. If you depend on features introduced in 1.5.2, use `">= 1.5.2 < 2"`. ## bundledDependencies -Array of package names that will be bundled when publishing the package. +This defines an array of package names that will be bundled when publishing the package. + +In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the `bundledDependencies` array and executing `npm pack`. + +For example: +If we define a package.json like this: + +``` +{ + "name": "awesome-web-framework", + "version": "1.0.0", + "bundledDependencies": [ + 'renderized', 'super-streams' + ] +} +``` +we can obtain `awesome-web-framework-1.0.0.tgz` file by running `npm pack`. This file contains the dependencies `renderized` and `super-streams` which can be installed in a new project by executing `npm install awesome-web-framework-1.0.0.tgz`. If this is spelled `"bundleDependencies"`, then that is also honored. diff --git a/deps/npm/doc/misc/npm-config.md b/deps/npm/doc/misc/npm-config.md index 76471601c162d9..a59767791d427c 100644 --- a/deps/npm/doc/misc/npm-config.md +++ b/deps/npm/doc/misc/npm-config.md @@ -530,6 +530,14 @@ colored output if it is a TTY. Show extended information in `npm ls` and `npm search`. +### maxsockets + +* Default: 50 +* Type: Number + +The maximum number of connections to use per origin (protocol/host/port +combination). Passed to the `http` `Agent` used to make the request. + ### message * Default: "%s" diff --git a/deps/npm/doc/misc/npm-scope.md b/deps/npm/doc/misc/npm-scope.md index f1e4da1f1fab0a..aae27cabbd67ed 100644 --- a/deps/npm/doc/misc/npm-scope.md +++ b/deps/npm/doc/misc/npm-scope.md @@ -54,7 +54,8 @@ just specifying to require the module `mypackage` in the folder called `@myorg`. Scoped packages can be published to any registry that supports them, including the public npm registry. -(As of 2015-04-19, the public npm registry **does** support scoped packages) +(As of 2015-04-19, and with npm 2.0 or newer, the public npm registry **does** +support scoped packages) If you wish, you may associate a scope with a registry; see below. diff --git a/deps/npm/html/doc/README.html b/deps/npm/html/doc/README.html index 288ea802b45263..692b8a5261400b 100644 --- a/deps/npm/html/doc/README.html +++ b/deps/npm/html/doc/README.html @@ -127,5 +127,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html index 94b82c9188a680..c79fe10422d594 100644 --- a/deps/npm/html/doc/api/npm-bin.html +++ b/deps/npm/html/doc/api/npm-bin.html @@ -28,5 +28,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-bugs.html b/deps/npm/html/doc/api/npm-bugs.html index 62242b26af58f6..09e2bc09450faf 100644 --- a/deps/npm/html/doc/api/npm-bugs.html +++ b/deps/npm/html/doc/api/npm-bugs.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-cache.html b/deps/npm/html/doc/api/npm-cache.html index 785a1aa043c540..0fd8c4d68212b7 100644 --- a/deps/npm/html/doc/api/npm-cache.html +++ b/deps/npm/html/doc/api/npm-cache.html @@ -42,5 +42,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-commands.html b/deps/npm/html/doc/api/npm-commands.html index 9979e3df71d406..3b5eccdd427ef1 100644 --- a/deps/npm/html/doc/api/npm-commands.html +++ b/deps/npm/html/doc/api/npm-commands.html @@ -36,5 +36,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-config.html b/deps/npm/html/doc/api/npm-config.html index b4a6763674ec18..34caf47bac8b8b 100644 --- a/deps/npm/html/doc/api/npm-config.html +++ b/deps/npm/html/doc/api/npm-config.html @@ -57,5 +57,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-deprecate.html b/deps/npm/html/doc/api/npm-deprecate.html index 54aadac5f1cce4..134e3a0940a141 100644 --- a/deps/npm/html/doc/api/npm-deprecate.html +++ b/deps/npm/html/doc/api/npm-deprecate.html @@ -47,5 +47,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-docs.html b/deps/npm/html/doc/api/npm-docs.html index 1142796c3104d9..606abc68590250 100644 --- a/deps/npm/html/doc/api/npm-docs.html +++ b/deps/npm/html/doc/api/npm-docs.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-edit.html b/deps/npm/html/doc/api/npm-edit.html index 679de772dfdede..0d06ec8b5c3dec 100644 --- a/deps/npm/html/doc/api/npm-edit.html +++ b/deps/npm/html/doc/api/npm-edit.html @@ -36,5 +36,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-explore.html b/deps/npm/html/doc/api/npm-explore.html index bd655478058b9c..c2b00dee7f317b 100644 --- a/deps/npm/html/doc/api/npm-explore.html +++ b/deps/npm/html/doc/api/npm-explore.html @@ -31,5 +31,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-help-search.html b/deps/npm/html/doc/api/npm-help-search.html index bc0075f8f4db32..5aaa0d749d934f 100644 --- a/deps/npm/html/doc/api/npm-help-search.html +++ b/deps/npm/html/doc/api/npm-help-search.html @@ -44,5 +44,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-init.html b/deps/npm/html/doc/api/npm-init.html index 35ad354f0c35db..16656cfa83ac33 100644 --- a/deps/npm/html/doc/api/npm-init.html +++ b/deps/npm/html/doc/api/npm-init.html @@ -39,5 +39,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-install.html b/deps/npm/html/doc/api/npm-install.html index eca8b80cf2a65c..ff44ed9b80b69c 100644 --- a/deps/npm/html/doc/api/npm-install.html +++ b/deps/npm/html/doc/api/npm-install.html @@ -32,5 +32,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-link.html b/deps/npm/html/doc/api/npm-link.html index dc764f89244c94..4370dfa82016a4 100644 --- a/deps/npm/html/doc/api/npm-link.html +++ b/deps/npm/html/doc/api/npm-link.html @@ -42,5 +42,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-load.html b/deps/npm/html/doc/api/npm-load.html index 30a2036bd7ca15..4ff8e4dd1fa708 100644 --- a/deps/npm/html/doc/api/npm-load.html +++ b/deps/npm/html/doc/api/npm-load.html @@ -37,5 +37,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-ls.html b/deps/npm/html/doc/api/npm-ls.html index fd75ccac3d6403..395cd8c0d7cda1 100644 --- a/deps/npm/html/doc/api/npm-ls.html +++ b/deps/npm/html/doc/api/npm-ls.html @@ -63,5 +63,5 @@

global

       - + diff --git a/deps/npm/html/doc/api/npm-outdated.html b/deps/npm/html/doc/api/npm-outdated.html index aaa194ed35deed..f88bf6ded1acbd 100644 --- a/deps/npm/html/doc/api/npm-outdated.html +++ b/deps/npm/html/doc/api/npm-outdated.html @@ -28,5 +28,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-owner.html b/deps/npm/html/doc/api/npm-owner.html index 5d925969733a57..9352adce3c0eae 100644 --- a/deps/npm/html/doc/api/npm-owner.html +++ b/deps/npm/html/doc/api/npm-owner.html @@ -47,5 +47,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-pack.html b/deps/npm/html/doc/api/npm-pack.html index 14c367a89e4e8d..f85a094d53dde5 100644 --- a/deps/npm/html/doc/api/npm-pack.html +++ b/deps/npm/html/doc/api/npm-pack.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-ping.html b/deps/npm/html/doc/api/npm-ping.html index 4dabc345acafde..9a0461ee11d735 100644 --- a/deps/npm/html/doc/api/npm-ping.html +++ b/deps/npm/html/doc/api/npm-ping.html @@ -29,4 +29,4 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-prefix.html b/deps/npm/html/doc/api/npm-prefix.html index 0921bed4b1f691..7003be312db0b7 100644 --- a/deps/npm/html/doc/api/npm-prefix.html +++ b/deps/npm/html/doc/api/npm-prefix.html @@ -29,5 +29,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-prune.html b/deps/npm/html/doc/api/npm-prune.html index 6ff302c3c87645..d49bfc87b99386 100644 --- a/deps/npm/html/doc/api/npm-prune.html +++ b/deps/npm/html/doc/api/npm-prune.html @@ -30,5 +30,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-publish.html b/deps/npm/html/doc/api/npm-publish.html index 9d0b68b5759f13..c19aadd53fc9ee 100644 --- a/deps/npm/html/doc/api/npm-publish.html +++ b/deps/npm/html/doc/api/npm-publish.html @@ -46,5 +46,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-rebuild.html b/deps/npm/html/doc/api/npm-rebuild.html index bc3e98e646f066..da78b38906037d 100644 --- a/deps/npm/html/doc/api/npm-rebuild.html +++ b/deps/npm/html/doc/api/npm-rebuild.html @@ -30,5 +30,5 @@

CONFIGURATION

       - + diff --git a/deps/npm/html/doc/api/npm-repo.html b/deps/npm/html/doc/api/npm-repo.html index e9146d84af2c37..7469d73e07364f 100644 --- a/deps/npm/html/doc/api/npm-repo.html +++ b/deps/npm/html/doc/api/npm-repo.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-restart.html b/deps/npm/html/doc/api/npm-restart.html index bf019a5011d4b4..bd4d54b13ddb64 100644 --- a/deps/npm/html/doc/api/npm-restart.html +++ b/deps/npm/html/doc/api/npm-restart.html @@ -52,5 +52,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-root.html b/deps/npm/html/doc/api/npm-root.html index c835d4e6b6af9e..830b5c723698b2 100644 --- a/deps/npm/html/doc/api/npm-root.html +++ b/deps/npm/html/doc/api/npm-root.html @@ -29,5 +29,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-run-script.html b/deps/npm/html/doc/api/npm-run-script.html index f694dcc645d21d..568a49f5686c73 100644 --- a/deps/npm/html/doc/api/npm-run-script.html +++ b/deps/npm/html/doc/api/npm-run-script.html @@ -41,5 +41,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-search.html b/deps/npm/html/doc/api/npm-search.html index 3292d838a4c458..e6f4d166e92d7e 100644 --- a/deps/npm/html/doc/api/npm-search.html +++ b/deps/npm/html/doc/api/npm-search.html @@ -53,5 +53,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-shrinkwrap.html b/deps/npm/html/doc/api/npm-shrinkwrap.html index 75d51dd630943a..453cc82fc27ae4 100644 --- a/deps/npm/html/doc/api/npm-shrinkwrap.html +++ b/deps/npm/html/doc/api/npm-shrinkwrap.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-start.html b/deps/npm/html/doc/api/npm-start.html index 715a7bba82f85c..5477a143121612 100644 --- a/deps/npm/html/doc/api/npm-start.html +++ b/deps/npm/html/doc/api/npm-start.html @@ -28,5 +28,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-stop.html b/deps/npm/html/doc/api/npm-stop.html index eca26362b4d90a..3bf0851434a666 100644 --- a/deps/npm/html/doc/api/npm-stop.html +++ b/deps/npm/html/doc/api/npm-stop.html @@ -28,5 +28,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-tag.html b/deps/npm/html/doc/api/npm-tag.html index ddb92596c9170f..a97fee612b18fc 100644 --- a/deps/npm/html/doc/api/npm-tag.html +++ b/deps/npm/html/doc/api/npm-tag.html @@ -36,5 +36,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-test.html b/deps/npm/html/doc/api/npm-test.html index 830585438a452b..9a32f5fb3c8441 100644 --- a/deps/npm/html/doc/api/npm-test.html +++ b/deps/npm/html/doc/api/npm-test.html @@ -30,5 +30,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-uninstall.html b/deps/npm/html/doc/api/npm-uninstall.html index 7458d7e735c8a4..ab13f65071acf3 100644 --- a/deps/npm/html/doc/api/npm-uninstall.html +++ b/deps/npm/html/doc/api/npm-uninstall.html @@ -30,5 +30,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-unpublish.html b/deps/npm/html/doc/api/npm-unpublish.html index 3f7f76c883c491..517ef69d7a958d 100644 --- a/deps/npm/html/doc/api/npm-unpublish.html +++ b/deps/npm/html/doc/api/npm-unpublish.html @@ -33,5 +33,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-update.html b/deps/npm/html/doc/api/npm-update.html index 87455a9ae0aadd..9bdda1f22beb6d 100644 --- a/deps/npm/html/doc/api/npm-update.html +++ b/deps/npm/html/doc/api/npm-update.html @@ -33,5 +33,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/api/npm-version.html b/deps/npm/html/doc/api/npm-version.html index e0e8b2761def3d..43ecf02668d774 100644 --- a/deps/npm/html/doc/api/npm-version.html +++ b/deps/npm/html/doc/api/npm-version.html @@ -32,5 +32,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm-view.html b/deps/npm/html/doc/api/npm-view.html index 3dd80d9c32730d..cf9a61b59a7b97 100644 --- a/deps/npm/html/doc/api/npm-view.html +++ b/deps/npm/html/doc/api/npm-view.html @@ -81,5 +81,5 @@

RETURN VALUE

       - + diff --git a/deps/npm/html/doc/api/npm-whoami.html b/deps/npm/html/doc/api/npm-whoami.html index 55233284d1a39c..095e750349e8ed 100644 --- a/deps/npm/html/doc/api/npm-whoami.html +++ b/deps/npm/html/doc/api/npm-whoami.html @@ -29,5 +29,5 @@

SYNOPSIS

       - + diff --git a/deps/npm/html/doc/api/npm.html b/deps/npm/html/doc/api/npm.html index df4ce202bb43cc..51a0eb3b641278 100644 --- a/deps/npm/html/doc/api/npm.html +++ b/deps/npm/html/doc/api/npm.html @@ -23,7 +23,7 @@

SYNOPSIS

npm.commands.install(["package"], cb) })

VERSION

-

2.14.20

+

2.15.0

DESCRIPTION

This is the API documentation for npm. To find documentation of the command line @@ -109,5 +109,5 @@

ABBREVS

       - + diff --git a/deps/npm/html/doc/cli/npm-access.html b/deps/npm/html/doc/cli/npm-access.html index 20f2717c42118d..03e8250cbedb9e 100644 --- a/deps/npm/html/doc/cli/npm-access.html +++ b/deps/npm/html/doc/cli/npm-access.html @@ -84,5 +84,5 @@

SEE ALSO

       - + diff --git a/deps/npm/html/doc/cli/npm-adduser.html b/deps/npm/html/doc/cli/npm-adduser.html index 2152a6a8cec187..54ae6e4118f3d2 100644 --- a/deps/npm/html/doc/cli/npm-adduser.html +++ b/deps/npm/html/doc/cli/npm-adduser.html @@ -12,6 +12,8 @@

npm-adduser

Add a registry user account

SYNOPSIS

npm adduser [--registry=url] [--scope=@orgname] [--always-auth]
+
+aliases: login, add-user
 

DESCRIPTION

Create or verify a user named <username> in the specified registry, and save the credentials to the .npmrc file. If no registry is specified, @@ -44,9 +46,11 @@

always-auth

registries. Can be used with --registry and / or --scope, e.g.

npm adduser --registry=http://private-registry.example.com --always-auth
 

This will ensure that all requests to that registry (including for tarballs) -include an authorization header. See always-auth in npm-config(7) for more -details on always-auth. Registry-specific configuration of always-auth takes -precedence over any global configuration.

+include an authorization header. This setting may be necessary for use with +private registries where metadata and package tarballs are stored on hosts with +different hostnames. See always-auth in npm-config(7) for more details on +always-auth. Registry-specific configuration of always-auth takes precedence +over any global configuration.

SEE ALSO

  • npm-registry(7)
  • @@ -68,5 +72,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-bin.html b/deps/npm/html/doc/cli/npm-bin.html index 38226fffabc72b..a9def2a9015475 100644 --- a/deps/npm/html/doc/cli/npm-bin.html +++ b/deps/npm/html/doc/cli/npm-bin.html @@ -35,5 +35,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-bugs.html b/deps/npm/html/doc/cli/npm-bugs.html index 99e5c63153d88b..ae6c1f4d7280ce 100644 --- a/deps/npm/html/doc/cli/npm-bugs.html +++ b/deps/npm/html/doc/cli/npm-bugs.html @@ -13,6 +13,8 @@

    npm-bugs

    Bugs for a package in a

    SYNOPSIS

    npm bugs <pkgname>
     npm bugs (with no args in a package dir)
    +
    +aliases: issues
     

    DESCRIPTION

    This command tries to guess at the likely location of a package's bug tracker URL, and then tries to open it using the --browser @@ -54,5 +56,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-build.html b/deps/npm/html/doc/cli/npm-build.html index 9ed02b341891d1..f768c932063d65 100644 --- a/deps/npm/html/doc/cli/npm-build.html +++ b/deps/npm/html/doc/cli/npm-build.html @@ -40,5 +40,5 @@

    DESCRIPTION

           - + diff --git a/deps/npm/html/doc/cli/npm-bundle.html b/deps/npm/html/doc/cli/npm-bundle.html index 7cd12975f82d40..8c700377190488 100644 --- a/deps/npm/html/doc/cli/npm-bundle.html +++ b/deps/npm/html/doc/cli/npm-bundle.html @@ -31,5 +31,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-cache.html b/deps/npm/html/doc/cli/npm-cache.html index 578d3d7afe60a9..613261b1201c04 100644 --- a/deps/npm/html/doc/cli/npm-cache.html +++ b/deps/npm/html/doc/cli/npm-cache.html @@ -81,5 +81,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-completion.html b/deps/npm/html/doc/cli/npm-completion.html index 8ecbe512f17d50..e3896b87156037 100644 --- a/deps/npm/html/doc/cli/npm-completion.html +++ b/deps/npm/html/doc/cli/npm-completion.html @@ -42,5 +42,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-config.html b/deps/npm/html/doc/cli/npm-config.html index bce6e121e5f1f7..8535edcaf0ee97 100644 --- a/deps/npm/html/doc/cli/npm-config.html +++ b/deps/npm/html/doc/cli/npm-config.html @@ -19,6 +19,8 @@

    SYNOPSIS

    npm c [set|get|delete|list] npm get <key> npm set <key> <value> [--global] + +aliases: c

    DESCRIPTION

    npm gets its config settings from the command line, environment variables, npmrc files, and in some cases, the package.json file.

    @@ -66,5 +68,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-dedupe.html b/deps/npm/html/doc/cli/npm-dedupe.html index 756959fa7fa141..0cc2b1408444c6 100644 --- a/deps/npm/html/doc/cli/npm-dedupe.html +++ b/deps/npm/html/doc/cli/npm-dedupe.html @@ -13,6 +13,8 @@

    npm-dedupe

    Reduce duplicationSYNOPSIS

    npm dedupe [package names...]
     npm ddp [package names...]
    +
    +aliases: find-dupes, ddp
     

    DESCRIPTION

    Searches the local package tree and attempts to simplify the overall structure by moving dependencies further up the tree, where they can @@ -63,5 +65,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-deprecate.html b/deps/npm/html/doc/cli/npm-deprecate.html index b68571a64eb1dc..c96a0db369ee9c 100644 --- a/deps/npm/html/doc/cli/npm-deprecate.html +++ b/deps/npm/html/doc/cli/npm-deprecate.html @@ -38,5 +38,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-dist-tag.html b/deps/npm/html/doc/cli/npm-dist-tag.html index 71354a368c0a0a..43e3924efa564b 100644 --- a/deps/npm/html/doc/cli/npm-dist-tag.html +++ b/deps/npm/html/doc/cli/npm-dist-tag.html @@ -14,6 +14,8 @@

    SYNOPSIS

    npm dist-tag add <pkg>@<version> [<tag>]
     npm dist-tag rm <pkg> <tag>
     npm dist-tag ls [<pkg>]
    +
    +aliases: dist-tags
     

    DESCRIPTION

    Add, remove, and enumerate distribution tags on a package:

      @@ -85,5 +87,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-docs.html b/deps/npm/html/doc/cli/npm-docs.html index 6e09bf2d9813c4..f64494ef7d14ce 100644 --- a/deps/npm/html/doc/cli/npm-docs.html +++ b/deps/npm/html/doc/cli/npm-docs.html @@ -56,5 +56,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-edit.html b/deps/npm/html/doc/cli/npm-edit.html index cd8c8b68fc8462..4c513c1928938c 100644 --- a/deps/npm/html/doc/cli/npm-edit.html +++ b/deps/npm/html/doc/cli/npm-edit.html @@ -49,5 +49,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-explore.html b/deps/npm/html/doc/cli/npm-explore.html index d4f2e44b4a6760..dc29b16d08c3a1 100644 --- a/deps/npm/html/doc/cli/npm-explore.html +++ b/deps/npm/html/doc/cli/npm-explore.html @@ -49,5 +49,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-help-search.html b/deps/npm/html/doc/cli/npm-help-search.html index 857d7e6625eff3..0cc0b0d489b91c 100644 --- a/deps/npm/html/doc/cli/npm-help-search.html +++ b/deps/npm/html/doc/cli/npm-help-search.html @@ -46,5 +46,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-help.html b/deps/npm/html/doc/cli/npm-help.html index aa1a531c1a12bc..52d2c6ac7efd63 100644 --- a/deps/npm/html/doc/cli/npm-help.html +++ b/deps/npm/html/doc/cli/npm-help.html @@ -52,5 +52,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-init.html b/deps/npm/html/doc/cli/npm-init.html index d99443cc5621c7..07734cd05f0f5b 100644 --- a/deps/npm/html/doc/cli/npm-init.html +++ b/deps/npm/html/doc/cli/npm-init.html @@ -48,5 +48,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-install-test.html b/deps/npm/html/doc/cli/npm-install-test.html deleted file mode 100644 index 8bc6a2bebab114..00000000000000 --- a/deps/npm/html/doc/cli/npm-install-test.html +++ /dev/null @@ -1,45 +0,0 @@ - - - npm-install-test - - - - - - -
      - -

      npm install-test

      Install package(s) and run tests

      -

      SYNOPSIS

      -
      npm install-test (with no args, in package dir)
      -npm install-test [<@scope>/]<name>
      -npm install-test [<@scope>/]<name>@<tag>
      -npm install-test [<@scope>/]<name>@<version>
      -npm install-test [<@scope>/]<name>@<version range>
      -npm install-test <tarball file>
      -npm install-test <tarball url>
      -npm install-test <folder>
      -
      -alias: npm it
      -common options: [--save|--save-dev|--save-optional] [--save-exact] [--dry-run]
      -

      DESCRIPTION

      -

      This command runs an npm install followed immediately by an npm test. It -takes exactly the same arguments as npm install.

      -

      SEE ALSO

      - - -
      - - - - - - - - - - - diff --git a/deps/npm/html/doc/cli/npm-install.html b/deps/npm/html/doc/cli/npm-install.html index 6ea5f73a8d74da..9f3a0429cbae82 100644 --- a/deps/npm/html/doc/cli/npm-install.html +++ b/deps/npm/html/doc/cli/npm-install.html @@ -15,7 +15,7 @@

      SYNOPSIS

      npm install <tarball file> npm install <tarball url> npm install <folder> -npm install [@<scope>/]<name> [--save|--save-dev|--save-optional] [--save-exact] +npm install [@<scope>/]<name> [--save|--save-dev|--save-optional] [--save-exact] [--save-bundle] npm install [@<scope>/]<name>@<tag> npm install [@<scope>/]<name>@<version> npm install [@<scope>/]<name>@<version range> @@ -82,14 +82,13 @@

      SYNOPSIS

    • --save-optional: Package will appear in your optionalDependencies.

      When using any of the above options to save dependencies to your -package.json, there is an additional, optional flag:

      +package.json, there are two additional, optional flags:

    • --save-exact: Saved dependencies will be configured with an exact version rather than using npm's default semver range operator.

      -

      <scope> is optional. The package will be downloaded from the registry -associated with the specified scope. If no registry is associated with -the given scope the default registry is assumed. See npm-scope(7).

      +
    • +
    • -B, --save-bundle: Saved dependencies will also be added to your bundleDependencies list.

      Note: if you do not include the @-symbol on your scope name, npm will interpret this as a GitHub repository instead, see below. Scopes names must also be followed by a slash.

      @@ -100,6 +99,7 @@

      SYNOPSIS

      npm install node-tap --save-dev npm install dtrace-provider --save-optional npm install readable-stream --save --save-exact +npm install ansi-regex --save --save-bundle
    @@ -279,5 +279,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-link.html b/deps/npm/html/doc/cli/npm-link.html index d57c65f6f19667..87c8ae81c5e1a7 100644 --- a/deps/npm/html/doc/cli/npm-link.html +++ b/deps/npm/html/doc/cli/npm-link.html @@ -16,11 +16,12 @@

    SYNOPSIS

    npm ln (with any of the previous argument usage)

    DESCRIPTION

    Package linking is a two-step process.

    -

    First, npm link in a package folder will create a globally-installed -symbolic link from prefix/package-name to the current folder (see -npm-config(7) for the value of prefix).

    +

    First, npm link in a package folder will create a symlink in the global folder +{prefix}/lib/node_modules/<package> that links to the package where the npm +link command was executed. (see npm-config(7) for the value of prefix).

    Next, in some other location, npm link package-name will create a -symlink from the local node_modules folder to the global symlink.

    +symbolic link from globally-installed package-name to node_modules/ +of the current folder.

    Note that package-name is taken from package.json, not from directory name.

    The package name can be optionally prefixed with a scope. See npm-scope(7). @@ -36,7 +37,7 @@

    SYNOPSIS

    npm link redis # link-install the package

    Now, any changes to ~/projects/node-redis will be reflected in ~/projects/node-bloggy/node_modules/node-redis/. Note that the link should -be to the package name, not the directory name for that package.

    +be to the package name, not the directory name for that package.

    You may also shortcut the two steps in one. For example, to do the above use-case in a shorter way:

    cd ~/projects/node-bloggy  # go into the dir of your main project
    @@ -72,5 +73,5 @@ 

    SYNOPSIS

           - + diff --git a/deps/npm/html/doc/cli/npm-logout.html b/deps/npm/html/doc/cli/npm-logout.html index ea01bb43aab6e7..c82727f5c4595c 100644 --- a/deps/npm/html/doc/cli/npm-logout.html +++ b/deps/npm/html/doc/cli/npm-logout.html @@ -51,5 +51,5 @@

    scope

           - + diff --git a/deps/npm/html/doc/cli/npm-ls.html b/deps/npm/html/doc/cli/npm-ls.html index 4aafcb8373db3c..5af7135a678efa 100644 --- a/deps/npm/html/doc/cli/npm-ls.html +++ b/deps/npm/html/doc/cli/npm-ls.html @@ -22,7 +22,7 @@

    SYNOPSIS

    limit the results to only the paths to the packages named. Note that nested packages will also show the paths to the specified packages. For example, running npm ls promzard in npm's source tree will show:

    -
    npm@2.14.20 /path/to/npm
    +
    npm@2.15.0 /path/to/npm
     └─┬ init-package-json@0.0.4
       └── promzard@0.1.5
     

    It will print out extraneous, missing, and invalid packages.

    @@ -97,5 +97,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html index adb2d79e2522de..5bb081e90cb29c 100644 --- a/deps/npm/html/doc/cli/npm-outdated.html +++ b/deps/npm/html/doc/cli/npm-outdated.html @@ -116,5 +116,5 @@

    SEE ALSO

           - + diff --git a/deps/npm/html/doc/cli/npm-owner.html b/deps/npm/html/doc/cli/npm-owner.html index e513e85f33f00d..85ab5703df6abb 100644 --- a/deps/npm/html/doc/cli/npm-owner.html +++ b/deps/npm/html/doc/cli/npm-owner.html @@ -14,6 +14,8 @@

    SYNOPSIS

    npm owner ls <package name>
     npm owner add <user> <package name>
     npm owner rm <user> <package name>
    +
    +aliases: author
     

    DESCRIPTION

    Manage ownership of published packages.

      @@ -49,5 +51,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-pack.html b/deps/npm/html/doc/cli/npm-pack.html index 61d7df6189398a..c247a4d4b95741 100644 --- a/deps/npm/html/doc/cli/npm-pack.html +++ b/deps/npm/html/doc/cli/npm-pack.html @@ -41,5 +41,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-ping.html b/deps/npm/html/doc/cli/npm-ping.html index 72888e9cc31e0f..20524fd5dd703b 100644 --- a/deps/npm/html/doc/cli/npm-ping.html +++ b/deps/npm/html/doc/cli/npm-ping.html @@ -32,4 +32,4 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-prefix.html b/deps/npm/html/doc/cli/npm-prefix.html index 7139defece1220..2f217bcfab403f 100644 --- a/deps/npm/html/doc/cli/npm-prefix.html +++ b/deps/npm/html/doc/cli/npm-prefix.html @@ -38,5 +38,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-prune.html b/deps/npm/html/doc/cli/npm-prune.html index c1843ab2d9574a..e1fb7cd73ee8a5 100644 --- a/deps/npm/html/doc/cli/npm-prune.html +++ b/deps/npm/html/doc/cli/npm-prune.html @@ -41,5 +41,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-publish.html b/deps/npm/html/doc/cli/npm-publish.html index 61b3076d84ace2..8ca91d7aaccbb0 100644 --- a/deps/npm/html/doc/cli/npm-publish.html +++ b/deps/npm/html/doc/cli/npm-publish.html @@ -69,5 +69,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html index ca28dc0db333f3..46e3975d7fbb4d 100644 --- a/deps/npm/html/doc/cli/npm-rebuild.html +++ b/deps/npm/html/doc/cli/npm-rebuild.html @@ -38,5 +38,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-repo.html b/deps/npm/html/doc/cli/npm-repo.html index 79b35adcfc5754..bfdcbff1f707a7 100644 --- a/deps/npm/html/doc/cli/npm-repo.html +++ b/deps/npm/html/doc/cli/npm-repo.html @@ -42,5 +42,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-restart.html b/deps/npm/html/doc/cli/npm-restart.html index 0fc1103cd4e47f..5d38582f641c7c 100644 --- a/deps/npm/html/doc/cli/npm-restart.html +++ b/deps/npm/html/doc/cli/npm-restart.html @@ -53,5 +53,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-rm.html b/deps/npm/html/doc/cli/npm-rm.html index 268fba49b623b9..2a36d6104987ce 100644 --- a/deps/npm/html/doc/cli/npm-rm.html +++ b/deps/npm/html/doc/cli/npm-rm.html @@ -39,5 +39,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-root.html b/deps/npm/html/doc/cli/npm-root.html index 67e26743c65254..b4c3969b597714 100644 --- a/deps/npm/html/doc/cli/npm-root.html +++ b/deps/npm/html/doc/cli/npm-root.html @@ -35,5 +35,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-run-script.html b/deps/npm/html/doc/cli/npm-run-script.html index bfc11f785013cb..7b97792a2126bc 100644 --- a/deps/npm/html/doc/cli/npm-run-script.html +++ b/deps/npm/html/doc/cli/npm-run-script.html @@ -57,5 +57,5 @@

      SEE ALSO

             - + diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html index 653c605248cef2..6f4cbe3cfb5c79 100644 --- a/deps/npm/html/doc/cli/npm-search.html +++ b/deps/npm/html/doc/cli/npm-search.html @@ -11,9 +11,9 @@

      npm-search

      Search for packages

      SYNOPSIS

      -
      npm search [--long] [search terms ...]
      -npm s [search terms ...]
      -npm se [search terms ...]
      +
      npm search [-l|--long] [search terms ...]
      +
      +aliases: s, se, find
       

      DESCRIPTION

      Search the registry for packages matching the search terms.

      If a term starts with /, then it's interpreted as a regular expression. @@ -29,6 +29,14 @@

      long

      lines. When disabled (default) search results are truncated to fit neatly on a single line. Modules with extremely long names will fall on multiple lines.

      +

      registry

      + +

      Search the specified registry for modules. If you have configured npm to point to a different default registry, +such as your internal private module repository, npm search will default to that registry when searching. +Pass a different registry url such as the default above in order to override this setting.

      SEE ALSO

      • npm-registry(7)
      • @@ -49,5 +57,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-shrinkwrap.html b/deps/npm/html/doc/cli/npm-shrinkwrap.html index 06c944a2eeaf26..bb36cfd775f438 100644 --- a/deps/npm/html/doc/cli/npm-shrinkwrap.html +++ b/deps/npm/html/doc/cli/npm-shrinkwrap.html @@ -168,5 +168,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-star.html b/deps/npm/html/doc/cli/npm-star.html index ee50f7d7ad358e..4375e29e4fa637 100644 --- a/deps/npm/html/doc/cli/npm-star.html +++ b/deps/npm/html/doc/cli/npm-star.html @@ -36,5 +36,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-stars.html b/deps/npm/html/doc/cli/npm-stars.html index 8cf87457a4137c..f679ba62b95c7b 100644 --- a/deps/npm/html/doc/cli/npm-stars.html +++ b/deps/npm/html/doc/cli/npm-stars.html @@ -37,5 +37,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-start.html b/deps/npm/html/doc/cli/npm-start.html index 433b721cef5caa..300500eba4796e 100644 --- a/deps/npm/html/doc/cli/npm-start.html +++ b/deps/npm/html/doc/cli/npm-start.html @@ -39,5 +39,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-stop.html b/deps/npm/html/doc/cli/npm-stop.html index b1b3ec665adb1f..353fb43592ce71 100644 --- a/deps/npm/html/doc/cli/npm-stop.html +++ b/deps/npm/html/doc/cli/npm-stop.html @@ -34,5 +34,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-tag.html b/deps/npm/html/doc/cli/npm-tag.html index e8a6594d4a85a9..3d00cda5121575 100644 --- a/deps/npm/html/doc/cli/npm-tag.html +++ b/deps/npm/html/doc/cli/npm-tag.html @@ -62,5 +62,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-team.html b/deps/npm/html/doc/cli/npm-team.html index 64fbcf0b3a44ff..d2bd12d6c8f5c5 100644 --- a/deps/npm/html/doc/cli/npm-team.html +++ b/deps/npm/html/doc/cli/npm-team.html @@ -67,4 +67,4 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html index 42154335910b22..e961d231b2512f 100644 --- a/deps/npm/html/doc/cli/npm-test.html +++ b/deps/npm/html/doc/cli/npm-test.html @@ -12,7 +12,8 @@

        npm-test

        Test a package

        SYNOPSIS

          npm test [-- <args>]
        -  npm tst [-- <args>]
        +
        +  aliases: t, tst
         

        DESCRIPTION

        This runs a package's "test" script, if one was provided.

        To run tests as a condition of installation, set the npat config to @@ -37,5 +38,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-uninstall.html b/deps/npm/html/doc/cli/npm-uninstall.html index f70c5546b0e604..871e514398605f 100644 --- a/deps/npm/html/doc/cli/npm-uninstall.html +++ b/deps/npm/html/doc/cli/npm-uninstall.html @@ -57,5 +57,5 @@

        SYNOPSIS

               - + diff --git a/deps/npm/html/doc/cli/npm-unpublish.html b/deps/npm/html/doc/cli/npm-unpublish.html index a3770b6fd06011..65fc3f13e835ed 100644 --- a/deps/npm/html/doc/cli/npm-unpublish.html +++ b/deps/npm/html/doc/cli/npm-unpublish.html @@ -47,5 +47,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-update.html b/deps/npm/html/doc/cli/npm-update.html index 61e356377df4a3..a131392a352b4d 100644 --- a/deps/npm/html/doc/cli/npm-update.html +++ b/deps/npm/html/doc/cli/npm-update.html @@ -12,6 +12,8 @@

        npm-update

        Update a package

        SYNOPSIS

        npm update [-g] [<name> [<name> ...]]
        +
        +aliases: up, upgrade
         

        DESCRIPTION

        This command will update all the packages listed to the latest version (specified by the tag config), respecting semver.

        @@ -24,13 +26,8 @@

        SYNOPSIS

        or local) will be updated.

        As of npm@2.6.1, the npm update will only inspect top-level packages. Prior versions of npm would also recursively inspect all dependencies. -To get the old behavior, use npm --depth Infinity update, but be warned that -simultaneous asynchronous update of all packages, including npm itself -and packages that npm depends on, often causes problems up to and including -the uninstallation of npm itself.

        -

        To restore a missing npm, use the command:

        -
        curl -L https://npmjs.com/install.sh | sh
        -

        EXAMPLES

        +To get the old behavior, use npm --depth 9999 update.

        +

        EXAMPLES

        IMPORTANT VERSION NOTE: these examples assume npm@2.6.1 or later. For older versions of npm, you must specify --depth 0 to get the behavior described below.

        @@ -38,7 +35,7 @@

        SYNOPSIS

        on dependencies, dep1 (dep2, .. etc.). The published versions of dep1 are:

        {
           "dist-tags": { "latest": "1.2.2" },
        -  "versions": {
        +  "versions": [
             "1.2.2",
             "1.2.1",
             "1.2.0",
        @@ -48,7 +45,7 @@ 

        SYNOPSIS

        "0.4.1", "0.4.0", "0.2.0" - } + ] }

        Caret Dependencies

        If app's package.json contains:

        @@ -120,5 +117,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html index f679effa7c9559..2cb44bb4ab2b31 100644 --- a/deps/npm/html/doc/cli/npm-version.html +++ b/deps/npm/html/doc/cli/npm-version.html @@ -95,5 +95,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html index 2fa22d98cb41c6..7d15486d88772b 100644 --- a/deps/npm/html/doc/cli/npm-view.html +++ b/deps/npm/html/doc/cli/npm-view.html @@ -85,5 +85,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm-whoami.html b/deps/npm/html/doc/cli/npm-whoami.html index 56dc846bd55d83..e133032a40dcaf 100644 --- a/deps/npm/html/doc/cli/npm-whoami.html +++ b/deps/npm/html/doc/cli/npm-whoami.html @@ -33,5 +33,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/cli/npm.html b/deps/npm/html/doc/cli/npm.html index f55051f479b24b..64071e9abf5bc4 100644 --- a/deps/npm/html/doc/cli/npm.html +++ b/deps/npm/html/doc/cli/npm.html @@ -13,7 +13,7 @@

        npm

        javascript package manager

        SYNOPSIS

        npm <command> [args]
         

        VERSION

        -

        2.14.20

        +

        2.15.0

        DESCRIPTION

        npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency @@ -106,19 +106,17 @@

        CONTRIBUTIONS

      Contributors are listed in npm's package.json file. You can view them easily by doing npm view npm contributors.

      -

      If you would like to contribute, but don't know what to work on, check -the issues list or ask on the mailing list.

      +

      If you would like to contribute, but don't know what to work on, read +the contributing guidelines and check the issues list.

      BUGS

      When you find issues, please report them:

      Be sure to include all of the output from the npm command that didn't work as expected. The npm-debug.log file is also helpful to provide.

      @@ -128,7 +126,7 @@

      AUTHOR

      Isaac Z. Schlueter :: isaacs :: @izs :: -i@izs.me

      +i@izs.me

      SEE ALSO

      • npm-help(1)
      • @@ -154,5 +152,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/files/npm-folders.html b/deps/npm/html/doc/files/npm-folders.html index cc6c4849d3377c..8421d2147ad14e 100644 --- a/deps/npm/html/doc/files/npm-folders.html +++ b/deps/npm/html/doc/files/npm-folders.html @@ -183,5 +183,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/files/npm-global.html b/deps/npm/html/doc/files/npm-global.html index cc6c4849d3377c..8421d2147ad14e 100644 --- a/deps/npm/html/doc/files/npm-global.html +++ b/deps/npm/html/doc/files/npm-global.html @@ -183,5 +183,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html index 18be731280ead6..aa6d69fc28204e 100644 --- a/deps/npm/html/doc/files/npm-json.html +++ b/deps/npm/html/doc/files/npm-json.html @@ -244,6 +244,9 @@

        directories.doc

        maybe, someday.

        directories.example

        Put example scripts in here. Someday, it might be exposed in some clever way.

        +

        directories.test

        +

        Put your tests in here. It is currently not exposed, but it might be in the +future.

        repository

        Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the npm docs @@ -434,7 +437,18 @@

        peerDependencies

        with every 1.x version of the host package, use "^1.0" or "1.x" to express this. If you depend on features introduced in 1.5.2, use ">= 1.5.2 < 2".

        bundledDependencies

        -

        Array of package names that will be bundled when publishing the package.

        +

        This defines an array of package names that will be bundled when publishing the package.

        +

        In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the bundledDependencies array and executing npm pack.

        +

        For example: +If we define a package.json like this:

        +
        {
        +  "name": "awesome-web-framework",
        +  "version": "1.0.0",
        +  "bundledDependencies": [
        +    'renderized', 'super-streams'
        +  ]
        +}
        +

        we can obtain awesome-web-framework-1.0.0.tgz file by running npm pack. This file contains the dependencies renderized and super-streams which can be installed in a new project by executing npm install awesome-web-framework-1.0.0.tgz.

        If this is spelled "bundleDependencies", then that is also honored.

        optionalDependencies

        If a dependency can be used, but you would like npm to proceed if it cannot be @@ -567,5 +581,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html index 805be3ca4c9140..a76191cae9a40d 100644 --- a/deps/npm/html/doc/files/npmrc.html +++ b/deps/npm/html/doc/files/npmrc.html @@ -83,5 +83,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html index 18be731280ead6..aa6d69fc28204e 100644 --- a/deps/npm/html/doc/files/package.json.html +++ b/deps/npm/html/doc/files/package.json.html @@ -244,6 +244,9 @@

        directories.doc

        maybe, someday.

        directories.example

        Put example scripts in here. Someday, it might be exposed in some clever way.

        +

        directories.test

        +

        Put your tests in here. It is currently not exposed, but it might be in the +future.

        repository

        Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the npm docs @@ -434,7 +437,18 @@

        peerDependencies

        with every 1.x version of the host package, use "^1.0" or "1.x" to express this. If you depend on features introduced in 1.5.2, use ">= 1.5.2 < 2".

        bundledDependencies

        -

        Array of package names that will be bundled when publishing the package.

        +

        This defines an array of package names that will be bundled when publishing the package.

        +

        In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the bundledDependencies array and executing npm pack.

        +

        For example: +If we define a package.json like this:

        +
        {
        +  "name": "awesome-web-framework",
        +  "version": "1.0.0",
        +  "bundledDependencies": [
        +    'renderized', 'super-streams'
        +  ]
        +}
        +

        we can obtain awesome-web-framework-1.0.0.tgz file by running npm pack. This file contains the dependencies renderized and super-streams which can be installed in a new project by executing npm install awesome-web-framework-1.0.0.tgz.

        If this is spelled "bundleDependencies", then that is also honored.

        optionalDependencies

        If a dependency can be used, but you would like npm to proceed if it cannot be @@ -567,5 +581,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html index 72caf441a7d004..4d3f849ad1fab4 100644 --- a/deps/npm/html/doc/index.html +++ b/deps/npm/html/doc/index.html @@ -242,5 +242,5 @@

        semver(7)

               - + diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html index d2768eed7ef2c3..4e934a2d1006f7 100644 --- a/deps/npm/html/doc/misc/npm-coding-style.html +++ b/deps/npm/html/doc/misc/npm-coding-style.html @@ -147,5 +147,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html index 417a8db9bfd642..e5703ab77773d0 100644 --- a/deps/npm/html/doc/misc/npm-config.html +++ b/deps/npm/html/doc/misc/npm-config.html @@ -457,6 +457,13 @@

        long

      • Type: Boolean

      Show extended information in npm ls and npm search.

      +

      maxsockets

      +
        +
      • Default: 50
      • +
      • Type: Number
      • +
      +

      The maximum number of connections to use per origin (protocol/host/port +combination). Passed to the http Agent used to make the request.

      message

      • Default: "%s"
      • @@ -799,5 +806,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html index 01906ac153a8ba..b5095f6e4762a6 100644 --- a/deps/npm/html/doc/misc/npm-developers.html +++ b/deps/npm/html/doc/misc/npm-developers.html @@ -195,5 +195,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-disputes.html b/deps/npm/html/doc/misc/npm-disputes.html index 7a8aca3414ecbf..31f8e439234546 100644 --- a/deps/npm/html/doc/misc/npm-disputes.html +++ b/deps/npm/html/doc/misc/npm-disputes.html @@ -13,7 +13,7 @@

        npm-disputes

        Handling Module

        SYNOPSIS

        1. Get the author email with npm owner ls <pkgname>
        2. -
        3. Email the author, CC support@npmjs.com
        4. +
        5. Email the author, CC support@npmjs.com
        6. After a few weeks, if there's no resolution, we'll sort it out.

        Don't squat on package names. Publish code or move out of the way.

        @@ -51,12 +51,12 @@

        DESCRIPTION

        owner (Bob).
      • Joe emails Bob, explaining the situation as respectfully as possible, and what he would like to do with the module name. He -adds the npm support staff support@npmjs.com to the CC list of +adds the npm support staff support@npmjs.com to the CC list of the email. Mention in the email that Bob can run npm owner add joe foo to add Joe as an owner of the foo package.
      • After a reasonable amount of time, if Bob has not responded, or if Bob and Joe can't come to any sort of resolution, email support -support@npmjs.com and we'll sort it out. ("Reasonable" is +support@npmjs.com and we'll sort it out. ("Reasonable" is usually at least 4 weeks, but extra time is allowed around common holidays.)
      • @@ -112,5 +112,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-index.html b/deps/npm/html/doc/misc/npm-index.html index 3f491423912d99..841d2f882414b1 100644 --- a/deps/npm/html/doc/misc/npm-index.html +++ b/deps/npm/html/doc/misc/npm-index.html @@ -242,5 +242,5 @@

        semver(7)

               - + diff --git a/deps/npm/html/doc/misc/npm-orgs.html b/deps/npm/html/doc/misc/npm-orgs.html index 25b626e7dbfcda..63bf8dd20e0773 100644 --- a/deps/npm/html/doc/misc/npm-orgs.html +++ b/deps/npm/html/doc/misc/npm-orgs.html @@ -86,4 +86,4 @@

        Team Admins create teams

               - + diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html index 965cc0878e756f..bc90aa9e60d710 100644 --- a/deps/npm/html/doc/misc/npm-registry.html +++ b/deps/npm/html/doc/misc/npm-registry.html @@ -70,5 +70,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-scope.html b/deps/npm/html/doc/misc/npm-scope.html index 7511fcfdb7a851..8e787b24915adf 100644 --- a/deps/npm/html/doc/misc/npm-scope.html +++ b/deps/npm/html/doc/misc/npm-scope.html @@ -45,7 +45,8 @@

        Requiring scoped packages

        Publishing scoped packages

        Scoped packages can be published to any registry that supports them, including the public npm registry.

        -

        (As of 2015-04-19, the public npm registry does support scoped packages)

        +

        (As of 2015-04-19, and with npm 2.0 or newer, the public npm registry does +support scoped packages)

        If you wish, you may associate a scope with a registry; see below.

        Publishing public scoped packages to the public npm registry

        To publish a public scoped package, you must specify --access public with @@ -91,5 +92,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/npm-scripts.html b/deps/npm/html/doc/misc/npm-scripts.html index 72f8a86bacf63e..e11f7bcfa6cc77 100644 --- a/deps/npm/html/doc/misc/npm-scripts.html +++ b/deps/npm/html/doc/misc/npm-scripts.html @@ -207,5 +207,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/removing-npm.html b/deps/npm/html/doc/misc/removing-npm.html index ea35c20539d81d..ebdd3610fbbd9c 100644 --- a/deps/npm/html/doc/misc/removing-npm.html +++ b/deps/npm/html/doc/misc/removing-npm.html @@ -57,5 +57,5 @@

        SEE ALSO

               - + diff --git a/deps/npm/html/doc/misc/semver.html b/deps/npm/html/doc/misc/semver.html index 72aaa36aa6ee3f..ad6dd783786753 100644 --- a/deps/npm/html/doc/misc/semver.html +++ b/deps/npm/html/doc/misc/semver.html @@ -302,5 +302,5 @@

        Ranges

               - + diff --git a/deps/npm/lib/cache.js b/deps/npm/lib/cache.js index 851636c3c17ae9..3a1249b073d0b2 100644 --- a/deps/npm/lib/cache.js +++ b/deps/npm/lib/cache.js @@ -288,7 +288,7 @@ function add (args, where, cb) { break case "remote": // get auth, if possible - mapToRegistry(spec, npm.config, function (err, uri, auth) { + mapToRegistry(p.raw, npm.config, function (err, uri, auth) { if (err) return cb(err) addRemoteTarball(p.spec, {name : p.name}, null, auth, cb) diff --git a/deps/npm/lib/cache/caching-client.js b/deps/npm/lib/cache/caching-client.js index ec8eb8e16ce083..a2c7c5f6fa4fc6 100644 --- a/deps/npm/lib/cache/caching-client.js +++ b/deps/npm/lib/cache/caching-client.js @@ -212,6 +212,7 @@ function adaptConfig (config) { userAgent : config.get("user-agent"), log : log, defaultTag : config.get("tag"), - couchToken : config.get("_token") + couchToken : config.get("_token"), + maxSockets : config.get('maxsockets') } } diff --git a/deps/npm/lib/config/defaults.js b/deps/npm/lib/config/defaults.js index a90d4c22b0a87e..3abc81ed5f6354 100644 --- a/deps/npm/lib/config/defaults.js +++ b/deps/npm/lib/config/defaults.js @@ -162,6 +162,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , loglevel : "warn" , logstream : process.stderr , long : false + , maxsockets : 50 , message : "%s" , "node-version" : process.version , npat : false @@ -268,6 +269,7 @@ exports.types = , loglevel : ["silent", "error", "warn", "http", "info", "verbose", "silly"] , logstream : Stream , long : Boolean + , maxsockets : Number , message: String , "node-version" : [null, semver] , npat : Boolean diff --git a/deps/npm/lib/config/get-credentials-by-uri.js b/deps/npm/lib/config/get-credentials-by-uri.js index 26a7f4317c6a3a..4122f4ce49fdf8 100644 --- a/deps/npm/lib/config/get-credentials-by-uri.js +++ b/deps/npm/lib/config/get-credentials-by-uri.js @@ -20,8 +20,16 @@ function getCredentialsByURI (uri) { alwaysAuth : undefined } - if (this.get(nerfed + ":_authToken")) { - c.token = this.get(nerfed + ":_authToken") + // used to override scope matching for tokens as well as legacy auth + if (this.get(nerfed + ':always-auth') !== undefined) { + var val = this.get(nerfed + ':always-auth') + c.alwaysAuth = val === 'false' ? false : !!val + } else if (this.get('always-auth') !== undefined) { + c.alwaysAuth = this.get('always-auth') + } + + if (this.get(nerfed + ':_authToken')) { + c.token = this.get(nerfed + ':_authToken') // the bearer token is enough, don't confuse things return c } @@ -58,13 +66,6 @@ function getCredentialsByURI (uri) { c.email = this.get("email") } - if (this.get(nerfed + ":always-auth") !== undefined) { - var val = this.get(nerfed + ":always-auth") - c.alwaysAuth = val === "false" ? false : !!val - } else if (this.get("always-auth") !== undefined) { - c.alwaysAuth = this.get("always-auth") - } - if (c.username && c.password) { c.auth = new Buffer(c.username + ":" + c.password).toString("base64") } diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js index cbd6893470ba2d..d349303a15d850 100644 --- a/deps/npm/lib/npm.js +++ b/deps/npm/lib/npm.js @@ -150,7 +150,7 @@ var commandCache = {} , "substack" , "visnup" ] - , littleGuys = [ "isntall" ] + , littleGuys = [ "isntall", "verison" ] , fullList = cmdList.concat(aliasNames).filter(function (c) { return plumbing.indexOf(c) === -1 }) diff --git a/deps/npm/lib/utils/lifecycle.js b/deps/npm/lib/utils/lifecycle.js index 9805a1c0c1dc45..a1b8ebcb81f13d 100644 --- a/deps/npm/lib/utils/lifecycle.js +++ b/deps/npm/lib/utils/lifecycle.js @@ -83,6 +83,9 @@ function lifecycle_ (pkg, stage, wd, env, unsafe, failOk, cb) { // the bundled one will be used for installing things. pathArr.unshift(path.join(__dirname, "..", "..", "bin", "node-gyp-bin")) + // prefer current node interpreter in child scripts + pathArr.push(path.dirname(process.execPath)) + if (env[PATH]) pathArr.push(env[PATH]) env[PATH] = pathArr.join(process.platform === "win32" ? ";" : ":") diff --git a/deps/npm/lib/utils/map-to-registry.js b/deps/npm/lib/utils/map-to-registry.js index bd68a26d42ef8e..3f4d5ed3f02fae 100644 --- a/deps/npm/lib/utils/map-to-registry.js +++ b/deps/npm/lib/utils/map-to-registry.js @@ -48,9 +48,53 @@ function mapToRegistry(name, config, cb) { var auth = config.getCredentialsByURI(registry) // normalize registry URL so resolution doesn't drop a piece of registry URL - var normalized = registry.slice(-1) !== "/" ? registry+"/" : registry - var uri = url.resolve(normalized, name) - log.silly("mapToRegistry", "uri", uri) + var normalized = registry.slice(-1) !== '/' ? registry + '/' : registry + var uri + log.silly('mapToRegistry', 'data', data) + if (data.type === 'remote') { + uri = data.spec + } else { + uri = url.resolve(normalized, name) + } + + log.silly('mapToRegistry', 'uri', uri) + + cb(null, uri, scopeAuth(uri, registry, auth), normalized) +} + +function scopeAuth (uri, registry, auth) { + var cleaned = { + scope: auth.scope, + email: auth.email, + alwaysAuth: auth.alwaysAuth, + token: undefined, + username: undefined, + password: undefined, + auth: undefined + } + + var requestHost + var registryHost + + if (auth.token || auth.auth || (auth.username && auth.password)) { + requestHost = url.parse(uri).hostname + registryHost = url.parse(registry).hostname + + if (requestHost === registryHost) { + cleaned.token = auth.token + cleaned.auth = auth.auth + cleaned.username = auth.username + cleaned.password = auth.password + } else if (auth.alwaysAuth) { + log.verbose('scopeAuth', 'alwaysAuth set for', registry) + cleaned.token = auth.token + cleaned.auth = auth.auth + cleaned.username = auth.username + cleaned.password = auth.password + } else { + log.silly('scopeAuth', uri, "doesn't share host with registry", registry) + } + } - cb(null, uri, auth, normalized) + return cleaned } diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index 9b7b02fe0ee0d4..677f371b3d25b0 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -6,6 +6,8 @@ .RS 2 .nf npm adduser [\-\-registry=url] [\-\-scope=@orgname] [\-\-always\-auth] + +aliases: login, add\-user .fi .RE .SH DESCRIPTION @@ -64,9 +66,11 @@ npm adduser \-\-registry=http://private\-registry\.example\.com \-\-always\-auth .RE .P This will ensure that all requests to that registry (including for tarballs) -include an authorization header\. See \fBalways\-auth\fP in npm help 7 \fBnpm\-config\fP for more -details on always\-auth\. Registry\-specific configuration of \fBalways\-auth\fP takes -precedence over any global configuration\. +include an authorization header\. This setting may be necessary for use with +private registries where metadata and package tarballs are stored on hosts with +different hostnames\. See \fBalways\-auth\fP in npm help 7 \fBnpm\-config\fP for more details on +always\-auth\. Registry\-specific configuration of \fBalways\-auth\fP takes precedence +over any global configuration\. .SH SEE ALSO .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 6326dcaffcf33b..0d57757211c012 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -7,6 +7,8 @@ .nf npm bugs npm bugs (with no args in a package dir) + +aliases: issues .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 0f39f09eb473c9..3a2d485c88ccf0 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -13,6 +13,8 @@ npm config edit npm c [set|get|delete|list] npm get npm set [\-\-global] + +aliases: c .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index af6344135010d1..a00d1beedec927 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -7,6 +7,8 @@ .nf npm dedupe [package names\.\.\.] npm ddp [package names\.\.\.] + +aliases: find\-dupes, ddp .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 056a5cd77d08aa..931278fec90d32 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -8,6 +8,8 @@ npm dist\-tag add @ [] npm dist\-tag rm npm dist\-tag ls [] + +aliases: dist\-tags .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 deleted file mode 100644 index 8b99c9af98ac92..00000000000000 --- a/deps/npm/man/man1/npm-install-test.1 +++ /dev/null @@ -1,32 +0,0 @@ -.TH "NPM" "" "February 2016" "" "" -.SH "NAME" -\fBnpm\fR -.SH SYNOPSIS -.P -.RS 2 -.nf -npm install\-test (with no args, in package dir) -npm install\-test [<@scope>/] -npm install\-test [<@scope>/]@ -npm install\-test [<@scope>/]@ -npm install\-test [<@scope>/]@ -npm install\-test -npm install\-test -npm install\-test - -alias: npm it -common options: [\-\-save|\-\-save\-dev|\-\-save\-optional] [\-\-save\-exact] [\-\-dry\-run] -.fi -.RE -.SH DESCRIPTION -.P -This command runs an \fBnpm install\fP followed immediately by an \fBnpm test\fP\|\. It -takes exactly the same arguments as \fBnpm install\fP\|\. -.SH SEE ALSO -.RS 0 -.IP \(bu 2 -npm help install -.IP \(bu 2 -npm help test - -.RE diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index 8555ffea5a2cd4..f2b12d2c089be3 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -9,7 +9,7 @@ npm install (with no args in a package dir) npm install npm install npm install -npm install [@/] [\-\-save|\-\-save\-dev|\-\-save\-optional] [\-\-save\-exact] +npm install [@/] [\-\-save|\-\-save\-dev|\-\-save\-optional] [\-\-save\-exact] [\-\-save\-bundle] npm install [@/]@ npm install [@/]@ npm install [@/]@ @@ -106,14 +106,13 @@ after packing it up into a tarball (b)\. .IP \(bu 2 \fB\-\-save\-optional\fP: Package will appear in your \fBoptionalDependencies\fP\|\. When using any of the above options to save dependencies to your -package\.json, there is an additional, optional flag: +package\.json, there are two additional, optional flags: .IP \(bu 2 \fB\-\-save\-exact\fP: Saved dependencies will be configured with an exact version rather than using npm's default semver range operator\. -\fB\fP is optional\. The package will be downloaded from the registry -associated with the specified scope\. If no registry is associated with -the given scope the default registry is assumed\. See npm help 7 \fBnpm\-scope\fP\|\. +.IP \(bu 2 +\fB\-B, \-\-save\-bundle\fP: Saved dependencies will also be added to your \fBbundleDependencies\fP list\. Note: if you do not include the @\-symbol on your scope name, npm will interpret this as a GitHub repository instead, see below\. Scopes names must also be followed by a slash\. @@ -127,6 +126,7 @@ npm install @myorg/privatepackage npm install node\-tap \-\-save\-dev npm install dtrace\-provider \-\-save\-optional npm install readable\-stream \-\-save \-\-save\-exact +npm install ansi\-regex \-\-save \-\-save\-bundle .fi .RE diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index f5c2e3f949144e..73e2a52859f0ad 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -14,12 +14,13 @@ npm ln (with any of the previous argument usage) .P Package linking is a two\-step process\. .P -First, \fBnpm link\fP in a package folder will create a globally\-installed -symbolic link from \fBprefix/package\-name\fP to the current folder (see -npm help 7 \fBnpm\-config\fP for the value of \fBprefix\fP)\. +First, \fBnpm link\fP in a package folder will create a symlink in the global folder +\fB{prefix}/lib/node_modules/\fP that links to the package where the \fBnpm +link\fP command was executed\. (see npm help 7 \fBnpm\-config\fP for the value of \fBprefix\fP)\. .P Next, in some other location, \fBnpm link package\-name\fP will create a -symlink from the local \fBnode_modules\fP folder to the global symlink\. +symbolic link from globally\-installed \fBpackage\-name\fP to \fBnode_modules/\fP +of the current folder\. .P Note that \fBpackage\-name\fP is taken from \fBpackage\.json\fP, not from directory name\. @@ -46,7 +47,7 @@ npm link redis # link\-install the package .P Now, any changes to ~/projects/node\-redis will be reflected in ~/projects/node\-bloggy/node_modules/node\-redis/\. Note that the link should -be to the package name, not the directory name for that package\. +be to the package name, not the directory name for that package\. .P You may also shortcut the two steps in one\. For example, to do the above use\-case in a shorter way: diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index 583be070b1864f..ca07364796dc41 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -23,7 +23,7 @@ For example, running \fBnpm ls promzard\fP in npm's source tree will show: .P .RS 2 .nf -npm@2.14.20 /path/to/npm +npm@2.15.0 /path/to/npm └─┬ init\-package\-json@0\.0\.4 └── promzard@0\.1\.5 .fi diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index fa70604268ae51..85d924f68af499 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -8,6 +8,8 @@ npm owner ls npm owner add npm owner rm + +aliases: author .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index f7c1b2af112d71..7afbbc28f9c31b 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -5,9 +5,9 @@ .P .RS 2 .nf -npm search [\-\-long] [search terms \.\.\.] -npm s [search terms \.\.\.] -npm se [search terms \.\.\.] +npm search [\-l|\-\-long] [search terms \.\.\.] + +aliases: s, se, find .fi .RE .SH DESCRIPTION @@ -31,6 +31,18 @@ Display full package descriptions and other long text across multiple lines\. When disabled (default) search results are truncated to fit neatly on a single line\. Modules with extremely long names will fall on multiple lines\. +.SS registry +.RS 0 +.IP \(bu 2 +Default: https://registry\.npmjs\.org/ +.IP \(bu 2 +Type : url + +.RE +.P +Search the specified registry for modules\. If you have configured npm to point to a different default registry, +such as your internal private module repository, \fBnpm search\fP will default to that registry when searching\. +Pass a different registry url such as the default above in order to override this setting\. .SH SEE ALSO .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index b72ed3a1e5518e..6e35b5f540d2c7 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -6,7 +6,8 @@ .RS 2 .nf npm test [\-\- ] - npm tst [\-\- ] + + aliases: t, tst .fi .RE .SH DESCRIPTION diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index 70887dda7fa4d0..966488dfb99eab 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -6,6 +6,8 @@ .RS 2 .nf npm update [\-g] [ [ \.\.\.]] + +aliases: up, upgrade .fi .RE .SH DESCRIPTION @@ -25,18 +27,7 @@ or local) will be updated\. .P As of \fBnpm@2\.6\.1\fP, the \fBnpm update\fP will only inspect top\-level packages\. Prior versions of \fBnpm\fP would also recursively inspect all dependencies\. -To get the old behavior, use \fBnpm \-\-depth Infinity update\fP, but be warned that -simultaneous asynchronous update of all packages, including \fBnpm\fP itself -and packages that \fBnpm\fP depends on, often causes problems up to and including -the uninstallation of \fBnpm\fP itself\. -.P -To restore a missing \fBnpm\fP, use the command: -.P -.RS 2 -.nf -curl \-L https://npmjs\.com/install\.sh | sh -.fi -.RE +To get the old behavior, use \fBnpm \-\-depth 9999 update\fP\|\. .SH EXAMPLES .P IMPORTANT VERSION NOTE: these examples assume \fBnpm@2\.6\.1\fP or later\. For @@ -50,7 +41,7 @@ on dependencies, \fBdep1\fP (\fBdep2\fP, \.\. etc\.)\. The published versions o .nf { "dist\-tags": { "latest": "1\.2\.2" }, - "versions": { + "versions": [ "1\.2\.2", "1\.2\.1", "1\.2\.0", @@ -60,7 +51,7 @@ on dependencies, \fBdep1\fP (\fBdep2\fP, \.\. etc\.)\. The published versions o "0\.4\.1", "0\.4\.0", "0\.2\.0" - } + ] } .fi .RE diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index faa648a1c178d1..887dbe2f43220e 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -10,7 +10,7 @@ npm [args] .RE .SH VERSION .P -2.14.20 +2.15.0 .SH DESCRIPTION .P npm is the package manager for the Node JavaScript platform\. It puts @@ -152,13 +152,13 @@ file in the "doc" folder\. (Don't worry about generating the man page\.) Contributors are listed in npm's \fBpackage\.json\fP file\. You can view them easily by doing \fBnpm view npm contributors\fP\|\. .P -If you would like to contribute, but don't know what to work on, check -the issues list or ask on the mailing list\. +If you would like to contribute, but don't know what to work on, read +the contributing guidelines and check the issues list\. .RS 0 .IP \(bu 2 -https://github\.com/npm/npm/issues +https://github\.com/npm/npm/wiki/Contributing\-Guidelines .IP \(bu 2 -npm\-@googlegroups\.com +https://github\.com/npm/npm/issues .RE .SH BUGS @@ -168,9 +168,6 @@ When you find issues, please report them: .IP \(bu 2 web: https://github\.com/npm/npm/issues -.IP \(bu 2 -email: -npm\-@googlegroups\.com .RE .P diff --git a/deps/npm/man/man3/npm.3 b/deps/npm/man/man3/npm.3 index 7fa67dbcb2ad67..9142d46a32d9ca 100644 --- a/deps/npm/man/man3/npm.3 +++ b/deps/npm/man/man3/npm.3 @@ -20,7 +20,7 @@ npm\.load([configObject, ]function (er, npm) { .RE .SH VERSION .P -2.14.20 +2.15.0 .SH DESCRIPTION .P This is the API documentation for npm\. diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index 2cfab7b03e119f..5d00c21b561145 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -399,6 +399,10 @@ maybe, someday\. .SS directories\.example .P Put example scripts in here\. Someday, it might be exposed in some clever way\. +.SS directories\.test +.P +Put your tests in here\. It is currently not exposed, but it might be in the +future\. .SH repository .P Specify the place where your code lives\. This is helpful for people who @@ -696,7 +700,26 @@ with every 1\.x version of the host package, use \fB"^1\.0"\fP or \fB"1\.x"\fP t this\. If you depend on features introduced in 1\.5\.2, use \fB">= 1\.5\.2 < 2"\fP\|\. .SH bundledDependencies .P -Array of package names that will be bundled when publishing the package\. +This defines an array of package names that will be bundled when publishing the package\. +.P +In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the \fBbundledDependencies\fP array and executing \fBnpm pack\fP\|\. +.P +For example: +If we define a package\.json like this: +.P +.RS 2 +.nf +{ + "name": "awesome\-web\-framework", + "version": "1\.0\.0", + "bundledDependencies": [ + 'renderized', 'super\-streams' + ] +} +.fi +.RE +.P +we can obtain \fBawesome\-web\-framework\-1\.0\.0\.tgz\fP file by running \fBnpm pack\fP\|\. This file contains the dependencies \fBrenderized\fP and \fBsuper\-streams\fP which can be installed in a new project by executing \fBnpm install awesome\-web\-framework\-1\.0\.0\.tgz\fP\|\. .P If this is spelled \fB"bundleDependencies"\fP, then that is also honored\. .SH optionalDependencies diff --git a/deps/npm/man/man5/package.json.5 b/deps/npm/man/man5/package.json.5 index 2cfab7b03e119f..5d00c21b561145 100644 --- a/deps/npm/man/man5/package.json.5 +++ b/deps/npm/man/man5/package.json.5 @@ -399,6 +399,10 @@ maybe, someday\. .SS directories\.example .P Put example scripts in here\. Someday, it might be exposed in some clever way\. +.SS directories\.test +.P +Put your tests in here\. It is currently not exposed, but it might be in the +future\. .SH repository .P Specify the place where your code lives\. This is helpful for people who @@ -696,7 +700,26 @@ with every 1\.x version of the host package, use \fB"^1\.0"\fP or \fB"1\.x"\fP t this\. If you depend on features introduced in 1\.5\.2, use \fB">= 1\.5\.2 < 2"\fP\|\. .SH bundledDependencies .P -Array of package names that will be bundled when publishing the package\. +This defines an array of package names that will be bundled when publishing the package\. +.P +In cases where you need to preserve npm packages locally or have them available through a single file download, you can bundle the packages in a tarball file by specifying the package names in the \fBbundledDependencies\fP array and executing \fBnpm pack\fP\|\. +.P +For example: +If we define a package\.json like this: +.P +.RS 2 +.nf +{ + "name": "awesome\-web\-framework", + "version": "1\.0\.0", + "bundledDependencies": [ + 'renderized', 'super\-streams' + ] +} +.fi +.RE +.P +we can obtain \fBawesome\-web\-framework\-1\.0\.0\.tgz\fP file by running \fBnpm pack\fP\|\. This file contains the dependencies \fBrenderized\fP and \fBsuper\-streams\fP which can be installed in a new project by executing \fBnpm install awesome\-web\-framework\-1\.0\.0\.tgz\fP\|\. .P If this is spelled \fB"bundleDependencies"\fP, then that is also honored\. .SH optionalDependencies diff --git a/deps/npm/man/man7/npm-config.7 b/deps/npm/man/man7/npm-config.7 index c60d8d94415638..77ca38136c4f6b 100644 --- a/deps/npm/man/man7/npm-config.7 +++ b/deps/npm/man/man7/npm-config.7 @@ -735,6 +735,17 @@ Type: Boolean .RE .P Show extended information in \fBnpm ls\fP and \fBnpm search\fP\|\. +.SS maxsockets +.RS 0 +.IP \(bu 2 +Default: 50 +.IP \(bu 2 +Type: Number + +.RE +.P +The maximum number of connections to use per origin (protocol/host/port +combination)\. Passed to the \fBhttp\fP \fBAgent\fP used to make the request\. .SS message .RS 0 .IP \(bu 2 diff --git a/deps/npm/man/man7/npm-scope.7 b/deps/npm/man/man7/npm-scope.7 index 4a97a8536ba64d..1255f57d65b49c 100644 --- a/deps/npm/man/man7/npm-scope.7 +++ b/deps/npm/man/man7/npm-scope.7 @@ -67,7 +67,8 @@ just specifying to require the module \fBmypackage\fP in the folder called \fB@m Scoped packages can be published to any registry that supports them, including the public npm registry\. .P -(As of 2015\-04\-19, the public npm registry \fBdoes\fR support scoped packages) +(As of 2015\-04\-19, and with npm 2\.0 or newer, the public npm registry \fBdoes\fR +support scoped packages) .P If you wish, you may associate a scope with a registry; see below\. .SS Publishing public scoped packages to the public npm registry diff --git a/deps/npm/node_modules/glob/README.md b/deps/npm/node_modules/glob/README.md index 063cf950ac0c29..9dd9384fa143c3 100644 --- a/deps/npm/node_modules/glob/README.md +++ b/deps/npm/node_modules/glob/README.md @@ -1,9 +1,9 @@ -[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) - # Glob Match files using the patterns the shell uses, like stars and stuff. +[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master) + This is a glob implementation in JavaScript. It uses the `minimatch` library to do its matching. @@ -11,6 +11,12 @@ library to do its matching. ## Usage +Install with npm + +``` +npm i glob +``` + ```javascript var glob = require("glob") @@ -74,14 +80,6 @@ slashes in it, then it will seek for any file anywhere in the tree with a matching basename. For example, `*.js` would match `test/simple/basic.js`. -### Negation - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird, and for the time being, this should be -avoided. The behavior is deprecated in version 5, and will be removed -entirely in version 6. - ### Empty Sets If no matching files are found, then an empty array is returned. This @@ -114,19 +112,19 @@ options. ## glob(pattern, [options], cb) -* `pattern` {String} Pattern to be matched -* `options` {Object} -* `cb` {Function} - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* `cb` `{Function}` + * `err` `{Error | null}` + * `matches` `{Array}` filenames found matching the pattern Perform an asynchronous glob search. ## glob.sync(pattern, [options]) -* `pattern` {String} Pattern to be matched -* `options` {Object} -* return: {Array} filenames found matching the pattern +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* return: `{Array}` filenames found matching the pattern Perform a synchronous glob search. @@ -144,11 +142,11 @@ immediately. ### new glob.Glob(pattern, [options], [cb]) -* `pattern` {String} pattern to search for -* `options` {Object} -* `cb` {Function} Called when an error occurs, or matches are found - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern +* `pattern` `{String}` pattern to search for +* `options` `{Object}` +* `cb` `{Function}` Called when an error occurs, or matches are found + * `err` `{Error | null}` + * `matches` `{Array}` filenames found matching the pattern Note that if the `sync` flag is set in the options, then matches will be immediately available on the `g.found` member. @@ -164,8 +162,8 @@ be immediately available on the `g.found` member. values: * `false` - Path does not exist * `true` - Path exists - * `'DIR'` - Path exists, and is not a directory - * `'FILE'` - Path exists, and is a directory + * `'FILE'` - Path exists, and is not a directory + * `'DIR'` - Path exists, and is a directory * `[file, entries, ...]` - Path exists, is a directory, and the array value is the results of `fs.readdir` * `statCache` Cache of `fs.stat` results, to prevent statting the same @@ -182,7 +180,8 @@ be immediately available on the `g.found` member. matches found. If the `nonull` option is set, and no match was found, then the `matches` list contains the original pattern. The matches are sorted, unless the `nosort` flag is set. -* `match` Every time a match is found, this is emitted with the matched. +* `match` Every time a match is found, this is emitted with the specific + thing that matched. It is not deduplicated or resolved to a realpath. * `error` Emitted when an unexpected error is encountered, or whenever any fs error occurs if `options.strict` is set. * `abort` When `abort()` is called, this event is raised. @@ -264,7 +263,9 @@ the filesystem. equivalent to `**/*.js`, matching all js files in all directories. * `nodir` Do not match directories, only files. (Note: to match *only* directories, simply put a `/` at the end of the pattern.) -* `ignore` Add a pattern or an array of patterns to exclude matches. +* `ignore` Add a pattern or an array of glob patterns to exclude matches. + Note: `ignore` patterns are *always* in `dot:true` mode, regardless + of any other settings. * `follow` Follow symlinked directories when expanding `**` patterns. Note that this can result in a lot of duplicate references in the presence of cyclic links. @@ -272,10 +273,6 @@ the filesystem. In the case of a symlink that cannot be resolved, the full absolute path to the matched entry is returned (though it will usually be a broken symlink) -* `nonegate` Suppress deprecated `negate` behavior. (See below.) - Default=true -* `nocomment` Suppress deprecated `comment` behavior. (See below.) - Default=true ## Comparisons to other fnmatch/glob implementations @@ -308,22 +305,13 @@ checked for validity. Since those two are valid, matching proceeds. ### Comments and Negation -**Note**: In version 5 of this module, negation and comments are -**disabled** by default. You can explicitly set `nonegate:false` or -`nocomment:false` to re-enable them. They are going away entirely in -version 6. - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird. It is better to use the `ignore` option -to set a pattern or set of patterns to exclude from matches. If you -want the "everything except *x*" type of behavior, you can use `**` as -the main pattern, and set an `ignore` for the things to exclude. - -The comments feature is added in minimatch, primarily to more easily -support use cases like ignore files, where a `#` at the start of a -line makes the pattern "empty". However, in the context of a -straightforward filesystem globber, "comments" don't make much sense. +Previously, this module let you mark a pattern as a "comment" if it +started with a `#` character, or a "negated" pattern if it started +with a `!` character. + +These options were deprecated in version 5, and removed in version 6. + +To specify things that should not match, use the `ignore` option. ## Windows diff --git a/deps/npm/node_modules/glob/changelog.md b/deps/npm/node_modules/glob/changelog.md new file mode 100644 index 00000000000000..41636771e3a7cd --- /dev/null +++ b/deps/npm/node_modules/glob/changelog.md @@ -0,0 +1,67 @@ +## 7.0 + +- Raise error if `options.cwd` is specified, and not a directory + +## 6.0 + +- Remove comment and negation pattern support +- Ignore patterns are always in `dot:true` mode + +## 5.0 + +- Deprecate comment and negation patterns +- Fix regression in `mark` and `nodir` options from making all cache + keys absolute path. +- Abort if `fs.readdir` returns an error that's unexpected +- Don't emit `match` events for ignored items +- Treat ENOTSUP like ENOTDIR in readdir + +## 4.5 + +- Add `options.follow` to always follow directory symlinks in globstar +- Add `options.realpath` to call `fs.realpath` on all results +- Always cache based on absolute path + +## 4.4 + +- Add `options.ignore` +- Fix handling of broken symlinks + +## 4.3 + +- Bump minimatch to 2.x +- Pass all tests on Windows + +## 4.2 + +- Add `glob.hasMagic` function +- Add `options.nodir` flag + +## 4.1 + +- Refactor sync and async implementations for performance +- Throw if callback provided to sync glob function +- Treat symbolic links in globstar results the same as Bash 4.3 + +## 4.0 + +- Use `^` for dependency versions (bumped major because this breaks + older npm versions) +- Ensure callbacks are only ever called once +- switch to ISC license + +## 3.x + +- Rewrite in JavaScript +- Add support for setting root, cwd, and windows support +- Cache many fs calls +- Add globstar support +- emit match events + +## 2.x + +- Use `glob.h` and `fnmatch.h` from NetBSD + +## 1.x + +- `glob.h` static binding. diff --git a/deps/npm/node_modules/glob/common.js b/deps/npm/node_modules/glob/common.js index e36a631cab20c4..58dc41e6632160 100644 --- a/deps/npm/node_modules/glob/common.js +++ b/deps/npm/node_modules/glob/common.js @@ -36,15 +36,16 @@ function setupIgnores (self, options) { } } +// ignore patterns are always in dot:true mode. function ignoreMap (pattern) { var gmatcher = null if (pattern.slice(-3) === '/**') { var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern) + gmatcher = new Minimatch(gpattern, { dot: true }) } return { - matcher: new Minimatch(pattern), + matcher: new Minimatch(pattern, { dot: true }), gmatcher: gmatcher } } @@ -92,8 +93,8 @@ function setopts (self, pattern, options) { if (!ownProp(options, "cwd")) self.cwd = cwd else { - self.cwd = options.cwd - self.changedCwd = path.resolve(options.cwd) !== cwd + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd } self.root = options.root || path.resolve(self.cwd, "/") @@ -101,37 +102,18 @@ function setopts (self, pattern, options) { if (process.platform === "win32") self.root = self.root.replace(/\\/g, "/") + self.cwdAbs = makeAbs(self, self.cwd) self.nomount = !!options.nomount - // disable comments and negation unless the user explicitly - // passes in false as the option. - options.nonegate = options.nonegate === false ? false : true - options.nocomment = options.nocomment === false ? false : true - deprecationWarning(options) + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true self.minimatch = new Minimatch(pattern, options) self.options = self.minimatch.options } -// TODO(isaacs): remove entirely in v6 -// exported to reset in tests -exports.deprecationWarned -function deprecationWarning(options) { - if (!options.nonegate || !options.nocomment) { - if (process.noDeprecation !== true && !exports.deprecationWarned) { - var msg = 'glob WARNING: comments and negation will be disabled in v6' - if (process.throwDeprecation) - throw new Error(msg) - else if (process.traceDeprecation) - console.trace(msg) - else - console.error(msg) - - exports.deprecationWarned = true - } - } -} - function finish (self) { var nou = self.nounique var all = nou ? [] : Object.create(null) @@ -172,7 +154,11 @@ function finish (self) { } if (self.nodir) { all = all.filter(function (e) { - return !(/\/$/.test(e)) + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir }) } } @@ -220,6 +206,10 @@ function makeAbs (self, f) { } else { abs = path.resolve(f) } + + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') + return abs } diff --git a/deps/npm/node_modules/glob/glob.js b/deps/npm/node_modules/glob/glob.js index 022d2ac8c6e58b..4dba04adec43c4 100644 --- a/deps/npm/node_modules/glob/glob.js +++ b/deps/npm/node_modules/glob/glob.js @@ -80,8 +80,21 @@ var GlobSync = glob.GlobSync = globSync.GlobSync // old api surface glob.glob = glob +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } + + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin +} + glob.hasMagic = function (pattern, options_) { - var options = util._extend({}, options_) + var options = extend({}, options_) options.noprocess = true var g = new Glob(pattern, options) @@ -149,14 +162,23 @@ function Glob (pattern, options, cb) { if (n === 0) return done() + var sync = true for (var i = 0; i < n; i ++) { this._process(this.minimatch.set[i], i, false, done) } + sync = false function done () { --self._processing - if (self._processing <= 0) - self._finish() + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } } } @@ -558,7 +580,15 @@ Glob.prototype._readdirError = function (f, er, cb) { switch (er.code) { case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } break case 'ENOENT': // not terribly unusual diff --git a/deps/npm/node_modules/glob/package.json b/deps/npm/node_modules/glob/package.json index 2949b83be0637f..4d5d7f791d6eab 100644 --- a/deps/npm/node_modules/glob/package.json +++ b/deps/npm/node_modules/glob/package.json @@ -6,7 +6,7 @@ }, "name": "glob", "description": "a little globber", - "version": "5.0.15", + "version": "7.0.3", "repository": { "type": "git", "url": "git://github.com/isaacs/node-glob.git" @@ -30,7 +30,7 @@ "devDependencies": { "mkdirp": "0", "rimraf": "^2.2.8", - "tap": "^1.1.4", + "tap": "^5.7.0", "tick": "0.0.6" }, "scripts": { @@ -43,23 +43,23 @@ "benchclean": "node benchclean.js" }, "license": "ISC", - "gitHead": "3a7e71d453dd80e75b196fd262dd23ed54beeceb", + "gitHead": "2fc2278ab857c7df117213a2fb431de090be6353", "bugs": { "url": "https://github.com/isaacs/node-glob/issues" }, "homepage": "https://github.com/isaacs/node-glob#readme", - "_id": "glob@5.0.15", - "_shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", - "_from": "glob@5.0.15", - "_npmVersion": "3.3.2", - "_nodeVersion": "4.0.0", + "_id": "glob@7.0.3", + "_shasum": "0aa235931a4a96ac13d60ffac2fb877bd6ed4f58", + "_from": "glob@7.0.3", + "_npmVersion": "3.7.3", + "_nodeVersion": "5.6.0", "_npmUser": { "name": "isaacs", - "email": "isaacs@npmjs.com" + "email": "i@izs.me" }, "dist": { - "shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", - "tarball": "http://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + "shasum": "0aa235931a4a96ac13d60ffac2fb877bd6ed4f58", + "tarball": "http://registry.npmjs.org/glob/-/glob-7.0.3.tgz" }, "maintainers": [ { @@ -67,7 +67,10 @@ "email": "i@izs.me" } ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/glob-7.0.3.tgz_1457166529288_0.7840580905321985" + }, "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz" } diff --git a/deps/npm/node_modules/glob/sync.js b/deps/npm/node_modules/glob/sync.js index 09883d2ce0c9de..301577ab5f228f 100644 --- a/deps/npm/node_modules/glob/sync.js +++ b/deps/npm/node_modules/glob/sync.js @@ -305,7 +305,14 @@ GlobSync.prototype._readdirError = function (f, er) { switch (er.code) { case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } break case 'ENOENT': // not terribly unusual diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py index ad6eff6d17b17d..bb9eb5f4b96775 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py @@ -164,7 +164,7 @@ def Write(self, qualified_target, relative_target, base_path, output_filename, if self.toolset == 'host': self.WriteLn('LOCAL_IS_HOST_MODULE := true') self.WriteLn('LOCAL_MULTILIB := $(GYP_HOST_MULTILIB)') - else: + elif sdk_version > 0: self.WriteLn('LOCAL_MODULE_TARGET_ARCH := ' '$(TARGET_$(GYP_VAR_PREFIX)ARCH)') self.WriteLn('LOCAL_SDK_VERSION := %s' % sdk_version) @@ -965,7 +965,7 @@ def GenerateOutput(target_list, target_dicts, data, params): builddir_name = generator_flags.get('output_dir', 'out') limit_to_target_all = generator_flags.get('limit_to_target_all', False) write_alias_targets = generator_flags.get('write_alias_targets', True) - sdk_version = generator_flags.get('aosp_sdk_version', 19) + sdk_version = generator_flags.get('aosp_sdk_version', 0) android_top_dir = os.environ.get('ANDROID_BUILD_TOP') assert android_top_dir, '$ANDROID_BUILD_TOP not set; you need to run lunch.' diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json b/deps/npm/node_modules/node-gyp/node_modules/glob/package.json index ad70fb110ce271..434e4696f8fb15 100644 --- a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json +++ b/deps/npm/node_modules/node-gyp/node_modules/glob/package.json @@ -67,5 +67,6 @@ "tarball": "http://registry.npmjs.org/glob/-/glob-4.5.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz" + "_resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json index b12c4a074f739b..253335e6234907 100644 --- a/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json +++ b/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json @@ -43,5 +43,6 @@ "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/package.json index 6d7c5e1048be04..2d403b6b2f2f12 100644 --- a/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/package.json +++ b/deps/npm/node_modules/node-gyp/node_modules/path-array/node_modules/array-index/package.json @@ -55,5 +55,6 @@ "tarball": "http://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" + "_resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/node-gyp/node_modules/path-array/package.json b/deps/npm/node_modules/node-gyp/node_modules/path-array/package.json index a9604065674615..974703c2eafbca 100644 --- a/deps/npm/node_modules/node-gyp/node_modules/path-array/package.json +++ b/deps/npm/node_modules/node-gyp/node_modules/path-array/package.json @@ -52,5 +52,6 @@ "tarball": "http://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" + "_resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json index 2c285300a89fe3..aedb6ce63dbf42 100644 --- a/deps/npm/node_modules/node-gyp/package.json +++ b/deps/npm/node_modules/node-gyp/package.json @@ -11,7 +11,7 @@ "bindings", "gyp" ], - "version": "3.3.0", + "version": "3.3.1", "installVersion": 9, "author": { "name": "Nathan Rajlich", @@ -52,19 +52,19 @@ "scripts": { "test": "tape test/test-*" }, - "gitHead": "7b10467b57dc632d358917decbeea94fd1172282", + "gitHead": "1dcf356ca7b658789447108b29a985c00ffcf0f5", "bugs": { "url": "https://github.com/nodejs/node-gyp/issues" }, - "homepage": "https://github.com/nodejs/node-gyp", - "_id": "node-gyp@3.3.0", - "_shasum": "7cc676b72d0be31dc977fb3c93539cab7adeff1e", - "_from": "node-gyp@3.3.0", + "homepage": "https://github.com/nodejs/node-gyp#readme", + "_id": "node-gyp@3.3.1", + "_shasum": "80f7b6d7c2f9c0495ba42c518a670c99bdf6e4a0", + "_from": "node-gyp@3.3.1", "_npmVersion": "3.3.12", - "_nodeVersion": "5.3.0", + "_nodeVersion": "6.0.0-pre", "_npmUser": { - "name": "rvagg", - "email": "rod@vagg.org" + "name": "bnoordhuis", + "email": "info@bnoordhuis.nl" }, "maintainers": [ { @@ -93,13 +93,13 @@ } ], "dist": { - "shasum": "7cc676b72d0be31dc977fb3c93539cab7adeff1e", - "tarball": "http://registry.npmjs.org/node-gyp/-/node-gyp-3.3.0.tgz" + "shasum": "80f7b6d7c2f9c0495ba42c518a670c99bdf6e4a0", + "tarball": "http://registry.npmjs.org/node-gyp/-/node-gyp-3.3.1.tgz" }, "_npmOperationalInternal": { - "host": "packages-6-west.internal.npmjs.com", - "tmp": "tmp/node-gyp-3.3.0.tgz_1455598883163_0.7978834484238178" + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/node-gyp-3.3.1.tgz_1457115144174_0.4018901875242591" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.3.0.tgz" + "_resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.3.1.tgz" } diff --git a/deps/npm/node_modules/npm-registry-client/README.md b/deps/npm/node_modules/npm-registry-client/README.md index fb3226cf401b5b..2caa3643708f80 100644 --- a/deps/npm/node_modules/npm-registry-client/README.md +++ b/deps/npm/node_modules/npm-registry-client/README.md @@ -310,5 +310,9 @@ any): Default = `"latest"` * `couchToken` {Object} A token for use with [couch-login](https://npmjs.org/package/couch-login). -* `sessionToken` {string} A random identifier for this set of client requests. +* `sessionToken` {String} A random identifier for this set of client requests. Default = 8 random hexadecimal bytes. +* `maxSockets` {Number} The maximum number of connections that will be open per + origin (unique combination of protocol:host:port). Passed to the + [httpAgent](https://nodejs.org/api/http.html#http_agent_maxsockets). + Default = 50 diff --git a/deps/npm/node_modules/npm-registry-client/index.js b/deps/npm/node_modules/npm-registry-client/index.js index 9b99a23738f103..a199801f98da99 100644 --- a/deps/npm/node_modules/npm-registry-client/index.js +++ b/deps/npm/node_modules/npm-registry-client/index.js @@ -39,6 +39,7 @@ function RegClient (config) { if (typeof this.config.retry.factor !== 'number') this.config.retry.factor = 10 if (typeof this.config.retry.minTimeout !== 'number') this.config.retry.minTimeout = 10000 if (typeof this.config.retry.maxTimeout !== 'number') this.config.retry.maxTimeout = 60000 + if (typeof this.config.maxSockets !== 'number') this.config.maxSockets = 50 this.config.userAgent = this.config.userAgent || 'node/' + process.version this.config.defaultTag = this.config.defaultTag || 'latest' diff --git a/deps/npm/node_modules/npm-registry-client/lib/initialize.js b/deps/npm/node_modules/npm-registry-client/lib/initialize.js index 4a2160fbbdad8a..3c12697f03cba6 100644 --- a/deps/npm/node_modules/npm-registry-client/lib/initialize.js +++ b/deps/npm/node_modules/npm-registry-client/lib/initialize.js @@ -4,9 +4,6 @@ var HttpsAgent = require('https').Agent var pkg = require('../package.json') -var httpAgent -var httpsAgent - module.exports = initialize function initialize (uri, method, accept, headers) { @@ -24,7 +21,7 @@ function initialize (uri, method, accept, headers) { cert: this.config.ssl.certificate, key: this.config.ssl.key, ca: this.config.ssl.ca, - agent: getAgent(uri.protocol, this.config) + agent: getAgent.call(this, uri.protocol) } // allow explicit disabling of proxy in environment via CLI @@ -55,28 +52,30 @@ function initialize (uri, method, accept, headers) { return opts } -function getAgent (protocol, config) { +function getAgent (protocol) { if (protocol === 'https:') { - if (!httpsAgent) { - httpsAgent = new HttpsAgent({ + if (!this.httpsAgent) { + this.httpsAgent = new HttpsAgent({ keepAlive: true, - localAddress: config.proxy.localAddress, - rejectUnauthorized: config.ssl.strict, - ca: config.ssl.ca, - cert: config.ssl.certificate, - key: config.ssl.key + maxSockets: this.config.maxSockets, + localAddress: this.config.proxy.localAddress, + rejectUnauthorized: this.config.ssl.strict, + ca: this.config.ssl.ca, + cert: this.config.ssl.certificate, + key: this.config.ssl.key }) } - return httpsAgent + return this.httpsAgent } else { - if (!httpAgent) { - httpAgent = new HttpAgent({ + if (!this.httpAgent) { + this.httpAgent = new HttpAgent({ keepAlive: true, - localAddress: config.proxy.localAddress + maxSockets: this.config.maxSockets, + localAddress: this.config.proxy.localAddress }) } - return httpAgent + return this.httpAgent } } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/doc/stream.markdown b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/doc/stream.markdown index bf544f9f2565f3..3988c0cbd0d9c9 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/doc/stream.markdown +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/doc/stream.markdown @@ -3,8 +3,7 @@ Stability: 2 - Stable A stream is an abstract interface implemented by various objects in -Node.js. For example a [request to an HTTP -server](https://iojs.org/dist/v5.0.0/doc/api/http.html#http_http_incomingmessage) is a stream, as is +Node.js. For example a [request to an HTTP server][] is a stream, as is [stdout][]. Streams are readable, writable, or both. All streams are instances of [EventEmitter][] @@ -93,6 +92,17 @@ server.listen(1337); // error: Unexpected token o ``` +### Class: stream.Duplex + +Duplex streams are streams that implement both the [Readable][] and +[Writable][] interfaces. See above for usage. + +Examples of Duplex streams include: + +* [tcp sockets][] +* [zlib streams][] +* [crypto streams][] + ### Class: stream.Readable @@ -136,61 +146,22 @@ destinations drain and ask for more data. Examples of readable streams include: -* [http responses, on the client](https://iojs.org/dist/v5.0.0/doc/api/http.html#http_http_incomingmessage) -* [http requests, on the server](https://iojs.org/dist/v5.0.0/doc/api/http.html#http_http_incomingmessage) -* [fs read streams](https://iojs.org/dist/v5.0.0/doc/api/fs.html#fs_class_fs_readstream) +* [http responses, on the client][] +* [http requests, on the server][] +* [fs read streams][] * [zlib streams][] * [crypto streams][] * [tcp sockets][] * [child process stdout and stderr][] * [process.stdin][] -#### Event: 'readable' - -When a chunk of data can be read from the stream, it will emit a -`'readable'` event. - -In some cases, listening for a `'readable'` event will cause some data -to be read into the internal buffer from the underlying system, if it -hadn't already. - -```javascript -var readable = getReadableStreamSomehow(); -readable.on('readable', function() { - // there is some data to read now -}); -``` - -Once the internal buffer is drained, a `readable` event will fire -again when more data is available. - -The `readable` event is not emitted in the "flowing" mode with the -sole exception of the last one, on end-of-stream. - -The 'readable' event indicates that the stream has new information: -either new data is available or the end of the stream has been reached. -In the former case, `.read()` will return that data. In the latter case, -`.read()` will return null. For instance, in the following example, `foo.txt` -is an empty file: - -```javascript -var fs = require('fs'); -var rr = fs.createReadStream('foo.txt'); -rr.on('readable', function() { - console.log('readable:', rr.read()); -}); -rr.on('end', function() { - console.log('end'); -}); -``` +#### Event: 'close' -The output of running this script is: +Emitted when the stream and any of its underlying resources (a file +descriptor, for example) have been closed. The event indicates that +no more events will be emitted, and no further computation will occur. -``` -bash-3.2$ node test.js -readable: null -end -``` +Not all streams will emit the 'close' event. #### Event: 'data' @@ -228,101 +199,75 @@ readable.on('end', function() { }); ``` -#### Event: 'close' - -Emitted when the stream and any of its underlying resources (a file -descriptor, for example) have been closed. The event indicates that -no more events will be emitted, and no further computation will occur. - -Not all streams will emit the 'close' event. - #### Event: 'error' * {Error Object} Emitted if there was an error receiving data. -#### readable.read([size]) - -* `size` {Number} Optional argument to specify how much data to read. -* Return {String | Buffer | null} - -The `read()` method pulls some data out of the internal buffer and -returns it. If there is no data available, then it will return -`null`. - -If you pass in a `size` argument, then it will return that many -bytes. If `size` bytes are not available, then it will return `null`, -unless we've ended, in which case it will return the data remaining -in the buffer. +#### Event: 'readable' -If you do not specify a `size` argument, then it will return all the -data in the internal buffer. +When a chunk of data can be read from the stream, it will emit a +`'readable'` event. -This method should only be called in paused mode. In flowing mode, -this method is called automatically until the internal buffer is -drained. +In some cases, listening for a `'readable'` event will cause some data +to be read into the internal buffer from the underlying system, if it +hadn't already. ```javascript var readable = getReadableStreamSomehow(); readable.on('readable', function() { - var chunk; - while (null !== (chunk = readable.read())) { - console.log('got %d bytes of data', chunk.length); - } + // there is some data to read now }); ``` -If this method returns a data chunk, then it will also trigger the -emission of a [`'data'` event][]. - -Note that calling `readable.read([size])` after the `end` event has been -triggered will return `null`. No runtime error will be raised. - -#### readable.setEncoding(encoding) - -* `encoding` {String} The encoding to use. -* Return: `this` +Once the internal buffer is drained, a `readable` event will fire +again when more data is available. -Call this function to cause the stream to return strings of the -specified encoding instead of Buffer objects. For example, if you do -`readable.setEncoding('utf8')`, then the output data will be -interpreted as UTF-8 data, and returned as strings. If you do -`readable.setEncoding('hex')`, then the data will be encoded in -hexadecimal string format. +The `readable` event is not emitted in the "flowing" mode with the +sole exception of the last one, on end-of-stream. -This properly handles multi-byte characters that would otherwise be -potentially mangled if you simply pulled the Buffers directly and -called `buf.toString(encoding)` on them. If you want to read the data -as strings, always use this method. +The 'readable' event indicates that the stream has new information: +either new data is available or the end of the stream has been reached. +In the former case, `.read()` will return that data. In the latter case, +`.read()` will return null. For instance, in the following example, `foo.txt` +is an empty file: ```javascript -var readable = getReadableStreamSomehow(); -readable.setEncoding('utf8'); -readable.on('data', function(chunk) { - assert.equal(typeof chunk, 'string'); - console.log('got %d characters of string data', chunk.length); +var fs = require('fs'); +var rr = fs.createReadStream('foo.txt'); +rr.on('readable', function() { + console.log('readable:', rr.read()); +}); +rr.on('end', function() { + console.log('end'); }); ``` -#### readable.resume() +The output of running this script is: -* Return: `this` +``` +bash-3.2$ node test.js +readable: null +end +``` -This method will cause the readable stream to resume emitting `data` -events. +#### readable.isPaused() -This method will switch the stream into flowing mode. If you do *not* -want to consume the data from a stream, but you *do* want to get to -its `end` event, you can call [`readable.resume()`][] to open the flow of -data. +* Return: `Boolean` + +This method returns whether or not the `readable` has been **explicitly** +paused by client code (using `readable.pause()` without a corresponding +`readable.resume()`). ```javascript -var readable = getReadableStreamSomehow(); -readable.resume(); -readable.on('end', function() { - console.log('got to the end, but did not read anything'); -}); +var readable = new stream.Readable + +readable.isPaused() // === false +readable.pause() +readable.isPaused() // === true +readable.resume() +readable.isPaused() // === false ``` #### readable.pause() @@ -346,24 +291,6 @@ readable.on('data', function(chunk) { }); ``` -#### readable.isPaused() - -* Return: `Boolean` - -This method returns whether or not the `readable` has been **explicitly** -paused by client code (using `readable.pause()` without a corresponding -`readable.resume()`). - -```javascript -var readable = new stream.Readable - -readable.isPaused() // === false -readable.pause() -readable.isPaused() // === true -readable.resume() -readable.isPaused() // === false -``` - #### readable.pipe(destination[, options]) * `destination` {[Writable][] Stream} The destination for writing data @@ -416,54 +343,137 @@ reader.on('end', function() { Note that `process.stderr` and `process.stdout` are never closed until the process exits, regardless of the specified options. -#### readable.unpipe([destination]) +#### readable.read([size]) -* `destination` {[Writable][] Stream} Optional specific stream to unpipe +* `size` {Number} Optional argument to specify how much data to read. +* Return {String | Buffer | null} -This method will remove the hooks set up for a previous `pipe()` call. +The `read()` method pulls some data out of the internal buffer and +returns it. If there is no data available, then it will return +`null`. -If the destination is not specified, then all pipes are removed. +If you pass in a `size` argument, then it will return that many +bytes. If `size` bytes are not available, then it will return `null`, +unless we've ended, in which case it will return the data remaining +in the buffer. -If the destination is specified, but no pipe is set up for it, then -this is a no-op. +If you do not specify a `size` argument, then it will return all the +data in the internal buffer. + +This method should only be called in paused mode. In flowing mode, +this method is called automatically until the internal buffer is +drained. ```javascript var readable = getReadableStreamSomehow(); -var writable = fs.createWriteStream('file.txt'); -// All the data from readable goes into 'file.txt', -// but only for the first second -readable.pipe(writable); -setTimeout(function() { - console.log('stop writing to file.txt'); - readable.unpipe(writable); - console.log('manually close the file stream'); - writable.end(); -}, 1000); +readable.on('readable', function() { + var chunk; + while (null !== (chunk = readable.read())) { + console.log('got %d bytes of data', chunk.length); + } +}); ``` -#### readable.unshift(chunk) +If this method returns a data chunk, then it will also trigger the +emission of a [`'data'` event][]. -* `chunk` {Buffer | String} Chunk of data to unshift onto the read queue +Note that calling `readable.read([size])` after the `end` event has been +triggered will return `null`. No runtime error will be raised. -This is useful in certain cases where a stream is being consumed by a -parser, which needs to "un-consume" some data that it has -optimistically pulled out of the source, so that the stream can be -passed on to some other party. +#### readable.resume() -Note that `stream.unshift(chunk)` cannot be called after the `end` event -has been triggered; a runtime error will be raised. +* Return: `this` -If you find that you must often call `stream.unshift(chunk)` in your -programs, consider implementing a [Transform][] stream instead. (See API -for Stream Implementors, below.) +This method will cause the readable stream to resume emitting `data` +events. + +This method will switch the stream into flowing mode. If you do *not* +want to consume the data from a stream, but you *do* want to get to +its `end` event, you can call [`readable.resume()`][] to open the flow of +data. ```javascript -// Pull off a header delimited by \n\n -// use unshift() if we get too much -// Call the callback with (error, header, stream) -var StringDecoder = require('string_decoder').StringDecoder; -function parseHeader(stream, callback) { - stream.on('error', callback); +var readable = getReadableStreamSomehow(); +readable.resume(); +readable.on('end', function() { + console.log('got to the end, but did not read anything'); +}); +``` + +#### readable.setEncoding(encoding) + +* `encoding` {String} The encoding to use. +* Return: `this` + +Call this function to cause the stream to return strings of the +specified encoding instead of Buffer objects. For example, if you do +`readable.setEncoding('utf8')`, then the output data will be +interpreted as UTF-8 data, and returned as strings. If you do +`readable.setEncoding('hex')`, then the data will be encoded in +hexadecimal string format. + +This properly handles multi-byte characters that would otherwise be +potentially mangled if you simply pulled the Buffers directly and +called `buf.toString(encoding)` on them. If you want to read the data +as strings, always use this method. + +```javascript +var readable = getReadableStreamSomehow(); +readable.setEncoding('utf8'); +readable.on('data', function(chunk) { + assert.equal(typeof chunk, 'string'); + console.log('got %d characters of string data', chunk.length); +}); +``` + +#### readable.unpipe([destination]) + +* `destination` {[Writable][] Stream} Optional specific stream to unpipe + +This method will remove the hooks set up for a previous `pipe()` call. + +If the destination is not specified, then all pipes are removed. + +If the destination is specified, but no pipe is set up for it, then +this is a no-op. + +```javascript +var readable = getReadableStreamSomehow(); +var writable = fs.createWriteStream('file.txt'); +// All the data from readable goes into 'file.txt', +// but only for the first second +readable.pipe(writable); +setTimeout(function() { + console.log('stop writing to file.txt'); + readable.unpipe(writable); + console.log('manually close the file stream'); + writable.end(); +}, 1000); +``` + +#### readable.unshift(chunk) + +* `chunk` {Buffer | String} Chunk of data to unshift onto the read queue + +This is useful in certain cases where a stream is being consumed by a +parser, which needs to "un-consume" some data that it has +optimistically pulled out of the source, so that the stream can be +passed on to some other party. + +Note that `stream.unshift(chunk)` cannot be called after the `end` event +has been triggered; a runtime error will be raised. + +If you find that you must often call `stream.unshift(chunk)` in your +programs, consider implementing a [Transform][] stream instead. (See API +for Stream Implementors, below.) + +```javascript +// Pull off a header delimited by \n\n +// use unshift() if we get too much +// Call the callback with (error, header, stream) +var StringDecoder = require('string_decoder').StringDecoder; +function parseHeader(stream, callback) { + stream.on('error', callback); stream.on('readable', onReadable); var decoder = new StringDecoder('utf8'); var header = ''; @@ -528,6 +538,16 @@ myReader.on('readable', function() { }); ``` +### Class: stream.Transform + +Transform streams are [Duplex][] streams where the output is in some way +computed from the input. They implement both the [Readable][] and +[Writable][] interfaces. See above for usage. + +Examples of Transform streams include: + +* [zlib streams][] +* [crypto streams][] ### Class: stream.Writable @@ -538,34 +558,15 @@ that you are writing data *to*. Examples of writable streams include: -* [http requests, on the client](https://iojs.org/dist/v5.0.0/doc/api/http.html#http_class_http_clientrequest) -* [http responses, on the server](https://iojs.org/dist/v5.0.0/doc/api/http.html#http_class_http_serverresponse) -* [fs write streams](https://iojs.org/dist/v5.0.0/doc/api/fs.html#fs_class_fs_writestream) +* [http requests, on the client][] +* [http responses, on the server][] +* [fs write streams][] * [zlib streams][] * [crypto streams][] * [tcp sockets][] -* [child process stdin](https://iojs.org/dist/v5.0.0/doc/api/child_process.html#child_process_child_stdin) +* [child process stdin][] * [process.stdout][], [process.stderr][] -#### writable.write(chunk[, encoding][, callback]) - -* `chunk` {String | Buffer} The data to write -* `encoding` {String} The encoding, if `chunk` is a String -* `callback` {Function} Callback for when this chunk of data is flushed -* Returns: {Boolean} True if the data was handled completely. - -This method writes some data to the underlying system, and calls the -supplied callback once the data has been fully handled. - -The return value indicates if you should continue writing right now. -If the data had to be buffered internally, then it will return -`false`. Otherwise, it will return `true`. - -This return value is strictly advisory. You MAY continue to write, -even if it returns `false`. However, writes will be buffered in -memory, so it is best not to do this excessively. Instead, wait for -the `drain` event before writing more data. - #### Event: 'drain' If a [`writable.write(chunk)`][] call returns false, then the `drain` @@ -600,40 +601,11 @@ function writeOneMillionTimes(writer, data, encoding, callback) { } ``` -#### writable.cork() - -Forces buffering of all writes. - -Buffered data will be flushed either at `.uncork()` or at `.end()` call. - -#### writable.uncork() - -Flush all data, buffered since `.cork()` call. - -#### writable.setDefaultEncoding(encoding) - -* `encoding` {String} The new default encoding - -Sets the default encoding for a writable stream. - -#### writable.end([chunk][, encoding][, callback]) - -* `chunk` {String | Buffer} Optional data to write -* `encoding` {String} The encoding, if `chunk` is a String -* `callback` {Function} Optional callback for when the stream is finished - -Call this method when no more data will be written to the stream. If -supplied, the callback is attached as a listener on the `finish` event. +#### Event: 'error' -Calling [`write()`][] after calling [`end()`][] will raise an error. +* {Error object} -```javascript -// write 'hello, ' and then end with 'world!' -var file = fs.createWriteStream('example.txt'); -file.write('hello, '); -file.end('world!'); -// writing more now is not allowed! -``` +Emitted if there was an error when writing or piping data. #### Event: 'finish' @@ -686,34 +658,59 @@ reader.pipe(writer); reader.unpipe(writer); ``` -#### Event: 'error' +#### writable.cork() -* {Error object} +Forces buffering of all writes. -Emitted if there was an error when writing or piping data. +Buffered data will be flushed either at `.uncork()` or at `.end()` call. -### Class: stream.Duplex +#### writable.end([chunk][, encoding][, callback]) -Duplex streams are streams that implement both the [Readable][] and -[Writable][] interfaces. See above for usage. +* `chunk` {String | Buffer} Optional data to write +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Optional callback for when the stream is finished -Examples of Duplex streams include: +Call this method when no more data will be written to the stream. If +supplied, the callback is attached as a listener on the `finish` event. -* [tcp sockets][] -* [zlib streams][] -* [crypto streams][] +Calling [`write()`][] after calling [`end()`][] will raise an error. +```javascript +// write 'hello, ' and then end with 'world!' +var file = fs.createWriteStream('example.txt'); +file.write('hello, '); +file.end('world!'); +// writing more now is not allowed! +``` -### Class: stream.Transform +#### writable.setDefaultEncoding(encoding) -Transform streams are [Duplex][] streams where the output is in some way -computed from the input. They implement both the [Readable][] and -[Writable][] interfaces. See above for usage. +* `encoding` {String} The new default encoding -Examples of Transform streams include: +Sets the default encoding for a writable stream. -* [zlib streams][] -* [crypto streams][] +#### writable.uncork() + +Flush all data, buffered since `.cork()` call. + +#### writable.write(chunk[, encoding][, callback]) + +* `chunk` {String | Buffer} The data to write +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Callback for when this chunk of data is flushed +* Returns: {Boolean} True if the data was handled completely. + +This method writes some data to the underlying system, and calls the +supplied callback once the data has been fully handled. + +The return value indicates if you should continue writing right now. +If the data had to be buffered internally, then it will return +`false`. Otherwise, it will return `true`. + +This return value is strictly advisory. You MAY continue to write, +even if it returns `false`. However, writes will be buffered in +memory, so it is best not to do this excessively. Instead, wait for +the `drain` event before writing more data. ## API for Stream Implementors @@ -796,6 +793,49 @@ methods described in [API for Stream Consumers][] above. Otherwise, you can potentially cause adverse side effects in programs that consume your streaming interfaces. +### Class: stream.Duplex + + + +A "duplex" stream is one that is both Readable and Writable, such as a +TCP socket connection. + +Note that `stream.Duplex` is an abstract class designed to be extended +with an underlying implementation of the `_read(size)` and +[`_write(chunk, encoding, callback)`][] methods as you would with a +Readable or Writable stream class. + +Since JavaScript doesn't have multiple prototypal inheritance, this +class prototypally inherits from Readable, and then parasitically from +Writable. It is thus up to the user to implement both the lowlevel +`_read(n)` method as well as the lowlevel +[`_write(chunk, encoding, callback)`][] method on extension duplex classes. + +#### new stream.Duplex(options) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `allowHalfOpen` {Boolean} Default=true. If set to `false`, then + the stream will automatically end the readable side when the + writable side ends and vice versa. + * `readableObjectMode` {Boolean} Default=false. Sets `objectMode` + for readable side of the stream. Has no effect if `objectMode` + is `true`. + * `writableObjectMode` {Boolean} Default=false. Sets `objectMode` + for writable side of the stream. Has no effect if `objectMode` + is `true`. + +In classes that extend the Duplex class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +### Class: stream.PassThrough + +This is a trivial implementation of a [Transform][] stream that simply +passes the input bytes across to the output. Its purpose is mainly +for examples and testing, but there are occasionally use cases where +it can come in handy as a building block for novel sorts of streams. + ### Class: stream.Readable @@ -807,15 +847,115 @@ Please see above under [API for Stream Consumers][] for how to consume streams in your programs. What follows is an explanation of how to implement Readable streams in your programs. -#### Example: A Counting Stream - - - -This is a basic example of a Readable stream. It emits the numerals -from 1 to 1,000,000 in ascending order, and then ends. +#### new stream.Readable([options]) -```javascript -var Readable = require('stream').Readable; +* `options` {Object} + * `highWaterMark` {Number} The maximum number of bytes to store in + the internal buffer before ceasing to read from the underlying + resource. Default=16kb, or 16 for `objectMode` streams + * `encoding` {String} If specified, then buffers will be decoded to + strings using the specified encoding. Default=null + * `objectMode` {Boolean} Whether this stream should behave + as a stream of objects. Meaning that stream.read(n) returns + a single value instead of a Buffer of size n. Default=false + +In classes that extend the Readable class, make sure to call the +Readable constructor so that the buffering settings can be properly +initialized. + +#### readable.\_read(size) + +* `size` {Number} Number of bytes to read asynchronously + +Note: **Implement this method, but do NOT call it directly.** + +This method is prefixed with an underscore because it is internal to the +class that defines it and should only be called by the internal Readable +class methods. All Readable stream implementations must provide a _read +method to fetch data from the underlying resource. + +When _read is called, if data is available from the resource, `_read` should +start pushing that data into the read queue by calling `this.push(dataChunk)`. +`_read` should continue reading from the resource and pushing data until push +returns false, at which point it should stop reading from the resource. Only +when _read is called again after it has stopped should it start reading +more data from the resource and pushing that data onto the queue. + +Note: once the `_read()` method is called, it will not be called again until +the `push` method is called. + +The `size` argument is advisory. Implementations where a "read" is a +single call that returns data can use this to know how much data to +fetch. Implementations where that is not relevant, such as TCP or +TLS, may ignore this argument, and simply provide data whenever it +becomes available. There is no need, for example to "wait" until +`size` bytes are available before calling [`stream.push(chunk)`][]. + +#### readable.push(chunk[, encoding]) + +* `chunk` {Buffer | null | String} Chunk of data to push into the read queue +* `encoding` {String} Encoding of String chunks. Must be a valid + Buffer encoding, such as `'utf8'` or `'ascii'` +* return {Boolean} Whether or not more pushes should be performed + +Note: **This method should be called by Readable implementors, NOT +by consumers of Readable streams.** + +If a value other than null is passed, The `push()` method adds a chunk of data +into the queue for subsequent stream processors to consume. If `null` is +passed, it signals the end of the stream (EOF), after which no more data +can be written. + +The data added with `push` can be pulled out by calling the `read()` method +when the `'readable'`event fires. + +This API is designed to be as flexible as possible. For example, +you may be wrapping a lower-level source which has some sort of +pause/resume mechanism, and a data callback. In those cases, you +could wrap the low-level source object by doing something like this: + +```javascript +// source is an object with readStop() and readStart() methods, +// and an `ondata` member that gets called when it has data, and +// an `onend` member that gets called when the data is over. + +util.inherits(SourceWrapper, Readable); + +function SourceWrapper(options) { + Readable.call(this, options); + + this._source = getLowlevelSourceObject(); + var self = this; + + // Every time there's data, we push it into the internal buffer. + this._source.ondata = function(chunk) { + // if push() returns false, then we need to stop reading from source + if (!self.push(chunk)) + self._source.readStop(); + }; + + // When the source ends, we push the EOF-signaling `null` chunk + this._source.onend = function() { + self.push(null); + }; +} + +// _read will be called when the stream wants to pull more data in +// the advisory size argument is ignored in this case. +SourceWrapper.prototype._read = function(size) { + this._source.readStart(); +}; +``` + +#### Example: A Counting Stream + + + +This is a basic example of a Readable stream. It emits the numerals +from 1 to 1,000,000 in ascending order, and then ends. + +```javascript +var Readable = require('stream').Readable; var util = require('util'); util.inherits(Counter, Readable); @@ -951,220 +1091,6 @@ SimpleProtocol.prototype._read = function(n) { // with the parsed header data. ``` - -#### new stream.Readable([options]) - -* `options` {Object} - * `highWaterMark` {Number} The maximum number of bytes to store in - the internal buffer before ceasing to read from the underlying - resource. Default=16kb, or 16 for `objectMode` streams - * `encoding` {String} If specified, then buffers will be decoded to - strings using the specified encoding. Default=null - * `objectMode` {Boolean} Whether this stream should behave - as a stream of objects. Meaning that stream.read(n) returns - a single value instead of a Buffer of size n. Default=false - -In classes that extend the Readable class, make sure to call the -Readable constructor so that the buffering settings can be properly -initialized. - -#### readable.\_read(size) - -* `size` {Number} Number of bytes to read asynchronously - -Note: **Implement this method, but do NOT call it directly.** - -This method is prefixed with an underscore because it is internal to the -class that defines it and should only be called by the internal Readable -class methods. All Readable stream implementations must provide a _read -method to fetch data from the underlying resource. - -When _read is called, if data is available from the resource, `_read` should -start pushing that data into the read queue by calling `this.push(dataChunk)`. -`_read` should continue reading from the resource and pushing data until push -returns false, at which point it should stop reading from the resource. Only -when _read is called again after it has stopped should it start reading -more data from the resource and pushing that data onto the queue. - -Note: once the `_read()` method is called, it will not be called again until -the `push` method is called. - -The `size` argument is advisory. Implementations where a "read" is a -single call that returns data can use this to know how much data to -fetch. Implementations where that is not relevant, such as TCP or -TLS, may ignore this argument, and simply provide data whenever it -becomes available. There is no need, for example to "wait" until -`size` bytes are available before calling [`stream.push(chunk)`][]. - -#### readable.push(chunk[, encoding]) - -* `chunk` {Buffer | null | String} Chunk of data to push into the read queue -* `encoding` {String} Encoding of String chunks. Must be a valid - Buffer encoding, such as `'utf8'` or `'ascii'` -* return {Boolean} Whether or not more pushes should be performed - -Note: **This method should be called by Readable implementors, NOT -by consumers of Readable streams.** - -If a value other than null is passed, The `push()` method adds a chunk of data -into the queue for subsequent stream processors to consume. If `null` is -passed, it signals the end of the stream (EOF), after which no more data -can be written. - -The data added with `push` can be pulled out by calling the `read()` method -when the `'readable'`event fires. - -This API is designed to be as flexible as possible. For example, -you may be wrapping a lower-level source which has some sort of -pause/resume mechanism, and a data callback. In those cases, you -could wrap the low-level source object by doing something like this: - -```javascript -// source is an object with readStop() and readStart() methods, -// and an `ondata` member that gets called when it has data, and -// an `onend` member that gets called when the data is over. - -util.inherits(SourceWrapper, Readable); - -function SourceWrapper(options) { - Readable.call(this, options); - - this._source = getLowlevelSourceObject(); - var self = this; - - // Every time there's data, we push it into the internal buffer. - this._source.ondata = function(chunk) { - // if push() returns false, then we need to stop reading from source - if (!self.push(chunk)) - self._source.readStop(); - }; - - // When the source ends, we push the EOF-signaling `null` chunk - this._source.onend = function() { - self.push(null); - }; -} - -// _read will be called when the stream wants to pull more data in -// the advisory size argument is ignored in this case. -SourceWrapper.prototype._read = function(size) { - this._source.readStart(); -}; -``` - - -### Class: stream.Writable - - - -`stream.Writable` is an abstract class designed to be extended with an -underlying implementation of the [`_write(chunk, encoding, callback)`][] method. - -Please see above under [API for Stream Consumers][] for how to consume -writable streams in your programs. What follows is an explanation of -how to implement Writable streams in your programs. - -#### new stream.Writable([options]) - -* `options` {Object} - * `highWaterMark` {Number} Buffer level when [`write()`][] starts - returning false. Default=16kb, or 16 for `objectMode` streams - * `decodeStrings` {Boolean} Whether or not to decode strings into - Buffers before passing them to [`_write()`][]. Default=true - * `objectMode` {Boolean} Whether or not the `write(anyObj)` is - a valid operation. If set you can write arbitrary data instead - of only `Buffer` / `String` data. Default=false - -In classes that extend the Writable class, make sure to call the -constructor so that the buffering settings can be properly -initialized. - -#### writable.\_write(chunk, encoding, callback) - -* `chunk` {Buffer | String} The chunk to be written. Will **always** - be a buffer unless the `decodeStrings` option was set to `false`. -* `encoding` {String} If the chunk is a string, then this is the - encoding type. If chunk is a buffer, then this is the special - value - 'buffer', ignore it in this case. -* `callback` {Function} Call this function (optionally with an error - argument) when you are done processing the supplied chunk. - -All Writable stream implementations must provide a [`_write()`][] -method to send data to the underlying resource. - -Note: **This function MUST NOT be called directly.** It should be -implemented by child classes, and called by the internal Writable -class methods only. - -Call the callback using the standard `callback(error)` pattern to -signal that the write completed successfully or with an error. - -If the `decodeStrings` flag is set in the constructor options, then -`chunk` may be a string rather than a Buffer, and `encoding` will -indicate the sort of string that it is. This is to support -implementations that have an optimized handling for certain string -data encodings. If you do not explicitly set the `decodeStrings` -option to `false`, then you can safely ignore the `encoding` argument, -and assume that `chunk` will always be a Buffer. - -This method is prefixed with an underscore because it is internal to -the class that defines it, and should not be called directly by user -programs. However, you **are** expected to override this method in -your own extension classes. - -#### writable.\_writev(chunks, callback) - -* `chunks` {Array} The chunks to be written. Each chunk has following - format: `{ chunk: ..., encoding: ... }`. -* `callback` {Function} Call this function (optionally with an error - argument) when you are done processing the supplied chunks. - -Note: **This function MUST NOT be called directly.** It may be -implemented by child classes, and called by the internal Writable -class methods only. - -This function is completely optional to implement. In most cases it is -unnecessary. If implemented, it will be called with all the chunks -that are buffered in the write queue. - - -### Class: stream.Duplex - - - -A "duplex" stream is one that is both Readable and Writable, such as a -TCP socket connection. - -Note that `stream.Duplex` is an abstract class designed to be extended -with an underlying implementation of the `_read(size)` and -[`_write(chunk, encoding, callback)`][] methods as you would with a -Readable or Writable stream class. - -Since JavaScript doesn't have multiple prototypal inheritance, this -class prototypally inherits from Readable, and then parasitically from -Writable. It is thus up to the user to implement both the lowlevel -`_read(n)` method as well as the lowlevel -[`_write(chunk, encoding, callback)`][] method on extension duplex classes. - -#### new stream.Duplex(options) - -* `options` {Object} Passed to both Writable and Readable - constructors. Also has the following fields: - * `allowHalfOpen` {Boolean} Default=true. If set to `false`, then - the stream will automatically end the readable side when the - writable side ends and vice versa. - * `readableObjectMode` {Boolean} Default=false. Sets `objectMode` - for readable side of the stream. Has no effect if `objectMode` - is `true`. - * `writableObjectMode` {Boolean} Default=false. Sets `objectMode` - for writable side of the stream. Has no effect if `objectMode` - is `true`. - -In classes that extend the Duplex class, make sure to call the -constructor so that the buffering settings can be properly -initialized. - - ### Class: stream.Transform A "transform" stream is a duplex stream where the output is causally @@ -1183,12 +1109,47 @@ also implement the `_flush()` method. (See below.) #### new stream.Transform([options]) -* `options` {Object} Passed to both Writable and Readable - constructors. +* `options` {Object} Passed to both Writable and Readable + constructors. + +In classes that extend the Transform class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +#### Events: 'finish' and 'end' + +The [`finish`][] and [`end`][] events are from the parent Writable +and Readable classes respectively. The `finish` event is fired after +`.end()` is called and all chunks have been processed by `_transform`, +`end` is fired after all data has been output which is after the callback +in `_flush` has been called. + +#### transform.\_flush(callback) + +* `callback` {Function} Call this function (optionally with an error + argument) when you are done flushing any remaining data. + +Note: **This function MUST NOT be called directly.** It MAY be implemented +by child classes, and if so, will be called by the internal Transform +class methods only. + +In some cases, your transform operation may need to emit a bit more +data at the end of the stream. For example, a `Zlib` compression +stream will store up some internal state so that it can optimally +compress the output. At the end, however, it needs to do the best it +can with what is left, so that the data will be complete. + +In those cases, you can implement a `_flush` method, which will be +called at the very end, after all the written data is consumed, but +before emitting `end` to signal the end of the readable side. Just +like with `_transform`, call `transform.push(chunk)` zero or more +times, as appropriate, and call `callback` when the flush operation is +complete. -In classes that extend the Transform class, make sure to call the -constructor so that the buffering settings can be properly -initialized. +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. #### transform.\_transform(chunk, encoding, callback) @@ -1238,41 +1199,6 @@ the class that defines it, and should not be called directly by user programs. However, you **are** expected to override this method in your own extension classes. -#### transform.\_flush(callback) - -* `callback` {Function} Call this function (optionally with an error - argument) when you are done flushing any remaining data. - -Note: **This function MUST NOT be called directly.** It MAY be implemented -by child classes, and if so, will be called by the internal Transform -class methods only. - -In some cases, your transform operation may need to emit a bit more -data at the end of the stream. For example, a `Zlib` compression -stream will store up some internal state so that it can optimally -compress the output. At the end, however, it needs to do the best it -can with what is left, so that the data will be complete. - -In those cases, you can implement a `_flush` method, which will be -called at the very end, after all the written data is consumed, but -before emitting `end` to signal the end of the readable side. Just -like with `_transform`, call `transform.push(chunk)` zero or more -times, as appropriate, and call `callback` when the flush operation is -complete. - -This method is prefixed with an underscore because it is internal to -the class that defines it, and should not be called directly by user -programs. However, you **are** expected to override this method in -your own extension classes. - -#### Events: 'finish' and 'end' - -The [`finish`][] and [`end`][] events are from the parent Writable -and Readable classes respectively. The `finish` event is fired after -`.end()` is called and all chunks have been processed by `_transform`, -`end` is fired after all data has been output which is after the callback -in `_flush` has been called. - #### Example: `SimpleProtocol` parser v2 The example above of a simple protocol parser can be implemented @@ -1351,13 +1277,79 @@ SimpleProtocol.prototype._transform = function(chunk, encoding, done) { // with the parsed header data. ``` +### Class: stream.Writable -### Class: stream.PassThrough + -This is a trivial implementation of a [Transform][] stream that simply -passes the input bytes across to the output. Its purpose is mainly -for examples and testing, but there are occasionally use cases where -it can come in handy as a building block for novel sorts of streams. +`stream.Writable` is an abstract class designed to be extended with an +underlying implementation of the [`_write(chunk, encoding, callback)`][] method. + +Please see above under [API for Stream Consumers][] for how to consume +writable streams in your programs. What follows is an explanation of +how to implement Writable streams in your programs. + +#### new stream.Writable([options]) + +* `options` {Object} + * `highWaterMark` {Number} Buffer level when [`write()`][] starts + returning false. Default=16kb, or 16 for `objectMode` streams + * `decodeStrings` {Boolean} Whether or not to decode strings into + Buffers before passing them to [`_write()`][]. Default=true + * `objectMode` {Boolean} Whether or not the `write(anyObj)` is + a valid operation. If set you can write arbitrary data instead + of only `Buffer` / `String` data. Default=false + +In classes that extend the Writable class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +#### writable.\_write(chunk, encoding, callback) + +* `chunk` {Buffer | String} The chunk to be written. Will **always** + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. If chunk is a buffer, then this is the special + value - 'buffer', ignore it in this case. +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunk. + +All Writable stream implementations must provide a [`_write()`][] +method to send data to the underlying resource. + +Note: **This function MUST NOT be called directly.** It should be +implemented by child classes, and called by the internal Writable +class methods only. + +Call the callback using the standard `callback(error)` pattern to +signal that the write completed successfully or with an error. + +If the `decodeStrings` flag is set in the constructor options, then +`chunk` may be a string rather than a Buffer, and `encoding` will +indicate the sort of string that it is. This is to support +implementations that have an optimized handling for certain string +data encodings. If you do not explicitly set the `decodeStrings` +option to `false`, then you can safely ignore the `encoding` argument, +and assume that `chunk` will always be a Buffer. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +#### writable.\_writev(chunks, callback) + +* `chunks` {Array} The chunks to be written. Each chunk has following + format: `{ chunk: ..., encoding: ... }`. +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunks. + +Note: **This function MUST NOT be called directly.** It may be +implemented by child classes, and called by the internal Writable +class methods only. + +This function is completely optional to implement. In most cases it is +unnecessary. If implemented, it will be called with all the chunks +that are buffered in the write queue. ## Simplified Constructor API @@ -1370,51 +1362,52 @@ This can be done by passing the appropriate methods as constructor options: Examples: -### Readable +### Duplex ```javascript -var readable = new stream.Readable({ +var duplex = new stream.Duplex({ read: function(n) { // sets this._read under the hood - } -}); -``` -### Writable -```javascript -var writable = new stream.Writable({ + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); + }, write: function(chunk, encoding, next) { // sets this._write under the hood + + // An optional error can be passed as the first argument + next() } }); // or -var writable = new stream.Writable({ +var duplex = new stream.Duplex({ + read: function(n) { + // sets this._read under the hood + + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); + }, writev: function(chunks, next) { // sets this._writev under the hood + + // An optional error can be passed as the first argument + next() } }); ``` -### Duplex +### Readable ```javascript -var duplex = new stream.Duplex({ +var readable = new stream.Readable({ read: function(n) { // sets this._read under the hood - }, - write: function(chunk, encoding, next) { - // sets this._write under the hood - } -}); - -// or -var duplex = new stream.Duplex({ - read: function(n) { - // sets this._read under the hood - }, - writev: function(chunks, next) { - // sets this._writev under the hood + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); } }); ``` @@ -1424,9 +1417,43 @@ var duplex = new stream.Duplex({ var transform = new stream.Transform({ transform: function(chunk, encoding, next) { // sets this._transform under the hood + + // generate output as many times as needed + // this.push(chunk); + + // call when the current chunk is consumed + next(); }, flush: function(done) { // sets this._flush under the hood + + // generate output as many times as needed + // this.push(chunk); + + done(); + } +}); +``` + +### Writable +```javascript +var writable = new stream.Writable({ + write: function(chunk, encoding, next) { + // sets this._write under the hood + + // An optional error can be passed as the first argument + next() + } +}); + +// or + +var writable = new stream.Writable({ + writev: function(chunks, next) { + // sets this._writev under the hood + + // An optional error can be passed as the first argument + next() } }); ``` @@ -1458,40 +1485,6 @@ The purpose of streams, especially with the `pipe()` method, is to limit the buffering of data to acceptable levels, so that sources and destinations of varying speed will not overwhelm the available memory. -### `stream.read(0)` - -There are some cases where you want to trigger a refresh of the -underlying readable stream mechanisms, without actually consuming any -data. In that case, you can call `stream.read(0)`, which will always -return null. - -If the internal read buffer is below the `highWaterMark`, and the -stream is not currently reading, then calling `read(0)` will trigger -a low-level `_read` call. - -There is almost never a need to do this. However, you will see some -cases in Node.js's internals where this is done, particularly in the -Readable stream class internals. - -### `stream.push('')` - -Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an -interesting side effect. Because it *is* a call to -[`stream.push()`][], it will end the `reading` process. However, it -does *not* add any data to the readable buffer, so there's nothing for -a user to consume. - -Very rarely, there are cases where you have no data to provide now, -but the consumer of your stream (or, perhaps, another bit of your own -code) will know when to check again, by calling `stream.read(0)`. In -those cases, you *may* call `stream.push('')`. - -So far, the only use case for this functionality is in the -[tls.CryptoStream][] class, which is deprecated in Node.js/io.js v1.0. If you -find that you have to use `stream.push('')`, please consider another -approach, because it almost certainly indicates that something is -horribly wrong. - ### Compatibility with Older Node.js Versions @@ -1649,25 +1642,66 @@ JSONParseStream.prototype._flush = function(cb) { }; ``` +### `stream.read(0)` + +There are some cases where you want to trigger a refresh of the +underlying readable stream mechanisms, without actually consuming any +data. In that case, you can call `stream.read(0)`, which will always +return null. + +If the internal read buffer is below the `highWaterMark`, and the +stream is not currently reading, then calling `read(0)` will trigger +a low-level `_read` call. + +There is almost never a need to do this. However, you will see some +cases in Node.js's internals where this is done, particularly in the +Readable stream class internals. + +### `stream.push('')` + +Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an +interesting side effect. Because it *is* a call to +[`stream.push()`][], it will end the `reading` process. However, it +does *not* add any data to the readable buffer, so there's nothing for +a user to consume. + +Very rarely, there are cases where you have no data to provide now, +but the consumer of your stream (or, perhaps, another bit of your own +code) will know when to check again, by calling `stream.read(0)`. In +those cases, you *may* call `stream.push('')`. + +So far, the only use case for this functionality is in the +[tls.CryptoStream][] class, which is deprecated in Node.js/io.js v1.0. If you +find that you have to use `stream.push('')`, please consider another +approach, because it almost certainly indicates that something is +horribly wrong. -[EventEmitter]: https://iojs.org/dist/v5.0.0/doc/api/events.html#events_class_events_eventemitter +[request to an HTTP server]: https://nodejs.org/docs/v5.1.0/api/http.html#http_http_incomingmessage +[EventEmitter]: https://nodejs.org/docs/v5.1.0/api/events.html#events_class_events_eventemitter [Object mode]: #stream_object_mode [`stream.push(chunk)`]: #stream_readable_push_chunk_encoding [`stream.push(null)`]: #stream_readable_push_chunk_encoding [`stream.push()`]: #stream_readable_push_chunk_encoding [`unpipe()`]: #stream_readable_unpipe_destination [unpiped]: #stream_readable_unpipe_destination -[tcp sockets]: https://iojs.org/dist/v5.0.0/doc/api/net.html#net_class_net_socket +[tcp sockets]: https://nodejs.org/docs/v5.1.0/api/net.html#net_class_net_socket +[http responses, on the client]: https://nodejs.org/docs/v5.1.0/api/http.html#http_http_incomingmessage +[http requests, on the server]: https://nodejs.org/docs/v5.1.0/api/http.html#http_http_incomingmessage +[http requests, on the client]: https://nodejs.org/docs/v5.1.0/api/http.html#http_class_http_clientrequest +[http responses, on the server]: https://nodejs.org/docs/v5.1.0/api/http.html#http_class_http_serverresponse +[fs read streams]: https://nodejs.org/docs/v5.1.0/api/fs.html#fs_class_fs_readstream +[fs write streams]: https://nodejs.org/docs/v5.1.0/api/fs.html#fs_class_fs_writestream [zlib streams]: zlib.html [zlib]: zlib.html [crypto streams]: crypto.html [crypto]: crypto.html -[tls.CryptoStream]: https://iojs.org/dist/v5.0.0/doc/api/tls.html#tls_class_cryptostream -[process.stdin]: https://iojs.org/dist/v5.0.0/doc/api/process.html#process_process_stdin -[stdout]: https://iojs.org/dist/v5.0.0/doc/api/process.html#process_process_stdout -[process.stdout]: https://iojs.org/dist/v5.0.0/doc/api/process.html#process_process_stdout -[process.stderr]: https://iojs.org/dist/v5.0.0/doc/api/process.html#process_process_stderr -[child process stdout and stderr]: https://iojs.org/dist/v5.0.0/doc/api/child_process.html#child_process_child_stdout +[tls.CryptoStream]: https://nodejs.org/docs/v5.1.0/api/tls.html#tls_class_cryptostream +[process.stdin]: https://nodejs.org/docs/v5.1.0/api/process.html#process_process_stdin +[stdout]: https://nodejs.org/docs/v5.1.0/api/process.html#process_process_stdout +[process.stdout]: https://nodejs.org/docs/v5.1.0/api/process.html#process_process_stdout +[process.stderr]: https://nodejs.org/docs/v5.1.0/api/process.html#process_process_stderr +[child process stdout and stderr]: https://nodejs.org/docs/v5.1.0/api/child_process.html#child_process_child_stdout +[child process stdin]: https://nodejs.org/docs/v5.1.0/api/child_process.html#child_process_child_stdin [API for Stream Consumers]: #stream_api_for_stream_consumers [API for Stream Implementors]: #stream_api_for_stream_implementors [Readable]: #stream_class_stream_readable @@ -1686,7 +1720,7 @@ JSONParseStream.prototype._flush = function(cb) { [`_write(chunk, encoding, callback)`]: #stream_writable_write_chunk_encoding_callback_1 [`_write()`]: #stream_writable_write_chunk_encoding_callback_1 [_write]: #stream_writable_write_chunk_encoding_callback_1 -[`util.inherits`]: https://iojs.org/dist/v5.0.0/doc/api/util.html#util_util_inherits_constructor_superconstructor +[`util.inherits`]: https://nodejs.org/docs/v5.1.0/api/util.html#util_util_inherits_constructor_superconstructor [`end()`]: #stream_writable_end_chunk_encoding_callback [`'data'` event]: #stream_event_data [`resume()`]: #stream_readable_resume diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js index 90068ea249d998..50852aee7e6e02 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js @@ -61,8 +61,9 @@ var StringDecoder; util.inherits(Readable, Stream); +var Duplex; function ReadableState(options, stream) { - var Duplex = require('./_stream_duplex'); + Duplex = Duplex || require('./_stream_duplex'); options = options || {}; @@ -128,8 +129,9 @@ function ReadableState(options, stream) { } } +var Duplex; function Readable(options) { - var Duplex = require('./_stream_duplex'); + Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js index 23a2ba295df2f1..1fa5eb695adde6 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js @@ -55,8 +55,9 @@ function WriteReq(chunk, encoding, cb) { this.next = null; } +var Duplex; function WritableState(options, stream) { - var Duplex = require('./_stream_duplex'); + Duplex = Duplex || require('./_stream_duplex'); options = options || {}; @@ -164,8 +165,9 @@ Object.defineProperty(WritableState.prototype, 'buffer', { }catch(_){}}()); +var Duplex; function Writable(options) { - var Duplex = require('./_stream_duplex'); + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json index 83e519e7b464a5..ddd227e64f99f4 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -33,11 +33,28 @@ "devDependencies": { "tap": "^2.3.0" }, - "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n", - "readmeFilename": "README.md", + "gitHead": "a177da234df5638b363ddc15fa324619a38577c8", "homepage": "https://github.com/isaacs/core-util-is#readme", "_id": "core-util-is@1.0.2", "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "_from": "core-util-is@>=1.0.0 <1.1.0", + "_npmVersion": "3.3.2", + "_nodeVersion": "4.0.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "tarball": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "_from": "core-util-is@>=1.0.0 <1.1.0" + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args/package.json index 4019a28addcd88..0ccf22578d2caa 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args/package.json @@ -22,7 +22,7 @@ "gitHead": "e85787b05a8c3c1adb714f332d822e9162699c78", "_id": "process-nextick-args@1.0.6", "_shasum": "0f96b001cea90b12592ce566edb97ec11e69bd05", - "_from": "process-nextick-args@>=1.0.0 <1.1.0", + "_from": "process-nextick-args@>=1.0.6 <1.1.0", "_npmVersion": "2.14.4", "_nodeVersion": "4.1.1", "_npmUser": { diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json index ee70702359198d..0364d54ba46af6 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json @@ -22,13 +22,33 @@ "browserify" ], "license": "MIT", - "readme": "**string_decoder.js** (`require('string_decoder')`) from Node.js core\n\nCopyright Joyent, Inc. and other Node contributors. See LICENCE file for details.\n\nVersion numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**\n\nThe *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.", - "readmeFilename": "README.md", + "gitHead": "d46d4fd87cf1d06e031c23f1ba170ca7d4ade9a0", "bugs": { "url": "https://github.com/rvagg/string_decoder/issues" }, "_id": "string_decoder@0.10.31", "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "_from": "string_decoder@>=0.10.0 <0.11.0", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "tarball": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "directories": {}, "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "_from": "string_decoder@>=0.10.0 <0.11.0" + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate/package.json index f68d8bb958657f..ae0c70f6c633f1 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate/package.json @@ -28,10 +28,27 @@ "url": "https://github.com/TooTallNate/util-deprecate/issues" }, "homepage": "https://github.com/TooTallNate/util-deprecate", - "readme": "util-deprecate\n==============\n### The Node.js `util.deprecate()` function with browser support\n\nIn Node.js, this module simply re-exports the `util.deprecate()` function.\n\nIn the web browser (i.e. via browserify), a browser-specific implementation\nof the `util.deprecate()` function is used.\n\n\n## API\n\nA `deprecate()` function is the only thing exposed by this module.\n\n``` javascript\n// setup:\nexports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');\n\n\n// users see:\nfoo();\n// foo() is deprecated, use bar() instead\nfoo();\nfoo();\n```\n\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014 Nathan Rajlich \n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n", - "readmeFilename": "README.md", + "gitHead": "475fb6857cd23fafff20c1be846c1350abf8e6d4", "_id": "util-deprecate@1.0.2", "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "_from": "util-deprecate@>=1.0.1 <1.1.0", + "_npmVersion": "2.14.4", + "_nodeVersion": "4.1.2", + "_npmUser": { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + "maintainers": [ + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + } + ], + "dist": { + "shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "tarball": "http://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "directories": {}, "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "_from": "util-deprecate@>=1.0.1 <1.1.0" + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/package.json index c0698efcb36108..7590ac88879acf 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/package.json @@ -1,13 +1,13 @@ { "name": "readable-stream", - "version": "2.0.4", + "version": "2.0.5", "description": "Streams3, a user-land copy of the stream library from iojs v2.x", "main": "readable.js", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", - "process-nextick-args": "~1.0.0", + "process-nextick-args": "~1.0.6", "string_decoder": "~0.10.x", "util-deprecate": "~1.0.1" }, @@ -34,14 +34,43 @@ "util": false }, "license": "MIT", - "readme": "# readable-stream\n\n***Node-core streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)\n\n\n[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)\n[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)\n\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)\n\n```bash\nnpm install --save readable-stream\n```\n\n***Node-core streams for userland***\n\nThis package is a mirror of the Streams2 and Streams3 implementations in\nNode-core, including [documentation](doc/stream.markdown).\n\nIf you want to guarantee a stable streams base, regardless of what version of\nNode you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *\"stream\"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).\n\nAs of version 2.0.0 **readable-stream** uses semantic versioning. \n\n# Streams WG Team Members\n\n* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com>\n - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B\n* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com>\n - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242\n* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org>\n - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D\n* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com>\n* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com>\n* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me>\n", - "readmeFilename": "README.md", + "gitHead": "a4f23d8e451267684a8160679ce16e16149fe72b", "bugs": { "url": "https://github.com/nodejs/readable-stream/issues" }, "homepage": "https://github.com/nodejs/readable-stream#readme", - "_id": "readable-stream@2.0.4", - "_shasum": "2523ef27ffa339d7ba9da8603f2d0599d06edbd8", - "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", - "_from": "readable-stream@>=2.0.0 <2.1.0" + "_id": "readable-stream@2.0.5", + "_shasum": "a2426f8dcd4551c77a33f96edf2886a23c829669", + "_from": "readable-stream@>=2.0.0 <2.1.0", + "_npmVersion": "3.3.12", + "_nodeVersion": "5.1.1", + "_npmUser": { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + "dist": { + "shasum": "a2426f8dcd4551c77a33f96edf2886a23c829669", + "tarball": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + }, + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + } + ], + "directories": {}, + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray/package.json index f946a953af73c6..b8b59f5c303991 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray/package.json @@ -52,13 +52,28 @@ "android-browser/4.2..latest" ] }, - "readme": "# typedarray\n\nTypedArray polyfill ripped from [this\nmodule](https://raw.github.com/inexorabletash/polyfill).\n\n[![build status](https://secure.travis-ci.org/substack/typedarray.png)](http://travis-ci.org/substack/typedarray)\n\n[![testling badge](https://ci.testling.com/substack/typedarray.png)](https://ci.testling.com/substack/typedarray)\n\n# example\n\n``` js\nvar Uint8Array = require('typedarray').Uint8Array;\nvar ua = new Uint8Array(5);\nua[1] = 256 + 55;\nconsole.log(ua[1]);\n```\n\noutput:\n\n```\n55\n```\n\n# methods\n\n``` js\nvar TA = require('typedarray')\n```\n\nThe `TA` object has the following constructors:\n\n* TA.ArrayBuffer\n* TA.DataView\n* TA.Float32Array\n* TA.Float64Array\n* TA.Int8Array\n* TA.Int16Array\n* TA.Int32Array\n* TA.Uint8Array\n* TA.Uint8ClampedArray\n* TA.Uint16Array\n* TA.Uint32Array\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install typedarray\n```\n\nTo use this module in the browser, compile with\n[browserify](http://browserify.org)\nor download a UMD build from browserify CDN:\n\nhttp://wzrd.in/standalone/typedarray@latest\n\n# license\n\nMIT\n", - "readmeFilename": "readme.markdown", "bugs": { "url": "https://github.com/substack/typedarray/issues" }, "_id": "typedarray@0.0.6", + "dist": { + "shasum": "867ac74e3864187b1d3d47d996a78ec5c8830777", + "tarball": "http://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + }, + "_from": "typedarray@>=0.0.5 <0.1.0", + "_npmVersion": "1.4.3", + "_npmUser": { + "name": "substack", + "email": "mail@substack.net" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + } + ], + "directories": {}, "_shasum": "867ac74e3864187b1d3d47d996a78ec5c8830777", "_resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "_from": "typedarray@>=0.0.5 <0.1.0" + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/package.json b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/package.json index 53820bc0b2ce94..5a3f8b401e4449 100644 --- a/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/package.json +++ b/deps/npm/node_modules/npm-registry-client/node_modules/concat-stream/package.json @@ -54,11 +54,28 @@ "android-browser/4.2..latest" ] }, - "readme": "# concat-stream\n\nWritable stream that concatenates all the data from a stream and calls a callback with the result. Use this when you want to collect all the data from a stream into a single buffer.\n\n[![Build Status](https://travis-ci.org/maxogden/concat-stream.svg?branch=master)](https://travis-ci.org/maxogden/concat-stream)\n\n[![NPM](https://nodei.co/npm/concat-stream.png)](https://nodei.co/npm/concat-stream/)\n\n### description\n\nStreams emit many buffers. If you want to collect all of the buffers, and when the stream ends concatenate all of the buffers together and receive a single buffer then this is the module for you.\n\nOnly use this if you know you can fit all of the output of your stream into a single Buffer (e.g. in RAM).\n\nThere are also `objectMode` streams that emit things other than Buffers, and you can concatenate these too. See below for details.\n\n## Related\n\n`stream-each` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.\n\n### examples\n\n#### Buffers\n\n```js\nvar fs = require('fs')\nvar concat = require('concat-stream')\n\nvar readStream = fs.createReadStream('cat.png')\nvar concatStream = concat(gotPicture)\n\nreadStream.on('error', handleError)\nreadStream.pipe(concatStream)\n\nfunction gotPicture(imageBuffer) {\n // imageBuffer is all of `cat.png` as a node.js Buffer\n}\n\nfunction handleError(err) {\n // handle your error appropriately here, e.g.:\n console.error(err) // print the error to STDERR\n process.exit(1) // exit program with non-zero exit code\n}\n\n```\n\n#### Arrays\n\n```js\nvar write = concat(function(data) {})\nwrite.write([1,2,3])\nwrite.write([4,5,6])\nwrite.end()\n// data will be [1,2,3,4,5,6] in the above callback\n```\n\n#### Uint8Arrays\n\n```js\nvar write = concat(function(data) {})\nvar a = new Uint8Array(3)\na[0] = 97; a[1] = 98; a[2] = 99\nwrite.write(a)\nwrite.write('!')\nwrite.end(Buffer('!!1'))\n```\n\nSee `test/` for more examples\n\n# methods\n\n```js\nvar concat = require('concat-stream')\n```\n\n## var writable = concat(opts={}, cb)\n\nReturn a `writable` stream that will fire `cb(data)` with all of the data that\nwas written to the stream. Data can be written to `writable` as strings,\nBuffers, arrays of byte integers, and Uint8Arrays. \n\nBy default `concat-stream` will give you back the same data type as the type of the first buffer written to the stream. Use `opts.encoding` to set what format `data` should be returned as, e.g. if you if you don't want to rely on the built-in type checking or for some other reason.\n\n* `string` - get a string\n* `buffer` - get back a Buffer\n* `array` - get an array of byte integers\n* `uint8array`, `u8`, `uint8` - get back a Uint8Array\n* `object`, get back an array of Objects\n\nIf you don't specify an encoding, and the types can't be inferred (e.g. you write things that aren't in the list above), it will try to convert concat them into a `Buffer`.\n\n# error handling\n\n`concat-stream` does not handle errors for you, so you must handle errors on whatever streams you pipe into `concat-stream`. This is a general rule when programming with node.js streams: always handle errors on each and every stream. Since `concat-stream` is not itself a stream it does not emit errors.\n\nWe recommend using [`end-of-stream`](https://npmjs.org/end-of-stream) or [`pump`](https://npmjs.org/pump) for writing error tolerant stream code.\n\n# license\n\nMIT LICENSE\n", - "readmeFilename": "readme.md", + "gitHead": "522adc12d82f57c691a5f946fbc8ba08718dcdcb", "homepage": "https://github.com/maxogden/concat-stream#readme", "_id": "concat-stream@1.5.1", "_shasum": "f3b80acf9e1f48e3875c0688b41b6c31602eea1c", + "_from": "concat-stream@>=1.4.6 <2.0.0", + "_npmVersion": "2.14.2", + "_nodeVersion": "4.0.0", + "_npmUser": { + "name": "maxogden", + "email": "max@maxogden.com" + }, + "dist": { + "shasum": "f3b80acf9e1f48e3875c0688b41b6c31602eea1c", + "tarball": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz" + }, + "maintainers": [ + { + "name": "maxogden", + "email": "max@maxogden.com" + } + ], + "directories": {}, "_resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", - "_from": "concat-stream@>=1.4.6 <2.0.0" + "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/npm-registry-client/package.json b/deps/npm/node_modules/npm-registry-client/package.json index 7ead37785b2d14..362862cfc5f886 100644 --- a/deps/npm/node_modules/npm-registry-client/package.json +++ b/deps/npm/node_modules/npm-registry-client/package.json @@ -6,7 +6,7 @@ }, "name": "npm-registry-client", "description": "Client for the npm registry", - "version": "7.0.9", + "version": "7.1.0", "repository": { "url": "git+https://github.com/npm/npm-registry-client.git" }, @@ -40,23 +40,23 @@ "npmlog": "~2.0.0" }, "license": "ISC", - "gitHead": "2c0c83149edb270829582a234703404b2ba1c410", + "gitHead": "d077cb652152a8c265369d9d169cba8a52239fb4", "bugs": { "url": "https://github.com/npm/npm-registry-client/issues" }, "homepage": "https://github.com/npm/npm-registry-client#readme", - "_id": "npm-registry-client@7.0.9", - "_shasum": "1baf86ee5285c4e6d38d4556208ded56049231bb", - "_from": "npm-registry-client@>=7.0.9 <7.1.0", - "_npmVersion": "3.4.1", - "_nodeVersion": "5.1.0", + "_id": "npm-registry-client@7.1.0", + "_shasum": "e3be14ab279fe5123e15ab5c8a650445415664a5", + "_from": "npm-registry-client@7.1.0", + "_npmVersion": "3.7.5", + "_nodeVersion": "5.4.0", "_npmUser": { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" + "name": "iarna", + "email": "me@re-becca.org" }, "dist": { - "shasum": "1baf86ee5285c4e6d38d4556208ded56049231bb", - "tarball": "http://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.0.9.tgz" + "shasum": "e3be14ab279fe5123e15ab5c8a650445415664a5", + "tarball": "http://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.1.0.tgz" }, "maintainers": [ { @@ -76,7 +76,10 @@ "email": "kat@sykosomatic.org" } ], + "_npmOperationalInternal": { + "host": "packages-5-east.internal.npmjs.com", + "tmp": "tmp/npm-registry-client-7.1.0.tgz_1456435497334_0.35472381697036326" + }, "directories": {}, - "_resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.0.9.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.1.0.tgz" } diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json new file mode 100644 index 00000000000000..4561db502b18e5 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fixtures/@npm/npm-registry-client/cache.json @@ -0,0 +1 @@ +{"_id":"@npm%2fnpm-registry-client","_rev":"213-0a1049cf56172b7d9a1184742c6477b9","name":"@npm/npm-registry-client","description":"Client for the npm registry","dist-tags":{"latest":"2.0.4","v2.0":"2.0.3"},"versions":{"0.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"693a08f6d2faea22bbd2bf412508a63d3e6229a7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.1.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"b48c0ec5563c6a6fdc253454fc56d2c60c5a26f4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.2.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"ccc0254c2d59e3ea9b9050e2b16edef78df1a1e8","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"@npm%2fnpm-registry-client@0.0.4","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"faabd25ef477521c74ac21e0f4cf3a2f66d18fb3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.4.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.5","dist":{"shasum":"85219810c9d89ae8d28ea766e7cf74efbd9f1e52","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.5.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"The code that npm uses to talk to the registry","version":"0.0.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.6","dist":{"shasum":"cc6533b3b41df65e6e9db2601fbbf1a509a7e94c","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.6.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"The code that npm uses to talk to the registry","version":"0.0.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"engines":{"node":"*"},"_id":"@npm%2fnpm-registry-client@0.0.7","dist":{"shasum":"0cee1d1c61f1c8e483774fe1f7bbb81c4f394a3a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.7.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.8","dist":{"shasum":"1b7411c3f7310ec2a96b055b00e7ca606e47bd07","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.8.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.9","dist":{"shasum":"6d5bfde431559ac9e2e52a7db85f5839b874f022","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.9.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.10","dist":{"shasum":"0c8b6a4615bce82aa6cc04a0d1f7dc89921f7a38","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.10.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.0.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.0.11","dist":{"shasum":"afab40be5bed1faa946d8e1827844698f2ec1db7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.0.11.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.0","dist":{"shasum":"1077d6bbb5e432450239dc6622a59474953ffbea","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.0.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.1","dist":{"shasum":"759765361d09b715270f59cf50f10908e4e9c5fc","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.1.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.2","dist":{"shasum":"541ce93abb3d35f5c325545c718dd3bbeaaa9ff0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.2.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.3","dist":{"shasum":"e9a40d7031e8f809af5fd85aa9aac979e17efc97","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.1.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.1.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.1.4","dist":{"shasum":"b211485b046191a1085362376530316f0cab0420","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.1.4.tgz"},"_npmVersion":"1.1.48","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.0","dist":{"shasum":"6508a4b4d96f31057d5200ca5779531bafd2b840","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.0.tgz"},"_npmVersion":"1.1.49","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"node-uuid":"~1.3.3","request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.1","dist":{"shasum":"1bc8c4576c368cd88253d8a52daf40c55b89bb1a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.1.tgz"},"_npmVersion":"1.1.49","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.5","dist":{"shasum":"2f55d675dfb977403b1ad0d96874c1d30e8058d7","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.5.tgz"},"_npmVersion":"1.1.51","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.6","dist":{"shasum":"f05df6695360360ad220e6e13a6a7bace7165fbe","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.6.tgz"},"_npmVersion":"1.1.56","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.0.14","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.7","dist":{"shasum":"867bad8854cae82ed89ee3b7f1d391af59491671","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.7.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.6","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.8","dist":{"shasum":"ef194cdb70f1ea03a576cff2c97392fa96e36563","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.8.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.9","dist":{"shasum":"3cec10431dfed1594adaf99c50f482ee56ecf9e4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.9.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2.0.1","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.10","dist":{"shasum":"1e69726dae0944e78562fd77243f839c6a2ced1e","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.10.tgz"},"_npmVersion":"1.1.64","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.11","dist":{"shasum":"d92f33c297eb1bbd57fd597c3d8f5f7e9340a0b5","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.11.tgz"},"_npmVersion":"1.1.70","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.12":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.12","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.1.8","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.12","dist":{"shasum":"3bfb6fc0e4b131d665580cd1481c341fe521bfd3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.12.tgz"},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.13":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.13","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.13","dist":{"shasum":"e03f2a4340065511b7184a3e2862cd5d459ef027","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.13.tgz"},"_from":".","_npmVersion":"1.2.4","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.14":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.14","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.14","dist":{"shasum":"186874a7790417a340d582b1cd4a7c338087ee12","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.14.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.15":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.15","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.15","dist":{"shasum":"f71f32b7185855f1f8b7a5ef49e49d2357c2c552","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.15.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.16":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.16","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.16","dist":{"shasum":"3331323b5050fc5afdf77c3a35913c16f3e43964","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.16.tgz"},"_from":".","_npmVersion":"1.2.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.17":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.17","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.17","dist":{"shasum":"1df2bbecac6751f5d9600fb43722aef96d956773","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.17.tgz"},"_from":".","_npmVersion":"1.2.11","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.18":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.18","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.9.202","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.18","dist":{"shasum":"198c8d15ed9b1ed546faf6e431eb63a6b18193ad","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.18.tgz"},"_from":".","_npmVersion":"1.2.13","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.19":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.19","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.19","dist":{"shasum":"106da826f0d2007f6e081f2b68fb6f26fa951b20","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.19.tgz"},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.20":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.20","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","_id":"@npm%2fnpm-registry-client@0.2.20","dist":{"shasum":"3fff194331e26660be2cf8ebf45ddf7d36add5f6","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.20.tgz"},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.21":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.21","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.16","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.21","dist":{"shasum":"d85dd32525f193925c46ff9eb0e0f529dfd1b254","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.21.tgz"},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.22":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.22","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"~2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.22","dist":{"shasum":"caa22ff40a1ccd632a660b8b80c333c8f92d5a17","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.22.tgz"},"_from":".","_npmVersion":"1.2.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.23":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.23","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.23","dist":{"shasum":"a320ab2b1d048b4f7b88e40bd86974ca322b4c24","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.23.tgz"},"_from":".","_npmVersion":"1.2.19","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.24":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.24","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~1.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.24","dist":{"shasum":"e12f644338619319ee7f233363a1714a87f3c72d","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.24.tgz"},"_from":".","_npmVersion":"1.2.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.25":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.25","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.25","dist":{"shasum":"c2caeb1dcf937d6fcc4a187765d401f5e2f54027","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.25.tgz"},"_from":".","_npmVersion":"1.2.32","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.26":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.26","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~1.2.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.26","dist":{"shasum":"4c5a2b3de946e383032f10fa497d0c15ee5f4c60","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.26.tgz"},"_from":".","_npmVersion":"1.3.1","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.27":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.27","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.20.0","graceful-fs":"~2.0.0","semver":"~2.0.5","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.15","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.27","dist":{"shasum":"8f338189d32769267886a07ad7b7fd2267446adf","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.27.tgz"},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.28":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.28","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"~2.1.0","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"_id":"@npm%2fnpm-registry-client@0.2.28","dist":{"shasum":"959141fc0180d7b1ad089e87015a8a2142a8bffc","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.28.tgz"},"_from":".","_npmVersion":"1.3.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.29":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.29","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.29","dist":{"shasum":"66ff2766f0c61d41e8a6139d3692d8833002c686","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.29.tgz"},"_from":".","_npmVersion":"1.3.12","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.30":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.30","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.30","dist":{"shasum":"f01cae5c51aa0a1c5dc2516cbad3ebde068d3eaa","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.30.tgz"},"_from":".","_npmVersion":"1.3.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.2.31":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.2.31","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.2.31","dist":{"shasum":"24a23e24e43246677cb485f8391829e9536563d4","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.2.31.tgz"},"_from":".","_npmVersion":"1.3.17","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.0","dist":{"shasum":"66eab02a69be67f232ac14023eddfb8308c2eccd","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.0.tgz"},"_from":".","_npmVersion":"1.3.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.1","dist":{"shasum":"16dba07cc304442edcece378218672d0a1258ef8","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.1.tgz"},"_from":".","_npmVersion":"1.3.18","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.2","dist":{"shasum":"ea3060bd0a87fb1d97b87433b50f38f7272b1686","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.2.tgz"},"_from":".","_npmVersion":"1.3.20","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.3","dist":{"shasum":"da08bb681fb24aa5c988ca71f8c10f27f09daf4a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.3.tgz"},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.4","dist":{"shasum":"25d771771590b1ca39277aea4506af234c5f4342","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.4.tgz"},"_from":".","_npmVersion":"1.3.25","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","couch-login":"~0.1.18","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.5","dist":{"shasum":"98ba1ac851a3939a3fb9917c28fa8da522dc635f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.5.tgz"},"_from":".","_npmVersion":"1.3.25","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.3.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.3.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.3.6","dist":{"shasum":"c48a2a03643769acc49672860f7920ec6bffac6e","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.3.6.tgz"},"_from":".","_npmVersion":"1.3.26","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.0","dist":{"shasum":"30d0c178b7f2e54183a6a3fc9fe4071eb10290bf","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.0.tgz"},"_from":".","_npmVersion":"1.3.26","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.1","dist":{"shasum":"9c49b3e44558e2072158fb085be8a083c5f83537","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.1.tgz"},"_from":".","_npmVersion":"1.4.0","_npmUser":{"name":"npm-www","email":"npm@npmjs.com"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.2","dist":{"shasum":"d9568a9413bee14951201ce73f3b3992ec6658c0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.2.tgz"},"_from":".","_npmVersion":"1.4.1","_npmUser":{"name":"npm-www","email":"npm@npmjs.com"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.3","dist":{"shasum":"aa188fc5067158e991a57f4697c54994108f5389","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.3.tgz"},"_from":".","_npmVersion":"1.4.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.4","dist":{"shasum":"f9dbc383a49069d8c7f67755a3ff6e424aff584f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.4.tgz"},"_from":".","_npmVersion":"1.4.2","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.5","dist":{"shasum":"7d6fdca46139470715f9477ddb5ad3e770d4de7b","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.5.tgz"},"_from":".","_npmVersion":"1.4.4","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.6","_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"657f69a79543fc4cc264c3b2de958bd15f7140fe","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.6.tgz"},"directories":{}},"0.4.7":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.7","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.7","dist":{"shasum":"f4369b59890da7882527eb7c427dd95d43707afb","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.7.tgz"},"_from":".","_npmVersion":"1.4.6","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.4.8":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.8","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.8","_shasum":"a6685a161033101be6064b7af887ab440e8695d0","_from":".","_npmVersion":"1.4.8","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"a6685a161033101be6064b7af887ab440e8695d0","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.8.tgz"},"directories":{}},"0.4.9":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.9","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.9","_shasum":"304d3d4726a58e33d8cc965afdc9ed70b996580c","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"304d3d4726a58e33d8cc965afdc9ed70b996580c","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.9.tgz"},"directories":{}},"0.4.10":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.10","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"^2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.10","_shasum":"ab7bf1be3ba07d769eaf74dee3c9347e02283116","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"ab7bf1be3ba07d769eaf74dee3c9347e02283116","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.10.tgz"},"directories":{}},"0.4.11":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.11","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"2 >=2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.11","_shasum":"032e9b6b050ed052ee9441841a945a184ea6bc33","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"032e9b6b050ed052ee9441841a945a184ea6bc33","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.11.tgz"},"directories":{}},"0.4.12":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"0.4.12","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"request":"2 >=2.25.0","graceful-fs":"~2.0.0","semver":"2 >=2.2.1","slide":"~1.1.3","chownr":"0","mkdirp":"~0.3.3","rimraf":"~2","retry":"0.6.0","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@0.4.12","_shasum":"34303422f6a3da93ca3a387a2650d707c8595b99","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"34303422f6a3da93ca3a387a2650d707c8595b99","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-0.4.12.tgz"},"directories":{}},"1.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"1.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@1.0.0","_shasum":"2a6f9dfdce5f8ebf4b9af4dbfd738384d25014e5","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"2a6f9dfdce5f8ebf4b9af4dbfd738384d25014e5","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-1.0.0.tgz"},"directories":{}},"1.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"1.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"98b1278c230cf6c159f189e2f8c69daffa727ab8","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@1.0.1","_shasum":"c5f6a87d285f2005a35d3f67d9c724bce551b0f1","_from":".","_npmVersion":"1.4.13","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"c5f6a87d285f2005a35d3f67d9c724bce551b0f1","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-1.0.1.tgz"},"directories":{}},"2.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"~2.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"47a98069b6a34e751cbd5b84ce92858cae5abe70","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.0","_shasum":"88810dac2d534c0df1d905c79e723392fcfc791a","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"dist":{"shasum":"88810dac2d534c0df1d905c79e723392fcfc791a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.0.tgz"},"directories":{}},"2.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"123e40131f83f7265f66ecd2a558cce44a3aea86","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.1","_shasum":"611c7cb7c8f7ff22be2ebc6398423b5de10db0e2","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"611c7cb7c8f7ff22be2ebc6398423b5de10db0e2","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.1.tgz"},"directories":{}},"2.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"6ecc311c9dd4890f2d9b6bae60447070a3321e12","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.2","_shasum":"a82b000354c7f830114fb18444764bc477d5740f","_from":".","_npmVersion":"1.4.15","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"a82b000354c7f830114fb18444764bc477d5740f","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.2.tgz"},"directories":{}},"3.0.0":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.0","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"6bb1aec1e85fa82ee075bd997d6fb9f2dbb7f643","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.0","_shasum":"4febc5cdb274e9fa06bc3008910e3fa1ec007994","_from":".","_npmVersion":"1.5.0-pre","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"4febc5cdb274e9fa06bc3008910e3fa1ec007994","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.0.tgz"},"directories":{}},"3.0.1":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.1","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"fe8382dde609ea1e3580fcdc5bc3d0bba119cfc6","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.1","_shasum":"5f3ee362ce5c237cfb798fce22c77875fc1a63c2","_from":".","_npmVersion":"1.5.0-alpha-1","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"5f3ee362ce5c237cfb798fce22c77875fc1a63c2","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.1.tgz"},"directories":{}},"2.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"2578fb9a807d77417554ba235ba8fac39405e832","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.3","_shasum":"93dad3d9a162c99404badb71739c622c0f3b9a72","_from":".","_npmVersion":"1.5.0-alpha-1","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"93dad3d9a162c99404badb71739c622c0f3b9a72","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.3.tgz"},"directories":{}},"3.0.2":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.2","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"15343019160ace0b9874cf0ec186b3425dbc7301","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.2","_shasum":"5dd0910157ce55f4286a1871d39f9a2128cd3c99","_from":".","_npmVersion":"1.5.0-alpha-2","_npmUser":{"name":"othiym23","email":"ogd@aoaioxxysz.net"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"5dd0910157ce55f4286a1871d39f9a2128cd3c99","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.2.tgz"},"directories":{}},"3.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.3","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.3.3","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1 || 3.x","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"b18a780d1185f27c06c27812147b83aba0d4a2f5","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.3","_shasum":"2377dc1cf69b4d374b3a95fb7feba8c804d8cb30","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"2377dc1cf69b4d374b3a95fb7feba8c804d8cb30","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.3.tgz"},"directories":{}},"3.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"~0.5.0","normalize-package-data":"^0.4.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1 || 3.x","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"54900fe4b2eb5b99ee6dfe173f145732fdfae80e","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.4","_shasum":"d4a177d1f25615cfaef9b6844fa366ffbf5f578a","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"d4a177d1f25615cfaef9b6844fa366ffbf5f578a","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.4.tgz"},"directories":{}},"3.0.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.5","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"0.5","normalize-package-data":"0.4","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"2","semver":"2 >=2.2.1 || 3.x","slide":"^1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"BSD","gitHead":"635db1654346bc86473df7b39626601425f46177","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.5","_shasum":"cdabaefa399b81ac8a86a48718aefd80e7b19ff3","_from":".","_npmVersion":"2.0.0-alpha-5","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"cdabaefa399b81ac8a86a48718aefd80e7b19ff3","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.5.tgz"},"directories":{}},"3.0.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"3.0.6","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"^0.5.0","normalize-package-data":"0.4","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"2","semver":"2 >=2.2.1 || 3.x","slide":"^1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"ISC","gitHead":"eba30fadd724ed5cad1aec95ac3ee907a59b7317","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@3.0.6","_shasum":"14a17d9a60ed2a80b04edcbc596dbce0d96540ee","_from":".","_npmVersion":"1.4.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"14a17d9a60ed2a80b04edcbc596dbce0d96540ee","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-3.0.6.tgz"},"directories":{}},"2.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"@npm/npm-registry-client","description":"Client for the npm registry","version":"2.0.4","repository":{"url":"git://github.com/isaacs/npm-registry-client"},"main":"index.js","scripts":{"test":"tap test/*.js"},"dependencies":{"chownr":"0","graceful-fs":"^3.0.0","mkdirp":"^0.5.0","npm-cache-filename":"^1.0.0","request":"2 >=2.25.0","retry":"0.6.0","rimraf":"~2","semver":"2 >=2.2.1","slide":"~1.1.3","npmlog":""},"devDependencies":{"tap":""},"optionalDependencies":{"npmlog":""},"license":"ISC","gitHead":"a10f621d9cdc813b9d3092a14b661f65bfa6d40d","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"homepage":"https://github.com/isaacs/npm-registry-client","_id":"@npm%2fnpm-registry-client@2.0.4","_shasum":"528e08900d7655c12096d1637d1c3a7a5b451019","_from":".","_npmVersion":"1.4.22","_npmUser":{"name":"isaacs","email":"i@izs.me"},"maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"dist":{"shasum":"528e08900d7655c12096d1637d1c3a7a5b451019","tarball":"http://registry.npmjs.org/@npm%2fnpm-registry-client/-/@npm%2fnpm-registry-client-2.0.4.tgz"},"directories":{}}},"readme":"# npm-registry-client\u000a\u000aThe code that npm uses to talk to the registry.\u000a\u000aIt handles all the caching and HTTP calls.\u000a\u000a## Usage\u000a\u000a```javascript\u000avar RegClient = require('npm-registry-client')\u000avar client = new RegClient(config)\u000avar uri = \"npm://registry.npmjs.org/npm\"\u000avar options = {timeout: 1000}\u000a\u000aclient.get(uri, options, function (error, data, raw, res) {\u000a // error is an error if there was a problem.\u000a // data is the parsed data object\u000a // raw is the json string\u000a // res is the response from couch\u000a})\u000a```\u000a\u000a# Registry URLs\u000a\u000aThe registry calls take either a full URL pointing to a resource in the\u000aregistry, or a base URL for the registry as a whole (for the base URL, any path\u000awill be ignored). In addition to `http` and `https`, `npm` URLs are allowed.\u000a`npm` URLs are `https` URLs with the additional restrictions that they will\u000aalways include authorization credentials, and the response is always registry\u000ametadata (and not tarballs or other attachments).\u000a\u000a# Configuration\u000a\u000aThis program is designed to work with\u000a[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\u000aa plain-jane object with the appropriate configs, and it'll shim it\u000afor you. Any configuration thingie that has get/set/del methods will\u000aalso be accepted.\u000a\u000a* `cache` **Required** {String} Path to the cache folder\u000a* `always-auth` {Boolean} Auth even for GET requests.\u000a* `auth` {String} A base64-encoded `username:password`\u000a* `email` {String} User's email address\u000a* `tag` {String} The default tag to use when publishing new packages.\u000a Default = `\"latest\"`\u000a* `ca` {String} Cerficate signing authority certificates to trust.\u000a* `cert` {String} Client certificate (PEM encoded). Enable access\u000a to servers that require client certificates\u000a* `key` {String} Private key (PEM encoded) for client certificate 'cert'\u000a* `strict-ssl` {Boolean} Whether or not to be strict with SSL\u000a certificates. Default = `true`\u000a* `user-agent` {String} User agent header to send. Default =\u000a `\"node/{process.version} {process.platform} {process.arch}\"`\u000a* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\u000a that works, otherwise logs are disabled.\u000a* `fetch-retries` {Number} Number of times to retry on GET failures.\u000a Default=2\u000a* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\u000a* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\u000a Default=10000 (10 seconds)\u000a* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\u000a Default=60000 (60 seconds)\u000a* `proxy` {URL} The url to proxy requests through.\u000a* `https-proxy` {URL} The url to proxy https requests through.\u000a Defaults to be the same as `proxy` if unset.\u000a* `_auth` {String} The base64-encoded authorization header.\u000a* `username` `_password` {String} Username/password to use to generate\u000a `_auth` if not supplied.\u000a* `_token` {Object} A token for use with\u000a [couch-login](https://npmjs.org/package/couch-login)\u000a\u000a# client.request(method, uri, options, cb)\u000a\u000a* `method` {String} HTTP method\u000a* `uri` {String} URI pointing to the resource to request\u000a* `options` {Object} Object containing optional per-request properties.\u000a * `what` {Stream | Buffer | String | Object} The request body. Objects\u000a that are not Buffers or Streams are encoded as JSON.\u000a * `etag` {String} The cached ETag\u000a * `follow` {Boolean} Follow 302/301 responses (defaults to true)\u000a* `cb` {Function}\u000a * `error` {Error | null}\u000a * `data` {Object} the parsed data object\u000a * `raw` {String} the json\u000a * `res` {Response Object} response from couch\u000a\u000aMake a request to the registry. All the other methods are wrappers around\u000a`request`.\u000a\u000a# client.adduser(base, username, password, email, cb)\u000a\u000a* `base` {String} Base registry URL\u000a* `username` {String}\u000a* `password` {String}\u000a* `email` {String}\u000a* `cb` {Function}\u000a\u000aAdd a user account to the registry, or verify the credentials.\u000a\u000a# client.deprecate(uri, version, message, cb)\u000a\u000a* `uri` {String} Full registry URI for the deprecated package\u000a* `version` {String} Semver version range\u000a* `message` {String} The message to use as a deprecation warning\u000a* `cb` {Function}\u000a\u000aDeprecate a version of a package in the registry.\u000a\u000a# client.bugs(uri, cb)\u000a\u000a* `uri` {String} Full registry URI for the package\u000a* `cb` {Function}\u000a\u000aGet the url for bugs of a package\u000a\u000a# client.get(uri, options, cb)\u000a\u000a* `uri` {String} The complete registry URI to fetch\u000a* `options` {Object} Object containing optional per-request properties.\u000a * `timeout` {Number} Duration before the request times out.\u000a * `follow` {Boolean} Follow 302/301 responses (defaults to true)\u000a * `staleOk` {Boolean} If there's cached data available, then return that\u000a to the callback quickly, and update the cache the background.\u000a\u000aFetches data from the registry via a GET request, saving it in the cache folder\u000awith the ETag.\u000a\u000a# client.publish(uri, data, tarball, cb)\u000a\u000a* `uri` {String} The registry URI to publish to\u000a* `data` {Object} Package data\u000a* `tarball` {String | Stream} Filename or stream of the package tarball\u000a* `cb` {Function}\u000a\u000aPublish a package to the registry.\u000a\u000aNote that this does not create the tarball from a folder. However, it can\u000aaccept a gzipped tar stream or a filename to a tarball.\u000a\u000a# client.star(uri, starred, cb)\u000a\u000a* `uri` {String} The complete registry URI to star\u000a* `starred` {Boolean} True to star the package, false to unstar it.\u000a* `cb` {Function}\u000a\u000aStar or unstar a package.\u000a\u000aNote that the user does not have to be the package owner to star or unstar a\u000apackage, though other writes do require that the user be the package owner.\u000a\u000a# client.stars(base, username, cb)\u000a\u000a* `base` {String} The base URL for the registry\u000a* `username` {String} Name of user to fetch starred packages for.\u000a* `cb` {Function}\u000a\u000aView your own or another user's starred packages.\u000a\u000a# client.tag(uri, version, tag, cb)\u000a\u000a* `uri` {String} The complete registry URI to tag\u000a* `version` {String} Version to tag\u000a* `tag` {String} Tag name to apply\u000a* `cb` {Function}\u000a\u000aMark a version in the `dist-tags` hash, so that `pkg@tag` will fetch the\u000aspecified version.\u000a\u000a# client.unpublish(uri, [ver], cb)\u000a\u000a* `uri` {String} The complete registry URI to unpublish\u000a* `ver` {String} version to unpublish. Leave blank to unpublish all\u000a versions.\u000a* `cb` {Function}\u000a\u000aRemove a version of a package (or all versions) from the registry. When the\u000alast version us unpublished, the entire document is removed from the database.\u000a\u000a# client.upload(uri, file, [etag], [nofollow], cb)\u000a\u000a* `uri` {String} The complete registry URI to upload to\u000a* `file` {String | Stream} Either the filename or a readable stream\u000a* `etag` {String} Cache ETag\u000a* `nofollow` {Boolean} Do not follow 301/302 responses\u000a* `cb` {Function}\u000a\u000aUpload an attachment. Mostly used by `client.publish()`.\u000a","maintainers":[{"name":"isaacs","email":"i@izs.me"},{"name":"othiym23","email":"ogd@aoaioxxysz.net"}],"time":{"modified":"2014-07-31T21:59:52.896Z","created":"2012-06-07T04:43:36.581Z","0.0.1":"2012-06-07T04:43:38.123Z","0.0.2":"2012-06-07T05:35:05.937Z","0.0.3":"2012-06-09T00:55:25.861Z","0.0.4":"2012-06-11T03:53:26.548Z","0.0.5":"2012-06-11T23:48:11.235Z","0.0.6":"2012-06-17T06:23:27.320Z","0.0.7":"2012-06-18T19:19:38.315Z","0.0.8":"2012-06-28T20:40:20.563Z","0.0.9":"2012-07-10T03:28:04.651Z","0.0.10":"2012-07-11T17:03:45.151Z","0.0.11":"2012-07-17T14:06:37.489Z","0.1.0":"2012-07-23T18:17:38.007Z","0.1.1":"2012-07-23T21:21:28.196Z","0.1.2":"2012-07-24T06:14:12.831Z","0.1.3":"2012-08-07T02:02:20.564Z","0.1.4":"2012-08-15T03:04:52.822Z","0.1.5":"2012-08-17T21:59:33.310Z","0.2.0":"2012-08-17T22:00:18.081Z","0.2.1":"2012-08-17T22:07:28.827Z","0.2.2":"2012-08-17T22:37:24.352Z","0.2.3":"2012-08-19T19:16:44.808Z","0.2.4":"2012-08-19T19:18:51.792Z","0.2.5":"2012-08-20T16:54:50.794Z","0.2.6":"2012-08-22T00:25:04.766Z","0.2.7":"2012-08-27T19:07:34.829Z","0.2.8":"2012-10-02T19:53:50.661Z","0.2.9":"2012-10-03T22:09:50.766Z","0.2.10":"2012-10-25T14:55:54.216Z","0.2.11":"2012-12-21T16:26:38.094Z","0.2.12":"2013-01-18T22:22:41.668Z","0.2.13":"2013-02-06T00:16:35.939Z","0.2.14":"2013-02-10T02:44:02.764Z","0.2.15":"2013-02-11T19:18:55.678Z","0.2.16":"2013-02-15T17:09:03.249Z","0.2.17":"2013-02-16T03:47:13.898Z","0.2.18":"2013-03-06T22:09:23.536Z","0.2.19":"2013-03-20T06:27:39.128Z","0.2.20":"2013-03-28T00:43:07.558Z","0.2.21":"2013-04-29T15:46:54.094Z","0.2.22":"2013-04-29T15:51:02.178Z","0.2.23":"2013-05-11T00:28:14.198Z","0.2.24":"2013-05-24T21:27:50.693Z","0.2.25":"2013-06-20T15:36:46.277Z","0.2.26":"2013-07-06T17:12:54.670Z","0.2.27":"2013-07-11T07:14:45.740Z","0.2.28":"2013-08-02T20:27:41.732Z","0.2.29":"2013-10-28T18:23:24.477Z","0.2.30":"2013-11-18T23:12:00.540Z","0.2.31":"2013-12-16T08:36:43.044Z","0.3.0":"2013-12-17T07:03:10.699Z","0.3.1":"2013-12-17T16:53:27.867Z","0.3.2":"2013-12-17T22:25:14.882Z","0.3.3":"2013-12-21T16:07:06.773Z","0.3.4":"2014-01-29T15:24:05.163Z","0.3.5":"2014-01-31T01:53:19.656Z","0.3.6":"2014-02-07T00:17:21.362Z","0.4.0":"2014-02-13T01:17:18.973Z","0.4.1":"2014-02-13T23:47:37.892Z","0.4.2":"2014-02-14T00:29:13.086Z","0.4.3":"2014-02-16T03:40:54.640Z","0.4.4":"2014-02-16T03:41:48.856Z","0.4.5":"2014-03-12T05:09:17.474Z","0.4.6":"2014-03-29T19:44:15.041Z","0.4.7":"2014-04-02T19:41:07.149Z","0.4.8":"2014-05-01T22:24:54.980Z","0.4.9":"2014-05-12T21:52:55.127Z","0.4.10":"2014-05-13T16:44:29.801Z","0.4.11":"2014-05-13T20:33:04.738Z","0.4.12":"2014-05-14T06:14:22.842Z","1.0.0":"2014-05-14T23:04:37.188Z","1.0.1":"2014-06-03T00:55:54.448Z","2.0.0":"2014-06-06T04:23:46.579Z","2.0.1":"2014-06-06T06:25:14.419Z","2.0.2":"2014-06-14T00:33:10.205Z","3.0.0":"2014-07-02T00:30:29.154Z","3.0.1":"2014-07-14T23:29:05.057Z","2.0.3":"2014-07-15T00:09:36.043Z","3.0.2":"2014-07-17T06:30:02.659Z","3.0.3":"2014-07-23T21:20:42.406Z","3.0.4":"2014-07-25T00:27:26.007Z","3.0.5":"2014-07-25T00:28:48.007Z","3.0.6":"2014-07-31T21:57:49.043Z","2.0.4":"2014-07-31T21:59:52.896Z"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"url":"git://github.com/isaacs/npm-registry-client"},"users":{"fgribreau":true,"fengmk2":true},"readmeFilename":"README.md","homepage":"https://github.com/isaacs/npm-registry-client","bugs":{"url":"https://github.com/isaacs/npm-registry-client/issues"},"license":"ISC","_attachments":{}} diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json new file mode 100644 index 00000000000000..01da3002763731 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/cache.json @@ -0,0 +1 @@ +{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"47ac53683daf832bfa952e1774417da47817ae42","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}} \ No newline at end of file diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/1.3.3/package.tgz new file mode 100644 index 0000000000000000000000000000000000000000..19da9baa7fb191637b058d52d7f1c94a67e2196e GIT binary patch literal 58692 zcmV(^K-Iq=iwFP!000001MIyEfFxCUC_I273Uc0lqgR`@ zIy1||b=_OtUEN(f)m2SZ^~^MTS2Quny*CeTOpF>eMiWIvG>Agb5Y!~<^>wci@Iegm z{w4~F(M0qH1pe>)&aSl4-tXP?}Td&y_*YmBu zQ~t?jvtuJ82L2r%8>PS5JbTWH-?`k_*!XB}B%2-W%jWW<`EhuE>buhVX#}C^Lsw3= z9ySz1{{0W~39TT^^e>ppR@ru}{*qS=GC%J=ZGC=rpE_Uv(+8&JW}c!pdanN*uK)4j zvEk9N{OAa*|J-mkzqS5<7N3S&vizV3bpKe8_WVl!&$~lgpP%VRtpBpPVi!F(4PU3c z4P5u5qn*}&esp|{)_*=fJ`CIc81DaL-zepE`93zx%JulY<>Rk`8@gLlYOW0&*}UVfBt#*@n`h`P;Bbo&;KL# ze;fF~wRAPCIj6pjZv1~9kNTsu|BvLdBg60?o&QI+`2U~DXXlIe%ug>}dvM0sw=}nZ zvVSL{0RFMe(qzA3?5tU#X;j0op0ciM*ekmdz$J#38>Yf$-AWkzX;&h&*1`-H-chWY zeqe>W4lV6XZA%!L_SIaIIy9A<_G)!AvY&!~-a#@V8?ge&ed+vl$w%4qZNDjUFgpu80I955N z9|bQAy&C@HIacjbSOv&uvkLUy3XItCR#PxOvk`hN>1z{4)h?ARSG-BBT7_jhOvxNU z(f1sf+sXv=p;4^Leww8crRGNKYev=>hGywYPP^v=Vx@eB5IJ}oc#d5%E-DlXD$iOf zsG22j6$S$T<*|~BipAm%*^zEpYTor--fI(JrbDlIlu$dVKTNFH0Bx%zXQgBZb;kr~ z6&$a)97Dr`W2!X5omGzR1<#Q)RWtpH?WSnL5H@;0B0ZU?B9LX%FvmbGQY8zPqRB9T z`Tpdcc8ioG1h z-p1kFTC1tm+h)e}j(5Twz4|r{w4lZMP(#%V)FzGlh6!&~J)As@j%HhDY9vcjg|CeK zST>5YSlz1WyD)RIvi3O6=8CNbLKU3|D`GxAo|W{RHBpaMJi%6RoV00u=gS%vbITGI z&5VqUMDk9U0OJ*0|1k)+Y%;7sHJ3E1dH6RB|3={7DEu3fr35k)4D#9dI=Q1h(fb~v@`VK zU#VrfU_X-kK{g5qEw{F50DEBM@GIZC>>7?N(LxxCwqJB4&Z{;h>5n!ZAp-)7vJtAt zM=iF~T+93*f|OwBbsxtc#-~+Kra8|wi(b;0_FUNK%s}xEECpGIn&)~jQ$=mj>a&#B z`xPax+gb=YpTc%@oWLGND2Rd-?$UZ?ojDPDN1J$L`!1DAdXDQo0$V%chH#7Yq63CS zO97lCg*rkghE7?ARHL!MF)oBPIog&9Q9Wbe$wt^1*0r4(&JFL(utUI3WQiyH@f8qA z!!7|U&h}(r+F|+wV7UdqnV@`-(-f~H4&Mn|BAOv+3|0$+;yi> zTuw~VpWd^*hO@oaGoKB(1z)}L0V^2p1|YD%y>cUAtYdcmV?DK7rCAglu_pLK&vMm9 zxeP09lK<$HKlG-2--LegA3f^_0t%JGcQohDOv72n!Z)!EwdSeGlUwd(+Ydrq3-G5m za>0?hyL`=TgDBK{`911RUde8B!S{r@7fE%wGwLbU%g6rl-pZJPP0r~HT~(i zbbVw<@OwQ(#0xA&MBvA!P|PbJL!c0Bo;{xwdM#T>-SNBE5LQg5VL@K@w;h&yZjHnRy#)PT~9e}T% zgfE!6u0dNL`>~GvwR+g3{P<%X`5mifxgnKcKYN$qya)f$J3m8FEWm!Pr-e!b`x3BL z_(ShndY3rRs1=Yvh+pgI88R;x^^1P>F0tG59LuDk@SnZQ z>@isz__ufN1*%D8*E+^+9-u*+2i5~4$6*lay$jg^9(>^xWtFgqeApC)Y=pLB z<024eYW93m6w>vkJ-6)Gh{o!7&ta7SZK*5bS5E?B*O0u@pWa8FHFoG(>wWA&ZmeO= zmKa}#zj_kjplH?snb_ZTaMD0aiI;}IJx6KP>JFi*__e8tE>=z3rIjm$5j^3frkZL6 zdXInBwH@-^a8pA-Rj%60_v6z>1Tt0RR2?q@0Z1|SdzDBvJ2NGFMaippg;Gr*MO1YX zW!ai|NP)?&RSXh??MiT2>hN|HP#Z!_Ikp|15=P(`cO`V~uCk{^?QX&_op4toBIx2O zY3yfRc11QUppB~XiA<&fC!|Ip4Lno^TA`f*_U1-OYbTS?^x6mm!ww9S*T>02s$e;x z;n)S=^qWT6^NlOa6?3uZ+x5^0t7d4_eQyQUEtE7IFEqR|BwM@^!N-^mW~=ySt%e$s zpixH!Fe~5m8pf*Ea7u=?RtKarY`4RZpo-8#5jQh9&X{#OF?moVl49Nz;24CS#>=m+ zuBQD)p_u}JPz3}8nq`3hj0-^WQG!p#EQ!el$ci-%C3&5NMriPZr@NT6}R*l@gsc<2$A2!nM_O`dpZ8bUSVa8 zHPJQGEwvOzk#zyMF$S%~o} z)!C*4$FdTvGN%sxosbP0c*28uN*c#tQUaP3F$IjO(#w)%)eQ@oM?iW5eOo9Q;Tm{` z=i>Z9CdaA(84hsf#AL??7$gn5jPm&aR$LMb*F1nA^uza71LzveH1xd@SQ;|8CTiUb z8~Q`crOChwXa#V9MK?nNUk(=?WI}2Sk7Cgjr0A6Au~rCW1dzQNgDIg*LCFdVlbw-Z z%D}UjV}+K&GV=eyFTPxs;HPnkS*!0bc3W<-S~LA+W3j=RI9?GD7%nR<5ix*@OEwg0c>9Ig8CKKEUoPqlH`j+LQD#~^lP{VNYqDXx^GmvE9Ug}zoEa@A7=P)0u zmKD;nh<7gp!Uovb+P}o)%VPC+o06TjwpYHeGof))JTIgZkh^?o)eRUq!~#SfdyV>lmr)jV$p<^ zJ{2T}u)UobXo0sy+G9E1&=)`Pp)@JS)QGSIlY3x!J6;`!VqC@TT%_s?S*@@XtH_=l z9$zjbfwCje0KWo2P}+VDI>>&Pff1bcYWyr|N2-9|{zkf(g8iPlc~G)S>+a$K;1>fTd(xOVZkz!ePaW70z;m83VQ__EU|@H$)J_#9&hlYh z);yf6xjn|<0vaFs))k9GVxLPZZqZQsO@V4A=L$s^t9g1I(G4o4ppt(YgG_CJD~rpl zhBPFR%qLR>Dv%Y#K$)F{&=D3UcOto)JetPmK{OSB{R!5i8G3%wI83IKYvB=SgYu~g zb)72NOe7|!@XthSOVahLtS7!;Q}HuPZ6OUqYZ4O+V<%__f|Y8q{SG$GrfoUIPhm%i z3N>KU1cCzHz-@~684JqF#h#lciXF>^L;?k#C9EW5@A+_9>jYiet$}bTI*%H2ToP$x zhV^8{E7EN8?Ks{>(S%v#3kbF)%Q8$MiJ8z)I-DHjgM}t>&rOoy#t@NJ;4aD$&>(?p zN}NN293v1~P??d{Q78H5gFL9}VqCs}b*04*E2U#Kcb%k`(o zG|-dDevWO2b4eqgG=`5PW%)s1vWJetMsE2b{oY}m7~0Xl>yk>igQW%x0bCLo2|P%r z)1uPjI9Wh*ld$J_@BMiD8O>-23nV%W#t?Fd zFj?V~#;+PR3yw}DSvkWY1dhbm2JS?*3mlVKTJMt3F*dq1Hn=1@BQs89XI%CzqEzr; zTxtyK7NVj8o~ z!Egn_AtG~iIIv!uksk`vH^dm=$n5sFIAMVDUKxOfNJ$ zA#X=yTrq*+24vV}$mwc_nQY1;_=!ozOEC?wC~0IRB8~NT!60tw(-V!j5l|eLDEZVO z)P$IOe;sIqECJcor=T9MXft{wOu^Y+t}v%{N0b$5G$)td*0u&Y{A6^4#2kA?e`SS$ zSa2jo2A{dWAX`qAro;u2_SU0BCdga5ib= z09OukoH;y_G)9jc*+H4m3`4^$eflJBnMtECWJtU+(To}xq`|@vA=cp|ibP@63^@Ve zu-W#g#*D+d;25(TQ^gJ2*8QHh9LPN}x_ff|QjnP>hYoJD_=*g8h|NSv zS(MQXXnSoS_lOddHajX}vfOc5#ZXAGeu3w?9BU9VbT&4D2G!{>WJtD?WDA}ZxC0?> z=!nQx1k>^K2d8TsMOR#cBd1GfLK7hfP|{%YJ=S%Pyx7PayLO>5wA#z^o$!L00(Qj= zA?i}Nfhng9JCscFslg7MD#4<`K|*7_EU{5BDLZtpC!%yDVTu`30OR~va(yhlnD&6r zI|2FRXCA502o~(L2{Dy;*ZoH@2WsoVl#O6ObS4-03e%<_${$N50Ok-UST;?VLUW`h zvh7^)rO(#3S0{fqOUQfW6m^{quT%;+t)}swg2~8H@zD;GLDsWfW`YcB)il84DO-h7 zgxzBiimBUaPr@u%C@4bohOP*PO-*QQQL+^lw#pIIOv<&_@%YTwR7~ow^Z{KC83?Y! z*y$u55Zs32B#nWl6%4>M9!(3yxSXr9=>%4Xd2*ZG=gDnG=E-gHc{(hHedHwQC08$O za-x(jt@lKAVxA)twTQ02DfEbG*dY_I2ccIF#0DsKXslf^Xk|ufzH`~ zf}~#GIuHQn;V_%`ET8%$n`XsPVV~Mhx->=aGV#(%T}?hu;s`)6->_tYwBy0%C!NnP zw+>(jFAlD@n`a{swhPpTJ-KVwE~*PB1gWi1?%H(< z2rP#Wj}p}!N5VBsvynRjzX#B_U_k9}I8&oMo0zl?n;mz)=rT#%FGI}{CGaV#`(EAh z!zRMB*R-H=)dkkdMugW+m#fH7;99W!s#)g~=K+2fy;=>jz~M1fGy{UBP7ArbZGz28 zF(fvVo&UVD>=`Gp-6aj7=T$7^G7cX{Trnn$ftqIlUBaU%y2QePPrh-0k!{L%qmg&T zhVQ6%W7!jM;1m$!t-y3)Zf&{}&=!Umpo;Ma)spBiW8?zURXV#CmCmkhY}@P1Btlho z4S1?{vQ#0)jB5?p3emQRm=rX+{?Jgwa!HdyEf#&OkE|P-fG2jb8d*ZTBZ1+Y?y^<- zxy~`dSIJs+)Alx7a)*#$Of0a;Gd#w!?INswWJ z1F{2Y8iQ6PP09+#aw}n#6cj^U_CXH4^&bJ}%&?jc*qlbRVz`rzkY-_+w$ywFYAap- zy3Dfl22|6`lVbDSYjPLs4l(bBQlB&NePE#mi7I7`43o*@+{LFZwlF$RVcVr@ikaiu zDX3k|uY@u0N+5b7r&edQB2|keu2rWFKV2qV!0~V{jr>j;XDU6?eY(qz=lLxYempl} zU@cHK55HtpC;Ihf20RzHgn@9?qd%y&!jtI$Lr}G8A0LKF66gv7`!(cFK&DYlq9O^X zwj<4u9-%!5hjbQ=QV*W2A7ym9-V4VLF-dH}cG1u^uuLBbs%M~h*azxoab*xRVE|ty z32x-*qMu5b!iNqfB*hObqDzFg@gpq|Bu0kdT@6lCc%q7D8qfv4R23B=jBT}%(Ds*> zeFYjp%b$j(&LY}`#0M!PQN^-G@On@l0eRXy^6+mM{*B;9lEpL8s6>w84wEn3db>@$ z@c7jxoh1!&9qxL!2UbdL5be*GkW*vDBhrSLahc_&SM6mR2#{@(Z5cjg_S!+!@-Lpr zU%V}Q@%G_sQDSgZ4wSu3QL3RiGj{_tA8jj*kLX)+f_9H~rrpvlx(mFe$FzbsPg)ne zr}0GNhd~Rb51MW>tTL$!EF(03#MQy9gi2&3G?e7JS#38q9ey0gb&4u8G#(|RgjypM zG8|~fR8COR#HS-r2PLsolu`{-RyC9k9J^=@=7??%D)>jF*qG1(-psAM8*-CJsfO9` zyaBXkVkl<9qU*Oio!Q%A7q-~dKB4m>=B91J`<$>nx2uXo!V$g#fRhWJ=I#gqZI|w*Up>X$HSs}|O1XmoP2-pgQ zK#Z(4685QvTHq^dEc;$fV??`(uh{TA0b5J&Kw4N3hb};8@f{Sz@p%*AR`A^@hH}h| zz`H#F*NdPugiavKby6hufD?;up(_zJI1$&kQ6d05+I#e| z^yEyR;Dr^0J)Iix-9U$}z)%z~5-MdKV;>vM1p?m`&&af z=-S+N4K_XW3dTp@Ql04ndjSP9+~FD_g7&}w%C95ZTasvZFs2ZpR=VwjA_|MP6S5?^ z6oM-B*<0;NIQFt~%nX%WU?Nj7NGuEUvJy-n*?KqOz*P^c%#O6_HDrZ#PLX*B7^|*O znn;c30*OcU0&5(-284Z|gKiStc0E2$gyP{m*CQN0JaPm+Eg(i#Z%2QRQc2PQwJFQq zcaUJp2sd4(Nd~`B)5MeHG+oM&djn##-m3;hAEsMW#6+BYg9!N%>q*zl*#SFw64#DY zO?R~GGAm+O9C$fWjWWR$3OjH`td|Mrp@6!8l}8CuK&6DiOBrL^`@};hYDUPZq!jSc zF+63f?J{8c8KHN^jLhF04??v-lL&LUK$1~wlbkT6W)#_Vlr^G9RBYyg9{fHVnx?sg zv%7?GF3ar$bL~){GD4P4jG!JxsVg_A2UyZsLY2NL*b9j2)>8;LCcaUXbBn9aU^AEl zNJIn5Ws6Y_HJ9LRXaXX`+~_=XfW01vste@x5LF89Dpe4XOFbBn-xK(YcFlH7pDTMc z+LR>D+;6p}BK9LfV@_;xo+b~-1Mmn@wl!R z?YJ&RI<8afW3Wh4vLoH)kzKh-Mjtlj|50kx9lL0TR;rAr_^3Q9G66#9)oM&3>t!b+ z&9;K=&t#}i%xP%_HwR?~7nxvKFicXYXj@&J7Bp)R+#isqA0t~Fqxm4W?7 zS2CyK`G9OSjd5c=S~US_l#DY%T8)CqHEVI7mLxZ^bTz<6C92ZftSec)PTQ=+PSuuy zXpd#Yl-Q5ZOdXYjaQA~|RI6|!2YSh$R0hl7qZOgOg1G>d`3r@83)uukh9Q>KZ) z{8CQ0TD4r7l`6Wu23FnlbvKHV8JgTLTO-v)4|YAA27MJvz836^WSq z0Vs_UBU?mNFtMO-ui@A@Bg)1`o+ALhv{|n^%?JmB{3sy@MjzuEeyW2^@dHlp01vC( zu>mLNFjuBa%{kX)6R)U?$+_(xXYXTnUx$S)1Qx-JSU}oEU>&RgrZOW5tW~6T+^Tu# zzplHqG@Mc!G$je@CKWA$$ZbTV5L2f_tibrGfXwc+JwVYcMVfphBB`7(D3hx1_PdBC zu^^>Sd+$fxWK0_0H(bXG(9nJ$Flsi@uXIPuleNJ-RrooD8R1L1DTyUVYFJec#y4mR zYRQj1VaRDD{7`bHHpCLh9y*zuf=WizSzXx?HmMpXlJ6x`iG+{rA%dE1#Um{_f=e66 zA5OMNs^k>`|7qXn%74wQ@MLkQ1z$+G9vz*U9nE7F=tzK9)$|Z*&Bi8yDd6L?G15W8 z#e#Bn6LGP4otlgb69y0CHAW#cfp)QY!Vj%_&qX|?#)msC;B1J;ZfgyO*-SBA1dv+f z#c6v%cDDljM-uh{x73W9tN~IpZ*>eXK~fUXM6ttLvqA6%I1&yYl)s)szZDcJQ6;~~3kump5 z&*MfFh-uZT4RzEtQQ1N-=dwb~xeT8Nl|_f}yx)kS?QW=o#X1o62%KRuTd#0T20E%) zrYqH<$St8}BO)zVltcs@NGj%ys2p(6RhwdUNJYOmG0Bz`r!-$@ftb($8VB2|R#O%V z@&3c?q{=osHP;j(n{k(2VDrdn7MUxXnep~?Xu-COUCM%`0*4lq4=UxXNHJb&3``gU z@CV18CTpq_JNkJA+7xQmiO7bX0QReDqp=FU9F&L$i4z89Xir*Yu;3n8G!=D#;YouE zgOrW+`f!M(r&6!WN(Y)URL3LIaZ#j{s9UktCYPC#F&ZAI_=d<$?ASJH3deehiy4+o?2I9?JuMHTuD2?Ko!E(|ZgxKgcV;i~rxHXq;sdxf1zKGr3 zVY1K&L(jd+wpIZ@@!k%{ELaX?0mM|nat3fgdG0g@3^G&%vq2fcVt`@^StSkksUq^c zrLy}d%u2LukzK8lcD%~q0Nv_Cac^3y=s$s$o&s%EpJAP_xO0O87pdMJWf=yB*m7fi z8%SznP4ltHb#^r#23epy%tHi?jVP&gg+Z6ji}HX8_{c1g(&-MCzal_)mo+M5cWV~F zEJ>sHhpTX|6FW-JRXWGY<3g?2=oK5MnXvU2&0wY#$`k7Qhl&JEY zZyQjqVq>7cXm}pZe0A%gajXFhSVJ(`%#cCUFRJHLros>Ev;;H22)gexb^)&;D%!MH z#4%vd9ikN~d?k%b95i({E`y&Fs_dX^q>S7Utf6QU^66+R(_TQ!qQZBR&9Z>;nphSS zH1u3G?F}*`b0{=(>}A?90xMjyYnGJIGLjm!pe==TCwVTk7dh9|0D*uW15qgjQV1x0 zCj}n1@D#+dGzI$U_#SrzYUvA!knE7f4rDt|x9J5krHwTSo z2^Rrj!wqew>0qbhkQhk}X#zV9tU~A#j7gWy21=^m5JnwQLdi?ySfw?MWL=zP|wmnfKL zH?2Sfvf9Q|AB1MsK`!Vf@&O3*lEGD=H{R+{n%xCEC`)(V48+A8U1@{3vqL8j zEUk4{uxmB6LJqCouArUJ#1OUj!jh=Yj!>Zv(^{ukdKg!2%_=sy&=iRekxPB^7qcCi zWybaaMX6(3KzNFp$sLA!hq_gxrrHs7?2ut}$vV)2Ds8emFl7`bLfR@EPAyH{V~dMS zQ2Rx~MW9hc9Z}3vXPN_hg=D^ap+alT#D*p`!lh)sFySl6?xT{~m^1xlib+*uVKp%T z2&|N1gGC>v_&!Y}b8Jt+#u+xr>hxX|EGz@O7;-^+h~idcmKdk$2U`Tn(kcUm$pV9R zGEaLS4oo5QODLKsS=MJzM^4(jVa-=~|0SAmE)n*Z5+m*0eTGsMrSVPMp|xD9=*A2Z zNl0G~M*um|xJRH@e@z&r5Q`ImKgR&%%`kid5TlaUC^!}i$r>;%U?OM~fQ}@@nS{ta zaGq>l)P6|#NhsJ2&XNf+uW#;WbBe@6E?F__7JG@(wkY*r(>kcicOoBNFVf+~$cCqr zjCIq8I2DL2f1;35!(=m?q#y zi6!j1gUHq`!UCEBCM%y(axs`-m2a@+iE*4FGcv&ha8^x;cF_*32fv-E3yN@hr^N!n z1YnvQt`_m@6yZw5LXY(MMC|C0C+lLgjiVApmuR?L;Es2FMCO*9(`cCnO}7Z!t?M<= zoD-GNaD-G-3=9mgYr1Iw^dM;X+*m=dEL06gQbNNr%tTN{8p}97jktJ4c1G_y{cK-A zCkGa&he6lH=QQ)1OY%H)B%$!8^j3G{gJ*Ui#b0UaBSw%OJkG-mPUy{?;HOVO8ohD! z0&cj3D@hJ^95l7X74s&Uz_vF@^n1iTWtVzs#)$B&GbcW7v^||Xul7Zd1L?pJIm5t0 z1v0Mh4XoaXhPKtb#14gAASzBkp#FKxIn1C)0p>N};xU4p)XTKez_Lf^mPQ-% znn^*5eBIuY_ew+!lyY>mK_48Frsfs#o12tZ*)!55vi;I|+VWs!5Z(__j;?4$+7(QS zW0r_r^1@elLGZoeGG-GyBMp{%|IC|Jt+fkBZ&TcWa^3^;fX)(MdAz7nk$ zGIjw*gjz_q36a);Qm>-pa)_J-Xoi9fg-5&wyMhS56Oh}EU}uJVf!VllAja4q|wWlw4n z8&PNboSJ1MTC3S^ihB|So|35W%TpL@4*l?v!_qp=hY|n+$m$3iY?nzmkmHuDO}G01 z7+~Yt_~SB;P;1N|JqQtG=n$sM?iHoWjs@w0XQ`3D6lv&ssa4!VMpwSGkey7U#$`(@ z%G}+H+HMUO=99n3k?{is*n+>1 zXJC^MS2x3US84D|Vk7mDLsA3Z1O%57MHP=6`2aAl;9Od{0&-`m+GNditQGc zWJ>e@ z67mF7VsVg)+(|w2is?e5W&&+PeA``i02Gkycrba|dTUpE+aevfcXsb@H{P9H39NDM zn6OS>fe9BVZU-IJQm_h9YD9IkU5#mqNXTuyJ?+|O{D>u{OgMObg(gfq_ZUf%(WmsD z=;j#9h7u)f?H5+3kY!%!VZ?+Lb(<)BkCwIhd%^n$o3?hzoBxsV+F-|g;K=_l=kDh9pprcLUOX-^x zBwD0S$(am!c41EpR-siI(j2NsvKV=-J<8Cv*j-SDZp>CF1CJ7A@K%vt`ectEXE}$+ z1H4iavvGk+E;D8+B5~1lbU_K~6*&6=t<`vdp(UtOg5LvZOfRz9WkEY4pOlA zQ)UWnQ!=CR7L4Mq%V@QF{AVqe?OQMiiPlQ-;oq3lzmN%Viju|XT z&NbQ2^_uO2Y_$c#h^R)UHFO&$vD>~Kkj5J?_+vPL=PJ2j>H)HpNWILAJ=B#aC?)~e zA%{c`WL>vDpq2&-6JmS`#tLm7;E@V3W*NpD7>7gL$Pq3{V0*#_3u0@qz^QCBxVC~Q ziLfZg`eu(^F5i9j*uC?S*~6p_9idx7DMxuB5tnn@D|{kR#sNI@y@VFB z;W*lBuW~WSbVLje&YsAj8P4el!jqp0B#8w;+Bm+5zQu5cQ)EnW7_QX{UUgtlF-l;u+tMSz`;V?`_^-{U#}o+*aRly=I8 zU#4m~6uRRx>p&`(%|%BVc{}S;jqAF(#13{dlZzhU;JKpk;EAUgAeK#X96cLz6_qie zy240w3S&mC4+4A4p4hO*jN<~PoO*5vD(yNrY87n;>BrEz(0#$G%&c{nc!*5VA+oen zK1fz=*J1LOGeFTY>!WDqfnMYcsY!&EnFmhs&{U+cG^@d2(Kbmg!~B{fQfZX&3rh** z-7LGR9lE)HmW53KaNigRnRxviAVUAvKLURAlm?nD&!l z(^(A~MAnZysw2#*GR+kSSBY+QTg2RQpb^>_<|Z+Di2dkpI^cTKo?CY89tRthO^2LH z9qa|L%bD|p8~UEqGbWBE)H*AmLkIaI21-Hat-2T|oI_hyX0}M)5b}qlgI^nEVq1BQ zatS0G4t+Q~+G85O%&a?_@k|jM<7pc^1WM{ABL6cDH+jHuf~SnaxM5E8=JxX7+7OIw zjX1!TYi3dHBXr^p-2%y7QkkezG{pniph>WTv3`xGDfLz&>`+fJ*{&8H0~2TM(yoj{ z=~V>d+p8hayt2C@!mdSaJ}6<(UH>%>LJ6TH$)cnJpo+Om_MRP=`QY#n?|^7(6 z>56Z<;nj9f9c11-9j=O5>v>tsTKu{gNLVM`pJH}}Xmm=^gHiph&pT;d;H{6V)8N!b zS$we&uNrEQZzk>)fPpmU%E$KvlZq3~v$@~3$8?R%7m1NP{sme79G3^EJfC?HK@uV7dcIKsYN|Wem!a5>$PH_nYd9;+I+LL@=I2PENvB=fj;Vx27QuzqEA~;HqC};$e0g^x$ z!=swXo=D1NM+Vv(?gTJ<-H$*lOT=)8QUs3mn1UI~tX=BDJO%KA4tcW-dL-ho>yBBB zTsH_y?Gm$A-@%nx^z4L@$4d0^x`r1`xM(duE)qnz8%*5G5>c0l_qM^R>}FBJMm#W$ z;l7f_evAcXP|u7x-9|Fenn7erbPAOXdr+@n*^ottKTDCSCt(uNb4Q4A!ou3D6fvqW zbt_uwiwJ1DL&b*>DB3F$16OLo##yXdR$$@fVt%7mw?e#bGYA{yax{7ZuXeyirvmtY z0Jan|zK9KZfYqk~UeudtlbIUQ@`~EqPf2Li>P|1YfXEctqIue&_`#%eN#igE-otQl zffb^Y)H*JY^lEh*?LoAg>P4*qTQjk^A3T5?zn@-<`9U6>!e=h(*C{>eQ2EHsFN}iC zf=H2eVT<{`beriinL^a8hbS*IN$kP$Q~ zMiNS7`K8)QwQG!p;=tC#^k6{DIOurzIW!p6&|(q+t{o28Y@>&wW|$QX3&~jx(ZB%O zWLbJdNj?{mV0ymIog-myOL^sTlKP92sbAGBIwLFNo#MO;_uGqjGGcIkZLvhGPZ$O& z=n8*Gr>T32Y4^9cLM_c~Vwl4`EiN8$hMh5F-AX;q**mVUW!J(tX$I92UX*p=^y$v5 zP=T=Bj4B{nh+mPdVeZf@XoGMU;Yd#h3c?hW--{xhY@8Cx%OlaxTp!T@d6$u3h|b-b z>Xuh`tYoXp3N=JcJ2w7o=>#TZ*gMuk%OiOR&Ldjq zRlAT^Ye}V3;kIw6Hth``zC?#8j4@+D4lu>HJT=0C0Jto2oMi!sV}^i;3T7IJ^`F&> zd%DVoPtls=`-)mG*YZV0vOGaK(E2ar);36RxusQ%yruc^*VeBlgJp*2G8UFxyV;hU z@p&u>MPk$Gv`zyzgT4$asKFvsbZEC%(oq74-u4&aLR@E-l!U#2!I9L_|*! z&l*;JvsUn!A1%760%6p5iV~X`S>Ya%gvq-?WIpDl28{d~yK^oqRxv&Y(Ck3%;F7>7 zdZ@PqM5kbe=%&M}S8Vw@YnIjO7vwRgI_3yUJHFi3$mNc;#5b)rZOJ-2k4CX1GQLQR z`&Yq^bk2aEMQO#<%qBZ=QwV;HMM*RpFs#6B@dZCi?k8$Ow8#NT&D>G#uQ9{53iPm1 zAcM7Irt4&C4UF1SwbI9ei!cUC4YUnt@O^Z353vubdvEgl7fiFTs4(^0RW$hmjL zv>lp3Q9M2fb)*spWIRP#X3$h)Hd_o+^qG(H7VzeZ#icZKf}fHR7c|^B7KBUIS~!&E zjzbqu?&v2bLscQ>J*H0~`)jggndZMbUJNK05}Y|rIEfc+FlD^-UQ2nt%|h;?UB3hZ zu4JTq%CEL$)x~YkE9i>%T3{o>$R}0PSBXrikW2 z%+aV7<*7ZQ!TI4xpJ#JiTlON}p1%x#AS;#>lQt)k+=8YqnVywiq2NaeUz?k88H)VVasfGxLr%r;9pSf#6 zia~KG^jn&lFC@KVw*q)EyQqFG7);Z*i*&m>WH?TwhD^h;H2K%e4%85T2yc!dwLwk? z6TM}#nV`^~qF7!pW&{ozYEvu+yHX8VId)|xCYIu*hqcoC2x{?GtC-r_>`0^_Yd45B z%wV+~sHXebEm_R>fLzEy!Lx=z+geyu%Nhaiyqj-sfuWh0@hKX zW?*TDG3f|Qz+mM0KmTVVi#mqf4qYX|vh3)`E$+mS^4kzjJsQAhI&icEAO;CYqeIP! zE(Zs^Ev3Z6hlQQ477l>}>*jS}@`XV?uN)E`e>$Z&M2y?Z7>4GzCz@l3*$ni#LX`(OsZWXqaztdwu(BT?t6)QVJ5;|n3 zPQ4Tk_W*+d(hbIIVRzTI^S45KR4kXzbjo!5$*I+IjtcB83s{xM+*jZ zRQKpSKx||kV;OMH3ovpyNKEd>KU_hy2+TC|k6d73**ag+96OEHY=6aa)7qg_S%0MA zOr1$+1|*n(q(uvPW9)C3z%Kh?JU)sRE1buSC$ljwxOYsq(tvr^@B1P1TtM>q`GY9} zBa@q!zhM|{`rZaUExw1nU=(Y}Dusbntm^n4a6f}X z@uV26Tz&T^qn1F%HUgGL0}_uRj&-B}rgpu-4x&-RDtKShG~;x=3P~BXMB&AzCrR@T zme`Tq;MJ0BxU6a1Q8wKRgbR&A6Ii4;w)v2pDtSfX#1IY{+9s?ZGXn=d%g4D&SHqf< zm{bXb^}xO~oSx0Lb6k}y+p&O}O-vpXDO}_yta7Krs_ zT8=T*DEk&l{@Wl6nJr;>(zNYmE~>E-8I+c#j=`S12c>L$0yTm}f=PYR0IyTW(24*w zG}d(N0x6qui7ANm>hHlOFr{vrP69Fq={mh7?BdmDa7@5qIRQs!`P`8JDOnFNhmOaD zJ*ey0?{OA`Wo(D`E$mhei4EW8=&)0csJ#{PnRt2- zqP`@Hm+plqSwefTNSzqQmg&;0a@j7DDh+Sp(S&1s`6@pS; zj^|0T1WM|9ccwlxJBj35qFLdmodjJ(*drM_Q|JrB6Me$cI_hMixYL44Q_QH6LzTrH zibgBo0{Vz$D2qUWJ8PseeqwaUK-LkV_GRQCes{6As#{7?w6BxsvasrkcA6{_g%-ES zMcn+N!zeCbAEyq^3jPzjCnUCNtD)fSt8GHMZKA`>wQNpjeh{DHdd8bwWtC1x2()gb!tnV8~k@ zxrqz0uC%*(;xg)32(WeZc(1)?F;hf#mob;Sk}Q#?HmI9^V8w1;-ViYKi>D(1A*w0^ zQHW4K2AB3l>e7gT$--1%%m=A=X@u&ESk>GnyDP(+w{$i%mx;}1XsBYQ>(_JQN17ca zTS+C!)L@{(Wut8SRy< zK%|%{@r7)P7%@I-TLjv72n(|bLc$v6EHS@+lBSgcGO`O+DT}y_GHop4Na5_UOjnip z)-lg6Zfu`e!1GDSuWfQl!W@Lc@&Vms4T{i&*d;DDq+75s^0!xyatIVa5F^F0bt?U& zt!4d?V!U}m-(X6AAyjhPEp z4S-rQrsnn-g9{ey0={*{;*dNukPU%$Ru)!^C3Xn`!_!EOanBD~sj?k#JXqT-S~YA% zcr7^^Bp_$cLTE?l9JwsCtYLC87^t|{J2ImRFL)oOe#Sl6NX}O=BfxhiC5#-7zDDX-K;|?4y7QYwaWa7?aP9OWF|ecEV5mXo^3<(kQQHl<(0+oTRp5w(UqC zH#EhI8rLc5uS9=&NxPKwMQ+mG_|n~tGICarunW*Hr533RsOsg;IwoTY6(4U#IaX^8 zh440R-Hf}IZp>Jm8!-$nRhb!si`qalpd)ybZ7NZ!#&57Fd8ArQ4?P9AnD2m#2fP*7 zUPn$E8K=1l6plQrmbt9STx3)`I@Vh?6K!pRv~d6ce8nP#nY1x9K@hRY!A~^8oDE=A zS4P^t)U)yJkP}=U3e@y19_-GF0=v-U#Yz4N%SR85jO3NWX7Hln(cF-L#)c4%vwPff z7PNikR}@~fHX$I5q%@Ku-5{xyNP~1q2$DldGeaX%64EIMNJ=*&4bt5VJ>(2M3@|hI zci(mYh4A*T63=<>Q1M zJBv7pI}wP&Lp6T#Z@?z^N1Vbp!E8?;eQgxV^E_XD zM*KAuI-Rlj)GXnmt(5{;8pT5q^(5bcTRb+0O1Z;7o}qvFHZ7YD$V#U8i!1T;`%voK z8@eGML#@QG}%;Avf$sp0hp`2k=v0>R^ zFn_a7Ef)MtjpkV_zsTIFB#UHg&gb{IKs#YTBsyRg#}t!oZ@< zaNg~1Xiw#r(?+(uH0V0{MCwYg@w)xz)jr?5Zux=f)sUvfr1=d^mtUc{|_hGd9K`v8r zZ5lw0J?Q!S7n7L5+W5}P?7z0x#6K6@kh7mIBS6n0n7UPU5n=<$i<1XrPam&`alWfd zEg5xq5FJIH+qo^8DFu2cw#LQ$^M3iw)&U1taBShWRP=r2@t+w`Q$0lH&+KzclW%1X z`OmGR$`xp2-|$=zojobx>3+uVTv1&g{JKX~3N&;>z~4YU8p8WknC0d}!VcRg&AQv0 z>A12uI(Y_?=q>)|B_)U7hq9*l!kKd;*Rm?=3HJg=y{)R~SAwKzjTrYEs1^X1ZR1sqU6QJW(h>3M$+~!f><6Sd3C|wZ-uxa$awW(9ru|yu z@vTfiA}+Q*b>fE7C2q)A0YYH(D6XGRE3Y@eyoWGquK&bo`{O`<$~~jhp>~3l;zX^W z9_GlsCK)CFXkbL@f4$EV_ldoD#T)Tfd>mTo!b#?*aw7Bxhoe;G z_e%q=`Rv({-_|b`D@>X9wtr5^6ULc6Ez0;~Ra`c5(4Vm&($VJ_;27lLLQUQxP~%J_ zG*~*b&yQ{5VT8ncVqh<%>U{B!S~E@_Di~Sa1=+iJDNLTkRVKK`gp=r}R3szay4QH3 z!pci$;!o9_W5))uYwjQp~fbO-4Zt*`9erWIFjyCXU5>ovYC5MGd5rZdl-2{RYW zTN4;RANYX#cpoT{Z)se$^Sg=YLH69t*RU0s+DDcB=Xf^sv6vf3&OXQg6tMZee_$(| zmN;Pu?{`B>#2~;-i_ws;K)}`GiNS6Pw_T0<-gvrdp8tHzD?S=ENv%I`yd3Yui$o|s z+G!IX{t@9k`uRaLD?@ILRKt?w{==2!yn!nL^NT)#&pFC(S<+wX4#?ZI#T9$aFLO1J zbEh8#ve()yw9bD0tLBuoYJTw9SNr9;Ok%j1afVQ3ess|}NKm)8 z^hw8KpWP=qiLVd=$~jcD3mfYnR_xZORsB-70 zrp-6Iu2yI=nXKu>5@DCQ^Tqn;Zu{uB6V>Bho2r_3WZWzUnVX!HHw(&#XozGz0>hhkqB<8@{8p6r$b^#1SAPC0|i` zM%sq0L_F3c;`wPUj5s=2P6vy@I+t2niHf%(Iv#u1GpQZh^0!1pvgvT@Rhk6%?$Gzc ziqx5WJ9E-P6+Mcy!->kH%n0g_96YQ^gAXYlnr-t1<+QxAKW6Tu@Py#qwgGHzd^nCx zq)ayY#>{56L_#C5F?07fF8_h>jz1d`%o5;ZB0>~lb`$-cq=%_#S$W=?J?`VEn=>-x zn5wYh5xa|?T7YfyR!I@FTp2NO#MyHPrcQ&u@BuAe!Yo4jEs7X)g!d1do23cQ-x%5i#elR#D`H-%*GM?Z;S8vO#+>y}WF?I%iHa&*iVV$Nr4|E`?dg z^Uvohm1ADD$Vox`XA<$;xK61|9*Ni_FSN2Wwu@xCb>o>+Cg_-m;s>l9v#GV$4!*i* zyd0Aa-ZR$lVv>e%<7Bixjhv@cx}Z5Ld%hD5a1<%?L9s<|w%{G*1t#=Ozcs;aI*CSM z-?|izh3-4}m;TJj6`+1)`e%%j8|rp=VGXhTQhk6GI8{79!Fl7n*Yr;CMWJof9W zcR}{3RC?{75wcP_f+xBD3?sCop{2bN4%0H&lO&Cuq&J4mu&VLb144Ic4OtUg|2_v< zsF#_M?=Ek48Z(`DleNzIkzI@KI^K>?eImmeYhlfT50u^wet(y2*iz4+&nF}Bkdu|5 zpuXE%r1zbPBJI6>2g{?PF)?G9-J9=OT|cp9X@uKP1Fg^}?oPH{6Z~2iMpUwyRk-SI zfSn8wQOQKusYHOI*9_BvgTM{TwMZ2;b(KUXwfDgh(cgI0j0R+HQZxN&lQ6E3igHrr z8NVOr%!;J8*y^WMx5k4YM;fn*YKHivSn=RS`{(Xpw+gV9CDCUQXfO9ift*jvJ_JoK zsrMwfBsZjE|FolF{m*O!y+s`y`zkbWKac>eHuDMO4 z`sA*vCSun}^b2{0zoU4keC9@mWaPcMop-OG;O;`a<3g`%?F%|JCON`+m*FYqurzgF zQVprdr{Vj&!PH4!CR%~Jj?a@vD6EX+G}bS;GdVSBGtERVoX2LxY&DCPB~wMNf zJn`&BbTy39?MDz;Jx%0uCteX@4tRN-UOt-2GqCOkZF_m$q~Oey<{0p{)hf-6I8nFl zv6d|QM{sRo#}k$^HsO(J+M^5{>W28e18uKV?Pp(;-ll%AlvT0*Hd84sMZ~e7D;0>< z^v7l1jn1gY_wd{2h$G=XGQ*=JJ^sMSo4=Go!E&&HaU$#bIq}=C*CWO=F7}k(0!j_` z!~z%M2JP2=^oEh}&F5iTKil0TbJq$qweXd0r`f*~R0tRSRhpJ$dy+ONj>Ka%rD?CX z9nc-XaX2B+z{hi~eA_zrUBM>mb;-NfTnoFiNfr@zi?QDtymGg}FQj;sE~IRU7-UnN z4Ws(wh~gx*&&0gEA=#~mysws-x>iMYJu9W6+W0w~nRo41y?bNnWcqCM8$87CMPpQ?FWt&%76*XgjN8n6aq z-R%mHpIZ`%7!ovAl&S@U495>gII+dKT-Yq(Hho#KUmJ$#dxx%~E20ND ziFfB3Ry27P3;v`~{Hf5BUZe5beST4$)a*!?=lD%Sw3>3|P}Lc~bCa0cf3ua3`g3L= z10cl5%;UB2r^J2yYK}GaR8dAOUWBn^r*=Y|%h1r%>_-{keZ zD~&wBUABsd5mHXsRr{p@$Rdn2XPpgGWRLm7qdge0oW{eU%jg{3Hp^=s)x6}K_#uUTD9^QHMV)G z9oQa4er)$WKX2%-86Kzi!VDZGu65qDfy-R)d*HRWS>#IjNP(TCykwZPlOBXb#z zIvckl1_f<7)@V&)q7r1)t16m8cEWg<{LT_@N|^iQHhA|u=Z9E2>Eqq`14Pqx1~51otM(P zuUy>DCg1XiOr=L(;yW)sx{dQ2Ff^KoH5J*44DnK?*oi$AUe6GI1$!5-l&uMv^SJ*N zDt@d@Ui8sIl&$SGlxU2ue9yI$0MgYQ#4ao9=r1{ON!ps3Qq1fdITOux{cX(smrh65 zM%`*{Y#+}fW6BR#PlW~sn- z0X}-pe2bpxVmfT0>us`FJPrk>KXPKC@SfJs+|AuKGnz=NrzU((U^f+yxi5@ph-R;G zc$sA>UZ2Q3i|ZvilPF1H8o7QzoFuGK15jSAHE#IcKIb9b*hDcxx7{1jYbER8mH}q= z(A6xN+xVxF;o^5F>V6b9MR@n@Wn`&qNGTNyeRFi-Y?Qet%AD z3@R4+wp+cp6jbO<9oHJ&nyE}$_+JFC=!iMlu)t^yMI-h#w7%KM?|-O0sx#JB$Dfe@ zTY!`)pjQCAPx%g))O``dU%SxF=GelJtQj%W|2$W&3pTSG>vZ|B*Y>w=z z(l@oxu5`)y18rT`>i{>0I>$lN%QP{Oalbz$hSOf%&Qk*YGkU(JBeCx~N`yIIw0-j8 z{SbC*0acuP?9n-zw=Y?|PK||_d?$UL7~>VAtf1fgb64U$2`g#QY*I6y z$fwh7q4EnZmp-p$!XezV_eJdtL0Rp;2$y_nm{+;*0-~yn68;Lk`cz8)Arrek!dEy? z()Hk`z_k`%YuTdzFP#4BbE%j*(p~qc!$JegG1@Aql-Oy(v24RLop*)r+T!76=fnGf ztfi07+a*e2S?jY4WIuXq{uAx{A!)$t_Sxw#oCzPs0#LCgZVsCv#E&>^i8J61iqE`o zAhP}~LkQB(5M6<^-pH)zGEY;U^D0kLW5LURCb~(=N{ZTTK`!d`?{g;_o$eD35_>E? z+}uLMrEqjZS1c8z6!77N-zEnX10;&ctz=e$mi0)G2*r`u*hZ&%O`M5Nd$t-YfiV9( zOjmHnP2ej9I~2Syzd+`X^i_J(OehN4Xm8(!9&VH|Meo`Nnqt~#wlDrywDL|X_@+$P zq=1w*HX%f^Q$G5cVj>?uq*5Z0cQS^vq)P>ac|$U>}#&ZhLRCS>(X>wCkrf{(i(~N? z5lzmR04zch-d<_)i}xdU_xkI}wE?B`wlOu!1TSzn#rV@Sm-!>Z*abawZX36%Phq0K zruPgtYQ6Q5F0(IJu$L-}{t;2edvZ2@rJpL=h}oA$trO?C2B^T>o(XKQB`lGPQHc2T zSE@%$0A(l{>l`lz7viZEgwHEfX&+(&*Zye=7i(l%>CtIjBZN|l1vh0a(tTh-FMNNj zUA#T}B2o27qk5qhOXxv3&KXMmFN>4__u2H#^MTKXPxw82OUcDZ&)~Ttv`~bgm3*_X z{kR|l0o_4e&W2dy@H;JmJ|A{xOZm;3(Xuom0tUge9D=?L&o=&-ITHh*N2Yx492dg13l=0G3O ze^0}^iKqXKuaAfS5^o~XrWZ5mjjV42xL|-TF2@wt!0>x1dC>W4^vW1Q;0B%x0XyOU z#{p8BD)WOE+G_U}l_7K|CVLxla&kLDV%|?E3lRTDcdNx5hl-^?In(aN%xN}W5m0c? zT@hr^Zix_B0VzRN=jGS8;sOuys|e z`nWQ6-{9ovqB!6DHTq`!s8DKQ^**mMc^QMWk;V>y{q`s!z$hjK%b#L6+D}J>9|;~X zo|1|k%@_>7LO`zz4xT9?S7Mg1?~+Hl9M^kV*{G6ynXzJ(cHHAW;dSf~^5rmd(pKZH z`?bqKZFOg3no}2JW<7xyjIMl^&cSq+F-HGs108vonGJ3~AsVtJ)~G1hqUzKn0M*NO zUeKAWa3|>*IpX?(6pKmahmg-@llA+?%pDZds>OPY5IC~ekB$)wo^o&Kn%^1;#?Te{WznZ6>2bsIf9Pc&F8)%%#BIh()}upxB(6SeKd-%* znVE!wECsz$$rKpHyx69h@=E15fp0VIu!p18irzg-J;ngQIU0|VD!EA8c0TI5qM0;F*32(TXpJvp{W zka6yPc1`ND_0+C5jBG+Iq?u5rdXOq81A&{yZyN+b37pw990WH4EWy7y>w@^C%8X8|QLLn);Mf{h@8F<= zL%$}&*+lfIlW`x6i?>0`vDePJU5pPaHh$-&jFeQkwd8Xb7r!Y^&QkYI@p}KD5FwAP zm5UHRHw(d5cez&owegXbi^sd=WlulZ3CE_-n$2%}2C4*Xn|DvDjQLg#YJ@po#~rVI zn3)|{kX0fRrZu8=@|o!n%z0%kEjb~H_soL*OBPn>&tF&>#q@c?ah>_4n#>osaqnE9 zc7C}UCo+#2Kl4x2=dL``RmT?EDPN#-E3wjppLO}Ens4RVh5?DV*@R7WC?D4f%+I02 z+-hpTo-Grjt1aO)dVM|4$Jm_uGu?}X-W;TiP!^_cVi{KMHx$!IgxkUR0jz7;&JShoqpk}N^=Co7uCjD_w@gzu1ApAp z>`O}eOS-Z$n1r5TubnTq)Tivd^LsGO=&`LF@(H}nFQ>khC*duT$#CL~`!#eF%&5Kc zG*tQDNXra=DD)^ey$2g_C>Hz8c`#!rU>NRhc0W1eU(geK6dcu~ew6zUhcaz3Drq&q$QN8*6C&LI3A@tc@N-64|iA@B+B_X&$y7#P57EICZ>y#Ma^1oFBCse$t$-8)p+FZ)y&D>7Jg*aWl<=S8jcV{LgQGgVg_gw3qFMy9K?@FDO{!?RmQQvDau)Mmy9r z=-ccR=VvP=UZ+uMj_-c=W6O%xW6!&TlY^33TeqdpWB*z06V&du(_GLB!T16Sl&SV5 zT{>$Tpcdvyjci_(Oy)h-F7?*)u19q%FgdmiX34-~;+G4S@nt(*H)nq9GU!K=<11n8 zV`uk=bx7HiQ|86{{=wV37&Tl)oxe+0~G3FM7N%WXKSEdJ_YTbG@^)mYF3_YR>|1CYx_|yCoZ8v%ilwWK1C;9P4_~8?TpJL93+A zgtFkB0K7S~%kb;1{7n;?2UU`@#wtf)=!?%!2?<%%4ktES?mUASLjwHtn)#2r?K>Cc z0`c&El2-oLK%uaIB}6%d%BqW7G#0L%GQ$)5Lx$zZKVjMUWJ(t z@^j1lWsJ@U+PJM}Zm_;7w)4AD5A z6#;N`rP*~7MvF1@^kdg)Ym0vptT0VU7t`jk6y-~4y81?&-niJef>j4p=jW*8PUXm+ zstrQl7?N#v|HTI>Fg_}zBuopKeQMl}$_gF4?3Y}rqa2+%g;KxTn=Hdd;23{I>|f&f z?S?^jAdSj(WMiU#eE;6aVvS_X`w&|{#d6nBjD5STmgbB{(qMNEza9hry)?MTyEZ(P zpDN?Y(`~uR)BIvRzJ0@U4$s_%D&F2CcHz%X!GeJhXIP@*F0c|Ka2d$59>$?`9KilG)o~~H0(`d zg?Ijk)=n1Yd71x&UlZ%d?ncZNJmQmdV@AO;XQGGubI5{m1*gAT1-I8?gR9&7xjf(NeohB;FE%N6a^#dJOClsBz3VK5j$WTDxAw5kYJ)W+#R^fu z@U|}qRiVJiJ|3ce4s;#R`JSE*47?zKJlcvp4~5ApUb|+VB2m9)$9XW~Ou?HF=6lE@ zc=NUcjP~BeAX~d}LFZ0j^tROFggoSarc>dv6@i}PF!^Bu+$D#EK9s{ApsdL@z%QR} zq#yxv%!TNGtsw6=kfU;CK%rV_&``E6>o37BX#}xuB#UKc+xZc43BB1^Pf%!jH%lI4 zV{li7sj4fq4$%>Lj@%w}vLh()8a?E}kiEVrpW>TfVj!-;2y{-j6W~@7>jJys>tYoX z#P@ls12RWM91b8{VV19W&0 zyF>;-jSeeb-wvbK&LD&^bPHoT3;M^{Wa!xvv`553#_MJnbKRW`_Xq9A4`%`}4;CI^ z==PcqIS3}k8Z_qb@z8oLi;=-h&+u%X+Z5jYZABx))jdL{77$%qEzEQUKHKru-n)gg zkW&`SDkDPist$-4SzZA9uTj|mPh;Vr$DLvu(g{kh;(V zAM(e|e4D%T{z4S%Ad;K~cy-AK@7(R3A;8?&C_HR+C&Iz7U;uJjf~r}TweW8JG%gr` z+Ed4+-5IQ@F@qEmy=$ujT?Te?Wrg zX4++857%etSnHd_V1N1BJ17cbs^C3E&WgGX&0I$u)*ss`jQvwFUoFHG8k~9@= zeqgR4AepPtV^R#d_S#AlbMR#(t@ z+$YQWCj)fiF4c1oo(Xa9xep|lzsQBZvTlJ#Zu2q24?3-HP?(^B_M=CH9K5i|+cJ^+^|foocB>1+bv ztOtgt^-Vppg0g=vh~= z7ZeOCMkCkIs0DaX1AGd2KLXfj3z`^aeH@Zu4cYq!hun4#%`n0P=OolI4^SJVYb@j{ zdTRYLTwO<6YW;qK89oXDo*hR95_EJxOTc#~tqSN$SvYE%6^xLIXRQEjZM1TE1Z`Rs zT3Z7#hg6E~SK(3{SNE8kWz9OwXfx(2QWoU=vjJT1SBFH6O0A1r%&aNgWlv#NvXd1q zGD2Xo@W+}?Yp<0x_}wK(r{J1@srQ_eE)#Okz4dX#40&L2RXBz@U(|*89#)aZE-pip zQEhjJ-I$a5>q6`6eRUSlU@mJu_;C{fJi$Xe9!C3jec2JPdB|Vdd_Z4@Yr51i2CIJr zod@DVN5fIg59mk6WF|}_U?XF+3lY&S1bp=c z8XI2++PVdx=4v6R8S=u@&SO>uQ2!VllZo-#neNuLG&PleoT(z0yS_DfV$;ckXkG%z zKS05a4^%?HrDR4S^J=-vyX8TfdlyuRVjwco)jrK8%}I>uGSk)2RW~->S|v_C?Jnkp^DcxV(5DSLec-! z(0>Coj9`^V5Am^fHoyz5(Twz0FipVg*P*LxEbTRq%U57z_XBJ9aSR8Yy!SpGYv@&- z{IyAM4Zx-V6aejH{R8a%GR%tpX&7FY)!rTEVIDoUOm^C>yE0a4$eqlM^1aHhg?qfxSd6PVv(B_ zOB)J-LWicS;t_?b+i24fStAEz|twNZW1 zf_7*gJP#fMU7M7F$RLDn-Mj8aA&}+m`N$tUAVjTtVqGM$@y!scNFj9&47z?||?&9Ex0-qo@`@-JSUjqDlfQjhpNfK$vc zcO?*4WbaBj@a|}MDL>$*5VM;*sYbN-F+7hsWDS&`gFdJoLx7OY`ItpLHvhuF{SsFO zhQ*MgBkd`4aQNdM#1Z{y!&1n^hz6H~E|kI_Z)FLHId98+((vri7U7RG^_p{dm&1y| z+&-7(nogOa`%}q^g)y(J18x-;nZf(l8#W?DdsVuR5BL80E-17K{N?vQf1!nCg$WY{ zg5P;Cc7=)RV?V>k6nVd6uKv2pI;8=E+&0vOZWJ#zaFDabp-#GIo#zn0P|R+;+7ys2 z1kG-Da|qW0Lg7w2v?KmLen!EN^L=7Ws}c}JZgFdap1Q$6W(ruD9=kj0Cf%Idkms2; zm}mfMLisrZ0-<19f;19F$ln@3lRUjl!FK96V}F9Cpe9 z?#J4^rb6W>hkm?{9tH*6i`j!NV9-KT8g4m@h0v=u|J%CqLRJC>GaGZ?+3x3&abnr>T-J!+J(W}JLsj*t?-hGxZj13Gs$Gy zQ(gX-7jU|FOrKGM^ZRgJ1!N~e;PuU99ZI6;V#!I<7vVtHvuI2sdUT0yGYEi(P#qubKwA(M8 zCJ___%&oB`h4$VdXJ)3ZF$b+49e;kFDGDZ`ACncXM`k+7{NImCHny2%po70_D1+huahR{i4zrWtAkSyqs}SyV(dUl90VwsKFfnt~8OwI4U5ppO(F?Cs_I}}% z`FE`Jkr0_Xha;gp18|2HVd8ZvaQ4lB%W8z$v3JYq@|%q9u9$TL#H-h!K_fW>#Otiq zhL+e9YXAoLr#3DVo32~%t8WVyD30@5i?4gxo10Ty=r$ z0l(%Mi7aWJV zXk*qJ{ld(%;Tx0Kf9qzEmQ4gU1V2useD1#4SfZ5ORs8n6y9*Xtg8Y8XSzO`QF3;qS zNO6kSAE>P@r)mTh_z!m@gGEQHO({wM39DKF2U=oK?iqDJ$8P{MLvo<0pl4FXc3`}1 zS*lGSd)0Q&o7-xDGOljwQ-Xt}yTiDHn_WpXK(p-lAL)sjCGnfffDE_8z{oJDs( zt-z>SRv`}Tfo{I2&c2%V#I_k$WjxnxJ8kU+)>jl&#b*4JgE4on@@hUbzDSX>Qt6z_ z?B=r1(J(<*g&;d80tgS$OyAd<)6ZN&7<>AfrbZG2jbFmMgj{Fy3aSm~SqM&DM#*;Y z=Usy+2@>PnbmcbFMsD`*WZR#xu6vYUGnj=lcrUqk$9-5l)!@8+USc-0QGQdurxoRaBOaO8f>hWZJV9x>3=z?Oiv1u~t zo0*~m#d@}LjyPb;-FBTn#HG0OnHmIp1MwJJTjS0MUU2{>%DrD|wKT2V^rTw1XN`I= z=t8-JCREr@`V1XB@S>5Pud>A`<)|b!nB}NiS*x>nPFjE=z1|tlJ|>~9|E2q3G*gN0 z5(2@PXzz0YwtWRWPcafz00?~8mmlKr$Kv+ztIlI;Kr8l1u!ek?g=Za>`+V-yfx+&Y zUp&4?c#}3@t;I|ZLNWzdn{kTA4L&Vjg0V|&wg%^p1mhXihVp)#Co}=j5mtZmh6P}e zd~ff6Z@#P6w=g0!9xc={gW2PScJdm}t8o@mzqrbLpfXK)%T;L6!bs()7XMK` zE@YP7O~;>jh3vgs1kBEbv+rD+v$3tboy}Iu;qWSo2I?k8UT7a@>!NuQfT`Xad9kyq zy-~Pc=&i`paP(}-hd*Vz-)-)ttYnh=vQPc<1o^4kAm!Gis~5Yx#8k^7>nDQ~_XPmd z7bs{GT?sD#lEn0H>q*DVDIMu9w%BF$9HQa_@R1=(Az=+D1+j+Uvwz$D@H1OnI z-0oQK7G0?2^0ymj?Z#-z&`$X$TuU{|hYB3_362TZ%dn8y-}W490ny?r*lDIQRUwM_ zWYgjWpOp1OH5w)Iq1T@boad_@Gq|2oe2YXatWtp}va-#e0Vd>QtE(l8RLy<0W66Q! zm({J^%%Z*pB8Qbps5PR{!%>F>LierXFZQ-4@?otKeUMf5e?o2>Zl4-t#NEfYUL>&- zuPI=|1FQSbU9H88rO;-uhV>@|y@c+o4P8U^_Fj8tuJq+$V2bZMHwYwdiFl+k2UyKlbXiM@q)6 zpGW|)MQh|2F)^JNBHt%JzAY9Y{QQrXYMY6|E3?-cAVqpVwDC?e*HBUWZRQ~Tj~aZU znF>ie&IU;@$vv_E#sW%+W=Nr|&n*ldt~y1%I2+})2*$^skn!JaH+A1I)e`y-r znawnj=!L(;&Rp$w(sC-#%jX>CRIci#Uru6GoFzLBS6$JdqrmR7G`M&9%^b!1W4v93 zxZowRzu#-7)|C;~RV@ ziER19p6s^i>X?eARn4*T#Jx}cYmKsB{Hjj#u{AicN%K@#mD>MR(Lp+QV8=SS;1y6z z3g2*OMg*|v=Q=;KFXp%yxuV9i!Y9}@m}opy3b!pv80yHMNDjWCc9LUQiuB%M12e0L zkk1hjT;%^IrJq}dGrr+VDFX89{>jEMSDr~)PDU`sbsc3?(uRIgcgkI)JTk3mUAd3A zdR6ky1#G6gFDkM3A^tf)=lQ0sqx;O>Pnf>pwl=U+?5m`gtw9)}??Je>f9>I6(~qm? zrp?a}4W0Cu(9wkT&0_ye@zlxC?WJE4;q#Ezc56y_-Uc%!AqjiV8|MbLjBamNj%%cJ zDi`3IlxmXZvo-EJZTc03jG;X^_)6)-HK}9qJ`eEO%eb#PYQVp$LMT(AcwCsHEbsK^t88tx+N@RJAsr#S69^O zjV*^JhqMKJEGO6NtL^8+CyAA%2_NI#PCTg0h7x4=_Vn*bPRNL-YAeI|AyTpDJi8CcM^YUuP{uV(Q&$-R3dYdM<@}4C1#RWy= z`R172XA(>+pLC|sO6{LkZ< zmE&a8u0cu#e^j56Tfl+z$XpI|@%Hj}pLUL*=W2QahuW&uDkD+ru|I7G5$=6WP&Y8Q z=N*9UzfguHV<~N9s-$2wJ;HHcMRY~K*Ikxf7FIX2*=L~QAOdFfth7?S+m z5-*BRz3JP%nP%qqNOS*EmL}LlvV{WvN{qVIn~C&8I8g&`4{MY)gc!vf3kTZ0jr&^Y z=u=U3Mzpv9#5*}Yr}Uc2YNsO4;tDAz%Oiou;bk0Y6Q@q+U!M}N^lDKgo^o4^;7c}P z6EKGiGewnUGJ8Fh+hUX7WRqEElV4?%U8eA@e&bhRt12(`A6r$KQP-19{G58!3*V2u z&p)g9R6mA@Of+3_h)sTgO{R}c<}aIK51VY4-tl3CJIQmy*9rO(t~9!XPZ(#MO$U$@ zUBV(psoK4JRKm#Xv4W755GwI2qAY);lhvh6CSZt07~<_{QR@V;)OWT(_m%paZ8TI=kQ1bCh+we5`m-1+};T)#7 zEw{RyKK9&AT8+OpN6AF7Q{CU3dHr#r|9<889YAG15?LLoX;MkkJ!_ozkkj%;h)gNi ztbyJj^;hsSQ$<4yq<8_Rs#2w;`D>HrhuQEQT4s^yEjfTGkqFZV7JhFWm0TK|(G6(g zZ&Mc4cWpCf`^tQ*=E&)PvBnBbm&HHGYeGK%-xgQM;g^%c9|E-}hhz-bE(~2QzAw;a z4MT7PFUs={#t@1+&|gUU%ta;RQnZNwM>SU87m25Se+xs)g@Wm<3!r?4$)Ehn&u`m{ zPOL*fwYgE^ck9;2i}Z+^xAbE4h>cgibEIBXdcKJW2i04@8YPWm}m2EkmZ_Lsmdt;+IUE8$w zTkdbEkYj|&kcJkLye$?S{;elhP_p2Z=Mmr9nzJBrw;6cWG@2U_9s2}lhg`GlV}y~3 z|48mDagBYI>bJ8#gWJkN08hYIzWrsS;Dh)*lN)#DJ&n z>sNUujEZ;2LNfGF%K1`j2pT@Ts&Gj@fH4V|9Lii@*cci!sZOMGsA)U;b?=@|Y4+Xe z91$`f8a)=-rrlI1*|6gJc90YlI4B=?GU?>nCK%GPDP`&Po&!Ajz`9^?FUjz;RJFb}vkp}@!J9&t*8L4eVlahsUxq*8OKVSVYv@P0PFBJf$2;(nAE*t6tVj+s zXkc*kU9Ni1jpw)0CdF6xjxur71UK3fxJZK6Ja{Mfy;FaaA}cI2wT zejYdT>5NdS)zS84$a=?N%ydsT^|r?XjK1aK+k7Ub_(AS9jrY|<0PemuetjNFi$IM_*nSS)K>s|a#~*G#S_yjg;F>u5v8tOsq-fQ-m#G~5o-J2qHK zg4hHqd%}mv1Ka)Y*0kF@1tmM${3Yr-m)gJNgk+T^Oq(lewIlj_vMqCzjmEo4-_l7X z=4R`Qu~1UCkvV;lrIc9((>WWr&S=yH8AE%dJARtw^I1(CyJRiIWv{;=V7}$ymizLB zV^c+%x*$ULiq}e zAX2OUx4@lZc>#X`*62}F&`?kT=7)rJ6^49&Bno5=QNY5WUOggC&XE*I_e;U76%_si z1}jkL5rO^k2K&-g98t0-jr1RRU~Wj{Xa7$t#ahFfxNwQOBM$u}8#297lh4t(p-Z79 zO#r(g-YDIsi#l}boKpUW_f7_vSCQkYgQwiF463Vr>#WFgb$z|Je}o+7?qn=rziKZ2 z?d%;?CJYLCRg+)#M+KBaaW)F$aqgaC|0@!vpdeFf)7L&K-n3!$QtRy+-YkMR=Shvf zqDdCW&ZT0T{%zS5?W8h0+cYY~cJsQvXU@U8fA6R>>~IVC=Gk=)OP&Nx9(v z%H>qks~XG<**SQ2q|TWm6QmnyJVen)bnmSC>*?QVozRU=2!ALij_zsPTYPb+ApeWX z`x!oT+4*@)Qw39Qe*ufE=7BCP(b3!nNnv9Y$(tLVx%*F9`;ggu1u`S?fO;@VKQf*8 zL8Ib>W}yl@dA{vU+8jTWq)05z6bm9CjSmSm^=lv>DapqQ<0TzVY&G}qvW>|b?!hWE ztmZy6hlnc_lmz&JbV=-3Id!brGDjm~iZvjfbVS52S9Lp6LTDM@Qj+A~{JfKE|Bd}M zpkW)wY&tQkfL+S@t2cu88x4Jj%H&&G&R_J0KK$~bn~Af5N>9F#X3m_c(=(H6+>vVuqUuWLpP2Iv-qo@^8&p6BtE90U zyQg9XTA7$vBW6-A8KRp1O5)gRN>NPkX7oslB><+vIdNtkG$mikRP~E z%gqDI5nnF)7?yv#7}Exf&>RD23dc3EsgQPBZYUfR5TP>j3L)ct6rUll78`{S0QEQEGC;{E*YSVK}O}JnLB29?s|~HEsw;Qp-2o0u&@lX4LK8U%7}{1;#Dvb zbQs|5EepubQ)AFogG)6V8a)SN$IvZ>@fk3UKwATcBuNRsaP2T8jgycbnlUPW;71Dd zo947bY6e5%?;Z+}Q>~>(t^AaDlXN?|3;SN-Xc@0Gc2?%Om$Bt3`?3nL0h!{{;EKk_ z(8SDrI2;07OdL;L1-rnsl1uOkneb;EL%Ue&?1@RhMy47%I=gZ%AA&~a&al{dEgZ%~ ztRISasOWS6luM4@Y8bfqBObJr^$7R*FDWM(yke(<_soQrInHUWK-ugBlaVHII$1E% zEaaHs&Pr3_4?}`mnG3wKf!2(R!{YsM2#kz4e~66L$#S?E74Tu+A0PaVW#pbY*rW!a zL>7ZexL|c${18Z~P#Hou0PLfRf_TW23j40X*qMhFMu>hB;HZ-RZ8+@I_x4s+KZ9Hp zA^-d#*=<}waUJnv761$A8lX)$aLIe~g3!gSak$9*5r(FDTX-mx4~B4CYMheM?c4() zF~C&vre*sI3z(BH@>uul!+~e{ATSHZ-nPAGi_m)&1J$bo93QOBH!XH5mOY*h6mx|l zVF4U2f@{uC2jTtKc9`VxCos_Jjnvl|@FSx8!pbYU027m5*6s3qVGK`n>K>8SXbEVl zB#5e(_!Z#6hNqU+zg_HA18v2?^)r!o-I!@?JL2A$Ga1y4fTGuNl8$m}h*bi#N4Geh zi0?*edxOSl+co(k0Aq4}Lp6i@Z$Vg9Ft8Gx#H^CYju_q;R+6Zo&T`CRb1d!S;o}Hg z(Pz8|hp=H1`9k13S<9PdoJ9Qv+UF(nZMmgwb{CQ{-s!g0U}Hx(qhQXy~sSo}Hs1>CD+$A~Q^ z)@{Kp0e(C#G2C}sm#eG}#iw^vlb_QqSIaS+>=&n&Z2?bUhqJ8WR0SRTx99x@rnV?t z4TBkOWOw8rJXbEy`Y1V*ztVVq#V;~vlt}GWz>woOgdo8jb)1M%h5DU-STgnT zjrPpK6a30&LbGyJ{|Wi58)a2}ZY0Xc>0lJIW6zA!&v37x2j(3;>?Y!fIGpq92;32NalB&!bidWj* zj6&xc&-}Jf6rA`u+Kh%0gnSNWpN2=`&GDM<5#@++)xKBQ+z~t&Awgj>2hW})Ah!S> z%HrdB0jedR)$=ylGW2`*s4SlA9=A{usfRjO>9T4Jl{8cSS$3W^iagYrdm9%>zouM4 z^d;UxZI&@>Xn7zDYaB}Mw}-C9wB$+bsO?AUDy7RZz^N9dki4sh{2>oaN#SC(&49gJ zuw5?*y@IlK-o7OoV);2XZl0hC#wpSmq~qGF{s1I?*Ae)WW0)G>*HNPY;feZ=s7l9^ zQ_O6A9>lbO%^{y3s9z3xy5rTk*EJvq+TlD{D2JK<;woF7IRDQj6y972oW+7nNS)=L zz>Fa1l`fR%My>#dUIEc}F3E?u@^0afLo`!7BBKudy$2Q=oEln{a-%d6!qw#>)^?%H z^T|T{ibnaH>fzMtuH;v`TRN_$`F-WB<{o0zmGi7!);(+Dgt z5h^STICyzkV*H_0B}O6zmB^eN;r=VGI_qGA5Aw`)PPbP&gr&Pes3Tq7_HHR!|F8o9 zo6e18$Ba`^FF&PY)^8>@H?#uy@09F0tuxDA%dE+6JFj0PzYD7S&Zm>zL4o(bet}AF`P2nM5DA7=$d3b`oq(o;-ro6?(5!kb>Gx|;#IGf)0NO2!-@W)GGJ~I#dp*@|OsSfxh z>3HOZKit{QbXQMsEvkNed97~s55D$odot^uR~hn0XN*E{ANFpQKZOpx+n0=!Psnq;-)~(98vE-XkCZXC zZAITuVns%IW!*WEDVO2gan4&(30n6Xwrx*szo%T8xwdW`2Uzlv2v)Mh??x}QMvw!fk?l*t6HXXS&Uz$$tH19MW zAvWWiPU2f|N+-bse`b@5BC2V8nm8%sHXb$}GD(l2T{ZR}n6I>^lkJ!7(@8fAHwhH| z$^oTxFYK>2rk=l*3{zWtl7DM?mXmAUEc%#E_IlUTc_sJ#Nb3>*O)9fn=8#M=4#=Q; z>3#Jvo4i^7%_#F(@F}cyAO46uog`Qnpqus%`+?qcq;Qd+LJ^?-)k62e`f6c18GjZ( zktA3jpr7{M{`z|=iFlbfnIeBlVKOP8>Pt24z2y^#jPX}b^VP~vrTAU)oBXhW|yApJk~A&d;msP-ns$#Y#-pS z&?V>nRRL02{<2?oTHb|)0|57t@s0c??%dvAB!CuuP+DKI zte-?0lI=t;XMINU=#d`X4(-BGatVpd`ffq5aMq{9RcswVxLszeYjLU!eQd;?Hv6Hw z*1K`N8`^+WEwx`~wRA+__l8p=D7H5yO*cOV>p5fo;SA%wo&CA#zzi`Wtg%#cx3mRv z%8UeKtLhWJwE1PJl4yCG>XTh*Gj{5nJyot>dG0KO$dj^}(d4$}hnWyL$>?cj=ZjdV{ zDNKRZXTUq6#4`)Q;gg?SDKk6#jr3B$d~SJzXf3yVK3{!f86as@i!5nwV(7XNkBsDEJ+_omi#5WZaeR^trUv+p0_({TiTU~d>Q<$EO6tC`8>_|uuFK= zrQF7&xMvvDRoMg+0@V&4ehf$}2bg{TfJk&0%`u0hrOCpS8lcHU0g^2Ei9H%zSzKL; z&whkD38;#R%k)9DidzaSPw`QtegaPRu^j9(0>HTaXW^p*l^$KhIKAgwi0xR{744Zpt5q_9ZW^XVy+-xxKMdpJVvknWPCH>F3uvPI&(Ny?U@) z-Au8CQw!6wcB;VAq>*MpJ5@MRZdCe7o|NJVvwDLsa^f!xnaeNon3WzGoXjl_BUAgg zpNUz(JvG>GFeI#h)5NUwY2Z})H8Ux{*&CHub~kwHm0^ry+hMCiTw8d)xEq-=yoG}3 z(z2hntpXM3lLf9%-4e31`bu6Q{8r)}_E?#_C2VE&T{O2(<>|9zZRa3l{5=!w-q`)n}a=eE3_lb}sR+LybDTo_gR>H(p|qoD%M$OuMfC z!c=pyZvfN5Z<3lQ!Vlh`t4+xP)eYXy+>ONn%MH@*fEzsZamCNsVe3L0v+<&x0h(Wp zmLByS?kNsg;_uz&byL$0$YMut;E8*P!2{BxE;a^ZG1+A5OEHI5hQ#6 z>f;zI%%RE+7a74kWd(86DWf`sDxRIhDvsdLlbt-}1BI*Hp)3g(Il=ghZt}vpD!0NK zmLMzKkeu}uE^zE2^P|kQcR9g4c6&kU<%la*A>1JIqYfJ5h!8D2_62eHDUf;56_pQA z1lqZrRN$3!_%$wrRS!^@pg?l$rJKu{5Lo>Hl^P68Ui1XYR!v6t;2bQeh8PEYL1r_}6u6l}SZ8+YU!wC~{@Ryx+o$8YVbM$6XUFn@Bsvn~! z>OkWkXCQtj6J)>vWbq8d57!|oi|%$jD=mF7V{bz06cej0eSuC{zGn@d9vD_x`a-EE zh5dÃ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 RfB#SZ{s)0Zq*MTO1pt4+z1;u+ literal 0 HcmV?d00001 diff --git a/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json new file mode 100644 index 00000000000000..d899f11922a405 --- /dev/null +++ b/deps/npm/node_modules/npm-registry-client/test/fixtures/underscore/cache.json @@ -0,0 +1 @@ +{"_id":"underscore","_rev":"72-47f2986bfd8e8b55068b204588bbf484","name":"underscore","description":"JavaScript's functional programming helper library.","dist-tags":{"latest":"1.3.3","stable":"1.3.3"},"versions":{"1.0.3":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.0.3","_id":"underscore@1.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.0.3.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.0.4":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.0.4","_id":"underscore@1.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.0.4.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.0":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.0","_id":"underscore@1.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.0.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.1":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.1","_id":"underscore@1.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.1.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.2":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.2","_id":"underscore@1.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.2.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.3":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore","version":"1.1.3","_id":"underscore@1.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.5","dist":{"tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.3.tgz"},"directories":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.4":{"name":"underscore","description":"Functional programming aid for JavaScript. Works well with jQuery.","url":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"underscore.js","version":"1.1.4","_id":"underscore@1.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"9e82274902865625b3a6d4c315a38ffd80047dae","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.4.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.1.5":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.5","_id":"underscore@1.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"23601d62c75619998b2f0db24938102793336a56","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.5.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.6":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.6","_id":"underscore@1.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6868da1bdd72d75285be0b4e50f228e70d001a2c","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.6.tgz"},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"1.1.7":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.1.7","devDependencies":{},"_id":"underscore@1.1.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"40bab84bad19d230096e8d6ef628bff055d83db0","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz"},"scripts":{},"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.0":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.0","_npmJsonOpts":{"file":"/Users/jashkenas/.npm/underscore/1.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"underscore@1.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b32ce32c8c118caa8031c10b54c7f65ab3b557fd","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.0.tgz"},"scripts":{},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"directories":{}},"1.2.1":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.1","_npmJsonOpts":{"file":"/Users/jashkenas/.npm/underscore/1.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"underscore@1.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz"},"scripts":{},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"directories":{}},"1.2.2":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.2","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"74dd40e9face84e724eb2edae945b8aedc233ba3","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.2.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.3":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"11b874da70f4683d7d48bba2b44be1e600d2f6cf","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.3.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.2.4":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.2.4","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.2.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e8da6241aa06f64df2473bb2590b8c17c84c3c7e","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.2.4.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.0":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.0","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"253b2d79b7bb67943ced0fc744eb18267963ede8","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.0.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.1":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.1","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6cb8aad0e77eb5dbbfb54b22bcd8697309cf9641","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.1.tgz"},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.2":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.2","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1b4e455089ab1d1d38ab6794ffe6cf08f764394a","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.2.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"1.3.3":{"name":"underscore","description":"JavaScript's functional programming helper library.","homepage":"http://documentcloud.github.com/underscore/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"main":"underscore.js","version":"1.3.3","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"underscore@1.3.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"47ac53683daf832bfa952e1774417da47817ae42","tarball":"http://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz"},"readme":" __ \n /\\ \\ __ \n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____ \n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\ \n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/ \n \\ \\____/ \n \\/___/\n \nUnderscore.js is a utility-belt library for JavaScript that provides \nsupport for the usual functional suspects (each, map, reduce, filter...) \nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://documentcloud.github.com/underscore/\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n","maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}}},"maintainers":[{"name":"documentcloud","email":"jeremy@documentcloud.org"},{"name":"jashkenas","email":"jashkenas@gmail.com"}],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"time":{"1.0.3":"2011-12-07T15:12:18.045Z","1.0.4":"2011-12-07T15:12:18.045Z","1.1.0":"2011-12-07T15:12:18.045Z","1.1.1":"2011-12-07T15:12:18.045Z","1.1.2":"2011-12-07T15:12:18.045Z","1.1.3":"2011-12-07T15:12:18.045Z","1.1.4":"2011-12-07T15:12:18.045Z","1.1.5":"2011-12-07T15:12:18.045Z","1.1.6":"2011-12-07T15:12:18.045Z","1.1.7":"2011-12-07T15:12:18.045Z","1.2.0":"2011-12-07T15:12:18.045Z","1.2.1":"2011-12-07T15:12:18.045Z","1.2.2":"2011-11-14T20:28:47.115Z","1.2.3":"2011-12-07T15:12:18.045Z","1.2.4":"2012-01-09T17:23:14.818Z","1.3.0":"2012-01-11T16:41:38.459Z","1.3.1":"2012-01-23T22:57:36.474Z","1.3.2":"2012-04-09T18:38:14.345Z","1.3.3":"2012-04-10T14:43:48.089Z"},"repository":{"type":"git","url":"git://github.com/documentcloud/underscore.git"},"users":{"vesln":true,"mvolkmann":true,"lancehunt":true,"mikl":true,"linus":true,"vasc":true,"bat":true,"dmalam":true,"mbrevoort":true,"danielr":true,"rsimoes":true,"thlorenz":true}} \ No newline at end of file diff --git a/deps/npm/node_modules/npm-registry-client/test/initialize.js b/deps/npm/node_modules/npm-registry-client/test/initialize.js index aefbe626fce210..3856b67b45e0f8 100644 --- a/deps/npm/node_modules/npm-registry-client/test/initialize.js +++ b/deps/npm/node_modules/npm-registry-client/test/initialize.js @@ -1,4 +1,5 @@ var test = require('tap').test +var url = require('url') // var server = require('./lib/server.js') var Client = require('../') @@ -29,6 +30,39 @@ test('defaulted initialization', function (t) { var HttpAgent = require('http').Agent t.ok(options.agent instanceof HttpAgent, 'got an HTTP agent for an HTTP URL') + t.equal(options.agent.maxSockets, 50, 'maxSockets set to a reasonable default') + + t.end() +}) + +test('intializing with maxSockets set works for http', function (t) { + var client = new Client({ maxSockets: Infinity }) + var options = client.initialize( + url.parse('http://localhost:1337/'), + 'GET', + 'application/json', + {} + ) + + var HttpAgent = require('http').Agent + t.ok(options.agent instanceof HttpAgent, 'got an HTTP agent for an HTTP URL') + t.equal(options.agent.maxSockets, Infinity, 'request uses configured value for maxSockets') + + t.end() +}) + +test('intializing with maxSockets set works for https', function (t) { + var client = new Client({ maxSockets: Infinity }) + var options = client.initialize( + url.parse('https://localhost:1337/'), + 'GET', + 'application/json', + {} + ) + + var HttpsAgent = require('https').Agent + t.ok(options.agent instanceof HttpsAgent, 'got an HTTPS agent for an HTTPS URL') + t.equal(options.agent.maxSockets, Infinity, 'request uses configured value for maxSockets') t.end() }) diff --git a/deps/npm/node_modules/request/.eslintrc b/deps/npm/node_modules/request/.eslintrc new file mode 100644 index 00000000000000..6ebc53601d7ba5 --- /dev/null +++ b/deps/npm/node_modules/request/.eslintrc @@ -0,0 +1,45 @@ +{ + "env": { + "node": true + }, + "rules": { + // 2-space indentation + "indent": [2, 2, {"SwitchCase": 1}], + // Disallow semi-colons, unless needed to disambiguate statement + "semi": [2, "never"], + // Require strings to use single quotes + "quotes": [2, "single"], + // Require curly braces for all control statements + "curly": 2, + // Disallow using variables and functions before they've been defined + "no-use-before-define": 2, + // Allow any case for variable naming + "camelcase": 0, + // Disallow unused variables, except as function arguments + "no-unused-vars": [2, {"args":"none"}], + // Allow leading underscores for method names + // REASON: we use underscores to denote private methods + "no-underscore-dangle": 0, + // Allow multi spaces around operators since they are + // used for alignment. This is not consistent in the + // code. + "no-multi-spaces": 0, + // Style rule is: most objects use { beforeColon: false, afterColon: true }, unless aligning which uses: + // + // { + // beforeColon : true, + // afterColon : true + // } + // + // eslint can't handle this, so the check is disabled. + "key-spacing": 0, + // Allow shadowing vars in outer scope (needs discussion) + "no-shadow": 0, + // Use if () { } + // ^ space + "space-after-keywords": [2, "always"], + // Use if () { } + // ^ space + "space-before-blocks": [2, "always"] + } +} diff --git a/deps/npm/node_modules/strip-ansi/package.json b/deps/npm/node_modules/strip-ansi/package.json index f9809beee8dc3f..32e04f05858668 100644 --- a/deps/npm/node_modules/strip-ansi/package.json +++ b/deps/npm/node_modules/strip-ansi/package.json @@ -1,11 +1,11 @@ { "name": "strip-ansi", - "version": "3.0.0", + "version": "3.0.1", "description": "Strip ANSI escape codes", "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/sindresorhus/strip-ansi.git" + "url": "git+https://github.com/chalk/strip-ansi.git" }, "author": { "name": "Sindre Sorhus", @@ -26,7 +26,7 @@ "node": ">=0.10.0" }, "scripts": { - "test": "node test.js" + "test": "xo && ava" }, "files": [ "index.js" @@ -59,27 +59,32 @@ "ansi-regex": "^2.0.0" }, "devDependencies": { - "ava": "0.0.4" + "ava": "*", + "xo": "*" }, - "gitHead": "3f05b9810e1438f946e2eb84ee854cc00b972e9e", + "gitHead": "8270705c704956da865623e564eba4875c3ea17f", "bugs": { - "url": "https://github.com/sindresorhus/strip-ansi/issues" + "url": "https://github.com/chalk/strip-ansi/issues" }, - "homepage": "https://github.com/sindresorhus/strip-ansi", - "_id": "strip-ansi@3.0.0", - "_shasum": "7510b665567ca914ccb5d7e072763ac968be3724", - "_from": "strip-ansi@3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", + "homepage": "https://github.com/chalk/strip-ansi", + "_id": "strip-ansi@3.0.1", + "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "_from": "strip-ansi@*", + "_npmVersion": "2.11.3", + "_nodeVersion": "0.12.7", "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" + "name": "jbnicolai", + "email": "jappelman@xebia.com" }, "dist": { - "shasum": "7510b665567ca914ccb5d7e072763ac968be3724", - "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" + "shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "_npmOperationalInternal": { + "host": "packages-9-west.internal.npmjs.com", + "tmp": "tmp/strip-ansi-3.0.1.tgz_1456057278183_0.28958667791448534" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "readme": "ERROR: No README data found!" } diff --git a/deps/npm/node_modules/strip-ansi/readme.md b/deps/npm/node_modules/strip-ansi/readme.md index 76091512df5e46..cb7d9ff7ee403d 100644 --- a/deps/npm/node_modules/strip-ansi/readme.md +++ b/deps/npm/node_modules/strip-ansi/readme.md @@ -1,4 +1,4 @@ -# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi) +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) > Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) @@ -22,10 +22,10 @@ stripAnsi('\u001b[4mcake\u001b[0m'); ## Related -- [strip-ansi-cli](https://github.com/sindresorhus/strip-ansi-cli) - CLI for this module -- [has-ansi](https://github.com/sindresorhus/has-ansi) - Check if a string has ANSI escape codes -- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes -- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right ## License diff --git a/deps/npm/package.json b/deps/npm/package.json index 660b192626db85..be2988afefc2eb 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "2.14.20", + "version": "2.15.0", "name": "npm", "description": "a package manager for JavaScript", "keywords": [ @@ -51,7 +51,7 @@ "fstream-npm": "~1.0.7", "github-url-from-git": "~1.4.0", "github-url-from-username-repo": "~1.0.2", - "glob": "~5.0.15", + "glob": "~7.0.3", "graceful-fs": "~4.1.3", "hosted-git-info": "~2.1.4", "inflight": "~1.0.4", @@ -62,14 +62,14 @@ "lru-cache": "~3.2.0", "minimatch": "~3.0.0", "mkdirp": "~0.5.1", - "node-gyp": "~3.3.0", + "node-gyp": "~3.3.1", "nopt": "~3.0.6", "normalize-git-url": "~3.0.1", "normalize-package-data": "~2.3.5", "npm-cache-filename": "~1.0.2", "npm-install-checks": "~1.0.7", "npm-package-arg": "~4.1.0", - "npm-registry-client": "~7.0.9", + "npm-registry-client": "~7.1.0", "npm-user-validate": "~0.1.2", "npmlog": "~2.0.2", "once": "~1.3.3", @@ -89,6 +89,7 @@ "slide": "~1.1.6", "sorted-object": "~1.0.0", "spdx-license-ids": "~1.2.0", + "strip-ansi": "~3.0.1", "tar": "~2.2.1", "text-table": "~0.2.0", "uid-number": "0.0.6", @@ -180,6 +181,7 @@ "npm-registry-mock": "~1.0.0", "require-inject": "~1.3.0", "sprintf-js": "~1.0.2", + "tacks": "~1.0.9", "tap": "~2.3.1" }, "scripts": { @@ -188,8 +190,6 @@ "preversion": "bash scripts/update-authors.sh && git add AUTHORS && git commit -m \"update AUTHORS\" || true", "tap": "tap --timeout 240", "test": "npm run test-tap", - "test-all": "npm run test-legacy && npm run test-tap", - "test-legacy": "node ./test/run.js", "test-tap": "npm run tap -- \"test/tap/*.js\"" }, "license": "Artistic-2.0" diff --git a/deps/npm/test/fixtures/config/userconfig-with-gc b/deps/npm/test/fixtures/config/userconfig-with-gc index 62ad80be113e5e..7268fcb3c611f9 100644 --- a/deps/npm/test/fixtures/config/userconfig-with-gc +++ b/deps/npm/test/fixtures/config/userconfig-with-gc @@ -1,4 +1,4 @@ -globalconfig=/Users/zkat/Documents/code/npm/test/fixtures/config/globalconfig +globalconfig=/Users/ogd/Documents/projects/npm/npm/test/fixtures/config/globalconfig email=i@izs.me env-thing=asdf init.author.name=Isaac Z. Schlueter diff --git a/deps/npm/test/npm_cache/npm-test-files/1.2.5/package.tgz b/deps/npm/test/npm_cache/npm-test-files/1.2.5/package.tgz deleted file mode 100644 index b24f7944c5958427545ff80ab9f8d0827ed5b69b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmV(aBMF7U5J7gj4Qozk?M=)bpRMMM$U zGJ^A5oWnlY2QN>ZEwS z?LOBJc}A<7Y-gVG={enB{9FGM4oqdGWGPd1Ic}tG#;d%LnvK|A?sQ%$v%~`o5;N1S zq*JEbIS)-SbEYDj9e@1|q9+&c!)v5rt`su`<7n$lm7%k5MSj4#N3h901yBGR*ZES diff --git a/deps/npm/test/npm_cache/npm-test-files/1.2.5/package/package.json b/deps/npm/test/npm_cache/npm-test-files/1.2.5/package/package.json deleted file mode 100644 index 717149c176cc69..00000000000000 --- a/deps/npm/test/npm_cache/npm-test-files/1.2.5/package/package.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"npm-test-files","version":"1.2.5","files":["sub1/sub","sub2"],"readme":"ERROR: No README data found!","_id":"npm-test-files@1.2.5","scripts":{},"_shasum":"3f516561e52d6958b818db2a4fbc1b40707e68e3","_from":"npm-test-files","_resolved":"file:npm-test-files"} \ No newline at end of file diff --git a/deps/npm/test/packages/npm-test-array-bin/README b/deps/npm/test/packages/npm-test-array-bin/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-array-bin/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-array-bin/bin/array-bin b/deps/npm/test/packages/npm-test-array-bin/bin/array-bin deleted file mode 100644 index 9558516aad0c79..00000000000000 --- a/deps/npm/test/packages/npm-test-array-bin/bin/array-bin +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.log('ok') diff --git a/deps/npm/test/packages/npm-test-array-bin/package.json b/deps/npm/test/packages/npm-test-array-bin/package.json deleted file mode 100644 index 45e22efc41c9e0..00000000000000 --- a/deps/npm/test/packages/npm-test-array-bin/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "name":"npm-test-array-bin" -, "version":"1.2.5" -, "bin": [ "bin/array-bin" ] -, "scripts": { "test": "node test.js" } } diff --git a/deps/npm/test/packages/npm-test-blerg/README b/deps/npm/test/packages/npm-test-blerg/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-blerg/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-blerg/package.json b/deps/npm/test/packages/npm-test-blerg/package.json deleted file mode 100644 index 04e3338918716f..00000000000000 --- a/deps/npm/test/packages/npm-test-blerg/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "name":"npm-test-blerg" -, "version" : "0.0.2" -, "scripts" : { "test" : "node test.js" } -, "publishConfig": {"tag": "foo"} -} diff --git a/deps/npm/test/packages/npm-test-blerg3/README b/deps/npm/test/packages/npm-test-blerg3/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-blerg3/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-blerg3/package.json b/deps/npm/test/packages/npm-test-blerg3/package.json deleted file mode 100644 index 87b5bbb96e54ec..00000000000000 --- a/deps/npm/test/packages/npm-test-blerg3/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "name":"npm-test-blerg3" -, "homepage": "https://github.com/npm/npm/issues/2658" -, "version" : "0.0.0" -, "scripts" : { "test" : "node test.js" } -} diff --git a/deps/npm/test/packages/npm-test-bundled-git/README b/deps/npm/test/packages/npm-test-bundled-git/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-bundled-git/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-bundled-git/package.json b/deps/npm/test/packages/npm-test-bundled-git/package.json deleted file mode 100644 index 69e0eb7a8b2d0f..00000000000000 --- a/deps/npm/test/packages/npm-test-bundled-git/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{"name":"npm-test-bundled-git" -,"scripts":{"test":"node test.js"} -,"version":"1.2.5" -,"dependencies":{"glob":"git://github.com/isaacs/node-glob.git#npm-test"} -,"bundledDependencies":["glob"]} diff --git a/deps/npm/test/packages/npm-test-dir-bin/README b/deps/npm/test/packages/npm-test-dir-bin/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-dir-bin/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-dir-bin/bin/dir-bin b/deps/npm/test/packages/npm-test-dir-bin/bin/dir-bin deleted file mode 100644 index 9558516aad0c79..00000000000000 --- a/deps/npm/test/packages/npm-test-dir-bin/bin/dir-bin +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.log('ok') diff --git a/deps/npm/test/packages/npm-test-dir-bin/package.json b/deps/npm/test/packages/npm-test-dir-bin/package.json deleted file mode 100644 index 1ea26323fdbd3f..00000000000000 --- a/deps/npm/test/packages/npm-test-dir-bin/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "name":"npm-test-dir-bin" -, "version":"1.2.5" -, "directories": { "bin": "./bin" } -, "scripts": { "test": "node test.js" } } diff --git a/deps/npm/test/packages/npm-test-env-reader/README b/deps/npm/test/packages/npm-test-env-reader/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-env-reader/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-env-reader/package.json b/deps/npm/test/packages/npm-test-env-reader/package.json deleted file mode 100644 index 99d7fc93070284..00000000000000 --- a/deps/npm/test/packages/npm-test-env-reader/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "name":"npm-test-env-reader" -, "version" : "1.2.3" -, "scripts" : - { "install" : "node test.js" - , "preinstall" : "node test.js" - , "preuninstall" : "node test.js" - , "postuninstall" : "node test.js" - , "test" : "node test.js" - , "stop" : "node test.js" - , "start" : "node test.js" - , "restart" : "node test.js" - , "foo" : "node test.js" - } -} diff --git a/deps/npm/test/packages/npm-test-env-reader/test.js b/deps/npm/test/packages/npm-test-env-reader/test.js deleted file mode 100755 index d6cb7893a70f7a..00000000000000 --- a/deps/npm/test/packages/npm-test-env-reader/test.js +++ /dev/null @@ -1,9 +0,0 @@ -var envs = [] -for (var e in process.env) { - if (e.match(/npm|^path$/i)) envs.push(e + '=' + process.env[e]) -} -envs.sort(function (a, b) { - return a === b ? 0 : a > b ? -1 : 1 -}).forEach(function (e) { - console.log(e) -}) diff --git a/deps/npm/test/packages/npm-test-files/.npmignore b/deps/npm/test/packages/npm-test-files/.npmignore deleted file mode 100644 index c7d927d0a2fd51..00000000000000 --- a/deps/npm/test/packages/npm-test-files/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -/sub/ignore1 -./sub/include2 -ignore3 -./include4 -ignoredir1 -ignoredir2/ -*.tgz diff --git a/deps/npm/test/packages/npm-test-files/include4 b/deps/npm/test/packages/npm-test-files/include4 deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-files/package.json b/deps/npm/test/packages/npm-test-files/package.json deleted file mode 100644 index 2afa12dc560fc0..00000000000000 --- a/deps/npm/test/packages/npm-test-files/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ "name":"npm-test-files" -, "version":"1.2.5" -, "files": - [ "include4" - , "sub/include" - , "sub/include2" - , "sub/include4" - , "test.sh" - , ".npmignore" ] -, "scripts":{"test":"bash test.sh"}} diff --git a/deps/npm/test/packages/npm-test-files/sub/include b/deps/npm/test/packages/npm-test-files/sub/include deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-files/sub/include2 b/deps/npm/test/packages/npm-test-files/sub/include2 deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-files/sub/include4 b/deps/npm/test/packages/npm-test-files/sub/include4 deleted file mode 100644 index d16969cd189673..00000000000000 --- a/deps/npm/test/packages/npm-test-files/sub/include4 +++ /dev/null @@ -1 +0,0 @@ -This file should be in the package. diff --git a/deps/npm/test/packages/npm-test-files/test.sh b/deps/npm/test/packages/npm-test-files/test.sh deleted file mode 100644 index cdf47f211a86b8..00000000000000 --- a/deps/npm/test/packages/npm-test-files/test.sh +++ /dev/null @@ -1,27 +0,0 @@ -x=`find . | grep ignore | grep -v npmignore` -if [ "$x" != "" ]; then - echo "ignored files included: $x" - exit 1 -fi - -x=`find . | grep -v ignore | sort` -y=". -./include4 -./package.json -./sub -./sub/include -./sub/include2 -./sub/include4 -./test.sh" -if [ "$x" != "$y" ]; then - echo "missing included files" - echo "got:" - echo "===" - echo "$x" - echo "===" - echo "wanted:" - echo "===" - echo "$y" - echo "===" - exit 1 -fi diff --git a/deps/npm/test/packages/npm-test-ignore-nested-nm/README b/deps/npm/test/packages/npm-test-ignore-nested-nm/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore-nested-nm/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-ignore-nested-nm/lib/node_modules/foo b/deps/npm/test/packages/npm-test-ignore-nested-nm/lib/node_modules/foo deleted file mode 100644 index 2c9d06aff6f62c..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore-nested-nm/lib/node_modules/foo +++ /dev/null @@ -1 +0,0 @@ -I WILL NOT BE IGNORED! diff --git a/deps/npm/test/packages/npm-test-ignore-nested-nm/package.json b/deps/npm/test/packages/npm-test-ignore-nested-nm/package.json deleted file mode 100644 index 177dbfb01d61b7..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore-nested-nm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{"name":"npm-test-ignore-nested-nm" -,"version":"1.2.5" -,"scripts":{"test":"node test.js"}} diff --git a/deps/npm/test/packages/npm-test-ignore/.npmignore b/deps/npm/test/packages/npm-test-ignore/.npmignore deleted file mode 100644 index c7d927d0a2fd51..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -/sub/ignore1 -./sub/include2 -ignore3 -./include4 -ignoredir1 -ignoredir2/ -*.tgz diff --git a/deps/npm/test/packages/npm-test-ignore/README b/deps/npm/test/packages/npm-test-ignore/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-ignore/include4 b/deps/npm/test/packages/npm-test-ignore/include4 deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-ignore/package.json b/deps/npm/test/packages/npm-test-ignore/package.json deleted file mode 100644 index 6d492de78063ae..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ "name":"npm-test-ignore" -, "version":"1.2.5" -, "scripts":{"test":"bash test.sh"}} diff --git a/deps/npm/test/packages/npm-test-ignore/sub/include b/deps/npm/test/packages/npm-test-ignore/sub/include deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-ignore/sub/include2 b/deps/npm/test/packages/npm-test-ignore/sub/include2 deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/deps/npm/test/packages/npm-test-ignore/sub/include4 b/deps/npm/test/packages/npm-test-ignore/sub/include4 deleted file mode 100644 index d16969cd189673..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore/sub/include4 +++ /dev/null @@ -1 +0,0 @@ -This file should be in the package. diff --git a/deps/npm/test/packages/npm-test-ignore/test.sh b/deps/npm/test/packages/npm-test-ignore/test.sh deleted file mode 100644 index 05fbaf169973bf..00000000000000 --- a/deps/npm/test/packages/npm-test-ignore/test.sh +++ /dev/null @@ -1,29 +0,0 @@ -x=`find . | grep ignore | grep -v npmignore` -if [ "$x" != "" ]; then - echo "ignored files included: $x" - exit 1 -fi - -x=`find . | grep -v ignore | sort` -y=". -./include4 -./package.json -./README -./sub -./sub/include -./sub/include2 -./sub/include4 -./test.sh" -y="`echo "$y" | sort`" -if [ "$x" != "$y" ]; then - echo "missing included files" - echo "got:" - echo "===" - echo "$x" - echo "===" - echo "wanted:" - echo "===" - echo "$y" - echo "===" - exit 1 -fi diff --git a/deps/npm/test/packages/npm-test-missing-bindir/README b/deps/npm/test/packages/npm-test-missing-bindir/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-missing-bindir/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-missing-bindir/package.json b/deps/npm/test/packages/npm-test-missing-bindir/package.json deleted file mode 100644 index 49e26742df58f0..00000000000000 --- a/deps/npm/test/packages/npm-test-missing-bindir/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "name":"npm-test-missing-bindir" -, "version" : "0.0.0" -, "scripts" : { "test" : "node test.js" } -, "directories": { "bin" : "./not-found" } } diff --git a/deps/npm/test/packages/npm-test-optional-deps/README b/deps/npm/test/packages/npm-test-optional-deps/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-optional-deps/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-optional-deps/package.json b/deps/npm/test/packages/npm-test-optional-deps/package.json deleted file mode 100644 index 67545ca9da1391..00000000000000 --- a/deps/npm/test/packages/npm-test-optional-deps/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ "name": "npm-test-optional-deps" -, "version": "1.2.5" -, "scripts": { "test": "node test.js" } -, "optionalDependencies": - { "npm-test-foobarzaaakakaka": "http://example.com/" - , "dnode": "10.999.14234" - , "sax": "0.3.5" - , "glob": "some invalid version 99 #! $$ x y z" - , "npm-test-failer":"*" - } -} diff --git a/deps/npm/test/packages/npm-test-platform-all/README b/deps/npm/test/packages/npm-test-platform-all/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-platform-all/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-platform-all/package.json b/deps/npm/test/packages/npm-test-platform-all/package.json deleted file mode 100644 index 07624363e6e996..00000000000000 --- a/deps/npm/test/packages/npm-test-platform-all/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{"name":"npm-test-platform-all" -,"version":"9.9.9-9" -,"homepage":"http://www.zombo.com/" -,"os":["darwin","linux","win32","solaris","haiku","sunos","freebsd","openbsd","netbsd"] -,"cpu":["arm","mips","ia32","x64","sparc"]} diff --git a/deps/npm/test/packages/npm-test-platform/README b/deps/npm/test/packages/npm-test-platform/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-platform/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-platform/package.json b/deps/npm/test/packages/npm-test-platform/package.json deleted file mode 100644 index d6c3e09e1d9091..00000000000000 --- a/deps/npm/test/packages/npm-test-platform/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{"name":"npm-test-platform" -,"version":"9.9.9-9" -,"homepage":"http://www.youtube.com/watch?v=dQw4w9WgXcQ" -,"os":["!this_is_not_a_real_os", "!neither_is_this"] -,"cpu":["!this_is_not_a_real_cpu","!this_isnt_either"]} diff --git a/deps/npm/test/packages/npm-test-private/README b/deps/npm/test/packages/npm-test-private/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-private/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-private/package.json b/deps/npm/test/packages/npm-test-private/package.json deleted file mode 100644 index 3d95a37af14b45..00000000000000 --- a/deps/npm/test/packages/npm-test-private/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{"name":"npm-test-private" -,"version":"9.9.9-9" -,"homepage":"http://www.youtube.com/watch?v=1MLry6Cn_D4" -,"private":"true"} diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/README b/deps/npm/test/packages/npm-test-shrinkwrap/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-shrinkwrap/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/package.json b/deps/npm/test/packages/npm-test-shrinkwrap/package.json deleted file mode 100644 index a5d446e2d11681..00000000000000 --- a/deps/npm/test/packages/npm-test-shrinkwrap/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "name": "npm-test-shrinkwrap", - "version": "0.0.0", - "dependencies": { - "npm-test-single-file": "https://gist.github.com/isaacs/1837112/raw/9ef57a59fc22aeb1d1ca346b68826dcb638b8416/index.js", - "glob": "git://github.com/isaacs/node-glob.git#npm-test", - "minimatch": "~0.1.0" - }, - "scripts": { - "test": "node test.js" - } -} diff --git a/deps/npm/test/packages/npm-test-test-package/README b/deps/npm/test/packages/npm-test-test-package/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-test-package/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-test-package/package.json b/deps/npm/test/packages/npm-test-test-package/package.json deleted file mode 100644 index c5c5aeabc1e56f..00000000000000 --- a/deps/npm/test/packages/npm-test-test-package/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "name":"npm-test-test-package" -, "author" : "Testy McMock" -, "version" : "1.2.3-99-b" -, "description" : "This is a test package used for debugging. It has some random data and that's all." -} diff --git a/deps/npm/test/packages/npm-test-url-dep/README b/deps/npm/test/packages/npm-test-url-dep/README deleted file mode 100644 index 8848f0786872f2..00000000000000 --- a/deps/npm/test/packages/npm-test-url-dep/README +++ /dev/null @@ -1 +0,0 @@ -just an npm test diff --git a/deps/npm/test/packages/npm-test-url-dep/package.json b/deps/npm/test/packages/npm-test-url-dep/package.json deleted file mode 100644 index f1949d8388154c..00000000000000 --- a/deps/npm/test/packages/npm-test-url-dep/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "name":"npm-test-url-dep" -, "version" : "1.2.3" -, "dependencies" : - { "jsonify" : "https://github.com/substack/jsonify/tarball/master" - , "sax": "isaacs/sax-js" - , "canonical-host": "git://github.com/isaacs/canonical-host" - } } diff --git a/deps/npm/test/tap/bearer-token-check.js b/deps/npm/test/tap/bearer-token-check.js new file mode 100644 index 00000000000000..6db2b832067541 --- /dev/null +++ b/deps/npm/test/tap/bearer-token-check.js @@ -0,0 +1,119 @@ +var resolve = require('path').resolve +var writeFileSync = require('graceful-fs').writeFileSync + +var mkdirp = require('mkdirp') +var mr = require('npm-registry-mock') +var osenv = require('osenv') +var rimraf = require('rimraf') +var test = require('tap').test + +var common = require('../common-tap.js') +var toNerfDart = require('../../lib/config/nerf-dart.js') + +var pkg = resolve(__dirname, 'install-bearer-check') +var outfile = resolve(pkg, '_npmrc') +var modules = resolve(pkg, 'node_modules') +var tarballPath = '/scoped-underscore/-/scoped-underscore-1.3.1.tgz' +// needs to be a different hostname to verify tokens (not) being sent correctly +var tarballURL = 'http://lvh.me:' + common.port + tarballPath +var tarball = resolve(__dirname, '../fixtures/scoped-underscore-1.3.1.tgz') + +var server + +var EXEC_OPTS = { cwd: pkg } + +function mocks (server) { + var auth = 'Bearer 0xabad1dea' + server.get(tarballPath, { authorization: auth }).reply(403, { + error: 'token leakage', + reason: 'This token should not be sent.' + }) + server.get(tarballPath).replyWithFile(200, tarball) +} + +test('setup', function (t) { + mr({ port: common.port, plugin: mocks }, function (er, s) { + server = s + t.ok(s, 'set up mock registry') + setup() + t.end() + }) +}) + +test('authed npm install with tarball not on registry', function (t) { + common.npm( + [ + 'install', + '--loglevel', 'silent', + '--json', + '--fetch-retries', 0, + '--userconfig', outfile + ], + EXEC_OPTS, + function (err, code, stdout, stderr) { + t.ifError(err, 'test runner executed without error') + t.equal(code, 0, 'npm install exited OK') + t.notOk(stderr, 'no output on stderr') + try { + var results = JSON.parse(stdout) + } catch (ex) { + console.error('#', ex) + t.ifError(ex, 'stdout was valid JSON') + } + + if (results) { + var installedversion = { + 'name': '@scoped/underscore', + 'version': '1.3.1', + 'from': 'http://lvh.me:1337/scoped-underscore/-/scoped-underscore-1.3.1.tgz', + 'dependencies': {} + } + t.isDeeply(results[0], installedversion, '@scoped/underscore installed') + } + + t.end() + } + ) +}) + +test('cleanup', function (t) { + server.close() + cleanup() + t.end() +}) + +var contents = '@scoped:registry=' + common.registry + '\n' + + toNerfDart(common.registry) + ':_authToken=0xabad1dea\n' + +var json = { + name: 'test-package-install', + version: '1.0.0' +} + +var shrinkwrap = { + name: 'test-package-install', + version: '1.0.0', + dependencies: { + '@scoped/underscore': { + resolved: tarballURL, + from: '>=1.3.1 <2', + version: '1.3.1' + } + } +} + +function setup () { + cleanup() + mkdirp.sync(modules) + writeFileSync(resolve(pkg, 'package.json'), JSON.stringify(json, null, 2) + '\n') + writeFileSync(outfile, contents) + writeFileSync( + resolve(pkg, 'npm-shrinkwrap.json'), + JSON.stringify(shrinkwrap, null, 2) + '\n' + ) +} + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} diff --git a/deps/npm/test/tap/config-credentials.js b/deps/npm/test/tap/config-credentials.js index 1cb2a7eb410c59..c23be12f6e0abb 100644 --- a/deps/npm/test/tap/config-credentials.js +++ b/deps/npm/test/tap/config-credentials.js @@ -73,13 +73,13 @@ test("set with token", function (t) { }, "needs only token") var expected = { - scope : "//registry.lvh.me:8661/", - token : "simple-token", - username : undefined, - password : undefined, - email : undefined, - auth : undefined, - alwaysAuth : undefined + scope: '//registry.lvh.me:8661/', + token: 'simple-token', + username: undefined, + password: undefined, + email: undefined, + auth: undefined, + alwaysAuth: false } t.same(conf.getCredentialsByURI(URI), expected, "got bearer token and scope") diff --git a/deps/npm/test/tap/files-and-ignores.js b/deps/npm/test/tap/files-and-ignores.js new file mode 100644 index 00000000000000..02371cfe3eab78 --- /dev/null +++ b/deps/npm/test/tap/files-and-ignores.js @@ -0,0 +1,558 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var fs = require('graceful-fs') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-files') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-files') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +test('basic file inclusion', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + 'include', + 'sub/include' + ] + }), + include: File(''), + sub: Dir({ include: File('') }), + notincluded: File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('include'), 'toplevel file included') + t.ok(fileExists('sub/include'), 'nested file included') + t.notOk(fileExists('notincluded'), 'unspecified file not included') + done() + }) +}) + +test('basic file exclusion', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.npmignore': File( + 'ignore\n' + + 'sub/ignore\n' + ), + include: File(''), + ignore: File(''), + sub: Dir({ ignore: File('') }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('ignore'), 'toplevel file excluded') + t.notOk(fileExists('sub/ignore'), 'nested file excluded') + t.ok(fileExists('include'), 'unignored file included') + done() + }) +}) + +test('toplevel-only and blanket ignores', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.npmignore': File( + './shallow1\n' + + '/shallow2\n' + + '/sub/onelevel\n' + + 'deep\n' + + '' + ), + shallow1: File(''), + shallow2: File(''), + deep: File(''), + sub: Dir({ + shallow1: File(''), + shallow2: File(''), + onelevel: File(''), + deep: File(''), + sub: Dir({ + deep: File(''), + onelevel: File('') + }) + }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('shallow2'), '/ file excluded') + t.ok(fileExists('sub/shallow1'), 'nested ./ file included') + t.ok(fileExists('sub/shallow2'), 'nested / file included') + t.ok(fileExists('sub/sub/onelevel'), 'double-nested file included') + t.notOk(fileExists('sub/onelevel'), 'nested / file excluded') + t.notOk(fileExists('deep'), 'deep file excluded') + t.notOk(fileExists('sub/deep'), 'nested deep file excluded') + t.notOk(fileExists('sub/sub/deep'), 'double-nested deep file excluded') + t.ok(fileExists('shallow1'), './ file included') + done() + }) +}) + +test('.npmignore works for nested directories recursively', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.npmignore': File( + '/ignore\n' + + 'deep\n' + ), + include: File(''), + ignore: File(''), + deep: File(''), + sub: Dir({ + ignore: File(''), + include: File(''), + deep: File(''), + sub: Dir({ + '.npmignore': File( + '/ignore\n' + ), + ignore: File(''), + include: File(''), + deep: File('') + }) + }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('ignore'), 'toplevel file excluded') + t.ok(fileExists('include'), 'unignored file included') + t.ok(fileExists('sub/ignore'), 'same-name file in nested dir included') + t.ok(fileExists('sub/include'), 'unignored nested dir file included') + t.notOk(fileExists('sub/sub/ignore'), 'sub-sub-directory file excluded') + t.ok(fileExists('sub/sub/include'), 'sub-sube-directory file included') + t.notOk(fileExists('deep'), 'deep file excluded') + t.notOk(fileExists('sub/deep'), 'sub-dir deep file excluded') + t.notOk(fileExists('sub/sub/deep'), 'sub-sub-dir deep file excluded') + done() + }) +}) + +test('.gitignore should have identical semantics', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.gitignore': File( + './shallow1\n' + + '/shallow2\n' + + '/sub/onelevel\n' + + 'deep\n' + + '' + ), + shallow1: File(''), + shallow2: File(''), + deep: File(''), + sub: Dir({ + shallow1: File(''), + shallow2: File(''), + onelevel: File(''), + deep: File(''), + sub: Dir({ + deep: File(''), + onelevel: File('') + }) + }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('shallow2'), '/ file excluded') + t.ok(fileExists('sub/shallow1'), 'nested ./ file included') + t.ok(fileExists('sub/shallow2'), 'nested / file included') + t.ok(fileExists('sub/sub/onelevel'), 'double-nested file included') + t.notOk(fileExists('sub/onelevel'), 'nested / file excluded') + t.notOk(fileExists('deep'), 'deep file excluded') + t.notOk(fileExists('sub/deep'), 'nested deep file excluded') + t.notOk(fileExists('sub/sub/deep'), 'double-nested deep file excluded') + t.ok(fileExists('shallow1'), './ file included') + done() + }) +}) + +test('.npmignore should always be overridden by files array', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + 'include', + 'sub' + ] + }), + '.npmignore': File( + 'include\n' + + 'ignore\n' + + 'sub/included\n' + ), + include: File(''), + ignore: File(''), + sub: Dir({ + include: File('') + }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('ignore'), 'toplevel file excluded') + t.ok(fileExists('include'), 'unignored file included') + t.ok(fileExists('sub/include'), 'nested file included') + done() + }) +}) + +test('.gitignore supported for ignores', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.gitignore': File( + 'ignore\n' + + 'sub/ignore\n' + ), + include: File(''), + ignore: File(''), + sub: Dir({ ignore: File('') }) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('ignore'), 'toplevel file excluded') + t.notOk(fileExists('sub/ignore'), 'nested file excluded') + t.ok(fileExists('include'), 'unignored file included') + done() + }) +}) + +test('.npmignore completely overrides .gitignore', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.npmignore': File( + 'ignore\n' + + 'sub/ignore\n' + ), + '.gitignore': File( + 'include\n' + + 'sub/include\n' + + 'extra\n' + ), + include: File(''), + sub: Dir({ include: File('') }), + extra: File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('include'), 'gitignored toplevel file included') + t.ok(fileExists('extra'), 'gitignored extra toplevel file included') + t.ok(fileExists('sub/include'), 'gitignored nested file included') + t.notOk(fileExists('ignore'), 'toplevel file excluded') + t.notOk(fileExists('sub/ignore'), 'nested file excluded') + done() + }) +}) + +test('files array overrides .npmignore', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + 'include', + 'sub/include' + ] + }), + '.npmignore': File( + 'include\n' + + 'sub/include\n' + ), + include: File(''), + sub: Dir({ include: File('') }) + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('include'), 'toplevel file included') + t.ok(fileExists('sub/include'), 'nested file included') + done() + }) +}) + +test('includes files regardless of emptiness', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + 'full', + 'empty' + ] + }), + full: File('This file has contents~'), + empty: File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('full'), 'contentful file included') + t.ok(fileExists('empty'), 'empty file included') + done() + }) +}) + +test('.npmignore itself gets included', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + '.npmignore' + ] + }), + '.npmignore': File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('.npmignore'), '.npmignore included') + done() + }) +}) + +test('include default files when missing files spec', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + 'index.js': File(''), + foo: File(''), + node_modules: Dir({foo: Dir({bar: File('')})}) + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('index.js'), 'index.js included') + t.ok(fileExists('foo'), 'foo included') + t.notOk(fileExists('node_modules'), 'node_modules not included') + done() + }) +}) + +test('include main file', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + main: 'foo.js', + files: [] + }), + 'index.js': File(''), + 'foo.js': File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('foo.js'), 'foo.js included because of main') + t.notOk(fileExists('index.js'), 'index.js not included') + done() + }) +}) + +test('certain files ignored unconditionally', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + '.git', + '.svn', + 'CVS', + '.hg', + '.lock-wscript', + '.wafpickle-0', + '.wafpickle-5', + '.wafpickle-50', + 'build/config.gypi', + 'npm-debug.log', + '.npmrc', + '.foo.swp', + '.DS_Store', + '._ohno' + ] + }), + '.git': Dir({foo: File('')}), + '.svn': Dir({foo: File('')}), + 'CVS': Dir({foo: File('')}), + '.hg': Dir({foo: File('')}), + '.lock-wscript': File(''), + '.wafpickle-0': File(''), + '.wafpickle-5': File(''), + '.wafpickle-50': File(''), + 'build': Dir({'config.gypi': File('')}), + 'npm-debug.log': File(''), + '.npmrc': File(''), + '.foo.swp': File(''), + '.DS_Store': Dir({foo: File('')}), + '._ohno': File(''), + '._ohnoes': Dir({noes: File('')}) + }) + ) + withFixture(t, fixture, function (done) { + t.notOk(fileExists('.git'), '.git not included') + t.notOk(fileExists('.svn'), '.svn not included') + t.notOk(fileExists('CVS'), 'CVS not included') + t.notOk(fileExists('.hg'), '.hg not included') + t.notOk(fileExists('.lock-wscript'), '.lock-wscript not included') + t.notOk(fileExists('.wafpickle-0'), '.wafpickle-0 not included') + t.notOk(fileExists('.wafpickle-5'), '.wafpickle-5 not included') + t.notOk(fileExists('.wafpickle-50'), '.wafpickle-50 not included') + t.notOk(fileExists('build/config.gypi'), 'build/config.gypi not included') + t.notOk(fileExists('npm-debug.log'), 'npm-debug.log not included') + t.notOk(fileExists('.npmrc'), '.npmrc not included') + t.notOk(fileExists('.foo.swp'), '.foo.swp not included') + t.notOk(fileExists('.DS_Store'), '.DS_Store not included') + t.notOk(fileExists('._ohno'), '._ohno not included') + t.notOk(fileExists('._ohnoes'), '._ohnoes not included') + done() + }) +}) + +test('certain files included unconditionally', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5' + }), + '.npmignore': File( + 'package.json', + 'README', + 'Readme', + 'readme.md', + 'readme.randomext', + 'changelog', + 'CHAngelog', + 'ChangeLOG.txt', + 'license', + 'licence', + 'LICENSE', + 'LICENCE' + ), + 'README': File(''), + 'Readme': File(''), + 'readme.md': File(''), + 'readme.randomext': File(''), + 'changelog': File(''), + 'CHAngelog': File(''), + 'ChangeLOG.txt': File(''), + 'license': File(''), + 'licence': File(''), + 'LICENSE': File(''), + 'LICENCE': File('') + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('package.json'), 'package.json included') + t.ok(fileExists('README'), 'README included') + t.ok(fileExists('Readme'), 'Readme included') + t.ok(fileExists('readme.md'), 'readme.md included') + t.ok(fileExists('readme.randomext'), 'readme.randomext included') + t.ok(fileExists('changelog'), 'changelog included') + t.ok(fileExists('CHAngelog'), 'CHAngelog included') + t.ok(fileExists('ChangeLOG.txt'), 'ChangeLOG.txt included') + t.ok(fileExists('license'), 'license included') + t.ok(fileExists('licence'), 'licence included') + t.ok(fileExists('LICENSE'), 'LICENSE included') + t.ok(fileExists('LICENCE'), 'LICENCE included') + done() + }) +}) + +test('folder-based inclusion works', function (t) { + var fixture = new Tacks( + Dir({ + 'package.json': File({ + name: 'npm-test-files', + version: '1.2.5', + files: [ + 'sub1/sub', + 'sub2' + ] + }), + sub1: Dir({ + sub: Dir({ + include1: File(''), + include2: File('') + }), + ignored: File('') + }), + sub2: Dir({ + include1: File(''), + include2: File(''), + empty: Dir({}) + }) + }) + ) + withFixture(t, fixture, function (done) { + t.ok(fileExists('sub1/sub/include1'), 'nested dir included') + t.ok(fileExists('sub1/sub/include2'), 'nested dir included') + t.notOk(fileExists('sub1/ignored'), 'unspecified file not included') + + t.ok(fileExists('sub2/include1'), 'dir contents included') + t.ok(fileExists('sub2/include2'), 'dir contents included') + t.notOk(fileExists('sub2/empty'), 'empty dir not included') + + done() + }) +}) + +function fileExists (file) { + try { + return !!fs.statSync(path.resolve(installedpath, file)) + } catch (_) { + return false + } +} + +function withFixture (t, fixture, tester) { + fixture.create(fixturepath) + mkdirp.sync(modulepath) + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code) { + if (err) throw err + t.is(code, 0, 'install went ok') + tester(removeAndDone) + } + function removeAndDone (err) { + if (err) throw err + fixture.remove(fixturepath) + rimraf.sync(basepath) + t.done() + } +} diff --git a/deps/npm/test/tap/legacy-array-bin.js b/deps/npm/test/tap/legacy-array-bin.js new file mode 100644 index 00000000000000..3e421ee23e3ff0 --- /dev/null +++ b/deps/npm/test/tap/legacy-array-bin.js @@ -0,0 +1,80 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-array-bin') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-array-bin') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir +var fixture = new Tacks( + Dir({ + bin: Dir({ + 'array-bin': File( + '#!/usr/bin/env node\n' + + "console.log('test ran ok')\n" + ) + }), + 'package.json': File({ + name: 'npm-test-array-bin', + version: '1.2.5', + bin: [ + 'bin/array-bin' + ], + scripts: { + test: 'node test.js' + } + }), + 'test.js': File( + "require('child_process').exec('array-bin', { env: process.env },\n" + + ' function (err, stdout, stderr) {\n' + + " if (err && err.code) throw new Error('exited badly with code = ' + err.code)\n" + + ' console.log(stdout)\n' + + ' console.error(stderr)\n' + + ' }\n' + + ')\n' + ) + }) +) +test('setup', function (t) { + setup() + t.done() +}) +test('array-bin', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'install went ok') + t.equal(stderr, '', 'no error output') + common.npm(['test'], {cwd: installedpath}, testCheckAndRemove) + } + function testCheckAndRemove (err, code, stdout, stderr) { + t.ifError(err, 'npm test on array bin') + t.equal(code, 0, 'exited OK') + t.equal(stderr.trim(), '', 'no error output') + t.match(stdout, /test ran ok/, 'child script ran properly') + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + } + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'remove went ok') + t.done() + } +}) +test('cleanup', function (t) { + cleanup() + t.done() +}) +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-bundled-git.js b/deps/npm/test/tap/legacy-bundled-git.js new file mode 100644 index 00000000000000..355f9467c151fb --- /dev/null +++ b/deps/npm/test/tap/legacy-bundled-git.js @@ -0,0 +1,103 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-bundled-git') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-bundled-git') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var minimatchExpected = { + name: 'minimatch', + description: 'a glob matcher in javascript', + version: '0.2.1', + repository: { + type: 'git', + url: 'git://github.com/isaacs/minimatch.git' + }, + main: 'minimatch.js', + scripts: { + test: 'tap test' + }, + engines: { + node: '*' + }, + dependencies: { + 'lru-cache': '~1.0.5' + }, + devDependencies: { + tap: '~0.1.3' + }, + licenses: [ + { + type: 'MIT', + url: 'http://github.com/isaacs/minimatch/raw/master/LICENSE' + } + ] +} + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-bundled-git', + scripts: { + test: 'node test.js' + }, + version: '1.2.5', + dependencies: { + glob: 'git://github.com/isaacs/node-glob.git#npm-test' + }, + bundledDependencies: [ + 'glob' + ] + }) + }) +) +test('setup', function (t) { + setup() + t.done() +}) +test('bundled-git', function (t) { + common.npm(['install', '--global-style', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'install went ok') + + var actual = require(path.resolve(installedpath, 'node_modules/glob/node_modules/minimatch/package.json')) + Object.keys(minimatchExpected).forEach(function (key) { + t.isDeeply(actual[key], minimatchExpected[key], key + ' set to the right value') + }) + + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + } + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'remove went ok') + t.done() + } +}) +test('cleanup', function (t) { + cleanup() + t.done() +}) +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-dir-bin.js b/deps/npm/test/tap/legacy-dir-bin.js new file mode 100644 index 00000000000000..e9e6bdfe1320f6 --- /dev/null +++ b/deps/npm/test/tap/legacy-dir-bin.js @@ -0,0 +1,79 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-dir-bin') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-dir-bin') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir +var fixture = new Tacks( + Dir({ + bin: Dir({ + 'dir-bin': File( + '#!/usr/bin/env node\n' + + "console.log('test ran ok')\n" + ) + }), + 'package.json': File({ + name: 'npm-test-dir-bin', + version: '1.2.5', + directories: { + bin: './bin' + }, + scripts: { + test: 'node test.js' + } + }), + 'test.js': File( + "require('child_process').exec('dir-bin', { env: process.env },\n" + + ' function (err, stdout, stderr) {\n' + + " if (err && err.code) throw new Error('exited badly with code = ' + err.code)\n" + + ' console.log(stdout)\n' + + ' console.error(stderr)\n' + + ' }\n' + + ')\n' + ) + }) +) +test('setup', function (t) { + setup() + t.done() +}) +test('dir-bin', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'install went ok') + common.npm(['test'], {cwd: installedpath}, testCheckAndRemove) + } + function testCheckAndRemove (err, code, stdout, stderr) { + t.ifError(err, 'npm test on array bin') + t.equal(code, 0, 'exited OK') + t.equal(stderr.trim(), '', 'no error output') + t.match(stdout, /test ran ok/, 'child script ran properly') + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + } + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'remove went ok') + t.done() + } +}) +test('cleanup', function (t) { + cleanup() + t.done() +}) +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-ignore-nested-nm.js b/deps/npm/test/tap/legacy-ignore-nested-nm.js new file mode 100644 index 00000000000000..095c41efa146ba --- /dev/null +++ b/deps/npm/test/tap/legacy-ignore-nested-nm.js @@ -0,0 +1,64 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-ignore-nested-nm') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-ignore-nested-nm') +var fs = require('graceful-fs') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fileData = 'I WILL NOT BE IGNORED!\n' +var fixture = new Tacks( + Dir({ + lib: Dir({ + node_modules: Dir({ + foo: File(fileData) + }) + }), + 'package.json': File({ + name: 'npm-test-ignore-nested-nm', + version: '1.2.5' + }) + }) +) +test('setup', function (t) { + setup() + t.done() +}) +test('ignore-nested-nm', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'install went ok') + var foopath = path.resolve(installedpath, 'lib/node_modules/foo') + fs.readFile(foopath, function (err, data) { + t.ifError(err, 'file read successfully') + t.equal(data.toString(), fileData) + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + }) + } + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'remove went ok') + t.done() + } +}) +test('cleanup', function (t) { + cleanup() + t.done() +}) +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-missing-bindir.js b/deps/npm/test/tap/legacy-missing-bindir.js new file mode 100644 index 00000000000000..a55703bebdb7cc --- /dev/null +++ b/deps/npm/test/tap/legacy-missing-bindir.js @@ -0,0 +1,82 @@ +'use strict' +var path = require('path') +var fs = require('fs') +var test = require('tap').test +var common = require('../common-tap.js') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-missing-bindir') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-missing-bindir') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-missing-bindir', + version: '0.0.0', + directories: { + bin: './not-found' + } + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +function installedExists (filename) { + try { + fs.statSync(path.resolve(installedpath, filename)) + return true + } catch (ex) { + console.log(ex) + return false + } +} + +test('missing-bindir', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + if (stderr) console.error(stderr) + console.log(stdout) + t.is(code, 0, 'install went ok') + t.is(installedExists('README'), true, 'README') + t.is(installedExists('package.json'), true, 'package.json') + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + } + + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'remove went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-no-auth-leak.js b/deps/npm/test/tap/legacy-no-auth-leak.js new file mode 100644 index 00000000000000..f837239250222b --- /dev/null +++ b/deps/npm/test/tap/legacy-no-auth-leak.js @@ -0,0 +1,75 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-no-auth-leak', + version: '0.0.0', + scripts: { + test: 'node test.js' + } + }), + '.npmrc': File( + 'auth=abc', + 'authCrypt=def', + 'password=xyz', + '//registry.npmjs.org/:_authToken=nopenope' + ), + 'test.js': File( + 'var authTokenKeys = Object.keys(process.env)\n' + + ' .filter(function (key) { return /authToken/.test(key) })\n' + + 'console.log(JSON.stringify({\n' + + ' password: process.env.npm_config__password || null,\n' + + ' auth: process.env.npm_config__auth || null,\n' + + ' authCrypt: process.env.npm_config__authCrypt || null ,\n' + + ' authToken: authTokenKeys && process.env[authTokenKeys[0]] || null\n' + + '}))' + ) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('no-auth-leak', function (t) { + common.npm(['test'], {cwd: basepath}, function (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'test ran ok') + if (stderr) console.log(stderr) + var matchResult = /^[^{]*(\{(?:.|\n)*\})[^}]*$/ + t.like(stdout, matchResult, 'got results with a JSON chunk in them') + var stripped = stdout.replace(matchResult, '$1') + var result = JSON.parse(stripped) + t.is(result.password, null, 'password') + t.is(result.auth, null, 'auth') + t.is(result.authCrypt, null, 'authCrypt') + t.is(result.authToken, null, 'authToken') + t.end() + }) +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(basepath) +} + +function cleanup () { + fixture.remove(basepath) +} diff --git a/deps/npm/test/tap/legacy-npm-self-install.js b/deps/npm/test/tap/legacy-npm-self-install.js new file mode 100644 index 00000000000000..313c0594935a0d --- /dev/null +++ b/deps/npm/test/tap/legacy-npm-self-install.js @@ -0,0 +1,107 @@ +'use strict' +var test = require('tap').test +var fs = require('graceful-fs') +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var osenv = require('osenv') +var npmpath = path.resolve(__dirname, '../..') +var basepath = path.resolve(osenv.tmpdir(), path.basename(__filename, '.js')) +var globalpath = path.resolve(basepath, 'global') +var extend = Object.assign || require('util')._extend +var isWin32 = process.platform === 'win32' + +test('setup', function (t) { + setup() + t.done() +}) + +var tarball + +test('build-tarball', function (t) { + common.npm(['pack'], {cwd: npmpath, stdio: ['ignore', 'pipe', process.stderr]}, function (err, code, stdout) { + if (err) throw err + t.is(code, 0, 'pack went ok') + tarball = path.resolve(npmpath, stdout.trim().replace(/^(?:.|\n)*(?:^|\n)(.*?[.]tgz)$/, '$1')) + t.match(tarball, /[.]tgz$/, 'got a tarball') + t.done() + }) +}) + +function exists () { + try { + fs.statSync(path.resolve.apply(null, arguments)) + return true + } catch (ex) { + return false + } +} + +test('npm-self-install', function (t) { + if (!tarball) return t.done() + + var env = extend({}, process.env) + var pathsep = isWin32 ? ';' : ':' + env.npm_config_prefix = globalpath + env.npm_config_global = 'true' + env.npm_config_npat = 'false' + env.NODE_PATH = null + env.npm_config_user_agent = null + env.npm_config_color = 'always' + env.npm_config_progress = 'always' + var PATH = env.PATH.split(pathsep) + var binpath = isWin32 ? globalpath : path.join(globalpath, 'bin') + var cmdname = isWin32 ? 'npm.cmd' : 'npm' + PATH.unshift(binpath) + env.PATH = PATH.join(pathsep) + + var opts = {cwd: basepath, env: env, stdio: ['ignore', 'ignore', process.stderr]} + + common.npm(['install', '--ignore-scripts', tarball], opts, installCheckAndTest) + function installCheckAndTest (err, code) { + if (err) throw err + t.is(code, 0, 'install went ok') + t.is(exists(binpath, cmdname), true, 'binary was installed') + t.is(exists(globalpath, 'lib', 'node_modules', 'npm'), true, 'module path exists') + common.npm(['ls', '--json', '--depth=0'], {cwd: basepath, env: env}, lsCheckAndRemove) + } + function lsCheckAndRemove (err, code, stdout, stderr) { + t.ifError(err, 'npm test on array bin') + t.equal(code, 0, 'exited OK') + t.equal(stderr.trim(), '', 'no error output') + var installed = JSON.parse(stdout.trim()) + t.is(Object.keys(installed.dependencies).length, 1, 'one thing installed') + t.is(path.resolve(globalpath, installed.dependencies.npm.from), tarball, 'and it was our npm tarball') + common.npm(['rm', 'npm'], {cwd: basepath, env: env, stdio: 'inherit'}, removeCheck) + } + function removeCheck (err, code) { + if (err) throw err + t.is(code, 0, 'remove went ok') + common.npm(['ls', '--json', '--depth=0'], {cwd: basepath, env: env}, andDone) + } + function andDone (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'remove went ok') + t.equal(stderr.trim(), '', 'no error output') + var installed = JSON.parse(stdout.trim()) + t.ok(!installed.dependencies || installed.dependencies.length === 0, 'nothing left') + t.is(exists(binpath, cmdname), false, 'binary was removed') + t.is(exists(globalpath, 'lib', 'node_modules', 'npm'), false, 'module was entirely removed') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + mkdirp.sync(globalpath) +} + +function cleanup () { + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-optional-deps.js b/deps/npm/test/tap/legacy-optional-deps.js new file mode 100644 index 00000000000000..54d0c75aabd0ed --- /dev/null +++ b/deps/npm/test/tap/legacy-optional-deps.js @@ -0,0 +1,80 @@ +'use strict' +var path = require('path') +var fs = require('fs') +var test = require('tap').test +var common = require('../common-tap.js') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var mr = require('npm-registry-mock') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-optional-deps') +var modulepath = path.resolve(basepath, 'node_modules') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-optional-deps', + version: '1.2.5', + optionalDependencies: { + 'npm-test-foobarzaaakakaka': 'http://example.com/', + async: '10.999.14234', + mkdirp: '0.3.5', + optimist: 'some invalid version 99 #! $$ x y z', + 'npm-test-failer': '*' + } + }) + }) +) + +var server + +test('setup', function (t) { + setup() + mr({port: common.port}, function (err, s) { + if (err) throw err + server = s + t.done() + }) +}) + +test('optional-deps', function (t) { + server.get('/npm-test-failer').reply(404, {error: 'nope'}) + + var opts = ['--registry=' + common.registry, '--timeout=100'] + common.npm(opts.concat(['install', fixturepath]), {cwd: basepath}, installCheckAndTest) + + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + if (stderr) console.error(stderr) + server.done() + t.is(code, 0, 'install went ok') + var subpath = modulepath + '/npm-test-optional-deps/node_modules/' + var dir = fs.readdirSync(subpath) + t.isDeeply(dir, ['mkdirp'], 'only one optional dep should be there') + t.is(require(path.resolve(subpath, 'mkdirp', 'package.json')).version, '0.3.5', 'mkdirp version right') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + server.close() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-platform-all.js b/deps/npm/test/tap/legacy-platform-all.js new file mode 100644 index 00000000000000..2bfb19a45782bd --- /dev/null +++ b/deps/npm/test/tap/legacy-platform-all.js @@ -0,0 +1,73 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-platform-all') +var modulepath = path.resolve(basepath, 'node_modules') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-platform-all', + version: '9.9.9-9', + homepage: 'http://www.zombo.com/', + os: [ + 'darwin', + 'linux', + 'win32', + 'solaris', + 'haiku', + 'sunos', + 'freebsd', + 'openbsd', + 'netbsd' + ], + cpu: [ + 'arm', + 'mips', + 'ia32', + 'x64', + 'sparc' + ] + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('platform-all', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + t.is(stderr, '', 'no error messages') + t.is(code, 0, 'install went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-platform.js b/deps/npm/test/tap/legacy-platform.js new file mode 100644 index 00000000000000..4e94148b213097 --- /dev/null +++ b/deps/npm/test/tap/legacy-platform.js @@ -0,0 +1,64 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-platform') +var modulepath = path.resolve(basepath, 'node_modules') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-platform', + version: '9.9.9-9', + homepage: 'http://www.youtube.com/watch?v=dQw4w9WgXcQ', + os: [ + '!this_is_not_a_real_os', + '!neither_is_this' + ], + cpu: [ + '!this_is_not_a_real_cpu', + '!this_isnt_either' + ] + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('platform', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + t.is(code, 0, 'install went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-private.js b/deps/npm/test/tap/legacy-private.js new file mode 100644 index 00000000000000..5e7817bf6a13a7 --- /dev/null +++ b/deps/npm/test/tap/legacy-private.js @@ -0,0 +1,58 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-private') +var modulepath = path.resolve(basepath, 'node_modules') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-private', + version: '9.9.9-9', + homepage: 'http://www.youtube.com/watch?v=1MLry6Cn_D4', + private: 'true' + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('private', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'install went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-shrinkwrap.js b/deps/npm/test/tap/legacy-shrinkwrap.js new file mode 100644 index 00000000000000..6f5303037707a0 --- /dev/null +++ b/deps/npm/test/tap/legacy-shrinkwrap.js @@ -0,0 +1,132 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'npm-shrinkwrap.json': File({ + name: 'npm-test-shrinkwrap', + version: '0.0.0', + dependencies: { + glob: { + version: '3.1.5', + from: 'git://github.com/isaacs/node-glob.git#npm-test', + resolved: 'git://github.com/isaacs/node-glob.git#67bda227fd7a559cca5620307c7d30a6732a792f', + dependencies: { + 'graceful-fs': { + version: '1.1.5', + resolved: 'https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.5.tgz', + dependencies: { + 'fast-list': { + version: '1.0.2', + resolved: 'https://registry.npmjs.org/fast-list/-/fast-list-1.0.2.tgz' + } + } + }, + inherits: { + version: '1.0.0', + resolved: 'https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz' + }, + minimatch: { + version: '0.2.1', + dependencies: { + 'lru-cache': { + version: '1.0.5' + } + } + } + } + }, + minimatch: { + version: '0.1.5', + resolved: 'https://registry.npmjs.org/minimatch/-/minimatch-0.1.5.tgz', + dependencies: { + 'lru-cache': { + version: '1.0.5', + resolved: 'https://registry.npmjs.org/lru-cache/-/lru-cache-1.0.5.tgz' + } + } + }, + 'npm-test-single-file': { + version: '1.2.3', + resolved: 'https://gist.github.com/isaacs/1837112/raw/9ef57a59fc22aeb1d1ca346b68826dcb638b8416/index.js' + } + } + }), + 'package.json': File({ + author: 'Isaac Z. Schlueter (http://blog.izs.me/)', + name: 'npm-test-shrinkwrap', + version: '0.0.0', + dependencies: { + 'npm-test-single-file': 'https://gist.github.com/isaacs/1837112/raw/9ef57a59fc22aeb1d1ca346b68826dcb638b8416/index.js', + glob: 'git://github.com/isaacs/node-glob.git#npm-test', + minimatch: '~0.1.0' + }, + scripts: { + test: 'node test.js' + } + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('shrinkwrap', function (t) { + common.npm(['install'], {cwd: basepath}, installCheckAndTest) + + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + t.is(code, 0, 'install went ok') + + common.npm(['ls', '--json'], {cwd: basepath}, verifyLsMatchesShrinkwrap) + } + + function verifyLsMatchesShrinkwrap (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + t.is(code, 0, 'ls went ok') + var actual = JSON.parse(stdout) + var expected = require(path.resolve(basepath, 'npm-shrinkwrap.json')) + // from is expected to vary + t.isDeeply(rmFrom(actual), rmFrom(expected)) + t.done() + } + + function rmFrom (obj) { + for (var i in obj) { + if (i === 'from') { + delete obj[i] + } else if (i === 'dependencies') { + for (var j in obj[i]) { + rmFrom(obj[i][j]) + } + } + } + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(basepath) +} + +function cleanup () { + fixture.remove(basepath) +} diff --git a/deps/npm/test/tap/legacy-test-package.js b/deps/npm/test/tap/legacy-test-package.js new file mode 100644 index 00000000000000..b0cbaa01a5cb62 --- /dev/null +++ b/deps/npm/test/tap/legacy-test-package.js @@ -0,0 +1,76 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-test-package') +var modulepath = path.resolve(basepath, 'node_modules') +var installedpath = path.resolve(modulepath, 'npm-test-test-package') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-test-package', + author: 'Testy McMock', + version: '1.2.3-99-b', + description: "This is a test package used for debugging. It has some random data and that's all." + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('test-package', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'install went ok') + common.npm(['test'], {cwd: installedpath}, testCheckAndRemove) + } + + function testCheckAndRemove (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'npm test w/o test is ok') + common.npm(['rm', fixturepath], {cwd: basepath}, removeCheckAndDone) + } + + function removeCheckAndDone (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'remove went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/legacy-url-dep.js b/deps/npm/test/tap/legacy-url-dep.js new file mode 100644 index 00000000000000..9807d6916a4e44 --- /dev/null +++ b/deps/npm/test/tap/legacy-url-dep.js @@ -0,0 +1,61 @@ +'use strict' +var test = require('tap').test +var common = require('../common-tap.js') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('mkdirp') +var basepath = path.resolve(__dirname, path.basename(__filename, '.js')) +var fixturepath = path.resolve(basepath, 'npm-test-url-dep') +var modulepath = path.resolve(basepath, 'node_modules') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir + +var fixture = new Tacks( + Dir({ + README: File( + 'just an npm test\n' + ), + 'package.json': File({ + name: 'npm-test-url-dep', + version: '1.2.3', + dependencies: { + jsonify: 'https://github.com/substack/jsonify/tarball/master', + sax: 'isaacs/sax-js', + 'canonical-host': 'git://github.com/isaacs/canonical-host' + } + }) + }) +) + +test('setup', function (t) { + setup() + t.done() +}) + +test('url-dep', function (t) { + common.npm(['install', fixturepath], {cwd: basepath}, installCheckAndTest) + function installCheckAndTest (err, code, stdout, stderr) { + if (err) throw err + console.error(stderr) + console.log(stdout) + t.is(code, 0, 'install went ok') + t.done() + } +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) + +function setup () { + cleanup() + fixture.create(fixturepath) + mkdirp.sync(modulepath) +} + +function cleanup () { + fixture.remove(fixturepath) + rimraf.sync(basepath) +} diff --git a/deps/npm/test/tap/lifecycle-path.js b/deps/npm/test/tap/lifecycle-path.js index fae6fcc83f71e3..39761b48d7533e 100644 --- a/deps/npm/test/tap/lifecycle-path.js +++ b/deps/npm/test/tap/lifecycle-path.js @@ -67,7 +67,8 @@ test('make sure the path is correct', function (t) { // get the ones we tacked on, then the system-specific requirements var expect = [ '{{ROOT}}/bin/node-gyp-bin', - '{{ROOT}}/test/tap/lifecycle-path/node_modules/.bin' + '{{ROOT}}/test/tap/lifecycle-path/node_modules/.bin', + path.dirname(process.execPath) ].concat(PATH.split(pathSplit).map(function (p) { return p.replace(/\\/g, '/') })) diff --git a/deps/npm/test/tap/map-to-registry.js b/deps/npm/test/tap/map-to-registry.js index 9f6673b92c0d6c..d9677bd7e0fceb 100644 --- a/deps/npm/test/tap/map-to-registry.js +++ b/deps/npm/test/tap/map-to-registry.js @@ -48,7 +48,7 @@ test('mapRegistryToURI', function (t) { password: undefined, email: undefined, auth: undefined, - alwaysAuth: undefined + alwaysAuth: false }) t.equal(registry, 'http://reg.npm/design/-/rewrite/') }) @@ -66,7 +66,7 @@ test('mapRegistryToURI', function (t) { password: undefined, email: undefined, auth: undefined, - alwaysAuth: undefined + alwaysAuth: false }) t.equal(registry, 'http://reg.npm/-/rewrite/') }) @@ -84,8 +84,83 @@ test('mapRegistryToURI', function (t) { password: undefined, email: undefined, auth: undefined, - alwaysAuth: undefined + alwaysAuth: false }) t.equal(registry, 'http://reg.npm/design/-/rewrite/relative/') }) }) + +test('mapToRegistry token scoping', function (t) { + npm.config.set('scope', '') + npm.config.set('registry', 'https://reg.npm/') + npm.config.set('//reg.npm/:_authToken', 'r-token') + + t.test('pass token to registry host', function (t) { + mapRegistry( + 'https://reg.npm/packages/e/easy-1.0.0.tgz', + npm.config, + function (er, uri, auth, registry) { + t.ifError(er, 'mapRegistryToURI worked') + t.equal(uri, 'https://reg.npm/packages/e/easy-1.0.0.tgz') + t.deepEqual(auth, { + scope: '//reg.npm/', + token: 'r-token', + username: undefined, + password: undefined, + email: undefined, + auth: undefined, + alwaysAuth: false + }) + t.equal(registry, 'https://reg.npm/') + } + ) + t.end() + }) + + t.test("don't pass token to non-registry host", function (t) { + mapRegistry( + 'https://butts.lol/packages/e/easy-1.0.0.tgz', + npm.config, + function (er, uri, auth, registry) { + t.ifError(er, 'mapRegistryToURI worked') + t.equal(uri, 'https://butts.lol/packages/e/easy-1.0.0.tgz') + t.deepEqual(auth, { + scope: '//reg.npm/', + token: undefined, + username: undefined, + password: undefined, + email: undefined, + auth: undefined, + alwaysAuth: false + }) + t.equal(registry, 'https://reg.npm/') + } + ) + t.end() + }) + + t.test('pass token to non-registry host with always-auth', function (t) { + npm.config.set('always-auth', true) + mapRegistry( + 'https://butts.lol/packages/e/easy-1.0.0.tgz', + npm.config, + function (er, uri, auth, registry) { + t.ifError(er, 'mapRegistryToURI worked') + t.equal(uri, 'https://butts.lol/packages/e/easy-1.0.0.tgz') + t.deepEqual(auth, { + scope: '//reg.npm/', + token: 'r-token', + username: undefined, + password: undefined, + email: undefined, + auth: undefined, + alwaysAuth: true + }) + t.equal(registry, 'https://reg.npm/') + } + ) + t.end() + }) + + t.end() +}) diff --git a/deps/npm/test/tap/peer-deps-invalid.js b/deps/npm/test/tap/peer-deps-invalid.js index 453f9617f38e34..3f51dbfc8e349e 100644 --- a/deps/npm/test/tap/peer-deps-invalid.js +++ b/deps/npm/test/tap/peer-deps-invalid.js @@ -6,73 +6,66 @@ var mr = require('npm-registry-mock') var osenv = require('osenv') var rimraf = require('rimraf') var test = require('tap').test +var Tacks = require('tacks') +var Dir = Tacks.Dir +var File = Tacks.File var npm = require('../../') var common = require('../common-tap') -var pkg = path.resolve(__dirname, 'peer-deps-invalid') -var cache = path.resolve(pkg, 'cache') +var testdir = path.resolve(__dirname, path.basename(__filename, '.js')) +var cachedir = path.resolve(testdir, 'cache') -var json = { - author: 'Domenic Denicola (http://domenicdenicola.com/)', - name: 'peer-deps-invalid', - version: '0.0.0', - dependencies: { - 'npm-test-peer-deps-file': 'http://localhost:1337/ok.js', - 'npm-test-peer-deps-file-invalid': 'http://localhost:1337/invalid.js' - } -} - -var fileFail = function () { -/**package -* { "name": "npm-test-peer-deps-file-invalid" -* , "main": "index.js" -* , "version": "1.2.3" -* , "description":"This one should conflict with the other one" -* , "peerDependencies": { "underscore": "1.3.3" } -* } -**/ - module.exports = 'I\'m just a lonely index, naked as the day I was born.' -}.toString().split('\n').slice(1, -1).join('\n') - -var fileOK = function () { -/**package -* { "name": "npm-test-peer-deps-file" -* , "main": "index.js" -* , "version": "1.2.3" -* , "description":"No package.json in sight!" -* , "peerDependencies": { "underscore": "1.3.1" } -* , "dependencies": { "mkdirp": "0.3.5" } -* } -**/ - module.exports = 'I\'m just a lonely index, naked as the day I was born.' -}.toString().split('\n').slice(1, -1).join('\n') +var fixtures = new Tacks(Dir({ + cache: Dir({}), + 'package.json': File({ + author: 'Domenic Denicola (http://domenicdenicola.com/)', + name: 'peer-deps-invalid', + version: '0.0.0', + dependencies: { + 'npm-test-peer-deps-file': 'file-ok/', + 'npm-test-peer-deps-file-invalid': 'file-fail/' + } + }), + 'file-ok': Dir({ + 'package.json': File({ + name: 'npm-test-peer-deps-file', + main: 'index.js', + version: '1.2.3', + description:'This one should conflict with the other one', + peerDependencies: { underscore: '1.3.1' }, + dependencies: { mkdirp: '0.3.5' } + }), + 'index.js': File( + "module.exports = 'I\'m just a lonely index, naked as the day I was born.'" + ), + }), + 'file-fail': Dir({ + 'package.json': File({ + name: 'npm-test-peer-deps-file-invalid', + main: 'index.js', + version: '1.2.3', + description:'This one should conflict with the other one', + peerDependencies: { underscore: '1.3.3' } + }), + 'index.js': File( + "module.exports = 'I\'m just a lonely index, naked as the day I was born.'" + ), + }), +})) test('setup', function (t) { cleanup() - mkdirp.sync(cache) - fs.writeFileSync( - path.join(pkg, 'package.json'), - JSON.stringify(json, null, 2) - ) - fs.writeFileSync(path.join(pkg, 'file-ok.js'), fileOK) - fs.writeFileSync(path.join(pkg, 'file-fail.js'), fileFail) - - process.chdir(pkg) + fixtures.create(testdir) + process.chdir(testdir) t.end() }) test('installing dependencies that have conflicting peerDependencies', function (t) { - var customMocks = { - 'get': { - '/ok.js': [200, path.join(pkg, 'file-ok.js')], - '/invalid.js': [200, path.join(pkg, 'file-fail.js')] - } - } - mr({port: common.port, mocks: customMocks}, function (err, s) { // create mock registry. + mr({port: common.port}, function (err, s) { // create mock registry. t.ifError(err, 'mock registry started') npm.load({ - cache: pkg + "/cache", + cache: cachedir, registry: common.registry }, function () { npm.commands.install([], function (err) { @@ -81,8 +74,8 @@ test('installing dependencies that have conflicting peerDependencies', function } else { t.equal(err.code, "EPEERINVALID") t.equal(err.packageName, "underscore") - t.equal(err.packageVersion, "1.3.3") - t.equal(err.message, "The package underscore@1.3.3 does not satisfy its siblings' peerDependencies requirements!") + t.match(err.packageVersion, /^1\.3\.[13]$/) + t.match(err.message, /^The package underscore@1\.3\.[13] does not satisfy its siblings' peerDependencies requirements!$/) } s.close() // shutdown mock registry. t.end() @@ -97,6 +90,5 @@ test('cleanup', function (t) { }) function cleanup () { - process.chdir(osenv.tmpdir()) - rimraf.sync(pkg) + fixtures.remove(testdir) } diff --git a/deps/npm/test/tap/run-script.js b/deps/npm/test/tap/run-script.js index 5d414d8e9249f9..f95f7028b261bc 100644 --- a/deps/npm/test/tap/run-script.js +++ b/deps/npm/test/tap/run-script.js @@ -25,8 +25,13 @@ var fullyPopulated = { 'prewith-both': 'node -e "console.log(process.argv[1] || \'pre\')"', 'with-both': 'node -e "console.log(process.argv[1] || \'main\')"', 'postwith-both': 'node -e "console.log(process.argv[1] || \'post\')"', - 'stop': 'node -e "console.log(process.argv[1] || \'stop\')"' - } + 'stop': 'node -e "console.log(process.argv[1] || \'stop\')"', + 'env-vars': 'node -e "console.log(process.env.run_script_foo_var)"', + 'npm-env-vars': 'node -e "console.log(process.env.npm_run_script_foo_var)"', + 'package-env-vars': 'node -e "console.log(process.env.run_script_foo_var)"', + 'prefixed-package-env-vars': 'node -e "console.log(process.env.npm_package_run_script_foo_var)"' + }, + 'run_script_foo_var': 'run_script_test_foo_val' } var lifecycleOnly = { @@ -181,6 +186,64 @@ test('npm run-script nonexistent-script with --if-present flag', function (t) { }) }) +test('npm run-script env vars accessible', function (t) { + process.env.run_script_foo_var = 'run_script_test_foo_val' + common.npm(['run-script', 'env-vars'], { + cwd: pkg + }, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without crashing') + t.equal(code, 0, 'exited normally') + t.equal(stderr, '', 'no error output') + t.match(stdout, + new RegExp(process.env.run_script_foo_var), + 'script had env access') + t.end() + }) +}) + +test('npm run-script package.json vars injected', function (t) { + common.npm(['run-script', 'package-env-vars'], { + cwd: pkg + }, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without crashing') + t.equal(code, 0, 'exited normally') + t.equal(stderr, '', 'no error output') + t.match(stdout, + new RegExp(fullyPopulated.run_script_foo_var), + 'script injected package.json value') + t.end() + }) +}) + +test('npm run-script package.json vars injected with prefix', function (t) { + common.npm(['run-script', 'prefixed-package-env-vars'], { + cwd: pkg + }, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without crashing') + t.equal(code, 0, 'exited normally') + t.equal(stderr, '', 'no error output') + t.match(stdout, + new RegExp(fullyPopulated.run_script_foo_var), + 'script injected npm_package-prefixed package.json value') + t.end() + }) +}) + +test('npm run-script env vars stripped npm-prefixed', function (t) { + process.env.npm_run_script_foo_var = 'run_script_test_foo_val' + common.npm(['run-script', 'npm-env-vars'], { + cwd: pkg + }, function (err, code, stdout, stderr) { + t.ifError(err, 'ran run-script without crashing') + t.equal(code, 0, 'exited normally') + t.equal(stderr, '', 'no error output') + t.notMatch(stdout, + new RegExp(process.env.npm_run_script_foo_var), + 'script stripped npm-prefixed env var') + t.end() + }) +}) + test('npm run-script no-params (lifecycle only)', function (t) { var expected = [ 'Lifecycle scripts included in scripted:', From 60ddab841ea706cb3ab5db250466a9f5bcd8710d Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Wed, 23 Mar 2016 14:47:12 -0400 Subject: [PATCH 38/41] doc: add instructions to only sign a release PR-URL: https://github.com/nodejs/node/pull/5876 Reviewed-By: Myles Borins Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- doc/releases.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/releases.md b/doc/releases.md index 1c77b91a014e00..512deb34acf84d 100644 --- a/doc/releases.md +++ b/doc/releases.md @@ -246,6 +246,8 @@ Use `tools/release.sh` to promote and sign the build. When run, it will perform If you didn't wait for ARM builds in the previous step before promoting the release, you should re-run `tools/release.sh` after the ARM builds have finished. That will move the ARM artifacts into the correct location. You will be prompted to re-sign SHASUMS256.txt. +Note: it is possible to only sign a release by running `./tools/release.sh -s vX.Y.Z`. + ### 13. Check the Release Your release should be available at and . Check that the appropriate files are in place. You may want to check that the binaries are working as appropriate and have the right internal version strings. Check that the API docs are available at . Check that the release catalog files are correct at and . From 42bbdc9dd176873af22cdb9552d44fd7c50fd468 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 9 Mar 2016 13:05:09 -0800 Subject: [PATCH 39/41] Add @mhdawson back to the CTC Now that the CTC has expanded, this PR calls for a vote of the CTC to reinstate Michael Dawson (@mhdawson) as a full voting member. Voted on and approved by the CTC on 2016-03-23 PR-URL: https://github.com/nodejs/node/pull/5633 Reviewed-By: Ben Noordhuis Reviewed-By: Alexis Campailla Reviewed-By: Colin Ihrig --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58741e602331a7..5e805ca55d2a95 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ information about the governance of the Node.js project, see * [fishrock123](https://github.com/fishrock123) - **Jeremiah Senkpiel** <fishrock123@rocketmail.com> * [indutny](https://github.com/indutny) - **Fedor Indutny** <fedor.indutny@gmail.com> * [jasnell](https://github.com/jasnell) - **James M Snell** <jasnell@gmail.com> +* [mhdawson](https://github.com/mhdawson) - **Michael Dawson** <michael_dawson@ca.ibm.com> * [misterdjules](https://github.com/misterdjules) - **Julien Gilli** <jgilli@nodejs.org> * [mscdex](https://github.com/mscdex) - **Brian White** <mscdex@mscdex.net> * [ofrobots](https://github.com/ofrobots) - **Ali Ijaz Sheikh** <ofrobots@google.com> @@ -174,7 +175,6 @@ information about the governance of the Node.js project, see * [lxe](https://github.com/lxe) - **Aleksey Smolenchuk** <lxe@lxe.co> * [matthewloring](https://github.com/matthewloring) - **Matthew Loring** <mattloring@google.com> * [mcollina](https://github.com/mcollina) - **Matteo Collina** <matteo.collina@gmail.com> -* [mhdawson](https://github.com/mhdawson) - **Michael Dawson** <michael_dawson@ca.ibm.com> * [micnic](https://github.com/micnic) - **Nicu Micleușanu** <micnic90@gmail.com> * [mikeal](https://github.com/mikeal) - **Mikeal Rogers** <mikeal.rogers@gmail.com> * [monsanto](https://github.com/monsanto) - **Christopher Monsanto** <chris@monsan.to> From 8d86d232e7ba3c5ca626ed4712cf37c3b4fd0370 Mon Sep 17 00:00:00 2001 From: Corey Kosak Date: Tue, 22 Mar 2016 17:18:02 -0400 Subject: [PATCH 40/41] doc: typo: interal->internal. Fixes a copy typo in the events.md docs. PR-URL: https://github.com/nodejs/node/pull/5849 Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell --- doc/api/events.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/events.markdown b/doc/api/events.markdown index 7b7ff57ee028f5..500d046f9e59f7 100644 --- a/doc/api/events.markdown +++ b/doc/api/events.markdown @@ -402,14 +402,14 @@ myEmitter.on('event', callbackA); myEmitter.on('event', callbackB); // callbackA removes listener callbackB but it will still be called. -// Interal listener array at time of emit [callbackA, callbackB] +// Internal listener array at time of emit [callbackA, callbackB] myEmitter.emit('event'); // Prints: // A // B // callbackB is now removed. -// Interal listener array [callbackA] +// Internal listener array [callbackA] myEmitter.emit('event'); // Prints: // A From 9ef4b1b140ce25e8178f7dfe2e637b8bd5483963 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Wed, 30 Mar 2016 13:30:51 -0700 Subject: [PATCH 41/41] 2016-03-31, Version v4.4.2 'Argon' (LTS) Notable Changes * https: - Under certain conditions ssl sockets may have been causing a memory leak when keepalive is enabled. This is no longer the case. - (Alexander Penev) https://github.com/nodejs/node/pull/5713 * lib: - The way that we were internally passing arguments was causing a potential leak. By copying the arguments into an array we can avoid this - (Nathan Woltman) https://github.com/nodejs/node/pull/4361 * npm: - Upgrade to v2.15.1. Fixes a security flaw in the use of authentication tokens in HTTP requests that would allow an attacker to set up a server that could collect tokens from users of the command-line interface. Authentication tokens have previously been sent with every request made by the CLI for logged-in users, regardless of the destination of the request. This update fixes this by only including those tokens for requests made against the registry or registries used for the current install. (Forrest L Norvell) * repl: - Previously if you were using the repl in strict mode the column number would be wrong in a stack trace. This is no longer an issue. - (Prince J Wesley) https://github.com/nodejs/node/pull/5416 PR-URL: https://github.com/nodejs/node/pull/5961 --- CHANGELOG.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++ src/node_version.h | 2 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6deb07263838f9..27062a6b62c6d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,61 @@ # Node.js ChangeLog +## 2016-03-31, Version 4.4.2 'Argon' (LTS), @thealphanerd + +### Notable Changes + +* **https**: + - Under certain conditions ssl sockets may have been causing a memory leak when keepalive is enabled. This is no longer the case. (Alexander Penev) [#5713](https://github.com/nodejs/node/pull/5713) +* **lib**: + - The way that we were internally passing arguments was causing a potential leak. By copying the arguments into an array we can avoid this. (Nathan Woltman) [#4361](https://github.com/nodejs/node/pull/4361) +* **npm**: + - Upgrade to v2.15.1. Fixes a security flaw in the use of authentication tokens in HTTP requests that would allow an attacker to set up a server that could collect tokens from users of the command-line interface. Authentication tokens have previously been sent with every request made by the CLI for logged-in users, regardless of the destination of the request. This update fixes this by only including those tokens for requests made against the registry or registries used for the current install. (Forrest L Norvell) +* **repl**: + - Previously if you were using the repl in strict mode the column number would be wrong in a stack trace. This is no longer an issue. (Prince J Wesley) [#5416](https://github.com/nodejs/node/pull/5416) + +### Commits + +* [[`96e163a79f`](https://github.com/nodejs/node/commit/96e163a79f)] - **buffer**: changing let in for loops back to var (Gareth Ellis) [#5819](https://github.com/nodejs/node/pull/5819) +* [[`0c6f6742f2`](https://github.com/nodejs/node/commit/0c6f6742f2)] - **console**: check that stderr is writable (Rich Trott) [#5635](https://github.com/nodejs/node/pull/5635) +* [[`55c3f804c4`](https://github.com/nodejs/node/commit/55c3f804c4)] - **deps**: upgrade npm in LTS to 2.15.1 (Forrest L Norvell) +* [[`1d0e4a987d`](https://github.com/nodejs/node/commit/1d0e4a987d)] - **deps**: remove unused openssl files (Ben Noordhuis) [#5619](https://github.com/nodejs/node/pull/5619) +* [[`d55599f4d8`](https://github.com/nodejs/node/commit/d55599f4d8)] - **dns**: use template literals (Benjamin Gruenbaum) [#5809](https://github.com/nodejs/node/pull/5809) +* [[`42bbdc9dd1`](https://github.com/nodejs/node/commit/42bbdc9dd1)] - **doc** Add @mhdawson back to the CTC (James M Snell) [#5633](https://github.com/nodejs/node/pull/5633) +* [[`8d86d232e7`](https://github.com/nodejs/node/commit/8d86d232e7)] - **doc**: typo: interal->internal. (Corey Kosak) [#5849](https://github.com/nodejs/node/pull/5849) +* [[`60ddab841e`](https://github.com/nodejs/node/commit/60ddab841e)] - **doc**: add instructions to only sign a release (Jeremiah Senkpiel) [#5876](https://github.com/nodejs/node/pull/5876) +* [[`040263e0f3`](https://github.com/nodejs/node/commit/040263e0f3)] - **doc**: grammar, clarity and links in timers doc (Bryan English) [#5792](https://github.com/nodejs/node/pull/5792) +* [[`8c24bd25a6`](https://github.com/nodejs/node/commit/8c24bd25a6)] - **doc**: fix order of end tags of list after heading (firedfox) [#5874](https://github.com/nodejs/node/pull/5874) +* [[`7c837028da`](https://github.com/nodejs/node/commit/7c837028da)] - **doc**: use consistent event name parameter (Benjamin Gruenbaum) [#5850](https://github.com/nodejs/node/pull/5850) +* [[`20faf9097d`](https://github.com/nodejs/node/commit/20faf9097d)] - **doc**: explain error message on missing main file (Wolfgang Steiner) [#5812](https://github.com/nodejs/node/pull/5812) +* [[`79d26ae196`](https://github.com/nodejs/node/commit/79d26ae196)] - **doc**: explain path.format expected properties (John Eversole) [#5801](https://github.com/nodejs/node/pull/5801) +* [[`e43e8e3a31`](https://github.com/nodejs/node/commit/e43e8e3a31)] - **doc**: add a cli options doc page (Jeremiah Senkpiel) [#5787](https://github.com/nodejs/node/pull/5787) +* [[`c0a24e4a1d`](https://github.com/nodejs/node/commit/c0a24e4a1d)] - **doc**: fix multiline return comments in querystring (Claudio Rodriguez) [#5705](https://github.com/nodejs/node/pull/5705) +* [[`bf1fe4693c`](https://github.com/nodejs/node/commit/bf1fe4693c)] - **doc**: Add windows example for Path.format (Mithun Patel) [#5700](https://github.com/nodejs/node/pull/5700) +* [[`3b8fc4fddc`](https://github.com/nodejs/node/commit/3b8fc4fddc)] - **doc**: update crypto docs to use good defaults (Bill Automata) [#5505](https://github.com/nodejs/node/pull/5505) +* [[`a6ec8a6cb7`](https://github.com/nodejs/node/commit/a6ec8a6cb7)] - **doc**: fix crypto update() signatures (Brian White) [#5500](https://github.com/nodejs/node/pull/5500) +* [[`eb0ed46665`](https://github.com/nodejs/node/commit/eb0ed46665)] - **doc**: reformat & improve node.1 manual page (Jeremiah Senkpiel) [#5497](https://github.com/nodejs/node/pull/5497) +* [[`b70ca4a4b4`](https://github.com/nodejs/node/commit/b70ca4a4b4)] - **doc**: updated fs #5862 removed irrelevant data in fs.markdown (topal) [#5877](https://github.com/nodejs/node/pull/5877) +* [[`81876612f7`](https://github.com/nodejs/node/commit/81876612f7)] - **https**: fix ssl socket leak when keepalive is used (Alexander Penev) [#5713](https://github.com/nodejs/node/pull/5713) +* [[`6daebdbd9b`](https://github.com/nodejs/node/commit/6daebdbd9b)] - **lib**: simplify code with String.prototype.repeat() (Jackson Tian) [#5359](https://github.com/nodejs/node/pull/5359) +* [[`108fc90dd7`](https://github.com/nodejs/node/commit/108fc90dd7)] - **lib**: reduce usage of `self = this` (Jackson Tian) [#5231](https://github.com/nodejs/node/pull/5231) +* [[`3c8e59c396`](https://github.com/nodejs/node/commit/3c8e59c396)] - **lib**: copy arguments object instead of leaking it (Nathan Woltman) [#4361](https://github.com/nodejs/node/pull/4361) +* [[`8648420586`](https://github.com/nodejs/node/commit/8648420586)] - **net**: make `isIPv4` and `isIPv6` more efficient (Vladimir Kurchatkin) [#5478](https://github.com/nodejs/node/pull/5478) +* [[`07b7172d76`](https://github.com/nodejs/node/commit/07b7172d76)] - **net**: remove unused `var self = this` from old code (Benjamin Gruenbaum) [#5224](https://github.com/nodejs/node/pull/5224) +* [[`acbce4b72b`](https://github.com/nodejs/node/commit/acbce4b72b)] - **repl**: fix stack trace column number in strict mode (Prince J Wesley) [#5416](https://github.com/nodejs/node/pull/5416) +* [[`0a1eb168e0`](https://github.com/nodejs/node/commit/0a1eb168e0)] - **test**: fix `test-cluster-worker-kill` (Santiago Gimeno) [#5814](https://github.com/nodejs/node/pull/5814) +* [[`86b876fe7b`](https://github.com/nodejs/node/commit/86b876fe7b)] - **test**: smaller chunk size for smaller person.jpg (Jérémy Lal) [#5813](https://github.com/nodejs/node/pull/5813) +* [[`1135ee97e7`](https://github.com/nodejs/node/commit/1135ee97e7)] - **test**: strip non-free icc profile from person.jpg (Jérémy Lal) [#5813](https://github.com/nodejs/node/pull/5813) +* [[`0836d7e2fb`](https://github.com/nodejs/node/commit/0836d7e2fb)] - **test**: fix flaky test-cluster-shared-leak (Claudio Rodriguez) [#5802](https://github.com/nodejs/node/pull/5802) +* [[`e57355c2f4`](https://github.com/nodejs/node/commit/e57355c2f4)] - **test**: make test-net-connect-options-ipv6.js better (Michael Dawson) [#5791](https://github.com/nodejs/node/pull/5791) +* [[`1b266fc15c`](https://github.com/nodejs/node/commit/1b266fc15c)] - **test**: remove the use of curl in the test suite (Santiago Gimeno) [#5750](https://github.com/nodejs/node/pull/5750) +* [[`7e45d4f076`](https://github.com/nodejs/node/commit/7e45d4f076)] - **test**: minimize test-http-get-pipeline-problem (Rich Trott) [#5728](https://github.com/nodejs/node/pull/5728) +* [[`78effc3484`](https://github.com/nodejs/node/commit/78effc3484)] - **test**: add batch of known issue tests (cjihrig) [#5653](https://github.com/nodejs/node/pull/5653) +* [[`d506eea4b7`](https://github.com/nodejs/node/commit/d506eea4b7)] - **test**: improve test-npm-install (Santiago Gimeno) [#5613](https://github.com/nodejs/node/pull/5613) +* [[`7520100e8b`](https://github.com/nodejs/node/commit/7520100e8b)] - **test**: add test-npm-install to parallel tests suite (Myles Borins) [#5166](https://github.com/nodejs/node/pull/5166) +* [[`b258dddb8c`](https://github.com/nodejs/node/commit/b258dddb8c)] - **test**: repl tab completion test (Santiago Gimeno) [#5534](https://github.com/nodejs/node/pull/5534) +* [[`f209effe8b`](https://github.com/nodejs/node/commit/f209effe8b)] - **test**: remove timer from test-http-1.0 (Santiago Gimeno) [#5129](https://github.com/nodejs/node/pull/5129) +* [[`3a901b0e3e`](https://github.com/nodejs/node/commit/3a901b0e3e)] - **tools**: remove unused imports (Sakthipriyan Vairamani) [#5765](https://github.com/nodejs/node/pull/5765) + ## 2016-03-22, Version 4.4.1 'Argon' (LTS), @thealphanerd This LTS release comes with 113 commits, 56 of which are doc related, diff --git a/src/node_version.h b/src/node_version.h index abc53e8879b225..6510c7815b48f9 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -8,7 +8,7 @@ #define NODE_VERSION_IS_LTS 1 #define NODE_VERSION_LTS_CODENAME "Argon" -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)