Sha256: 34f3e0d28f8d13bc43db793f1bfa9c66eff23187fa6e8de5d3513aea2927b496

Contents?: true

Size: 1.69 KB

Versions: 81

Compression:

Stored size: 1.69 KB

Contents

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var callBound = require('call-bind/callBound');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var Type = require('./Type');
var UTF16SurrogatePairToCodePoint = require('./UTF16SurrogatePairToCodePoint');

var $charAt = callBound('String.prototype.charAt');
var $charCodeAt = callBound('String.prototype.charCodeAt');

// https://262.ecma-international.org/12.0/#sec-codepointat

module.exports = function CodePointAt(string, position) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var size = string.length;
	if (position < 0 || position >= size) {
		throw new $TypeError('Assertion failed: `position` must be >= 0, and < the length of `string`');
	}
	var first = $charCodeAt(string, position);
	var cp = $charAt(string, position);
	var firstIsLeading = isLeadingSurrogate(first);
	var firstIsTrailing = isTrailingSurrogate(first);
	if (!firstIsLeading && !firstIsTrailing) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': false
		};
	}
	if (firstIsTrailing || (position + 1 === size)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}
	var second = $charCodeAt(string, position + 1);
	if (!isTrailingSurrogate(second)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}

	return {
		'[[CodePoint]]': UTF16SurrogatePairToCodePoint(first, second),
		'[[CodeUnitCount]]': 2,
		'[[IsUnpairedSurrogate]]': false
	};
};

Version data entries

81 entries across 27 versions & 2 rubygems

Version Path
immosquare-cleaner-0.1.32 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.32 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.32 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.31 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.31 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.31 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.30 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.30 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.30 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.29 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.29 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.29 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.28 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.28 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.28 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.27 node_modules/es-abstract/2021/CodePointAt.js
immosquare-cleaner-0.1.27 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.27 node_modules/es-abstract/2023/CodePointAt.js
immosquare-cleaner-0.1.26 node_modules/es-abstract/2022/CodePointAt.js
immosquare-cleaner-0.1.26 node_modules/es-abstract/2023/CodePointAt.js