- web/: Vue 3 + Vite + UnoCSS + Pinia, dark tactical theme (amber/#0d1117) - AppNav, ListingCard, SearchView with filters/sort, composables (useSnipeMode, useKonamiCode, useMotion), Pinia search store - Steal shimmer, auction countdown, Snipe Mode easter egg all native in Vue - docker/web/: nginx + multi-stage Dockerfile (node build → nginx serve) - compose.yml: api (8510) + web (8509) services - Dockerfile CMD updated to uvicorn for upcoming FastAPI layer - Clean build: 0 TS errors, 380 modules
28 lines
759 B
JavaScript
28 lines
759 B
JavaScript
// Forked from https://github.com/jsdom/jsdom/blob/main/lib/jsdom/living/helpers/strings.js
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
* Converts a string to ASCII lowercase.
|
|
*
|
|
* @see https://infra.spec.whatwg.org/#ascii-lowercase
|
|
* @param {string} s - The string to convert.
|
|
* @returns {string} The converted string.
|
|
*/
|
|
function asciiLowercase(s) {
|
|
if (!/[^\x00-\x7f]/.test(s)) {
|
|
return s.toLowerCase();
|
|
}
|
|
const len = s.length;
|
|
const out = new Array(len);
|
|
for (let i = 0; i < len; i++) {
|
|
const code = s.charCodeAt(i);
|
|
// If the character is between 'A' (65) and 'Z' (90), convert using bitwise OR with 32
|
|
out[i] = code >= 65 && code <= 90 ? String.fromCharCode(code | 32) : s[i];
|
|
}
|
|
return out.join("");
|
|
}
|
|
|
|
module.exports = {
|
|
asciiLowercase
|
|
};
|