Files
HRM-System/node_modules/@react-grab/cli/dist/read-clipboard.swift

36 lines
1.5 KiB
Swift

import AppKit
// macOS clipboard reader for `react-grab watch`. React Grab's custom MIME type
// is not exposed directly by Chromium-based browsers: the legacy
// execCommand("copy") + dataTransfer.setData path lands as a base::Pickle under
// "org.chromium.web-custom-data"; the async Clipboard API path lands as raw
// bytes referenced by "org.w3.web-custom-format.map". This reader emits the
// pickle as base64 (the CLI decodes it, shared with Linux/Windows) and the W3C
// payload as a resolved string, plus changeCount for cheap idle polling.
let GRAB_MIME = "application/x-react-grab"
let pasteboard = NSPasteboard.general
var result: [String: Any] = ["changeCount": pasteboard.changeCount]
if let text = pasteboard.string(forType: .string) {
result["text"] = text
}
if let data = pasteboard.data(forType: NSPasteboard.PasteboardType("org.chromium.web-custom-data")) {
result["pickleBase64"] = data.base64EncodedString()
}
if let mapData = pasteboard.data(
forType: NSPasteboard.PasteboardType("org.w3.web-custom-format.map")),
let mapString = String(data: mapData, encoding: .utf8),
let mapJson = try? JSONSerialization.jsonObject(with: Data(mapString.utf8)) as? [String: String],
let pasteboardType = mapJson["web " + GRAB_MIME] ?? mapJson[GRAB_MIME],
let raw = pasteboard.data(forType: NSPasteboard.PasteboardType(pasteboardType)),
let value = String(data: raw, encoding: .utf8)
{
result["grab"] = value
}
let outData = (try? JSONSerialization.data(withJSONObject: result, options: [])) ?? Data("{}".utf8)
FileHandle.standardOutput.write(outData)