forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathNpmHints.js
More file actions
1 lines (1 loc) · 5.75 KB
/
Copy pathNpmHints.js
File metadata and controls
1 lines (1 loc) · 5.75 KB
1
define(function(require,exports,module){const JSONUtils=require("language/JSONUtils"),Strings=require("strings"),semver=require("thirdparty/semver.browser"),DefaultProviders=require("languageTools/DefaultProviders"),_=require("thirdparty/lodash"),NpmRegistry=require("./NpmRegistry"),DEP_SECTIONS=["dependencies","devDependencies","peerDependencies","optionalDependencies"],PACKAGE_JSON="package.json",MIN_QUERY_LENGTH=2,SEARCH_DEBOUNCE_MS=250,MAX_VERSION_HINTS=50;function NpmHints(){this.editor=null,this.ctxInfo=null,this._searchSession=0,this._searchTimer=null}function _isPackageJson(editor){return editor&&editor.document&&editor.document.file&&editor.document.file.name===PACKAGE_JSON}function _depContext(ctxInfo){return!(!ctxInfo||!ctxInfo.tokenType||-1===DEP_SECTIONS.indexOf(ctxInfo.parentKeyName))}function _query(ctxInfo){const raw=JSONUtils.stripQuotes(ctxInfo.token.string.substr(0,ctxInfo.offset)).trim();return JSONUtils.regexAllowedChars.test(raw)?"":raw}function _highlightMatches($hintObj,mainText,query){if(!query)return void $hintObj.text(mainText);const lower=mainText.toLowerCase(),needle=query.toLowerCase();let from=0,idx;for(;-1!==(idx=lower.indexOf(needle,from));)idx>from&&$hintObj.append(document.createTextNode(mainText.slice(from,idx))),$hintObj.append($("<span>").addClass("matched-hint").text(mainText.slice(idx,idx+needle.length))),from=idx+needle.length;$hintObj.append(document.createTextNode(mainText.slice(from)))}function _hintItem(mainText,description,mode,query){const $hintItem=$("<span>").addClass("brackets-hints npm-hint"),$hintObj=$("<span>").addClass("hint-obj");return _highlightMatches($hintObj,mainText,query),$hintItem.append($hintObj),description&&("name"===mode?$hintItem.data("npmDoc",description):$hintItem.append($("<span>").addClass("hint-description").text(description))),$hintItem.data("npmMode",mode),$hintItem}NpmHints.prototype.hasHints=function(editor,implicitChar){return!!_isPackageJson(editor)&&(this.editor=editor,this.ctxInfo=JSONUtils.getContextInfo(editor,editor.getCursorPos(),!0),_depContext(this.ctxInfo))},NpmHints.prototype._nameHints=function(query,explicitInvocation){const self=this,deferred=$.Deferred(),session=++this._searchSession;this._searchTimer&&clearTimeout(this._searchTimer);const delay=explicitInvocation?0:250;return this._searchTimer=setTimeout(function(){self._searchTimer=null,NpmRegistry.searchPackages(query).then(function(results){session===self._searchSession?deferred.resolve({hints:results.map(function(pkg){return _hintItem(pkg.name,pkg.description,"name",query)}),match:null,selectInitial:!0,handleWideResults:!1}):deferred.reject()}).catch(function(){deferred.reject()})},delay),deferred},NpmHints.prototype._versionHints=function(packageName,query){const deferred=$.Deferred();return NpmRegistry.getVersions(packageName).then(function(result){const sorted=result.versions.slice().sort(semver.rcompare),bare=query.replace(/^[\^~]/,"");let matching=sorted;bare&&((matching=sorted.filter(function(version){return 0===version.indexOf(bare)})).length||(matching=sorted));const hints=[];!result.latest||bare&&0!==result.latest.indexOf(bare)||(hints.push(_hintItem("^"+result.latest,Strings.NPM_HINT_LATEST_MINOR,"version")),hints.push(_hintItem("~"+result.latest,Strings.NPM_HINT_LATEST_PATCH,"version"))),matching.slice(0,50).forEach(function(version){hints.push(_hintItem(version,null,"version",bare))}),deferred.resolve({hints:hints,match:null,selectInitial:!0,handleWideResults:!1})}).catch(function(){deferred.reject()}),deferred},NpmHints.prototype.getHints=function(implicitChar){const ctxInfo=this.ctxInfo=JSONUtils.getContextInfo(this.editor,this.editor.getCursorPos(),!0);if(!_depContext(ctxInfo))return null;let query=_query(ctxInfo);if(ctxInfo.tokenType===JSONUtils.TOKEN_KEY){if(query.length<2&&null===implicitChar){const fullToken=JSONUtils.stripQuotes(ctxInfo.token.string).trim();if(fullToken.length>query.length&&!JSONUtils.regexAllowedChars.test(fullToken)&&(query=fullToken),!query.length)return{hints:[],match:null,selectInitial:!0,handleWideResults:!1}}else if(query.length<2)return{hints:[],match:null,selectInitial:!0,handleWideResults:!1};return this._nameHints(query,null===implicitChar)}return this._versionHints(ctxInfo.keyName,query)},NpmHints.prototype.onHighlight=function($hint){const $span=$hint.closest("li").data("hint"),doc=$span&&$span.data&&$span.data("npmDoc"),mode=$span&&$span.data&&$span.data("npmMode");doc&&"name"===mode?DefaultProviders.showHintDocPopup($hint,"<p>"+_.escape(doc)+"</p>"):DefaultProviders.hideHintDocPopup()},NpmHints.prototype.insertHint=function($hint){const ctxInfo=JSONUtils.getContextInfo(this.editor,this.editor.getCursorPos(),!1,!0),pos=this.editor.getCursorPos(),mode=$hint.data("npmMode"),start={line:pos.line,ch:-1},end={line:pos.line,ch:-1};let completion=$hint.find(".hint-obj").text(),startChar,quoteChar='"';return ctxInfo.tokenType===JSONUtils.TOKEN_KEY&&"name"===mode?(startChar=ctxInfo.token.string.charAt(0),/^['"]$/.test(startChar)&&(quoteChar=startChar),completion=quoteChar+completion+quoteChar,ctxInfo.shouldReplace||(completion+=': ""'),start.ch=pos.ch-ctxInfo.offset,end.ch=ctxInfo.token.end,this.editor.document.replaceRange(completion,start,end),!ctxInfo.shouldReplace&&(this.editor.setCursorPos(start.line,start.ch+completion.length-1),!0)):ctxInfo.tokenType===JSONUtils.TOKEN_VALUE&&(JSONUtils.regexAllowedChars.test(ctxInfo.token.string)?start.ch=end.ch=pos.ch:ctxInfo.shouldReplace?(start.ch=ctxInfo.token.start,end.ch=ctxInfo.token.end):(start.ch=pos.ch-ctxInfo.offset,end.ch=ctxInfo.token.end),startChar=ctxInfo.token.string.charAt(0),/^['"]$/.test(startChar)&&(quoteChar=startChar),this.editor.document.replaceRange(quoteChar+completion+quoteChar,start,end),!1)},exports.NpmHints=NpmHints,exports.DEP_SECTIONS=DEP_SECTIONS,exports.isPackageJson=_isPackageJson,exports.depContext=_depContext});