Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add pnpm/pnpm #21993

Merged
merged 3 commits into from Apr 20, 2024
Merged

feat: add pnpm/pnpm #21993

merged 3 commits into from Apr 20, 2024

Conversation

tomoyamachi
Copy link
Contributor

Thank you for a great tool!
This is my first contribution, so please point out any mistakes strictly.

pnpm/pnpm: Fast, disk space efficient package manager

$ aqua g -i pnpm/pnpm

How to confirm if this package works well

Reviewers aren't necessarily familiar with this package, so please describe how to confirm if this package works well.
Please confirm if this package works well yourself as much as possible.

Command and output

$ which pnpm
/Users/t/.local/share/aquaproj-aqua/bin/pnpm
$ pnpm -h
INFO[0000] download and unarchive the package            aqua_version=2.27.0 env=darwin/arm64 exe_name=pnpm package_name=pnpm/pnpm package_version=v9.0.2 program=aqua registry=standard
Version 9.0.2 (compiled to binary; bundled Node.js v18.5.0)
Usage: pnpm [command] [flags]
       pnpm [ -h | --help | -v | --version ]

Manage your dependencies:
      add                  Installs a package and any packages that it depends on. By default, any new package is installed as a prod dependency
      import               Generates a pnpm-lock.yaml from an npm package-lock.json (or npm-shrinkwrap.json) file
   i, install              Install all dependencies for a project
  it, install-test         Runs a pnpm install followed immediately by a pnpm test
  ln, link                 Connect the local project to another one
      prune                Removes extraneous packages
  rb, rebuild              Rebuild a package
  rm, remove               Removes packages from node_modules and from the project's package.json
      unlink               Unlinks a package. Like yarn unlink but pnpm re-installs the dependency after removing the external link
  up, update               Updates packages to their latest version based on the specified range
...

If files such as configuration file are needed, please share them.

  • No additional configuration required

Reference

[pnpm/pnpm](https://github.com/pnpm/pnpm): Fast, disk space efficient package manager
@suzuki-shunsuke
Copy link
Member

Thank you for your contribution!

@suzuki-shunsuke suzuki-shunsuke added the enhancement New feature or request label Apr 18, 2024
@suzuki-shunsuke
Copy link
Member

suzuki-shunsuke commented Apr 18, 2024

Please follow the guide.

https://aquaproj.github.io/docs/products/aqua-registry/contributing#how-to-add-a-package

Note that you would have to specify cmdx s' -limit option because the repository https://github.com/pnpm/pnpm has too many GitHub Releases (922).

e.g.

cmdx s -limit 200 pnpm/pnpm

Then cmdx s would work well.

@suzuki-shunsuke suzuki-shunsuke mentioned this pull request Apr 18, 2024
@tomoyamachi
Copy link
Contributor Author

tomoyamachi commented Apr 18, 2024

@suzuki-shunsuke Thank you for your comments.
I didn't realize cmdx s was failing. I manually wrote code using other packages as a reference, instead of using the blank file that was generated :)
The generated code is better than mine..

@suzuki-shunsuke
Copy link
Member

I'm testing if pnpm works, but it seems sometimes pnpm doesn't work well.

  1. Install pnpm by aqua
$ pnpm -v
9.0.2

$ aqua which pnpm
/Users/shunsukesuzuki/.local/share/aquaproj-aqua/pkgs/github_release/github.com/pnpm/pnpm/v9.0.2/pnpm-macos-arm64/pnpm-macos-arm64
  1. Set up a test environment
$ mkdir hello
$ cd hello
$ echo '{
  "name": "pnpm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "typescript": "^5.4.5"
  }
}' > package.json
  1. Try to install typescript by pnpm, then it failed.
$ pnpm add typescript 
 ENOENT  not found: node

This error happened while installing a direct dependency of /Users/shunsukesuzuki/Documents/test/pnpm/hello

