UNPKG

sketch-plugin-types

Version:

TypeScript type definitions for the Sketch app plugin API (sketch/dom, sketch/ui, sketch/settings, sketch/async, sketch/data-supplier) and the Action API.

238 lines (194 loc) 11.3 kB
# Changelog All notable changes to this package are documented here. Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.3.3] — 2026-05-24 Republish after the 0.3.2 tarball was unpublished from the previous npm account. No content changes vs 0.3.2 — same `.d.ts` surface, same `build-manifest` CLI. Version bump only because npm forbids reusing unpublished versions. ## [0.3.2] — 2026-04-22 Docs-only release. Acknowledges the current state of the skpm toolchain and surfaces the plain-`tsc` / `esbuild` alternative for greenfield plugins. No API changes — `sketch-plugin-types/skpm` subpath stays as is, since the polyfill surface it types is itself frozen and therefore correct indefinitely. ### Changed - **`docs/skpm.md` — added a status note at the top.** `@skpm/builder` is in maintenance (`0.9.5`, 2023-10-10, still on webpack 4). The runtime bits (`sketch-module-web-view`, `sketch-polyfill-fetch`) are still actively patched; the build tooling is not. For new plugins, consider building directly onto the `.sketchplugin` bundle layout with `tsc` + a bundle script — see `examples/hello-world/`. - **README — new "Two build paths" subsection.** Explicit choice between skpm (maintenance / compat) and plain `tsc`/`esbuild` (recommended for new plugins). Both paths consume the same types. ## [0.3.1] — 2026-04-21 Post-release fact-check pass — three inaccuracies shipped in 0.3.0 were audited against `sketch-hq/SketchAPI` and `skpm/skpm` sources and corrected here. No API changes. ### Fixed - **`verticalAlignment` is no longer `@deprecated` on `StyleProps` or `Style`.** Only the `Text`-layer path (`new Text({ verticalAlignment })` or `textLayer.verticalAlignment =`) is broken — assigning on the *Style* works (`text.style.verticalAlignment = 'center'` is the supported path, implemented in `Source/dom/style/Text.js`). The `@deprecated` tag now lives only on `TextProps.verticalAlignment` with jsdoc pointing at the working alternative and [sketch-hq/SketchAPI#447](https://github.com/sketch-hq/SketchAPI/issues/447). - **`SketchManifestCommand.handler` jsdoc cited the wrong runtime error.** The previous text said `TypeError: … is not a function`; skpm actually throws `Error: Missing export named "<handler>". Your command should contain something like \`export function <handler>() {}\`.` from `packages/builder/src/utils/webpackHeaderFooterPlugin.js`. - **`docs/skpm.md` "Not polyfilled" section overstated the `fetch` gap.** `@skpm/builder` *does* inject `fetch` via webpack's `ProvidePlugin``sketch-polyfill-fetch`, so the function works out of the box. What's still missing are the WHATWG classes `Request` / `Response` / `Headers` — the polyfill returns plain objects, not constructor instances. `FormData` is also injected (added to the section for completeness). ## [0.3.0] — 2026-04-21 Driven by early-adopter feedback: the clipboard was the single most-hit gap, plus a round of jsdoc / docs fixes for things the types quietly lied about or under-documented. ### Added - **`NSPasteboard` in the typed Cocoa bridge.** `NSPasteboardInstance` covers the realistic plugin surface — `clearContents`, `declareTypes_owner_` (accepts a JS array, auto-bridged to `NSArray`), `setString_forType_` / `setData_forType_`, `stringForType_` / `dataForType_`, `types`, `availableTypeFromArray_`, `changeCount`. `NSPasteboardClass` exposes `generalPasteboard`, `pasteboardWithName_`, `pasteboardWithUniqueName`. New branded alias `NSPasteboardType` for UTI strings (`'public.utf8-plain-text'`, `'public.html'`, …). - **`NSClassFromString('NSPasteboard')` overload** in `globals.d.ts` returns `NSPasteboardClass` directly — no cast. - **`examples/clipboard-roundtrip/`** — new runnable plugin with two commands (read the pasteboard into a UI alert; copy selection names into the pasteboard). Same bundle pattern as `cocoa-file-io`. - **`test/cocoa.ts`** — new cases for the pasteboard: read/write/preview, `changeCount` polling, named pasteboards. ### Changed - **`Text.verticalAlignment` is now `@deprecated`.** Sketch ignores the property at runtime (`no idea what to do with "verticalAlignment" in Text`). The jsdoc points at the working alternative: call `text.adjustToFit()` and offset `text.frame.y` manually. Marked in all three declaration sites (`StyleProps`, `Style`, `TextProps`). - **`ShapePath.fromSVGPath` has `@remarks`.** Documented the non-obvious normalization: the returned `frame` matches the path's bounding box and every `CurvePoint` coordinate is stored as a percentage of that frame (`0``1`), not in points. Previously one-liner; now includes a worked example. - **`SketchManifestCommand.handler` jsdoc spells out the skpm export convention.** `handler: "onRun"` maps to `export default`; any other value maps to a named export of the same name. Mismatch only surfaces as a runtime `TypeError`, so the hint belongs in the type. - **`docs/skpm.md` — softened the "TS out of the box" claim.** In practice `@skpm/builder@0.9.5` is flaky about `.ts` sources; added a minimal working `webpack.skpm.config.js` with `ts-loader@8` (webpack 4) and a note on the `webpack-merge.smart` footgun. - **`docs/skpm.md` — new "Not polyfilled — shim yourself" section.** Lists globals and APIs that the bare JavaScriptCore context lacks and skpm does not fill in: `structuredClone`, `TextEncoder` / `TextDecoder`, `fetch`, WHATWG `URL` globals, `queueMicrotask`, `crypto.subtle`, `fs`. Each entry has a shim hint. ### Compatibility Fully backwards compatible with 0.2.x. `NSPasteboard` is additive and the `@deprecated` flag is advisory only — existing assignments to `verticalAlignment` still compile. ## [0.2.3] — 2026-04-20 ### Changed - **README trimmed from 519 to 134 lines.** Long-form guides moved to dedicated `docs/*.md` files, each linked from a navigation table in the README: `docs/skpm.md` (skpm toolchain + polyfilled core modules), `docs/manifest.md` (`defineManifest` + `build-manifest` CLI), `docs/actions.md` (typed action handlers + payload augmentation), `docs/cocoa.md` (Foundation bridge + overloaded `NSClassFromString`). README keeps install, tsconfig, a minimal command, module and examples tables, gotchas, and troubleshooting. Dropped "Common patterns" (duplicated `examples/`) and "Sketch CLI tools" (not about types). ### Packaging - `files` now includes `docs/` so the tarball stays self-contained when read from `node_modules`. No code or type changes. ## [0.2.2] — 2026-04-19 ### Added Missing `init*` methods on Foundation classes that already shipped typed `alloc()`. Before 0.2.2 the `alloc()` return type pointed at an instance with no way to initialize it, so authors either had to call through class factories (`NSString.stringWithUTF8String_`) or augment locally — now the canonical `alloc().initWith…()` pairs type-check directly. - `NSString`: `initWithUTF8String_`, `initWithString_`, `initWithData_encoding_`. New helper alias `NSStringEncoding`. - `NSData`: `initWithBytes_length_`, `initWithContentsOfURL_`, `initWithContentsOfFile_`, `initWithBase64EncodedString_options_`. New helper alias `NSDataBase64DecodingOptions`. - `NSURL`: `initWithString_`, `initFileURLWithPath_`. - `NSImage`: `initWithSize_`. - `NSBitmapImageRep`: `initWithData_` and the 10-argument designated initializer `initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel_`. New helper alias `NSColorSpaceName`. - `test/cocoa.ts` now exercises every new `init*` pair. Fully backwards compatible — additive change, no signatures removed. ## [0.2.1] — 2026-04-19 ### Fixed - `Group.Frame` and `Group.Graphic` are now constructor-only (`new …()`). The previous declaration also allowed callable form (`Group.Frame({…})`) which throws at runtime in modern Sketch — the types now reject it at compile time. README already documented this as a gotcha; the type-level enforcement catches up. - `ImageData` now has a `private constructor()`. `new ImageData()` is no longer allowed — use the `ImageData.from(…)` static factory instead, as the runtime has always required. ### Added - `prepublishOnly` script runs `lint` + `test` before every publish so a broken `.d.ts` can never ship again. - GitHub Actions CI (`.github/workflows/ci.yml`) runs the full typecheck on Node 18 / 20 / 22 on every push to `main` and every PR. - Negative tests cover the `Group.Frame` / `Group.Graphic` / `ImageData` footguns. ## [0.2.0] — 2026-04-19 ### Added - **Typed Cocoa bridge for a Foundation subset.** `SketchNative` now ships `FooInstance` + `FooClass` interface pairs for `NSString`, `NSURL`, `NSData`, `NSImage`, `NSBitmapImageRep`, and `NSFileManager`. The historical `type Foo = Opaque<'Foo'>` aliases are preserved as `type Foo = FooInstance` so existing code keeps compiling. - **Overloaded `NSClassFromString`.** Calling it with a literal class name listed above now returns the corresponding `FooClass` interface directly — no `as` cast needed. Other names fall through to the `string → unknown` overload as before. - **`sketch-plugin-types/skpm` subpath.** New ambient declarations for the Node-like polyfills that `@skpm/builder` injects: `buffer`, `path`, `crypto` (subset), `stream` (stubs), `util`, `events`, `url`, `assert`. Opt in with `import 'sketch-plugin-types/skpm';`. `fs` is intentionally excluded — skpm does not polyfill it; use `NSFileManager` instead. - **`build-manifest` CLI.** Ships under `bin`. Runs a TS/JS module whose default export is a `SketchManifest` value and writes the JSON: ```sh npx build-manifest src/manifest.ts --out build/manifest.json ``` TypeScript sources require `tsx` or `ts-node` in the plugin project. - **Action payload augmentation pattern.** README now documents how to extend `SketchActionContextMap` via `declare module 'sketch-plugin-types'` so community-reverse-engineered payloads can plug in without a package release. - **`examples/cocoa-file-io/`.** New runnable example that exports the selected layer via `sketch.export()` and exercises the typed Cocoa bridge (`NSFileManager`, `NSString`, `NSURL`) for path handling. - **New tests.** `test/skpm.ts` covers every module in the skpm subpath; `test/cocoa.ts` covers the overloaded `NSClassFromString` and the new Foundation interfaces. ### Changed - `types/globals.d.ts``NSClassFromString` is no longer a single `(name: string) => unknown`. The trailing `string` overload preserves the escape hatch for any class not yet named. ### Compatibility - Fully backwards compatible with `0.1.x`. Existing imports and call sites continue to type-check; the new surfaces are additive. ## [0.1.1] — 2026-04-01 Initial public release. TypeScript definitions for the Sketch plugin API (`sketch`, `sketch/dom`, `sketch/ui`, `sketch/settings`, `sketch/async`, `sketch/data-supplier`), 323 Action API names (12 with typed payloads), `manifest.json` types, and opt-in CocoaScript ambient globals.