Skip to content

Getting Started ​

Install ​

Add str to an AssemblyScript project:

bash
npm install as-str

For manual use, import the str class directly:

ts
import { str } from "as-str";

The encoding namespaces (str.UTF8 / str.UTF16) are powered by utf-as, pulled in automatically as a dependency.

Manual mode ​

Create your first view ​

Wrap a real string with str.from, then slice, search, and trim without allocating. Materialize back to a string with .toString() only when you need one:

ts
const real = "  the quick brown fox  ";

const v = str.from(real).trim(); // view -> "the quick brown fox"
const word = v.slice(4, 9); // view -> "quick"

word.length; // 5
word.toString(); // "quick" — the only allocation here

str is a class, so it is also the type — annotate with str:

ts
const v: str = str.from("hello");

Call operations ​

Every operation is available as an instance method on a view and as a free function that takes a string or a str:

ts
// instance
str.from("hello, world").slice(7).toString(); // "world"

// free function — first arg is a string or a view
str.slice("hello, world", 7).toString(); // "world"
str.indexOf("hello, world", "world"); // 7

str is also callable as a converter — turn any value into a view:

ts
str(42).toString(); // "42"
str(someValue); // anything with a .toString()

Automatic mode ​

Use as-str/auto to let the transform migrate safe internal string values to zero-copy str views automatically:

bash
--transform as-str/auto

Or add it to asconfig.json:

json
{ "options": { "transform": ["as-str/auto"] } }

Your source can continue to use native string types:

ts
function compactLabel(value: string): string {
  return value.trim().slice(0, 12);
}

export function formatLabel(value: string): string {
  return compactLabel(value);
}

After optimization, the relevant source shape is:

ts
import { str } from "as-str";

function compactLabel(value: str): str {
  return value.trim().slice(0, 12);
}

export function formatLabel(value: string): string {
  return compactLabel(str.from(value)).toString();
}

The exported function keeps its native string signature while the internal helper operates entirely on views. The transform leaves values native around unsafe pointer casts, raw loads, explicit assertions, native-string call parameters, and other boundaries it cannot prove safe.

Global mode ​

By default you import str where you use it. If you'd rather use strwithout an import in every file, use as-str/global. This transform only injects imports; it does not optimize native strings.

  1. Add the transform to your asc command or asconfig.json:

    bash
    --transform as-str/global
    json
    { "options": { "transform": ["as-str/global"] } }
  2. Add the ambient typings so your editor resolves the globals — extend str's preset in assembly/tsconfig.json:

    json
    {
      "extends": [
        "assemblyscript/std/assembly.json",
        "as-str/globals.json"
      ],
      "include": ["./**/*.ts"]
    }

    The preset re-points typeRoots (AssemblyScript's std config sets typeRoots: ["types"], which would otherwise block resolving the globals from node_modules). For pnpm or other non-hoisted layouts, drop a copy of node_modules/as-str/globals/index.d.ts into your assembly directory instead — any .d.ts in the project is picked up by the editor.

Now this compiles with no import:

ts
export function method(line: string): string {
  return str.slice(line, 0, line.indexOf(" ")).toString();
}

The transform only injects names a file actually uses and doesn't already import, and never rewrites the library's own sources — so explicit imports keep working and the two styles mix freely.

The globals/index.d.ts typings are editor-only. The transform injects the matching imports at compile time, so the editor globals cannot collide with generated declarations.

SIMD ​

The scanning hot paths (indexOf, includes, compare) ship a SWAR kernel by default and a SIMD kernel when you compile with:

bash
--enable simd

With SIMD off, the v128 code is dead-code-eliminated — you only pay for the tier you build. Nothing else changes; results are identical.

UTF-8 views ​

If your text is already UTF-8 bytes (files, network, JSON), reach for str8 — the byte-indexed UTF-8 sibling of str — and slice/search it without transcoding to UTF-16. Bridge between the two with .toStr() / .toStr8().

Next ​

  • The View Model — the data layout, materialization, and GC safety.
  • API — the full method surface, grouped by what it returns.