Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

giget

unjs14.4mMIT2.0.0TypeScript support: included

Download templates and git repositories with pleasure!

readme

giget

npm version npm downloads Codecov

Download templates and git repositories with pleasure!

Features

✨ Support popular git providers (GitHub, GitLab, Bitbucket, Sourcehut) out of the box.

✨ Built-in and custom template registry.

✨ Fast cloning using tarball gzip without depending on local git and tar.

✨ Works online and offline with disk cache support.

✨ Custom template provider support with programmatic usage.

✨ Support extracting with a sub dir.

✨ Authorization support to download private templates

✨ Optionally install dependencies after clone using unjs/nypm

✨ HTTP proxy support and native fetch via unjs/node-fetch-native

Usage (CLI)

npx giget@latest <template> [<dir>] [...options]

Arguments

  • template: Template name or a URI describing provider, repository, sub dir, and branch/ref. (See Examples)
  • dir: A relative or absolute path where to extract the template.

Options

  • --force: Clone to existing directory even if exists.
  • --offline: Do not attempt to download and use the cached version.
  • --prefer-offline: Use cache if exists otherwise try to download.
  • --force-clean: ⚠️ Remove any existing directory or file recursively before cloning.
  • --shell: ⚠️ Open a new shell with the current working directory in cloned dir. (Experimental).
  • --registry: URL to a custom registry. (Can be overridden with GIGET_REGISTRY environment variable).
  • --no-registry: Disable registry lookup and functionality.
  • --verbose: Show verbose debugging info.
  • --cwd: Set the current working directory to resolve dirs relative to it.
  • --auth: Custom Authorization token to use for downloading template. (Can be overridden with GIGET_AUTH environment variable).
  • --install: Install dependencies after cloning using unjs/nypm.

Examples

# Clone nuxt starter from giget template registry
npx giget@latest nuxt

# Clone the main branch of github.com/unjs/template to unjs-template directory
npx giget@latest gh:unjs/template

# Clone to myProject directory
npx giget@latest gh:unjs/template myProject

# Clone dev branch
npx giget@latest gh:unjs/template#dev

# Clone /test directory from main branch
npx giget@latest gh:unjs/template/test

# Clone from gitlab
npx giget@latest gitlab:unjs/template

# Clone from bitbucket
npx giget@latest bitbucket:unjs/template

# Clone from sourcehut
npx giget@latest sourcehut:pi0/unjs-template

# Clone from https URL (tarball)
npx giget@latest https://api.github.com/repos/unjs/template/tarball/main

# Clone from https URL (JSON)
npx giget@latest https://raw.githubusercontent.com/unjs/giget/main/templates/unjs.json

Template Registry

Giget has a built-in HTTP registry system for resolving templates. This way you can support template name shortcuts and meta-data. The default registry is served from unjs/giget/templates.

If you want to add your template to the built-in registry, just drop a PR to add it to the ./templates directory. Slugs are added on a first-come first-served basis but this might change in the future.

Custom Registry

A custom registry should provide an endpoint with the dynamic path /:template.json that returns a JSON response with keys the same as custom providers.

  • name: (required) Name of the template.
  • tar (required) Link to the tar download link.
  • defaultDir: (optional) Default cloning directory.
  • url: (optional) Webpage of the template.
  • subdir: (optional) Directory inside the tar file.
  • headers: (optional) Custom headers to send while downloading template.

Because of the simplicity, you can even use a GitHub repository as a template registry but also you can build something more powerful by bringing your own API.

Usage (Programmatic)

Install package:

# npm
npm install giget

# yarn
yarn install giget

# pnpm
pnpm install giget

Import:

// ESM
import { downloadTemplate } from "giget";

// CommonJS
const { downloadTemplate } = require("giget");

downloadTemplate(source, options?)

Example:

const { source, dir } = await downloadTemplate("github:unjs/template");

