Dynamic namespace creation
As NPM package
npm install @lopatnov/namespace
As browser script
<script src="//lopatnov.github.io/namespace/dist/namespace.min.js"></script>
import Namespace from "@lopatnov/namespace";
var Namespace = require("@lopatnov/namespace");
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
let shapes = {
color: "green",
count: 3
};
let shapesSpace = Namespace.attach(shapes); // <-- Namespace.attach(to: T) => T & Namespace
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
// 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
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
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
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
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
See, how it's working: https://runkit.com/lopatnov/namespace
Test it with a runkit: https://npm.runkit.com/@lopatnov/namespace
License Apache-2.0
Copyright 2020–2021 Oleksandr Lopatnov