CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-core-js-pure

Modular standard library for JavaScript providing ECMAScript polyfills without global namespace pollution

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

web-apis.mddocs/

Web APIs

Web standard APIs including base64 encoding, URL handling, structured cloning, microtask scheduling, and other browser-compatible utilities.

Capabilities

Base64 Encoding and Decoding

Standard base64 encoding and decoding functions for binary data handling.

/**
 * Global base64 encoding/decoding functions
 */
declare function atob(encodedData: string): string;
declare function btoa(stringToEncode: string): string;

Usage Examples:

import { atob, btoa } from 'core-js-pure/stable/atob';
import { btoa } from 'core-js-pure/stable/btoa';

// Basic base64 operations
const originalText = "Hello, World!";
const encoded = btoa(originalText);
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

const decoded = atob(encoded);
console.log(decoded); // "Hello, World!"

// Binary data encoding
const binaryData = String.fromCharCode(0, 1, 2, 3, 255);
const encodedBinary = btoa(binaryData);
const decodedBinary = atob(encodedBinary);
console.log(binaryData === decodedBinary); // true

// URL-safe encoding utility
const createUrlSafeBase64 = (str) => {
  return btoa(str)
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=/g, '');
};

const parseUrlSafeBase64 = (str) => {
  // Add padding and restore characters
  const padded = str + '='.repeat((4 - str.length % 4) % 4);
  const standard = padded.replace(/-/g, '+').replace(/_/g, '/');
  return atob(standard);
};

const token = "secure-token-data";
const urlSafe = createUrlSafeBase64(token);
console.log(urlSafe);
console.log(parseUrlSafeBase64(urlSafe) === token); // true

// JWT-like token creation (simplified)
const createJWT = (header, payload, secret) => {
  const encodedHeader = createUrlSafeBase64(JSON.stringify(header));
  const encodedPayload = createUrlSafeBase64(JSON.stringify(payload));
  const signature = createUrlSafeBase64(`${encodedHeader}.${encodedPayload}.${secret}`);
  
  return `${encodedHeader}.${encodedPayload}.${signature}`;
};

const jwt = createJWT(
  { alg: 'HS256', typ: 'JWT' },
  { sub: '1234567890', name: 'John Doe', iat: 1516239022 },
  'secret-key'
);
console.log(jwt);

URL and URLSearchParams

Complete URL parsing and manipulation with search parameter handling.

/**
 * URL constructor and methods
 */
interface URLConstructor {
  /**
   * Creates a new URL object
   * @param url - URL string to parse
   * @param base - Optional base URL
   */
  new (url: string, base?: string | URL): URL;
}

interface URL {
  readonly hash: string;
  readonly host: string;
  readonly hostname: string;
  readonly href: string;
  readonly origin: string;
  readonly password: string;
  readonly pathname: string;
  readonly port: string;
  readonly protocol: string;
  readonly search: string;
  readonly searchParams: URLSearchParams;
  readonly username: string;
  
  toString(): string;
  toJSON(): string;
}

/**
 * URLSearchParams constructor and methods
 */
interface URLSearchParamsConstructor {
  /**
   * Creates a new URLSearchParams object
   * @param init - Initial parameters as string, array, or object
   */
  new (init?: string | string[][] | Record<string, string> | URLSearchParams): URLSearchParams;
}

interface URLSearchParams {
  /**
   * Appends a key-value pair
   */
  append(name: string, value: string): void;
  
  /**
   * Deletes all parameters with given name
   */
  delete(name: string): void;
  
  /**
   * Returns iterator of [name, value] pairs
   */
  entries(): IterableIterator<[string, string]>;
  
  /**
   * Executes callback for each parameter
   */
  forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void;
  
  /**
   * Gets first value for parameter name
   */
  get(name: string): string | null;
  
  /**
   * Gets all values for parameter name
   */
  getAll(name: string): string[];
  
  /**
   * Checks if parameter exists
   */
  has(name: string): boolean;
  
  /**
   * Returns iterator of parameter names
   */
  keys(): IterableIterator<string>;
  
  /**
   * Sets parameter to single value
   */
  set(name: string, value: string): void;
  
