Sha256: 14350bc53c55373911291fb9dd3a0a88cdc36da8fe1a602963c16810df26d904

Contents?: true

Size: 1.68 KB

Versions: 31

Compression:

Stored size: 1.68 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 UTF16DecodeSurrogatePair = require('./UTF16DecodeSurrogatePair');

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

// https://262.ecma-international.org/11.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]]': UTF16DecodeSurrogatePair(first, second),
		'[[CodeUnitCount]]': 2,
		'[[IsUnpairedSurrogate]]': false
	};
};

Version data entries

31 entries across 30 versions & 4 rubygems

Version Path
immosquare-cleaner-0.1.11 node_modules/es-abstract/2020/CodePointAt.js
immosquare-cleaner-0.1.10 node_modules/es-abstract/2020/CodePointAt.js
immosquare-cleaner-0.1.9 node_modules/es-abstract/2020/CodePointAt.js
immosquare-cleaner-0.1.8 node_modules/es-abstract/2020/CodePointAt.js
immosquare-cleaner-0.1.7 node_modules/es-abstract/2020/CodePointAt.js
immosquare-cleaner-0.1.6 node_modules/es-abstract/2020/CodePointAt.js
decidim-0.26.8 packages/eslint-config/node_modules/es-abstract/2020/CodePointAt.js
groonga-client-model-6.0.0 test/apps/rails6.1.3/node_modules/es-abstract/2020/CodePointAt.js
groonga-client-model-6.0.0 test/apps/rails6.0.3.5/node_modules/es-abstract/2020/CodePointAt.js
ruby2js-4.0.4 lib/tasks/testrails/node_modules/es-abstract/2020/CodePointAt.js
ruby2js-4.0.3 lib/tasks/testrails/node_modules/es-abstract/2020/CodePointAt.js