Options:

  • source: (string) Input source in format of [provider]:repo[/subpath][#ref].
  • options: (object) Options are usually inferred from the input string. You can customize them.
    • dir: (string) Destination directory to clone to. If not provided, user-name will be used relative to the current directory.
    • provider: (string) Either github, gitlab, bitbucket or sourcehut. The default is github.
    • force: (boolean) Extract to the existing dir even if already exists.
    • forceClean: (boolean) ⚠️ Clean up any existing directory or file before cloning.
    • offline: (boolean) Do not attempt to download and use the cached version.
    • preferOffline: (boolean) Use cache if exists otherwise try to download.
    • providers: (object) A map from provider name to custom providers. Can be used to override built-ins too.
    • registry: (string or false) Set to false to disable registry. Set to a URL string (without trailing slash) for custom registry. (Can be overridden with GIGET_REGISTRY environment variable).
    • cwd: (string) Current working directory to resolve dirs relative to it.
    • auth: (string) Custom Authorization token to use for downloading template. (Can be overridden with GIGET_AUTH environment variable).

Return value:

The return value is a promise that resolves to the resolved template.

  • dir: (string) Path to extracted dir.
  • source: (string) Normalized version of the input source without provider.
  • [other provider template keys]
    • url: (string) URL of the repository that can be opened in the browser. Useful for logging.

Custom Providers

Using the programmatic method, you can make your custom template providers.

import type { TemplateProvider } from "giget";

const rainbow: TemplateProvider = async (input, { auth }) => {
  return {
    name: "rainbow",
    version: input,
    headers: { authorization: auth },
    url: `https://rainbow.template/?variant=${input}`,
    tar: `https://rainbow.template/dl/rainbow.${input}.tar.gz`,
  };
};

const { source, dir } = await downloadTemplate("rainbow:one", {
  providers: { rainbow },
});

Custom Registry Providers

You can define additional custom registry providers using registryProvider utility and register to providers.

import { registryProvider } from "giget";

const themes = registryProvider(
  "https://raw.githubusercontent.com/unjs/giget/main/templates",
);

const { source, dir } = await downloadTemplate("themes:test", {
  providers: { themes },
});

Providing token for private repositories

For private repositories and sources, you might need a token. In order to provide it, using CLI, you can use --auth, using programmatic API using auth option and in both modes also it is possible to use GIGET_AUTH environment variable to set it. The value will be set in Authorization: Bearer ... header by default.

Note: For github private repository access with Fine-grained access tokens, you need to give Contents and Metadata repository permissions.

GitHub Actions

If your project depends on a private GitHub repository, you need to add the access token as a secret. Please see GitHub Actions docs on creating secrets for a repository. In your workflow, refer to the token as shown in the example below:

- name: Install packages
  run: npm ci
  env:
    GIGET_AUTH: ${{ secrets.GIGET_AUTH }}

Giget wouldn't be possible without inspiration from former projects. In comparison, giget does not depend on any local command which increases stability and performance and supports custom template providers, auth, and many more features out of the box.

💻 Development

  • Clone this repository
  • Enable Corepack using corepack enable (use npm i -g corepack for Node.js < 16.10)
  • Install dependencies using pnpm install
  • Run interactive tests using pnpm dev

License

Made with 💛

Published under MIT License.

changelog

Changelog

All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

v2.0.0

compare changes

🩹 Fixes

  • ⚠️ Use correct temp dir in windows for cache (#182)
  • Patch tar for bun on windows (#217)

📦 Build

  • ⚠️ Esm-only dist (d708f2b)
  • Bundle tar (#214)
  • Minify bundled tar dependencies (946ea3f)

🏡 Chore

⚠️ Breaking Changes

  • ⚠️ Use correct temp dir in windows for cache (#182)
  • ⚠️ Esm-only dist (d708f2b)

❤️ Contributors

v1.2.5

compare changes

🏡 Chore

  • Remove unused ohash dependency (be5888c)
  • Update dependencies (4eab58e)

❤️ Contributors

  • Pooya Parsa (@pi0)

v1.2.4

compare changes

💅 Refactors

  • Upgrade to tar v7 (3d5d7cf)
  • Revert tar upgrade back to v6 (#208)

📖 Documentation

  • Correct function name (#156)
  • Add github actions example for private repo (#197)

🏡 Chore

❤️ Contributors

v1.2.3

compare changes

🏡 Chore

❤️ Contributors

  • Pooya Parsa (@pi0)

v1.2.2

compare changes

🩹 Fixes

  • cli: Add missing shebang (#135)

📖 Documentation

  • Correct downloadTemplate options (#144)

🏡 Chore

❤️ Contributors

v1.2.1

compare changes

🩹 Fixes

  • cli: Add missing shebang (#135)

🏡 Chore

❤️ Contributors

  • Pooya Parsa (@pi0)

v1.2.0

compare changes

🚀 Enhancements

  • Support cloning from http(s) inputs (#129)
  • Support proxy for node.js with native fetch (#133)
  • Support installing dependencies (#134)

🩹 Fixes

  • http: Remove text/plain check for content type (1945818)
  • gitlab: Workaround hotlinking protection (406 Not Acceptable) (#123)
  • cli: Display the current directory when cloning into current dir (#132)
  • Add url to undici's fetch failed error (6e2455a)
  • Create dst dir only after source successfully downloaded (#119)

💅 Refactors

  • Use citty for cli (#113)
  • Use node-fetch-native/proxy (efa4f7a)
  • Add error cause for sendFetch (174bf8d)

📖 Documentation

  • Add more info about auth (ab28a9f)

📦 Build

🏡 Chore

❤️ Contributors

v1.1.3

compare changes

🩹 Fixes

  • github: Use api.github.com for private repository support (#93)
  • Allow / in git refs (#102)

💅 Refactors

  • Apply strict typescript checks + fixes (9704865)
  • Lazy import https-proxy-agent (8372e55)

🏡 Chore

🎨 Styles

  • Format with prettier v3 (9fdb553)

🤖 CI

❤️ Contributors

v1.1.2

compare changes

🩹 Fixes

  • Provide empty object for headers (#83)

❤️ Contributors

v1.1.1

compare changes

🩹 Fixes

  • Normalize fetch headers (#82)

🏡 Chore

❤️ Contributors

v1.1.0

compare changes

🚀 Enhancements

  • Support GIGET_GITHUB_URL and GIGET_GITLAB_URL env variables (#71)

🩹 Fixes

  • Respect XDG_CACHE_HOME environment variable (#31)
  • Cli name typo in usage (#63)
  • Pass auth to custom registry (#77)

📖 Documentation

  • Dir is part of options not standalone argument (#80)

🏡 Chore

  • Fix typos (#50)
  • Update dependencies (fc51e23)
  • Switch to changelogen for release (accb900)
  • Add .prettierignore (37bb7f8)

🎨 Styles

❤️ Contributors

1.0.0 (2022-11-15)

Features

0.1.7 (2022-09-19)

Bug Fixes

  • use non-promise version of pipeline for node 14 support (#18) (822fe2d)

0.1.6 (2022-09-14)

Features

  • add sourcehut provider (#15) (aa21643)
  • support GIGET_REGISTRTY and GIGET_AUTH environment variables (8cfabff)
  • support authotization (resolves #12) (8853342)
  • support cwd (9e1a34a)

Bug Fixes

  • fix type for downloadTemplate to return template info params (24e34d4)
  • subdir filter for dirs with shared prefix (#14) (c6ab563)

0.1.5 (2022-09-10)

Bug Fixes

  • cli: --registry is string (00447d8)

0.1.4 (2022-09-10)

Features

0.1.3 (2022-09-10)

0.1.2 (2022-09-10)

Features

Bug Fixes

  • handle subdir for git providers (f4d39d2)

0.1.1 (2022-09-10)

Features

  • expose registryProvider (2d84d26)

Bug Fixes

  • allow dash and dot in input strings (c322521)

0.1.0 (2022-09-09)

⚠ BREAKING CHANGES

  • custom template provider support

Features

  • custom template provider support (9678b98)
  • template registry (ce75c25)

Bug Fixes

0.0.4 (2022-09-08)

Features

  • add experimental --shell (resolves #2) (a04fc53)

Bug Fixes

  • output directory is optional (#5) (50035ef)

0.0.3 (2022-09-08)

0.0.2 (2022-09-08)

Features

  • force and force-clean options (8b0c4d6)
  • generate git url to open in browser (7220de2)
  • offline and prefer-offline (623c34c)

Bug Fixes

  • fix normalized source to include path filter leading slash (b28bdcb)

0.0.1 (2022-09-08)

Features

  • implement network fallback (9d92c9a)

Bug Fixes

  • use org-name for default dir (c7cfa93)