  /**
   * Sorts parameters by name
   */
  sort(): void;
  
  /**
   * Returns URL-encoded string
   */
  toString(): string;
  
  /**
   * Returns iterator of parameter values
   */
  values(): IterableIterator<string>;
  
  [Symbol.iterator](): IterableIterator<[string, string]>;
}

Usage Examples:

import URL from 'core-js-pure/stable/url';
import URLSearchParams from 'core-js-pure/stable/url-search-params';

// URL parsing and manipulation
const url = new URL('https://example.com:8080/path/to/resource?param1=value1&param2=value2#section');

console.log(url.protocol); // "https:"
console.log(url.hostname); // "example.com"
console.log(url.port); // "8080"
console.log(url.pathname); // "/path/to/resource"
console.log(url.search); // "?param1=value1&param2=value2"
console.log(url.hash); // "#section"
console.log(url.origin); // "https://example.com:8080"

// Working with relative URLs
const baseUrl = 'https://api.example.com/v1/';
const resourceUrl = new URL('users/123', baseUrl);
console.log(resourceUrl.href); // "https://api.example.com/v1/users/123"

// URLSearchParams manipulation
const params = new URLSearchParams('name=John&age=30&city=NYC');

// Basic operations
console.log(params.get('name')); // "John"
console.log(params.has('age')); // true

params.set('age', '31');
params.append('hobby', 'reading');
params.append('hobby', 'coding'); // Multiple values

console.log(params.toString()); // "name=John&age=31&city=NYC&hobby=reading&hobby=coding"
console.log(params.getAll('hobby')); // ["reading", "coding"]

// Iteration
for (const [key, value] of params) {
  console.log(`${key}: ${value}`);
}

// URL builder utility
class URLBuilder {
  constructor(base) {
    this.url = new URL(base);
  }
  
  path(...segments) {
    const cleanedSegments = segments
      .map(s => s.toString().replace(/^\/+|\/+$/g, ''))
      .filter(s => s.length > 0);
    
    this.url.pathname = '/' + cleanedSegments.join('/');
    return this;
  }
  
  query(params) {
    for (const [key, value] of Object.entries(params)) {
      if (Array.isArray(value)) {
        value.forEach(v => this.url.searchParams.append(key, v.toString()));
      } else if (value !== undefined && value !== null) {
        this.url.searchParams.set(key, value.toString());
      }
    }
    return this;
  }
  
  hash(fragment) {
    this.url.hash = fragment;
    return this;
  }
  
  build() {
    return this.url.href;
  }
}

// Usage
const apiUrl = new URLBuilder('https://api.example.com')
  .path('v1', 'users', 123, 'posts')
  .query({
    page: 2,
    limit: 10,
    tags: ['javascript', 'web'],
    include: 'comments'
  })
  .hash('top')
  .build();

console.log(apiUrl);
// "https://api.example.com/v1/users/123/posts?page=2&limit=10&tags=javascript&tags=web&include=comments#top"

Structured Cloning

Deep cloning of objects with support for complex data types.

/**
 * Structured cloning function
 */
declare function structuredClone<T>(value: T, options?: StructuredSerializeOptions): T;

interface StructuredSerializeOptions {
  transfer?: Transferable[];
}

Usage Examples:

import structuredClone from 'core-js-pure/stable/structured-clone';

// Basic object cloning
const original = {
  name: 'Alice',
  age: 30,
  hobbies: ['reading', 'coding'],
  address: {
    city: 'NYC',
    zipCode: '10001'
  }
};

const cloned = structuredClone(original);
cloned.hobbies.push('gaming');
cloned.address.city = 'LA';

console.log(original.hobbies); // ['reading', 'coding'] (unchanged)
console.log(original.address.city); // 'NYC' (unchanged)
console.log(cloned.hobbies); // ['reading', 'coding', 'gaming']
console.log(cloned.address.city); // 'LA'

// Cloning complex types
const complexData = {
  date: new Date('2024-01-01'),
  regex: /hello/gi,
  map: new Map([['key1', 'value1'], ['key2', 'value2']]),
  set: new Set([1, 2, 3]),
  buffer: new ArrayBuffer(8),
  error: new Error('Test error')
};

