ember-source
Version:
A JavaScript framework for creating ambitious web applications
137 lines (131 loc) • 4.02 kB
JavaScript
import { c as context } from './env-CwR5CFCu.js';
import './mandatory-setter-BiXq-dpN.js';
import '@embroider/macros';
import { g as getName, s as setName } from './name-Dx2bGFVv.js';
const hasOwnProperty = Object.prototype.hasOwnProperty;
let searchDisabled = false;
const flags = {
_set: 0,
_unprocessedNamespaces: false,
get unprocessedNamespaces() {
return this._unprocessedNamespaces;
},
set unprocessedNamespaces(v) {
this._set++;
this._unprocessedNamespaces = v;
}
};
let unprocessedMixins = false;
const NAMESPACES = [];
const NAMESPACES_BY_ID = Object.create(null);
function addNamespace(namespace) {
flags.unprocessedNamespaces = true;
NAMESPACES.push(namespace);
}
function removeNamespace(namespace) {
let name = getName(namespace);
delete NAMESPACES_BY_ID[name];
NAMESPACES.splice(NAMESPACES.indexOf(namespace), 1);
if (name in context.lookup && namespace === context.lookup[name]) {
context.lookup[name] = undefined;
}
}
function findNamespaces() {
if (!flags.unprocessedNamespaces) {
return;
}
let lookup = context.lookup;
let keys = Object.keys(lookup);
for (let key of keys) {
// Only process entities that start with uppercase A-Z
if (!isUppercase(key.charCodeAt(0))) {
continue;
}
let obj = tryIsNamespace(lookup, key);
if (obj) {
setName(obj, key);
}
}
}
function findNamespace(name) {
if (!searchDisabled) {
processAllNamespaces();
}
return NAMESPACES_BY_ID[name];
}
function processNamespace(namespace) {
_processNamespace([namespace.toString()], namespace, new Set());
}
function processAllNamespaces() {
let unprocessedNamespaces = flags.unprocessedNamespaces;
if (unprocessedNamespaces) {
findNamespaces();
flags.unprocessedNamespaces = false;
}
if (unprocessedNamespaces || unprocessedMixins) {
let namespaces = NAMESPACES;
for (let namespace of namespaces) {
processNamespace(namespace);
}
unprocessedMixins = false;
}
}
function isSearchDisabled() {
return searchDisabled;
}
function setSearchDisabled(flag) {
searchDisabled = Boolean(flag);
}
function setUnprocessedMixins() {
unprocessedMixins = true;
}
function _processNamespace(paths, root, seen) {
let idx = paths.length;
let id = paths.join('.');
NAMESPACES_BY_ID[id] = root;
setName(root, id);
// Loop over all of the keys in the namespace, looking for classes
for (let key in root) {
if (!hasOwnProperty.call(root, key)) {
continue;
}
let obj = root[key];
// If we are processing the `Ember` namespace, for example, the
// `paths` will start with `["Ember"]`. Every iteration through
// the loop will update the **second** element of this list with
// the key, so processing `Ember.View` will make the Array
// `['Ember', 'View']`.
paths[idx] = key;
// If we have found an unprocessed class
if (obj && getName(obj) === void 0) {
// Replace the class' `toString` with the dot-separated path
setName(obj, paths.join('.'));
// Support nested namespaces
} else if (obj && isNamespace(obj)) {
// Skip aliased namespaces
if (seen.has(obj)) {
continue;
}
seen.add(obj);
// Process the child namespace
_processNamespace(paths, obj, seen);
}
}
paths.length = idx; // cut out last item
}
function isNamespace(obj) {
return obj != null && typeof obj === 'object' && obj.isNamespace;
}
function isUppercase(code) {
return code >= 65 && code <= 90 // A
; // Z
}
function tryIsNamespace(lookup, prop) {
try {
let obj = lookup[prop];
return (obj !== null && typeof obj === 'object' || typeof obj === 'function') && obj.isNamespace && obj;
} catch (_e) {
// continue
}
}
export { NAMESPACES as N, NAMESPACES_BY_ID as a, addNamespace as b, findNamespaces as c, processNamespace as d, setSearchDisabled as e, findNamespace as f, isSearchDisabled as i, processAllNamespaces as p, removeNamespace as r, setUnprocessedMixins as s };