Skip to content

Commit 7321ef6

Browse files
authored
add npm package for dc api wasm bundle (#1)
* add npm package for dc-api wasm bundle Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * Update npm-package/package.json * Update npm-package/package.json * add npm package for dc-api wasm bundle Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * remove wasm binaries from git Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * move build files to dist folder Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * add ci cd workflow and release docs Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * resolve clippy errors Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * ci: add rustfmt to toolchain components Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * add wasm32 target to toolchain for rust-test job Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * remove dead code Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> * add readme and dual license Signed-off-by: Ryan Tate <ryan.tate@spruceid.com> --------- Signed-off-by: Ryan Tate <ryan.tate@spruceid.com>
1 parent 1fa5e40 commit 7321ef6

37 files changed

+7674
-521
lines changed

.github/workflows/cd.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: npm_cd
2+
3+
on:
4+
push:
5+
tags:
6+
- "npm/v[0-9]+.[0-9]+.[0-9]+"
7+
8+
jobs:
9+
validation:
10+
runs-on: ubuntu-latest
11+
defaults:
12+
run:
13+
working-directory: ./npm-package
14+
steps:
15+
- uses: actions/checkout@v4
16+
- name: Extract version
17+
run: |
18+
echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/npm/v}" >> $GITHUB_ENV
19+
- name: Validate package version is correct
20+
run: |
21+
grep "\"version\": \"${RELEASE_VERSION}\"" package.json
22+
23+
publish-npm:
24+
runs-on: ubuntu-latest
25+
needs: validation
26+
defaults:
27+
run:
28+
working-directory: ./npm-package
29+
steps:
30+
- uses: actions/checkout@v4
31+
- uses: actions/setup-node@v4
32+
with:
33+
node-version: 20
34+
registry-url: 'https://registry.npmjs.org'
35+
36+
# Install Rust and wasm-bindgen for WASM build
37+
- name: Install Rust
38+
uses: actions-rs/toolchain@v1
39+
with:
40+
toolchain: stable
41+
target: wasm32-unknown-unknown
42+
override: true
43+
44+
- name: Install wasm-bindgen-cli
45+
run: cargo install wasm-bindgen-cli
46+
47+
- name: Install dependencies
48+
run: npm ci
49+
50+
- name: Build WASM and package
51+
run: npm run build
52+
53+
- name: Publish to npm
54+
run: npm publish --access public
55+
env:
56+
NODE_AUTH_TOKEN: ${{ secrets.NPM_SPRUCEID_PUBLISH_TOKEN }}

