Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

bestzip

testsnpm versionnpm downloads

This module provides a bestzip command that calls the native zip command if available and otherwise falls back to a Node.js implementation.

The --recurse-directories (-r) option is automatically enabled.

Why?

The native zip command on GNU/Linux and macOS is significantly faster and creates moderately smaller .zip files than the Node.js version included here, but Windows has no built-in zip command. This module provides the best of both worlds, and allows for easier cross-platform scripting.

Global command line usage

npm install -g bestzip
bestzip destination.zip source/ [other sources...]

Command line usage within package.json scripts

npm install --save-dev bestzip

package.json:

{//..."scripts": {"build" "...", "zip": "bestzip bundle.zip build/*","upload": "....","deploy": "npm run build && npm run zip && npm run upload"}}

Programmatic usage from within Node.js

importzipfrom'bestzip';// use version 2.x for require()// zip a single sourceawaitzip({source: 'build/*',destination: './destination.zip'})// zip multiple sources, starting in a different CWD (current working directory)awaitzip({source: ['img1.jpg','img2.jpg','imgn.jpg'],destination: '../images.zip',cwd: './images/'// optional, defaults to process.cwd()})// Promises also work: zip({source, destination}).then(...).catch(...)// Callbacks also work: zip(destination, sources, callback)

Options

  • source: Path or paths to files and folders to include in the zip file. String or Array of Strings.
  • destination: Path to generated .zip file.
  • cwd: Set the Current Working Directory that source and destination paths are relative to. Defaults to process.cwd()

How to control the directory structure

The directory structure in the .zip is going to match your input files, but the exact details depend on how the command is called. For example:

bestzip build.zip build/*

This includes the build/ folder inside of the .zip

Alternatively:

cd build/ && bestzip ../build.zip *

This will not include the build/ folder, it's contents will be top-level.

Note: some tools, including the Archive Utility built into macOS, will automatically create a top-level folder to group everything together when extracting a .zip archive that contains multiple top-level files.

When using the programmatic API, the same effect may be achieved by passing in the cwd option.

.dotfiles

Wildcards (*) ignore dotfiles.

  • To include a dotfile, either include the directory it's in (folder/) or include it by name (folder/.dotfile)
  • To omit dotfiles, either use a wildcard (folder/*) or explicitly list the desired files (folder/file1.txt folder/file2.txt)

Breaking changes for v2

  • bestzip output.zip foo/bar/file.txt now includes the foo/bar/ folders, previously it would place file.txt at the top-level
    • This was done to more closely align with the native zip command

Breaking changes for v3

  • Switched from CJS to ESM

About

Provides a `bestzip` command that uses the system `zip` if avaliable, and a Node.js implimentation otherwise.

Topics

Resources

Stars

90 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages