diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 97a9330..018fad6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,3 +32,13 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} HOMEBREW_TAP_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }} + + - uses: actions/setup-node@v3 + with: + node-version: '16.x' + registry-url: 'https://registry.npmjs.org' + + - name: Publish to npm + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 28967ec..f6af71b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,148 @@ go.work safebox dist/ completions/ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node + diff --git a/README.md b/README.md index f86205c..3a660fd 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ $ brew install adikari/taps/safebox # Via curl $ curl -sSL https://raw.githubusercontent.com/adikari/safebox/main/scripts/install.sh | sh + +# Via npm +$ npm install @adikari/safebox + +# Via yarn +$ yarn add @adikari/safebox ``` To install it directly find the right version for your machine in [releases](https://github.com/adikari/safebox/releases) page. Download and un-archive the files. Copy the `safebox` binary to the PATH or use it directly. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ebe7259 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "@adikari/safebox", + "version": "1.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@adikari/safebox", + "version": "1.1.0", + "hasInstallScript": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9053a1f --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "@adikari/safebox", + "version": "1.1.0", + "description": "A Fast and Flexible secret manager built with love by adikari in Go", + "main": "index.js", + "scripts": { + "postinstall": "node postinstall.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/adikari/safebox.git" + }, + "author": "Subash Adhikari ", + "license": "MIT", + "goBinary": { + "name": "safebox", + "path": "./bin" + }, + "homepage": "https://github.com/adikari/safebox", + "files": [ + "dist", + "scripts/postinstall.js" + ] +} diff --git a/postinstall.js b/postinstall.js new file mode 100644 index 0000000..49bea50 --- /dev/null +++ b/postinstall.js @@ -0,0 +1,49 @@ +const fs = require("fs"); +const { join } = require("path"); +const packageJson = require("./package.json"); + +// Mapping from Node's `process.arch` to Golang's `$GOARCH` +var ARCH_MAPPING = { + "ia32": "386", + "x64": "amd64", + "arm": "arm", + "arm64": "arm64" +}; + +// Mapping between Node's `process.platform` to Golang's +var PLATFORM_MAPPING = { + "darwin": "darwin", + "linux": "linux", + "win32": "windows", + "freebsd": "freebsd" +}; + +const error = (msg) => { + console.error(msg); + process.exit(1); +}; + +const name = packageJson.goBinary.name; +const binName = packageJson.goBinary.name; + +if (!(process.arch in ARCH_MAPPING) || !(process.platform in PLATFORM_MAPPING)) { + error(`Platform with type "${process.platform}" and architecture "${process.arch}" is not supported by ${name}.`); +} + +if (process.platform === "win32") { + binName += ".exe"; +} + +const binaryPath = `./dist/${name}_${process.platform}_${ARCH_MAPPING[process.arch]}/${binName}`; + +const installDirectory = join(__dirname, "node_modules", ".bin"); + +if (!fs.existsSync(installDirectory)) { + fs.mkdirSync(installDirectory, { recursive: true }); +} + +const installPath = join(installDirectory, name); + +fs.copyFile(binaryPath, installPath, (err) => { + if (err) error(err.message); +});