.github/workflows/ci.yml

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
name: npm_ci
2+
3+
on:
4+
push:
5+
branches: [main, develop]
6+
paths:
7+
- "npm-package/**"
8+
- "wasm/**"
9+
- "core/**"
10+
- "Cargo.toml"
11+
- "Cargo.lock"
12+
- ".github/workflows/**"
13+
pull_request:
14+
branches: [main, develop]
15+
paths:
16+
- "npm-package/**"
17+
- "wasm/**"
18+
- "core/**"
19+
- "Cargo.toml"
20+
- "Cargo.lock"
21+
- ".github/workflows/**"
22+
23+
jobs:
24+
lint-and-test:
25+
runs-on: ubuntu-latest
26+
defaults:
27+
run:
28+
working-directory: ./npm-package
29+
steps:
30+
- uses: actions/checkout@v4
31+
32+
- uses: actions/setup-node@v4
33+
with:
34+
node-version: 20
35+
cache: "npm"
36+
cache-dependency-path: "./npm-package/package-lock.json"
37+
38+
# Install Rust and wasm-bindgen for WASM build
39+
- name: Install Rust
40+
uses: actions-rs/toolchain@v1
41+
with:
42+
toolchain: stable
43+
target: wasm32-unknown-unknown
44+
override: true
45+
46+
- name: Install wasm-bindgen-cli
47+
# NOTE: wasm-bindgen-cli needs to align with wasm-bindgen version
48+
# in wasm/ crate dependency.
49+
run: cargo install -f wasm-bindgen-cli --version 0.2.101
50+
51+
- name: Install npm dependencies
52+
run: npm ci
53+
54+
- name: Lint package.json and check formatting
55+
run: |
56+
# Validate package.json structure
57+
node -e "const pkg = require('./package.json'); if (!pkg.main || !pkg.types) throw new Error('Missing main or types field')"
58+
59+
# Check for common issues
60+
if [ -f "src/" ]; then
61+
echo "❌ Error: src/ directory should not exist after restructure"
62+
exit 1
63+
fi
64+
65+
- name: Build WASM
66+
run: npm run build:wasm
67+
68+
- name: Verify build outputs
69+
run: |
70+
if [ ! -f "dist/dc_api_wasm.js" ]; then
71+
echo "❌ Missing dist/dc_api_wasm.js"
72+
exit 1
73+
fi
74+
if [ ! -f "dist/dc_api_wasm.d.ts" ]; then
75+
echo "❌ Missing dist/dc_api_wasm.d.ts"
76+
exit 1
77+
fi
78+
if [ ! -f "dist/dc_api_wasm_bg.wasm" ]; then
79+
echo "❌ Missing dist/dc_api_wasm_bg.wasm"
80+
exit 1
81+
fi
82+
echo "✅ All build outputs present"
83+
84+
- name: Test package integrity
85+
run: |
86+
# Test that the built files can be required/imported
87+
node -e "
88+
try {
89+
const wasm = require('./dist/dc_api_wasm.js');
90+
console.log('✅ Package can be loaded successfully');
91+
} catch (e) {
92+
console.error('❌ Package loading failed:', e.message);
93+
process.exit(1);
94+
}
95+
"
96+
97+
- name: Check package size
98+
run: |
99+
# Check if package size is reasonable (warn if > 10MB)
100+
SIZE=$(du -sm dist/ | cut -f1)
101+
if [ $SIZE -gt 10 ]; then
102+
echo "⚠️ Warning: Package size is ${SIZE}MB, consider optimizing"
103+
else
104+
echo "✅ Package size is ${SIZE}MB"
105+
fi
106+
107+
- name: Dry run publish
108+
run: npm pack --dry-run
109+
110+
rust-test:
111+
runs-on: ubuntu-latest
112+
steps:
113+
- uses: actions/checkout@v4
114+
115+
- name: Install Rust
116+
uses: actions-rs/toolchain@v1
117+
with:
118+
toolchain: stable
119+
target: wasm32-unknown-unknown
120+
override: true
121+
components: rustfmt, clippy
122+
123+
- name: Cache Cargo dependencies
124+
uses: actions/cache@v3
125+
with:
126+
path: |
127+
~/.cargo/registry
128+
~/.cargo/git
129+
target
130+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
131+
132+
- name: Run Rust tests
133+
run: cargo test --workspace
134+
135+
- name: Check Rust formatting
136+
run: cargo fmt --all -- --check
137+
138+
- name: Run Clippy
139+
run: RUSTFLAGS='--cfg getrandom_backend="wasm_js"' cargo clippy --target wasm32-unknown-unknown --all-features -- -D warnings
140+
141+
security-audit:
142+
runs-on: ubuntu-latest
143+
steps:
144+
- uses: actions/checkout@v4
145+
146+
- uses: actions/setup-node@v4
147+
with:
148+
node-version: 20
149+
cache: "npm"
150+
cache-dependency-path: "./npm-package/package-lock.json"
151+
152+
- name: Install npm dependencies
153+
working-directory: ./npm-package
154+
run: npm ci
155+
156+
- name: Run npm audit
157+
working-directory: ./npm-package
158+
run: npm audit --audit-level=moderate

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
target/
2+
**/**.wasm*

0 commit comments

Comments
 (0)