Skip to content

Commit

Permalink
Init
Browse files Browse the repository at this point in the history
  • Loading branch information
Brooooooklyn committed Dec 3, 2023
1 parent df55c8c commit 059923b
Show file tree
Hide file tree
Showing 39 changed files with 374 additions and 292 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: CI
env:
DEBUG: napi:*
APP_NAME: package-template
APP_NAME: tar
MACOSX_DEPLOYMENT_TARGET: '10.13'
permissions:
contents: write
Expand Down Expand Up @@ -178,7 +178,7 @@ jobs:
version: '13.2'
memory: 13G
cpu_count: 3
environment_variables: 'DEBUG RUSTUP_IO_THREADS'
environment_variables: DEBUG RUSTUP_IO_THREADS
shell: bash
run: |
sudo pkg install -y -f curl node libnghttp2 npm
Expand Down
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
authors = ["LongYinan <[email protected]>"]
edition = "2021"
name = "napi-package-template"
name = "napi-tar"
version = "0.1.0"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand All @@ -12,6 +12,7 @@ crate-type = ["cdylib"]
[dependencies]
napi = "2"
napi-derive = "2"
tar = "0.4"

[build-dependencies]
napi-build = "2"
Expand Down
138 changes: 38 additions & 100 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,105 +1,43 @@
# `@napi-rs/package-template`

![https://github.com/napi-rs/package-template/actions](https://github.com/napi-rs/package-template/workflows/CI/badge.svg)

> Template project for writing node packages with napi-rs.
# Usage

1. Click **Use this template**.
2. **Clone** your project.
3. Run `yarn install` to install dependencies.
4. Run `npx napi rename -n [name]` command under the project folder to rename your package.

## Install this test package

```
yarn add @napi-rs/package-template
# `@napi-rs/tar`

![https://github.com/napi-rs/tar/actions](https://github.com/napi-rs/tar/workflows/CI/badge.svg)
[![install size](https://packagephobia.com/badge?p=@napi-rs/tar)](https://packagephobia.com/result?p=@napi-rs/tar)
[![Downloads](https://img.shields.io/npm/dm/@napi-rs/tar.svg?sanitize=true)](https://npmcharts.com/compare/@napi-rs/tar?minimal=true)

> Node.js tar binding https://docs.rs/tar/latest/tar/
## Usage

```ts
export class Entries {
[Symbol.iterator](): Iterator<Entry, void, void>
}
export class Entry {
path(): string | null
}
export class Archive {
/** Create a new archive with the underlying path. */
constructor(path: string)
entries(): Entries
/**
* Unpacks the contents tarball into the specified `dst`.
*
* This function will iterate over the entire contents of this tarball,
* extracting each file in turn to the location specified by the entry's
* path name.
*
* This operation is relatively sensitive in that it will not write files
* outside of the path specified by `dst`. Files in the archive which have
* a '..' in their path are skipped during the unpacking process.
*/
unpack(to: string): void
}
```

## Support matrix

### Operating Systems

| | node14 | node16 | node18 |
| ---------------- | ------ | ------ | ------ |
| Windows x64 ||||
| Windows x32 ||||
| Windows arm64 ||||
| macOS x64 ||||
| macOS arm64 ||||
| Linux x64 gnu ||||
| Linux x64 musl ||||
| Linux arm gnu ||||
| Linux arm64 gnu ||||
| Linux arm64 musl ||||
| Android arm64 ||||
| Android armv7 ||||
| FreeBSD x64 ||||

## Ability

### Build

After `yarn build/npm run build` command, you can see `package-template.[darwin|win32|linux].node` file in project root. This is the native addon built from [lib.rs](./src/lib.rs).

### Test

With [ava](https://github.com/avajs/ava), run `yarn test/npm run test` to testing native addon. You can also switch to another testing framework if you want.

### CI

With GitHub Actions, each commit and pull request will be built and tested automatically in [`node@14`, `node@16`, `@node18`] x [`macOS`, `Linux`, `Windows`] matrix. You will never be afraid of the native addon broken in these platforms.

### Release

Release native package is very difficult in old days. Native packages may ask developers who use it to install `build toolchain` like `gcc/llvm`, `node-gyp` or something more.

With `GitHub actions`, we can easily prebuild a `binary` for major platforms. And with `N-API`, we should never be afraid of **ABI Compatible**.

The other problem is how to deliver prebuild `binary` to users. Downloading it in `postinstall` script is a common way that most packages do it right now. The problem with this solution is it introduced many other packages to download binary that has not been used by `runtime codes`. The other problem is some users may not easily download the binary from `GitHub/CDN` if they are behind a private network (But in most cases, they have a private NPM mirror).

In this package, we choose a better way to solve this problem. We release different `npm packages` for different platforms. And add it to `optionalDependencies` before releasing the `Major` package to npm.

`NPM` will choose which native package should download from `registry` automatically. You can see [npm](./npm) dir for details. And you can also run `yarn add @napi-rs/package-template` to see how it works.

## Develop requirements

- Install the latest `Rust`
- Install `Node.js@10+` which fully supported `Node-API`
- Install `[email protected]`

## Test in local

- yarn
- yarn build
- yarn test

And you will see:

```bash
$ ava --verbose

✔ sync function from native code
✔ sleep function from native code (201ms)

2 tests passed
✨ Done in 1.12s.
```

## Release package

Ensure you have set your **NPM_TOKEN** in the `GitHub` project setting.

In `Settings -> Secrets`, add **NPM_TOKEN** into it.

When you want to release the package:
## Install this test package

```
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]
git push
yarn add @napi-rs/tar
pnpm install @napi-rs/tar
npm install @napi-rs/tar
```

GitHub actions will do the rest job for you.
1 change: 1 addition & 0 deletions __test__/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
src
18 changes: 14 additions & 4 deletions __test__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import { join } from 'node:path'

import test from 'ava'

import { plus100 } from '../index'
import { Archive } from '../index'

test('should be able to read archive', (t) => {
const archive = new Archive(join(__dirname, 'src.tar'))
for (const entry of archive.entries()) {
t.is(typeof entry.path(), 'string')
}
})

test('sync function from native code', (t) => {
const fixture = 42
t.is(plus100(fixture), fixture + 100)
test('should be able to unpack archive', (t) => {
const archive = new Archive(join(__dirname, 'src.tar'))
archive.unpack(__dirname)
t.pass()
})
Binary file added __test__/src.tar
Binary file not shown.
24 changes: 23 additions & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,26 @@

/* auto-generated by NAPI-RS */

export function plus100(input: number): number
export class Entries {
[Symbol.iterator](): Iterator<Entry, void, void>
}
export class Entry {
path(): string | null
}
export class Archive {
/** Create a new archive with the underlying path. */
constructor(path: string)
entries(): Entries
/**
* Unpacks the contents tarball into the specified `dst`.
*
* This function will iterate over the entire contents of this tarball,
* extracting each file in turn to the location specified by the entry's
* path name.
*
* This operation is relatively sensitive in that it will not write files
* outside of the path specified by `dst`. Files in the archive which have
* a '..' in their path are skipped during the unpacking process.
*/
unpack(to: string): void
}
Loading

0 comments on commit 059923b

Please sign in to comment.