react-native-shiki-engine
Version:
Shiki syntax highlighting for React Native. Zero bridge overhead with native Oniguruma regex engine.
65 lines (64 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createNativeEngine = createNativeEngine;
exports.isNativeEngineAvailable = isNativeEngineAvailable;
var _reactNative = require("react-native");
var _NativeShikiEngine = _interopRequireDefault(require("../NativeShikiEngine"));
var _utils = require("./utils");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function createNativeEngine(options = {}) {
const {
maxCacheSize = 1000
} = options;
if (!isNativeEngineAvailable()) {
throw new Error('Native engine not available');
}
return {
createScanner(patterns) {
if (!Array.isArray(patterns) || patterns.some(p => typeof p !== 'string')) {
throw new TypeError('Patterns must be an array of strings');
}
const scannerId = _NativeShikiEngine.default.createScanner(patterns, maxCacheSize);
if (typeof scannerId !== 'number') {
throw new TypeError('Failed to create native scanner');
}
return {
findNextMatchSync(string, startPosition) {
if (startPosition < 0) throw new RangeError('Start position must be >= 0');
const stringContent = typeof string === 'string' ? string : string.content;
if (typeof stringContent !== 'string') throw new TypeError('Invalid input string');
try {
const result = _NativeShikiEngine.default.findNextMatchSync(scannerId, stringContent, startPosition);
return (0, _utils.convertToOnigMatch)(result);
} catch (err) {
if (__DEV__) console.error('Error in findNextMatchSync:', err);
throw err;
}
},
dispose() {
try {
_NativeShikiEngine.default.destroyScanner(scannerId);
} catch (err) {
if (__DEV__) console.error('Error disposing scanner:', err);
}
}
};
},
createString(s) {
if (typeof s !== 'string') throw new TypeError('Input must be a string');
return {
content: s
};
}
};
}
function isNativeEngineAvailable() {
try {
return _reactNative.TurboModuleRegistry.getEnforcing('ShikiEngine') != null;
} catch {
return false;
}
}
//# sourceMappingURL=index.js.map