const complexClone = structuredClone(complexData);
console.log(complexClone.date instanceof Date); // true
console.log(complexClone.map instanceof Map); // true
console.log(complexClone.set.has(2)); // true

// Safe cloning utility
const safeClone = (obj) => {
  try {
    return structuredClone(obj);
  } catch (error) {
    console.warn('Structured clone failed, falling back to JSON:', error);
    return JSON.parse(JSON.stringify(obj));
  }
};

// Cloning with circular references (throws error)
const circular = { name: 'test' };
circular.self = circular;

try {
  const clonedCircular = structuredClone(circular);
} catch (error) {
  console.log('Cannot clone circular structure:', error.message);
}

// Message passing simulation
const createMessage = (type, data) => ({
  id: Math.random().toString(36),
  type,
  data: structuredClone(data), // Ensure data is safely serializable
  timestamp: Date.now()
});

const message = createMessage('user-update', {
  userId: 123,
  profile: {
    name: 'John',
    preferences: new Map([['theme', 'dark'], ['lang', 'en']])
  }
});

console.log(message);

Microtask Scheduling

Scheduling functions to run in the next microtask queue.

/**
 * Queue microtask function
 */
declare function queueMicrotask(callback: VoidFunction): void;

Usage Examples:

import queueMicrotask from 'core-js-pure/stable/queue-microtask';

// Basic microtask scheduling
console.log('Start');

queueMicrotask(() => {
  console.log('Microtask 1');
});

queueMicrotask(() => {
  console.log('Microtask 2');
});

Promise.resolve().then(() => {
  console.log('Promise microtask');
});

setTimeout(() => {
  console.log('Timeout (macrotask)');
}, 0);

console.log('End');

// Output order:
// Start
// End
// Microtask 1
// Microtask 2
// Promise microtask
// Timeout (macrotask)

// Batch DOM updates
class DOMBatcher {
  constructor() {
    this.updates = [];
    this.scheduled = false;
  }
  
  scheduleUpdate(element, property, value) {
    this.updates.push({ element, property, value });
    
    if (!this.scheduled) {
      this.scheduled = true;
      queueMicrotask(() => {
        this.flushUpdates();
      });
    }
  }
  
  flushUpdates() {
    const updates = this.updates.splice(0);
    this.scheduled = false;
    
    // Apply all updates in one batch
    updates.forEach(({ element, property, value }) => {
      element.style[property] = value;
    });
    
    console.log(`Applied ${updates.length} DOM updates`);
  }
}

const batcher = new DOMBatcher();

// These will be batched into a single DOM update
// batcher.scheduleUpdate(element1, 'color', 'red');
// batcher.scheduleUpdate(element2, 'fontSize', '16px');
// batcher.scheduleUpdate(element3, 'margin', '10px');

// State synchronization utility
class StateManager {
  constructor() {
    this.state = {};
    this.listeners = [];
    this.notificationScheduled = false;
  }
  
  setState(updates) {
    Object.assign(this.state, updates);
    this.scheduleNotification();
  }
  
  subscribe(listener) {
    this.listeners.push(listener);
    return () => {
      const index = this.listeners.indexOf(listener);
      if (index > -1) {
        this.listeners.splice(index, 1);
      }
    };
  }
  
  scheduleNotification() {
    if (!this.notificationScheduled) {
      this.notificationScheduled = true;
      queueMicrotask(() => {
        this.notifyListeners();
      });
    }
  }
  
  notifyListeners() {
    this.notificationScheduled = false;
    const currentState = { ...this.state };
    
    this.listeners.forEach(listener => {
      try {
        listener(currentState);
      } catch (error) {
        console.error('State listener error:', error);
      }
    });
  }
}

const stateManager = new StateManager();

stateManager.subscribe(state => {
  console.log('State updated:', state);
});

// These updates will be batched
stateManager.setState({ user: 'Alice' });
stateManager.setState({ age: 30 });
stateManager.setState({ city: 'NYC' });
// Only one notification will be triggered

Global Object Access

Access to the global object across different environments.

