UNPKG

ember-legacy-class-transform

Version:
108 lines 16.1 kB
import { isSpecifierStringAbsolute, isSpecifierObjectAbsolute, deserializeSpecifier, serializeSpecifier } from '@glimmer/di'; import { assert } from './utils/debug'; import { detectLocalResolutionCollection } from './utils/specifiers'; export default class Resolver { constructor(config, registry) { this.config = config; this.registry = registry; } identify(specifier, referrer) { if (isSpecifierStringAbsolute(specifier)) { return specifier; } let s = deserializeSpecifier(specifier); let result; if (referrer) { let r = deserializeSpecifier(referrer); if (isSpecifierObjectAbsolute(r)) { assert('Specifier must not include a rootName, collection, or namespace when combined with an absolute referrer', s.rootName === undefined && s.collection === undefined && s.namespace === undefined); s.rootName = r.rootName; s.collection = r.collection; let definitiveCollection = this._definitiveCollection(s.type); if (!s.name) { /* * For specifiers without a name use the referrer's name and * do not fallback to any other resolution rules. */ s.namespace = r.namespace; s.name = r.name; return this._serializeAndVerify(s); } s.namespace = r.namespace ? r.namespace + '/' + r.name : r.name; if (detectLocalResolutionCollection(s) === definitiveCollection) { /* * For specifiers with a name, try local resolution. Based on * the referrer. */ if (result = this._serializeAndVerify(s)) { return result; } } // Look for a private collection in the referrer's namespace if (definitiveCollection) { s.namespace += '/-' + definitiveCollection; if (result = this._serializeAndVerify(s)) { return result; } } // Because local and private resolution has failed, clear all but `name` and `type` // to proceed with top-level resolution s.rootName = s.collection = s.namespace = undefined; } else { assert('Referrer must either be "absolute" or include a `type` to determine the associated type', r.type); // Look in the definitive collection for the associated type s.collection = this._definitiveCollection(r.type); assert(`'${r.type}' does not have a definitive collection`, s.collection); } } // If the collection is unspecified, use the definitive collection for the `type` if (!s.collection) { s.collection = this._definitiveCollection(s.type); assert(`'${s.type}' does not have a definitive collection`, s.collection); } if (!s.rootName) { // If the root name is unspecified, try the app's `rootName` first s.rootName = this.config.app.rootName || 'app'; if (result = this._serializeAndVerify(s)) { return result; } // Then look for an addon with a matching `rootName` let addonDef; if (s.namespace) { addonDef = this.config.addons && this.config.addons[s.namespace]; s.rootName = s.namespace; s.namespace = undefined; } else { addonDef = this.config.addons && this.config.addons[s.name]; s.rootName = s.name; s.name = 'main'; } } if (result = this._serializeAndVerify(s)) { return result; } } retrieve(specifier) { return this.registry.get(specifier); } resolve(specifier, referrer) { let id = this.identify(specifier, referrer); if (id) { return this.retrieve(id); } } _definitiveCollection(type) { let typeDef = this.config.types[type]; assert(`'${type}' is not a recognized type`, typeDef); return typeDef.definitiveCollection; } _serializeAndVerify(specifier) { let serialized = serializeSpecifier(specifier); if (this.registry.has(serialized)) { return serialized; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSXJFLE1BQU0sQ0FBQyxPQUFPO0lBSVosWUFBWSxNQUE2QixFQUFFLFFBQXdCO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBaUIsRUFBRSxRQUFpQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFjLENBQUM7UUFFbkIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLHlHQUF5RyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBRXZNLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxD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QztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFZO1FBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxJQUFJLElBQUksNEJBQTRCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztJQUN0QyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBb0I7UUFDOUMsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJlc29sdmVyIGFzIElSZXNvbHZlcixcbiAgU3BlY2lmaWVyLFxuICBpc1NwZWNpZmllclN0cmluZ0Fic29sdXRlLFxuICBpc1NwZWNpZmllck9iamVjdEFic29sdXRlLFxuICBkZXNlcmlhbGl6ZVNwZWNpZmllcixcbiAgc2VyaWFsaXplU3BlY2lmaWVyXG59IGZyb20gJ0BnbGltbWVyL2RpJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vdXRpbHMvZGVidWcnO1xuaW1wb3J0IHsgZGV0ZWN0TG9jYWxSZXNvbHV0aW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vdXRpbHMvc3BlY2lmaWVycyc7XG5pbXBvcnQgeyBNb2R1bGVSZWdpc3RyeSB9IGZyb20gJy4vbW9kdWxlLXJlZ2lzdHJ5JztcbmltcG9ydCB7IFJlc29sdmVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcmVzb2x2ZXItY29uZmlndXJhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc29sdmVyIGltcGxlbWVudHMgSVJlc29sdmVyIHtcbiAgcHVibGljIGNvbmZpZzogUmVzb2x2ZXJDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgcmVnaXN0cnk6IE1vZHVsZVJlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVzb2x2ZXJDb25maWd1cmF0aW9uLCByZWdpc3RyeTogTW9kdWxlUmVnaXN0cnkpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gIH1cblxuICBpZGVudGlmeShzcGVjaWZpZXI6IHN0cmluZywgcmVmZXJyZXI/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChpc1NwZWNpZmllclN0cmluZ0Fic29sdXRlKHNwZWNpZmllcikpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXI7XG4gICAgfVxuXG4gICAgbGV0IHMgPSBkZXNlcmlhbGl6ZVNwZWNpZmllcihzcGVjaWZpZXIpO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZztcblxuICAgIGlmIChyZWZlcnJlcikge1xuICAgICAgbGV0IHIgPSBkZXNlcmlhbGl6ZVNwZWNpZmllcihyZWZlcnJlcik7XG5cbiAgICAgIGlmIChpc1NwZWNpZmllck9iamVjdEFic29sdXRlKHIpKSB7XG4gICAgICAgIGFzc2VydCgnU3BlY2lmaWVyIG11c3Qgbm90IGluY2x1ZGUgYSByb290TmFtZSwgY29sbGVjdGlvbiwgb3IgbmFtZXNwYWNlIHdoZW4gY29tYmluZWQgd2l0aCBhbiBhYnNvbHV0ZSByZWZlcnJlcicsIHMucm9vdE5hbWUgPT09IHVuZGVmaW5lZCAmJiBzLmNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCAmJiBzLm5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBzLnJvb3ROYW1lID0gci5yb290TmFtZTtcbiAgICAgICAgcy5jb2xsZWN0aW9uID0gci5jb2xsZWN0aW9uO1xuICAgICAgICBsZXQgZGVmaW5pdGl2ZUNvbGxlY3Rpb24gPSB0aGlzLl9kZWZpbml0aXZlQ29sbGVjdGlvbihzLnR5cGUpO1xuXG4gICAgICAgIGlmICghcy5uYW1lKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBGb3Igc3BlY2lmaWVycyB3aXRob3V0IGEgbmFtZSB1c2UgdGhlIHJlZmVycmVyJ3MgbmFtZSBhbmRcbiAgICAgICAgICAgKiBkbyBub3QgZmFsbGJhY2sgdG8gYW55IG90aGVyIHJlc29sdXRpb24gcnVsZXMuXG4gICAgICAgICAgICovXG4gICAgICAgICAgcy5uYW1lc3BhY2UgPSByLm5hbWVzcGFjZTtcbiAgICAgICAgICBzLm5hbWUgPSByLm5hbWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZUFuZFZlcmlmeShzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHMubmFtZXNwYWNlID0gci5uYW1lc3BhY2UgPyByLm5hbWVzcGFjZSArICcvJyArIHIubmFtZSA6IHIubmFtZTtcbiAgICAgICAgaWYgKGRldGVjdExvY2FsUmVzb2x1dGlvbkNvbGxlY3Rpb24ocykgPT09IGRlZmluaXRpdmVDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBGb3Igc3BlY2lmaWVycyB3aXRoIGEgbmFtZSwgdHJ5IGxvY2FsIHJlc29sdXRpb24uIEJhc2VkIG9uXG4gICAgICAgICAgICogdGhlIHJlZmVycmVyLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChyZXN1bHQgPSB0aGlzLl9zZXJpYWxpemVBbmRWZXJpZnkocykpIHsgcmV0dXJuIHJlc3VsdDsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vayBmb3IgYSBwcml2YXRlIGNvbGxlY3Rpb24gaW4gdGhlIHJlZmVycmVyJ3MgbmFtZXNwYWNlXG4gICAgICAgIGlmIChkZWZpbml0aXZlQ29sbGVjdGlvbikge1xuICAgICAgICAgIHMubmFtZXNwYWNlICs9ICcvLScgKyBkZWZpbml0aXZlQ29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAocmVzdWx0ID0gdGhpcy5fc2VyaWFsaXplQW5kVmVyaWZ5KHMpKSB7IHJldHVybiByZXN1bHQ7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlY2F1c2UgbG9jYWwgYW5kIHByaXZhdGUgcmVzb2x1dGlvbiBoYXMgZmFpbGVkLCBjbGVhciBhbGwgYnV0IGBuYW1lYCBhbmQgYHR5cGVgXG4gICAgICAgIC8vIHRvIHByb2NlZWQgd2l0aCB0b3AtbGV2ZWwgcmVzb2x1dGlvblxuICAgICAgICBzLnJvb3ROYW1lID0gcy5jb2xsZWN0aW9uID0gcy5uYW1lc3BhY2UgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQoJ1JlZmVycmVyIG11c3QgZWl0aGVyIGJlIFwiYWJzb2x1dGVcIiBvciBpbmNsdWRlIGEgYHR5cGVgIHRvIGRldGVybWluZSB0aGUgYXNzb2NpYXRlZCB0eXBlJywgci50eXBlKTtcblxuICAgICAgICAvLyBMb29rIGluIHRoZSBkZWZpbml0aXZlIGNvbGxlY3Rpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHR5cGVcbiAgICAgICAgcy5jb2xsZWN0aW9uID0gdGhpcy5fZGVmaW5pdGl2ZUNvbGxlY3Rpb24oci50eXBlKTtcbiAgICAgICAgYXNzZXJ0KGAnJHtyLnR5cGV9JyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5pdGl2ZSBjb2xsZWN0aW9uYCwgcy5jb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY29sbGVjdGlvbiBpcyB1bnNwZWNpZmllZCwgdXNlIHRoZSBkZWZpbml0aXZlIGNvbGxlY3Rpb24gZm9yIHRoZSBgdHlwZWBcbiAgICBpZiAoIXMuY29sbGVjdGlvbikge1xuICAgICAgcy5jb2xsZWN0aW9uID0gdGhpcy5fZGVmaW5pdGl2ZUNvbGxlY3Rpb24ocy50eXBlKTtcbiAgICAgIGFzc2VydChgJyR7cy50eXBlfScgZG9lcyBub3QgaGF2ZSBhIGRlZmluaXRpdmUgY29sbGVjdGlvbmAsIHMuY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFzLnJvb3ROYW1lKSB7XG4gICAgICAvLyBJZiB0aGUgcm9vdCBuYW1lIGlzIHVuc3BlY2lmaWVkLCB0cnkgdGhlIGFwcCdzIGByb290TmFtZWAgZmlyc3RcbiAgICAgIHMucm9vdE5hbWUgPSB0aGlzLmNvbmZpZy5hcHAucm9vdE5hbWUgfHwgJ2FwcCc7XG4gICAgICBpZiAocmVzdWx0ID0gdGhpcy5fc2VyaWFsaXplQW5kVmVyaWZ5KHMpKSB7IHJldHVybiByZXN1bHQ7IH1cblxuICAgICAgLy8gVGhlbiBsb29rIGZvciBhbiBhZGRvbiB3aXRoIGEgbWF0Y2hpbmcgYHJvb3ROYW1lYFxuICAgICAgbGV0IGFkZG9uRGVmO1xuICAgICAgaWYgKHMubmFtZXNwYWNlKSB7XG4gICAgICAgIGFkZG9uRGVmID0gdGhpcy5jb25maWcuYWRkb25zICYmIHRoaXMuY29uZmlnLmFkZG9uc1tzLm5hbWVzcGFjZV07XG4gICAgICAgIHMucm9vdE5hbWUgPSBzLm5hbWVzcGFjZTtcbiAgICAgICAgcy5uYW1lc3BhY2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZG9uRGVmID0gdGhpcy5jb25maWcuYWRkb25zICYmIHRoaXMuY29uZmlnLmFkZG9uc1tzLm5hbWVdO1xuICAgICAgICBzLnJvb3ROYW1lID0gcy5uYW1lO1xuICAgICAgICBzLm5hbWUgPSAnbWFpbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCA9IHRoaXMuX3NlcmlhbGl6ZUFuZFZlcmlmeShzKSkgeyByZXR1cm4gcmVzdWx0OyB9XG4gIH1cblxuICByZXRyaWV2ZShzcGVjaWZpZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0KHNwZWNpZmllcik7XG4gIH1cblxuICByZXNvbHZlKHNwZWNpZmllcjogc3RyaW5nLCByZWZlcnJlcj86IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGlkID0gdGhpcy5pZGVudGlmeShzcGVjaWZpZXIsIHJlZmVycmVyKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldHJpZXZlKGlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWZpbml0aXZlQ29sbGVjdGlvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0eXBlRGVmID0gdGhpcy5jb25maWcudHlwZXNbdHlwZV07XG4gICAgYXNzZXJ0KGAnJHt0eXBlfScgaXMgbm90IGEgcmVjb2duaXplZCB0eXBlYCwgdHlwZURlZik7XG4gICAgcmV0dXJuIHR5cGVEZWYuZGVmaW5pdGl2ZUNvbGxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVBbmRWZXJpZnkoc3BlY2lmaWVyOiBTcGVjaWZpZXIpOiBzdHJpbmcge1xuICAgIGxldCBzZXJpYWxpemVkID0gc2VyaWFsaXplU3BlY2lmaWVyKHNwZWNpZmllcik7XG4gICAgaWYgKHRoaXMucmVnaXN0cnkuaGFzKHNlcmlhbGl6ZWQpKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==