pnpm: not found: node
    at getNotFoundError (/snapshot/dist/pnpm.cjs)
    at Function.whichSync [as sync] (/snapshot/dist/pnpm.cjs)
    at getCommandAbsolutePathSync (/snapshot/dist/pnpm.cjs)
    at Object.sync (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at checkPackage (/snapshot/dist/pnpm.cjs)
    at packageIsInstallable (/snapshot/dist/pnpm.cjs)
    at resolveAndFetch (/snapshot/dist/pnpm.cjs)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

The error message is not found: node, but node is installed already.

$ which node
/Users/shunsukesuzuki/.volta/bin/node

$ node -v
v20.11.0
  1. We can execute pnpm via aqua exec -- pnpm.
$ aqua exec -- pnpm add typescript
Packages: +1
+
Progress: resolved 1, reused 1, downloaded 0, added 1, done

dependencies:
+ typescript 5.4.5

Done in 336ms

pnpm add typescript failed, but pnpm add sax succeeds.

$ pnpm add sax
Packages: +1
+
Progress: resolved 2, reused 2, downloaded 0, added 1, done

dependencies:
+ sax 1.3.0

Done in 200ms

$ pnpm add typescript
 ENOENT  not found: node

This error happened while installing a direct dependency of /Users/shunsukesuzuki/Documents/test/pnpm/hello

pnpm: not found: node
    at getNotFoundError (/snapshot/dist/pnpm.cjs)
    at Function.whichSync [as sync] (/snapshot/dist/pnpm.cjs)
    at getCommandAbsolutePathSync (/snapshot/dist/pnpm.cjs)
    at Object.sync (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at checkPackage (/snapshot/dist/pnpm.cjs)
    at packageIsInstallable (/snapshot/dist/pnpm.cjs)
    at resolveAndFetch (/snapshot/dist/pnpm.cjs)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Progress: resolved 1, reused 1, downloaded 0, added 0

I'm not sure why pnpm add typescript fails, but Unlike aqua exec -- pnpm, pnpm is executed via symbolic links and aqua-proxy.

https://aquaproj.github.io/docs/reference/lazy-install/#how-does-lazy-install-work

Some tools don't work well due to these symbolic links and aqua-proxy.

Not only typescript, other packages such as express and renovate can't be installed.

$ pnpm add react  
 ENOENT  not found: node

This error happened while installing a direct dependency of /Users/shunsukesuzuki/Documents/test/pnpm/hello

pnpm: not found: node
    at getNotFoundError (/snapshot/dist/pnpm.cjs)
    at Function.whichSync [as sync] (/snapshot/dist/pnpm.cjs)
    at getCommandAbsolutePathSync (/snapshot/dist/pnpm.cjs)
    at Object.sync (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at checkPackage (/snapshot/dist/pnpm.cjs)
    at packageIsInstallable (/snapshot/dist/pnpm.cjs)
    at resolveAndFetch (/snapshot/dist/pnpm.cjs)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Progress: resolved 0, reused 1, downloaded 0, added 0

$ pnpm add express
 ENOENT  not found: node

This error happened while installing a direct dependency of /Users/shunsukesuzuki/Documents/test/pnpm/hello

pnpm: not found: node
    at getNotFoundError (/snapshot/dist/pnpm.cjs)
    at Function.whichSync [as sync] (/snapshot/dist/pnpm.cjs)
    at getCommandAbsolutePathSync (/snapshot/dist/pnpm.cjs)
    at Object.sync (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at getSystemNodeVersionNonCached (/snapshot/dist/pnpm.cjs)
    at checkPackage (/snapshot/dist/pnpm.cjs)
    at packageIsInstallable (/snapshot/dist/pnpm.cjs)
    at resolveAndFetch (/snapshot/dist/pnpm.cjs)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Progress: resolved 0, reused 1, downloaded 0, added 0

@suzuki-shunsuke
Copy link
Member

suzuki-shunsuke commented Apr 19, 2024

https://github.com/pnpm/pnpm/blob/65df252783f430bc5f1a2505d22e9107a4e4023f/config/package-is-installable/src/getSystemNodeVersion.ts#L1-L12

import mem from 'mem'
import * as execa from 'execa'

export function getSystemNodeVersionNonCached (): string {
  // @ts-expect-error
  if (process['pkg'] != null) {
    return execa.sync('node', ['--version']).stdout.toString()
  }
  return process.version
}

export const getSystemNodeVersion = mem(getSystemNodeVersionNonCached)

https://www.npmjs.com/package/execa

https://www.npmjs.com/package/safe-execa

https://github.com/zkochan/packages/blob/85cd4907e48ca7fb19c76309b9871d1ff5ed2679/safe-execa/src/index.ts#L9-L42

export function sync (
  file: string,
  args?: readonly string[],
  options?: execa.SyncOptions
): execa.ExecaSyncReturnValue {
  try {
    which.sync(file, { path: options?.cwd ?? process.cwd() })
  } catch (err: any) {
    // If the command is not found in the current directory, there is no need to resolve the command to full location
    // as there is no danger of binary planting attack on Windows
    if (err.code === 'ENOENT') {
      return execa.sync(file, args, options)
    }
  }
  const fileAbsolutePath = getCommandAbsolutePathSync(file, options)
  return execa.sync(fileAbsolutePath, args, options)
}

function getCommandAbsolutePathSync (file: string, options?: {
        readonly env?: NodeJS.ProcessEnv;
}) {
  if (file.includes('\\') || file.includes('/')) return file
  const path = options?.env?.[PATH] ?? process.env[PATH]
  const key = JSON.stringify([path, file])
  let fileAbsolutePath = pathCache.get(key)
  if (fileAbsolutePath == null) {
    fileAbsolutePath = which.sync(file, { path })
    pathCache.set(key, fileAbsolutePath)
  }
  if (fileAbsolutePath == null) {
    throw new Error(`Couldn't find ${file}`)
  }
  return fileAbsolutePath
}

https://www.npmjs.com/package/@zkochan/which

https://github.com/npm/node-which/blob/25c5191ec4e29d8f83028fae5f52c0182d006d96/lib/index.js#L80-L111

const whichSync = (cmd, opt = {}) => {
  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
  const found = []


  for (const pathEnvPart of pathEnv) {
    const p = getPathPart(pathEnvPart, cmd)


    for (const ext of pathExt) {
      const withExt = p + ext
      const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true })
      if (is) {
        if (!opt.all) {
          return withExt
        }
        found.push(withExt)
      }
    }
  }


  if (opt.all && found.length) {
    return found
  }


  if (opt.nothrow) {
    return null
  }


  throw getNotFoundError(cmd)
}

module.exports = which
which.sync = whichSync

@tomoyamachi
Copy link
Contributor Author

tomoyamachi commented Apr 19, 2024

@suzuki-shunsuke
I created a simple project and re-tested it, and pnpm command was successful in my environment.
https://github.com/tomoyamachi/aqua-pnpm-local-test

~/src/github.com/tomoyamachi/aqua-pnpm-local-test$ aqua policy allow "/Users/t/src/github.com/tomoyamachi/aqua-pnpm-local-test/aqua-policy.yaml"
~/src/github.com/tomoyamachi/aqua-pnpm-local-test$ pnpm info pnpm
INFO[0000] download and unarchive the package            aqua_version=2.27.0 env=darwin/arm64 exe_name=pnpm package_name=pnpm/pnpm package_version=v9.0.2 program=aqua registry=standard

pnpm@9.0.4 | MIT | deps: none | versions: 1045
Fast, disk space efficient package manager
https://pnpm.io

keywords: pnpm9, dependency manager, install, installer, uninstall, remove, link, prune, shrinkwrap, lockfile, fast, rapid, efficient, package.json, packages, dependencies, symlinks, hardlinks, modules, npm, package manager, monorepo, multi-package, workspace:*

bin: pnpm, pnpx

dist
.tarball: https://registry.npmjs.org/pnpm/-/pnpm-9.0.4.tgz
.shasum: b198ac6d38244fd829253720f9daafd6a606834d
.integrity: sha512-w3S1LePeiMWP2DM99mSnNyec2w4TRLpAVNOx//qaGjZwhU91XcpPFq3qPxS+mJan/K8WdAn+DBrWBHUnHa/oGg==
.unpackedSize: 16.8 MB

maintainers:
- zkochan <z@kochan.io>
- pnpmuser <publish-bot@pnpm.io>

dist-tags:
dev: 6.23.7-202112041634  latest-3: 3.8.1           latest-6: 6.35.1          latest-9: 9.0.4           next-7: 7.33.7            pr4475: 0.0.0-pr4475.1
latest-1: 1.43.1          latest-4: 4.14.4          latest-7: 7.33.5          latest: 9.0.4             next-8: 8.15.7
latest-2: 2.25.7          latest-5: 5.18.10         latest-8: 8.15.7          next-6: 6.35.1            next-9: 9.0.4

~/src/github.com/tomoyamachi/aqua-pnpm-local-test$ echo '{
  "name": "pnpm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "typescript": "^5.4.5"
  }
}' > package.json
~/src/github.com/tomoyamachi/aqua-pnpm-local-test$ pnpm add react

   ╭─────────────────────────────────────────────────────────────────╮
   │                                                                 │
   │                Update available! 9.0.2 → 9.0.4.                 │
   │   Changelog: https://github.com/pnpm/pnpm/releases/tag/v9.0.4   │
   │         Run a script from: https://pnpm.io/installation         │
   │                                                                 │
   │     Follow @pnpmjs for updates: https://twitter.com/pnpmjs      │
   │                                                                 │
   ╰─────────────────────────────────────────────────────────────────╯