/**
 * Global object reference
 */
declare var globalThis: typeof globalThis;

Usage Examples:

import 'core-js-pure/stable/global-this';

// Cross-environment global access
const getGlobal = () => {
  // Works in browsers, Node.js, Web Workers, etc.
  return globalThis;
};

// Feature detection utility
const hasFeature = (featureName) => {
  return featureName in globalThis;
};

console.log(hasFeature('fetch')); // true in browsers
console.log(hasFeature('process')); // true in Node.js

// Polyfill registration
const registerPolyfill = (name, implementation) => {
  if (!hasFeature(name)) {
    globalThis[name] = implementation;
  }
};

// Environment-specific utilities
const getEnvironment = () => {
  if (typeof window !== 'undefined') return 'browser';
  if (typeof global !== 'undefined') return 'node';
  if (typeof self !== 'undefined') return 'webworker';
  return 'unknown';
};

// Universal module pattern
const createUniversalModule = (moduleFactory) => {
  const global = globalThis;
  const module = moduleFactory(global);
  
  // Export in different module systems
  if (typeof exports === 'object') {
    // CommonJS
    module.exports = module;
  } else if (typeof define === 'function' && define.amd) {
    // AMD
    define(() => module);
  } else {
    // Global
    global.MyModule = module;
  }
  
  return module;
};

Common Patterns

API Client with URL Building

Creating robust API clients using URL and base64 utilities.

import URL from 'core-js-pure/stable/url';
import URLSearchParams from 'core-js-pure/stable/url-search-params';
import { btoa } from 'core-js-pure/stable/btoa';
import structuredClone from 'core-js-pure/stable/structured-clone';

class APIClient {
  constructor(baseURL, options = {}) {
    this.baseURL = baseURL;
    this.defaultHeaders = options.headers || {};
    this.timeout = options.timeout || 5000;
  }
  
  buildURL(endpoint, params = {}) {
    const url = new URL(endpoint, this.baseURL);
    
    Object.entries(params).forEach(([key, value]) => {
      if (value !== undefined && value !== null) {
        if (Array.isArray(value)) {
          value.forEach(v => url.searchParams.append(key, v.toString()));
        } else {
          url.searchParams.set(key, value.toString());
        }
      }
    });
    
    return url.href;
  }
  
  createAuthHeader(username, password) {
    const credentials = btoa(`${username}:${password}`);
    return `Basic ${credentials}`;
  }
  
  async request(endpoint, options = {}) {
    const url = this.buildURL(endpoint, options.params);
    
    const config = structuredClone({
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        ...this.defaultHeaders,
        ...options.headers
      },
      ...options
    });
    
    delete config.params; // Remove params from fetch options
    
