Files
scriptc/tests/corpus/text-codec-values/main.ts
Chris Tate be1426a5cb feat(compiler): advance static OpenTUI support
- Extend native FFI with additional scalar widths and writable byte spans.
- Compile stored text codecs and supported bundled module patterns without a JavaScript engine.
- Document supported limits.
2026-09-27 21:49:40 -05:00

76 lines
3.2 KiB
TypeScript

import { sharedEncoder, decodeShared } from "./shared.ts";
import { TextEncoder as UserEncoder } from "./user.ts";
class CodecOwner {
readonly encoder: TextEncoder = new TextEncoder();
readonly decoder: TextDecoder = new TextDecoder();
roundTrip(text: string): string {
return this.decoder.decode(this.encoder.encode(text));
}
}
function decodeWith(decoder: TextDecoder, bytes: Uint8Array): string {
return decoder.decode(bytes);
}
function makeEncoder(): (text: string) => Uint8Array {
const encoder = new TextEncoder();
return (text: string) => encoder.encode(text);
}
const owner = new CodecOwner();
console.log(owner.roundTrip("café 🎉"));
console.log(decodeShared(sharedEncoder.encode("imported ✓")));
const encode = makeEncoder();
console.log(decodeWith(new TextDecoder(), encode("captured 😀")));
let decoder: TextDecoder = new TextDecoder("windows-1252");
console.log(decodeWith(decoder, new Uint8Array([0x80, 0x93, 0x41, 0x94])));
decoder = new TextDecoder();
console.log(decodeWith(decoder, new Uint8Array([0xef, 0xbb, 0xbf, 0x41, 0xff])));
console.log(decoder.decode().length, owner.encoder.encode().length);
console.log(new TextEncoder().encode().length);
const alias = owner.encoder;
console.log(alias === owner.encoder, alias === new TextEncoder());
const pair = [new TextDecoder("utf-16le"), new TextDecoder("windows-1252")];
console.log(pair[0]!.decode(new Uint8Array([0x61, 0, 0x62, 0])), pair[1]!.decode(new Uint8Array([0x80])));
let events = "";
function receiver(): TextDecoder { events += "receiver;"; return decoder; }
function input(): Uint8Array { events += "input;"; return new Uint8Array([0x41]); }
console.log(receiver().decode(input()), events);
events = "";
function label(): "utf-8" { events += "label;"; return "utf-8"; }
const labelled = new TextDecoder(label());
console.log(labelled.decode(input()), labelled.decode(), events);
// User types with codec-like names retain their own implementation.
console.log(new UserEncoder().encode("hello"));
function earlyCapture(early: boolean): string {
const use = () => encoder.encode("x");
if (early) {
try { return String(use().length); }
catch (error) { return error instanceof Error ? error.name + ":" + error.message : "wrong error"; }
}
const encoder = new TextEncoder();
return String(use().length);
}
console.log(earlyCapture(true), earlyCapture(false));
function globalRead(): number { return laterEncoder.encode("early").length; }
try { console.log(globalRead()); }
catch (error) { if (error instanceof Error) console.log(error.name, error.message); }
const laterEncoder = new TextEncoder();
console.log(globalRead());
let writes = 0;
function value(): TextDecoder { writes++; return new TextDecoder("windows-1252"); }
function globalWrite(): void { laterDecoder = value(); }
function globalWriteExpression(): TextDecoder { return laterDecoder = value(); }
try { globalWrite(); }
catch (error) { if (error instanceof Error) console.log(error.name, error.message, writes); }
try { globalWriteExpression(); }
catch (error) { if (error instanceof Error) console.log(error.name, error.message, writes); }
let laterDecoder = new TextDecoder();
console.log(globalWriteExpression().decode(new Uint8Array([0x80])), writes);