@lopatnov/namespace
TypeScript icon, indicating that this package has built-in type declarations

1.3.0 • Public • Published

@lopatnov/namespace Twitter

npm NPM version License GitHub issues GitHub forks GitHub stars GitHub top language

build-and-test-package publish-npm-package Libraries.io dependency status for latest release

Patreon sobe.ru LinkedIn

Dynamic namespace creation

Install

https://nodei.co/npm/@lopatnov/namespace.png?downloads=true&downloadRank=true&stars=true

npm install @lopatnov/namespace

Browser

<script src="//lopatnov.github.io/namespace/dist/namespace.min.js"></script>

Import package to the project

TypeScript

import Namespace from "@lopatnov/namespace";

JavaScript

var Namespace = require("@lopatnov/namespace");

TypeScript and JavaScript samples

namespace creation

const ns = new Namespace(); // <-- create namespace variable

ns.namespace("a.b.c.d"); // <-- create inner namespaces
ns.namespace("a.b.c.e"); // <-- Function namespace(path: NamespacePath): Namespace
ns.namespace("a.b.f.g"); // <--
ns.namespace("a.i.h.k"); // <--
ns.namespace("a.i.h.l"); // <--
ns.namespace("a.m.n.o"); // <--

// Access to inner namespaces
const anyNS: any = ns; // <-- to avoid type casting
console.log(anyNS.a.b.f.g instanceof Namespace); // true
console.log((ns as any).a.b.c.d instanceof Namespace); // true
console.log((ns as any).a.b.c.e instanceof Namespace); // true

attach namespace to a current object

let shapes = {
    color: "green",
    count: 3
};
let shapesSpace = Namespace.attach(shapes);

shapesSpace.namespace('Triangles');
shapesSpace.namespace('Circles');
shapesSpace.namespace('Rectangles.Squares');

console.log(shapesSpace.exists('Triangles')); // true
console.log(shapesSpace.exists('Circles')); // true
console.log(shapesSpace.exists('Rectangles.Squares')); // true
console.log(shapesSpace.color); // "green"
console.log(shapesSpace.count); // 3
console.log(shapes === shapesSpace); // true

checking that object inside namespace exists

// Function exists(path: NamespacePath): boolean
console.log(ns.exists('a.b.c.d')); // true
console.log(ns.exists('a.b.c.e')); // true
console.log(ns.exists('a.b.f.g')); // true
console.log(ns.exists('a.i.h.k')); // true
console.log(ns.exists('a.i.h.l')); // true
console.log(ns.exists('a.m.n.o')); // true

create namespace through direct call

var dynamicNamespace: any = Namespace; // <-- escape current TypeScript restrictions with any Type
var a = dynamicNamespace('Pacific.Ocean'); // <-- call as function
console.log(a.Pacific.Ocean instanceof Namespace); // true

create namespace through new operator

var n: any = new Namespace("Hello.World");
console.log(n.Hello.World instanceof Namespace); // true
var eeny: any = new Namespace('meeny.miny.moe[Catch][a][tiger][by][the][toe]');
console.log(eeny.meeny.miny.moe.Catch.a.tiger.by.the.toe instanceof Namespace);  // true

go to inner object

var kitchenRadar = new Namespace();
    kitchenRadar.namespace('big.fruits');
    kitchenRadar.namespace('big.eggs');
    kitchenRadar.namespace('small.dishes');
    kitchenRadar.namespace('small.cookies');

    var fruits = kitchenRadar.goto('big.fruits'); // <-- goto(path: NamespacePath): any
    var eggs = kitchenRadar.goto('big.eggs');
    var dishes = kitchenRadar.goto('small.dishes');
    var cookies = kitchenRadar.goto('small.cookies');

    console.log(fruits === (kitchenRadar as any).big.fruits); // true
    console.log(eggs === (kitchenRadar as any).big.eggs); // true
    console.log(dishes === (kitchenRadar as any).small.dishes); // true
    console.log(cookies === (kitchenRadar as any).small.cookies); // true

apply namespace as a property of an object

var persons: any = {};
var extension = new Namespace('with.small.kitty');

extension.applyTo(persons, 'Julia'); // Function applyTo(context: any, name: string): void
extension.applyTo(persons, 'Kathy');
extension.applyTo(persons, 'Liza');

console.log(persons.Julia.with.small.kitty instanceof Namespace); // true
console.log(persons.Kathy.with.small.kitty instanceof Namespace); // true
console.log(persons.Liza.with.small.kitty instanceof Namespace); // true

Demo

See, how it's working: https://runkit.com/lopatnov/namespace

Test it with a runkit: https://npm.runkit.com/@lopatnov/namespace

Rights and Agreements

License Apache-2.0

Copyright 2020–2021 Oleksandr Lopatnov

Dependencies (0)

    Dev Dependencies (14)

    Package Sidebar

    Install

    npm i @lopatnov/namespace

    Weekly Downloads

    0

    Version

    1.3.0

    License

    Apache-2.0

    Unpacked Size

    53.5 kB

    Total Files

    12

    Last publish

    Collaborators

    • lopatnov