    const response = await fetch(url, config);
    
    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`);
    }
    
    return response.json();
  }
  
  // Convenience methods
  get(endpoint, params, options = {}) {
    return this.request(endpoint, { ...options, params, method: 'GET' });
  }
  
  post(endpoint, data, options = {}) {
    return this.request(endpoint, {
      ...options,
      method: 'POST',
      body: JSON.stringify(data)
    });
  }
}

// Usage
const client = new APIClient('https://api.example.com/v1');

// GET with query parameters
const users = await client.get('users', {
  page: 2,
  limit: 10,
  roles: ['admin', 'user'],
  active: true
});

// POST with authentication
client.defaultHeaders.Authorization = client.createAuthHeader('user', 'pass');
const newUser = await client.post('users', {
  name: 'Alice',
  email: 'alice@example.com'
});

Message Serialization System

Building a robust message serialization system for inter-process communication.

import structuredClone from 'core-js-pure/stable/structured-clone';
import { btoa, atob } from 'core-js-pure/stable/atob';

class MessageSerializer {
  static serialize(message) {
    try {
      // Clone to ensure no reference sharing
      const cloned = structuredClone(message);
      
      // Add metadata
      const envelope = {
        version: '1.0',
        timestamp: Date.now(),
        data: cloned
      };
      
      // Serialize and encode
      const json = JSON.stringify(envelope);
      return btoa(json);
    } catch (error) {
      throw new Error(`Serialization failed: ${error.message}`);
    }
  }
  
  static deserialize(encoded) {
    try {
      const json = atob(encoded);
      const envelope = JSON.parse(json);
      
      // Validate envelope
      if (!envelope.version || !envelope.data) {
        throw new Error('Invalid message format');
      }
      
      return {
        data: envelope.data,
        metadata: {
          version: envelope.version,
          timestamp: envelope.timestamp,
          age: Date.now() - envelope.timestamp
        }
      };
    } catch (error) {
      throw new Error(`Deserialization failed: ${error.message}`);
    }
  }
}

// Message queue with persistence
class MessageQueue {
  constructor() {
    this.queue = [];
    this.processing = false;
  }
  
  enqueue(message) {
    const serialized = MessageSerializer.serialize(message);
    this.queue.push(serialized);
    this.scheduleProcessing();
  }
  
  scheduleProcessing() {
    if (!this.processing) {
      this.processing = true;
      queueMicrotask(() => {
        this.processQueue();
      });
    }
  }
  
  processQueue() {
    while (this.queue.length > 0) {
      const serialized = this.queue.shift();
      const { data, metadata } = MessageSerializer.deserialize(serialized);
      
      console.log(`Processing message (age: ${metadata.age}ms):`, data);
      
      // Process message...
    }
    
    this.processing = false;
  }
}

Progressive Enhancement Framework

Using web APIs for progressive enhancement with graceful degradation.

import queueMicrotask from 'core-js-pure/stable/queue-microtask';
import structuredClone from 'core-js-pure/stable/structured-clone';

class ProgressiveEnhancement {
  constructor() {
    this.features = new Map();
    this.initQueue = [];
    this.initialized = false;
  }
  
  registerFeature(name, implementation, fallback) {
    this.features.set(name, { implementation, fallback });
    
    if (this.initialized) {
      this.initializeFeature(name);
    }
  }
  
  initializeFeature(name) {
    const feature = this.features.get(name);
    if (!feature) return;
    
    queueMicrotask(() => {
      try {
        feature.implementation();
        console.log(`✓ Enhanced feature: ${name}`);
      } catch (error) {
        console.warn(`✗ Enhancement failed for ${name}:`, error);
        if (feature.fallback) {
          feature.fallback();
          console.log(`↳ Fallback activated for ${name}`);
        }
      }
    });
  }
  
  init() {
    if (this.initialized) return;
    
    this.initialized = true;
    
    // Initialize all registered features
    for (const [name] of this.features) {
      this.initializeFeature(name);
    }
  }
  
  // Feature detection utilities
  static hasFeature(feature) {
    const features = {
      fetch: () => typeof fetch !== 'undefined',
      websocket: () => typeof WebSocket !== 'undefined',
      serviceworker: () => 'serviceWorker' in navigator,
      indexeddb: () => typeof indexedDB !== 'undefined',
      geolocation: () => 'geolocation' in navigator
    };
    
    return features[feature] ? features[feature]() : false;
  }
}

// Usage
const enhancer = new ProgressiveEnhancement();

// Register enhanced features with fallbacks
enhancer.registerFeature('realtime-updates', 
  () => {
    if (!ProgressiveEnhancement.hasFeature('websocket')) {
      throw new Error('WebSocket not supported');
    }
    // WebSocket implementation
    console.log('WebSocket real-time updates enabled');
  },
  () => {
    // Polling fallback
    console.log('Using polling for updates');
  }
);

enhancer.registerFeature('offline-storage',
  () => {
    if (!ProgressiveEnhancement.hasFeature('indexeddb')) {
      throw new Error('IndexedDB not supported');
    }
    // IndexedDB implementation
    console.log('IndexedDB offline storage enabled');
  },
  () => {
    // localStorage fallback
    console.log('Using localStorage for offline storage');
  }
);

// Initialize all features
enhancer.init();

docs

array-operations.md

collection-types.md

error-types.md

index.md

iterator-helpers.md

math-utilities.md

object-methods.md

promise-utilities.md

reflection-api.md

string-processing.md

symbol-management.md

typedarray-operations.md

web-apis.md

tile.json