Packages: +4
++++
Progress: resolved 4, reused 4, downloaded 0, added 4, done

dependencies:
+ react 18.2.0
+ typescript 5.4.5

Done in 692ms

My environments

  • macOS 14.4.1(23E224)
  • Apple M1
$ which node
/opt/homebrew/bin/node
$ node -v
v20.8.0

$ which pnpm
/Users/t/.local/share/aquaproj-aqua/bin/pnpm
$ pnpm -v
9.0.2

Next step

I will create a sample docker container to test behaviors when node is not installed.
I forgot that pnpm has a dependency on node.

@suzuki-shunsuke
Copy link
Member

suzuki-shunsuke commented Apr 19, 2024

My environment: M3 Pro

I installed node with volta.
I tried to install node with Homebrew, then the issue was solved.

$ brew install node@20
$ export PATH="/opt/homebrew/opt/node@20/bin:$PATH"
$ which node
/opt/homebrew/opt/node@20/bin/node

$ ls -lh /opt/homebrew/opt/node@20/bin/node
-r-xr-xr-x 1 shunsukesuzuki admin 47M  4 19 11:46 /opt/homebrew/opt/node@20/bin/node

/opt/homebrew/opt/node@20/bin/node isn't a symbolic link.

Then pnpm add typescript succeeded.

