You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.7 KiB
58 lines
1.7 KiB
'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://ecma-international.org/ecma-262/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 |
|
}; |
|
};
|
|
|