Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ hb.js
.DS_Store
.vscode/
node_modules/
package-lock.json
package-lock.json
dist/
4 changes: 4 additions & 0 deletions hb.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import type { HBModule } from './src/types'

declare function createHarfBuzz(): Promise<HBModule>;
export default createHarfBuzz;
4 changes: 4 additions & 0 deletions hbjs.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import type { HBHandle, HBModule } from './src/types'

declare function hbjs(module: HBModule): HBHandle;
export default hbjs;
31 changes: 27 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,29 @@
"name": "harfbuzzjs",
"version": "0.8.0",
"description": "Minimal version of HarfBuzz for JavaScript use",
"main": "index.js",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
},
"files": [
"dist"
],
"scripts": {
"prepare": "make",
"build:wasm": "make",
"build:ts": "tsdown && cp hb.wasm dist/",
"build": "npm run build:wasm && npm run build:ts",
"prepare": "npm run build",
"test": "make test"
},
"keywords": [
Expand Down Expand Up @@ -33,6 +53,9 @@
"homepage": "https://github.com/harfbuzz/harfbuzzjs#readme",
"devDependencies": {
"chai": "^4.3.7",
"mocha": "^10.2.0"
"mocha": "^10.2.0",
"rolldown-plugin-wasm": "^0.2.1",
"tsdown": "^0.20.2",
"typescript": "^5.9.3"
}
}
}
19 changes: 19 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import hbjs from '../hbjs.js'
import createHarfBuzz from '../hb.js'

export type {
HBBlob,
HBFace,
HBFont,
HBBuffer,
HBHandle,
HBDir,
HBFlag,
HBJson,
HBVariations,
SvgPathCommand,
} from './types'

export default createHarfBuzz().then((instance) => {
return hbjs(instance)
})
89 changes: 89 additions & 0 deletions src/types.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
export type HBBlob = {
ptr: number;
destroy: () => void;
};

export type HBFace = {
ptr: number;
upem: number;
reference_table: (name: string) => Uint8Array;
getAxisInfos: () => Record<
string,
{ min: number; default: number; max: number }
>;
collectUnicodes: () => Uint32Array;
destroy: () => void;
};

export type SvgPathCommand =
| { type: "M"; values: [number, number] }
| { type: "L"; values: [number, number] }
| { type: "Q"; values: [number, number, number, number] }
| { type: "C"; values: [number, number, number, number, number, number] }
| { type: "Z"; values: [] };

export type HBVariations = Record<string, number>;

export type HBFont = {
ptr: number;
glyphName: (glyphId: number) => string;
glyphToPath: (glyphId: number) => string;
glyphToJson: (glyphId: number) => SvgPathCommand[];
setScale: (xScale: number, yScale: number) => void;
setVariations: (variations: HBVariations) => void;
destroy: () => void;
};

export type HBFlag =
| "BOT"
| "EOT"
| "PRESERVE_DEFAULT_IGNORABLES"
| "REMOVE_DEFAULT_IGNORABLES"
| "DO_NOT_INSERT_DOTTED_CIRCLE"
| "PRODUCE_UNSAFE_TO_CONCAT";

export type HBDir = "ltr" | "rtl" | "ttb" | "btt";

export type HBJson = {
g: number;
cl: number;
ax: number;
ay: number;
dx: number;
dy: number;
flags: number;
};

export type HBBuffer = {
ptr: number;
addText: (text: string) => void;
guessSegmentProperties: () => void;
setDirection: (dir: HBDir) => void;
setFlags: (flags: HBFlag[]) => void;
setLanguage: (language: string) => void;
setScript: (script: string) => void;
setClusterLevel: (level: number) => void;
json: () => HBJson[];
destroy: () => void;
};

export type HBHandle = {
createBlob: (blob: Uint8Array) => HBBlob;
createFace: (blob: HBBlob, index: number) => HBFace;
createFont: (face: HBFace) => HBFont;
createBuffer: () => HBBuffer;
shape: (font: HBFont, buffer: HBBuffer, features: string) => void;
};

export type HBModule = {
wasmExports: WebAssembly.Exports;
wasmMemory: WebAssembly.Memory;
HEAPU8: Uint8Array;
HEAPU16: Uint16Array;
HEAPU32: Uint32Array;
addFunction: (fn: Function, signature: string) => number;
removeFunction: (ptr: number) => void;
stackSave: () => number;
stackRestore: (ptr: number) => void;
stackAlloc: (size: number) => number;
};
17 changes: 17 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"declaration": true,
"declarationMap": true,
"outDir": "dist",
"rootDir": "src",
"types": ["rolldown-plugin-wasm/types"]
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
10 changes: 10 additions & 0 deletions tsdown.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { wasm } from 'rolldown-plugin-wasm'
import { defineConfig } from 'tsdown'

export default defineConfig({
entry: ['./src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
clean: true,
plugins: [wasm()],
})