$ pnpm add typescript
Packages: +1
+
Progress: resolved 1, reused 1, downloaded 0, added 1, done

dependencies:
+ typescript 5.4.5

Done in 440ms

So it seems aqua-proxy and Node.js version manager are related to this issue.

I created a simple project and re-tested it, and pnpm command was successful in my environment.

How do you install Node.js?

@tomoyamachi
Copy link
Contributor Author

tomoyamachi commented Apr 19, 2024

@suzuki-shunsuke
I'm not considering it at the moment, but I plan to create a Debian-based image. like this: https://aquaproj.github.io/docs/tutorial#docker

After that, I plan to install it according to the instructions on the official page.
https://nodejs.org/en/learn/getting-started/how-to-install-nodejs

Do you think it would be better to include node in aqua as well?

@suzuki-shunsuke
Copy link
Member

Do you think it would be better to include node in aqua as well?

What do you mean?

I created a simple project and re-tested it, and pnpm command was successful in my environment.

How do you install Node.js?

I wanted to know how you installed Node.js (So I should have asked How did you install Node.js?).
If you installed Node.js with Homebrew and pnpm worked well, this was consistent with my expectation.
But if you installed Node.js with Node.js version manager such as Volta but pnpm worked well, this was inconsistent with my expectation.

@suzuki-shunsuke
Copy link
Member

suzuki-shunsuke commented Apr 19, 2024

I tried the Docker image node:21.7.3-bookworm, then pnpm worked well.

docker run --rm -ti node:21.7.3-bookworm bash
apt update
apt install -y curl vim

mkdir ~/workspace
cd ~/workspace
export PATH="${AQUA_ROOT_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/aquaproj-aqua}/bin:$PATH"
curl -sSfL -O https://raw.githubusercontent.com/aquaproj/aqua-installer/v3.0.0/aqua-installer
echo "8299de6c19a8ff6b2cc6ac69669cf9e12a96cece385658310aea4f4646a5496d  aqua-installer" | sha256sum -c

chmod +x aqua-installer
./aqua-installer
git init
echo 'packages:
  - type: github_release
    repo_owner: pnpm
    repo_name: pnpm
    description: Fast, disk space efficient package manager
    version_constraint: "false"
    version_overrides:
      - version_constraint: "true"
        asset: pnpm-{{.OS}}-{{.Arch}}
        format: raw
        windows_arm_emulation: true
        replacements:
          amd64: x64
          darwin: macos
          windows: win' > registry.yaml
echo '---
# aqua Policy
# https://aquaproj.github.io/
registries:
# Example
  - name: local
    type: local
    path: registry.yaml
# - name: aqua-registry
#   type: github_content
#   repo_owner: aquaproj
#   repo_name: aqua-registry
#   ref: semver(">= 3.0.0") # ref is optional
#   path: registry.yaml
  - type: standard
    ref: semver(">= 3.0.0")
packages:
# Example
  - registry: local # allow all packages in the Registry
# - name: cli/cli # allow only a specific package. The default value of registry is "standard"
# - name: cli/cli
#   version: semver(">= 2.0.0") # version is optional
  - registry: standard' > aqua-policy.yaml

echo '---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   enabled: true
#   require_checksum: true
#   supported_envs:
#   - all
registries:
- type: standard
  ref: v4.163.0 # renovate: depName=aquaproj/aqua-registry
- type: local
  name: local
  path: registry.yaml
packages:
- name: pnpm/pnpm@v9.0.4
  registry: local' > aqua.yaml

aqua policy allow
aqua i
$ pnpm add typescript
Packages: +1
+
Progress: resolved 1, reused 0, downloaded 1, added 1, done

dependencies:
+ typescript 5.4.5

Downloading typescript@5.4.5: 5.83 MB/5.83 MB, done
Done in 630ms

We should try Node Version manager such as Volta and nvm too.

@suzuki-shunsuke
Copy link
Member

If I installed Node.js with nvm on a container, then pnpm worked well.

docker run --rm -ti debian:bookworm-20231009 bash
apt update
apt install -y curl vim

mkdir ~/workspace
cd ~/workspace
export PATH="${AQUA_ROOT_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/aquaproj-aqua}/bin:$PATH"
curl -sSfL -O https://raw.githubusercontent.com/aquaproj/aqua-installer/v3.0.0/aqua-installer
echo "8299de6c19a8ff6b2cc6ac69669cf9e12a96cece385658310aea4f4646a5496d  aqua-installer" | sha256sum -c

chmod +x aqua-installer
./aqua-installer
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
nvm install 20
export AQUA_POLICY_CONFIG=$PWD/aqua-policy.yaml
echo 'packages:
  - type: github_release
    repo_owner: pnpm
    repo_name: pnpm
    description: Fast, disk space efficient package manager
    version_constraint: "false"
    version_overrides:
      - version_constraint: "true"
        asset: pnpm-{{.OS}}-{{.Arch}}
        format: raw
        windows_arm_emulation: true
        replacements:
          amd64: x64
          darwin: macos
          windows: win' > registry.yaml
echo '---
# aqua Policy
# https://aquaproj.github.io/
registries:
# Example
  - name: local
    type: local
    path: registry.yaml
# - name: aqua-registry
#   type: github_content
#   repo_owner: aquaproj
#   repo_name: aqua-registry
#   ref: semver(">= 3.0.0") # ref is optional
#   path: registry.yaml
  - type: standard
    ref: semver(">= 3.0.0")
packages:
# Example
  - registry: local # allow all packages in the Registry
# - name: cli/cli # allow only a specific package. The default value of registry is "standard"
# - name: cli/cli
#   version: semver(">= 2.0.0") # version is optional
  - registry: standard' > aqua-policy.yaml

echo '---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   enabled: true
#   require_checksum: true
#   supported_envs:
#   - all
registries:
- type: standard
  ref: v4.163.0 # renovate: depName=aquaproj/aqua-registry
- type: local
  name: local
  path: registry.yaml
packages:
- name: pnpm/pnpm@v9.0.4
  registry: local' > aqua.yaml

aqua policy allow
aqua i
pnpm add typescript
Packages: +1
+
Progress: resolved 1, reused 0, downloaded 1, added 1, done

dependencies:
+ typescript 5.4.5

Downloading typescript@5.4.5: 5.83 MB/5.83 MB, done
Done in 708ms

@suzuki-shunsuke
Copy link
Member

I tried Volta on a container, but unfortunately, volta doesn't support linux/arm64.

root@e054e6d42d7c:~/workspace# curl https://get.volta.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10930  100 10930    0     0  13880      0 --:--:-- --:--:-- --:--:-- 13870
Error: Sorry! Volta currently only provides pre-built binaries for x86_64 architectures.

@suzuki-shunsuke
Copy link
Member

If I installed Node.js with nvm on M3 Pro, pnpm worked well.

Unlike volta, nvm changes PATH dynamically instead of using symbolic links.

$ ls -lh /Users/shunsukesuzuki/.config/nvm/versions/node/v20.12.2/bin/node
-rwxr-xr-x 1 shunsukesuzuki staff 90M  4 10 23:28 /Users/shunsukesuzuki/.config/nvm/versions/node/v20.12.2/bin/node

@suzuki-shunsuke
Copy link
Member

If I installed Node.js with fnm on M3 Pro, pnpm worked well.

pnpm worked on most environments except for my environment (M3 Pro + Volta), so I think we can accept pnpm.

@suzuki-shunsuke suzuki-shunsuke added this to the v4.163.1 milestone Apr 20, 2024
@suzuki-shunsuke suzuki-shunsuke merged commit 1841e46 into aquaproj:main Apr 20, 2024
16 checks passed
@suzuki-shunsuke
Copy link
Member

@tomoyamachi
Copy link
Contributor Author

@suzuki-shunsuke
I apologize for the late response. Thank you for your generous support!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants