How to use scopeFor method in mountebank

Best JavaScript code snippet using mountebank

dump-load.js

Source:dump-load.js Github

copy

Full Screen

1import * as FT from "../extend/feature-tools.js";2// экспорт состояния дерева объектов nodesystem в json-простой объект3// а также создание дерева по этому состоянию4// update: manualParamsMode получается это идет признак источника восстановления и сообразно разное поведение5// manualParamsMode=true => все параметры считаются выставленные вручную, setParam( .... true )6// что приведет при дальнейшем дампе к их сохранению в дамп7// manualParamsMode=false => все параметры считаются устанавливаемыми программно и сообразно потом в дамп не попадут8// и более того, это используется для анализа стирания объектов которые не упоминаются в дампе9// todo переразобраться с manual и forcecreate(dumpyInserted) - тут где-то чувствуется что будет ясность причин.10export default function setup( m ) {11 // создание дерева по json-описанию12 // с возможностью синхронизации в существующее дерево13 14 // выяснилось что раз мы не держим во вьюзавре корня,15 // то надо уметь создавать объекты по дампу..16 // но - как нам это поможет выставлять параметры на созданной сцене?17 // видимо это все-таки создающе-синхронизирующая функция18 // и ее второй аргумент это как раз - текущий имеющийся объект19 // короче я все еще в сомнениях - тут смешано получается создание дерева по описанию20 // и 2) синхронизация этого дерева из описания, и 21 // и еще это упирается в ситуацию а что если корень дерева в памяти не того типа что в описании?22 23 // returns promise24 25 m.createSyncFromDump = function( dump, _existingObj, parent, desiredName, manualParamsMode, $scopeFor )26 {27 // это из списков.. присобачивать поверх всего что захочут давать..28 if (dump.$scopeFor) {29 // но есть случай когда мы это уже учли, и тогда этого делать не надо30 if (!$scopeFor?.skip_dump_scopes)31 $scopeFor = dump.$scopeFor;32 }33 //let scopeFor_param = $scopeFor;34 if (!$scopeFor) {35 //debugger;36 if (_existingObj)37 $scopeFor = _existingObj.$scopes.top();38 }39 // вроде как не положено ему. он ж ручной, от пользователя.. (из дампа поди пришел страницы)40 // но выяснилось это противоречит ситуации когда мы пытаемся изобразить действия пользователя а при этом таки опираемся на scope..41 // например в аргументах make={ |a b| some @a @b } и оно там сохранит эти a b но передать их надо..42 // if (dump.manual) $scopeFor = null;43 // выяснилось что у нас могут на промисах шпарить создание детей вовсю, когда объект уже решили удалить44 if (parent && parent.removed) {45 return Promise.resolve("parent_removed");46 }47 /*48 if (parent) {49 let root = parent.findRoot();50 if (root.getPath().split("/").length > 2)51 debugger;52 }53 */54 var obj = _existingObj;55 if (!obj || (dump.type && obj.historicalType != dump.type && dump.manual)) {56 if (!obj || obj.ns.parent) { // пусть это работает пока не для корня дерева - там непонятно мне пока57 // var opts = { parent: parent, type: dump.type, name: dump.name }58 var opts = Object.assign( {}, dump, { parent: parent, name: desiredName } );59 obj = dump.type ? m.create_obj_by_type( opts ) : m.createObj( opts );60 if (!obj) {61 console.error("createSyncFromDump: failed to create object! opts=",opts);62 console.error("will create some obj to avoid js errors, but it is not the desired one");63 obj = m.createObj( { parent: parent, name: desiredName || "ehh" });64 }65 //obj.$vz_created_by_dump = dump; // похраним...66 //obj.$vz_features_from_dump = dump.features;67 }68 }69 // в dump должно быть поле type, оно нам все и создаст что надо70 71// if (!$scopeFor)72// $scopeFor = obj.$scopes.createScope("createSyncFromDump");73 // F-FEAT-PARAMS74 if (dump.feature_of_env) {75 obj.hosted = true;76 obj.host = dump.feature_of_env;77 } else {78 obj.hosted = false;79 obj.host = obj;80 }81 // F-LEXICAL-PARENT82 if (dump.lexicalParent)83 obj.lexicalParent = dump.lexicalParent;84 // неописанное еще приключение85 if (dump.$name) {86 obj.$env_extra_names ||= {};87 obj.$env_extra_names[ dump.$name ] = true;88 };89 // F-SCOPE90 let name_for_scope = desiredName || dump.$name;91 if ($scopeFor && !_existingObj) {92 obj.$scopes.addScopeRef( $scopeFor );93 if (dump.name_is_autogenerated)94 {95 // ничего не делаем, не засоряем среду96 dump.name_is_autogenerated;97 }98 else99 {100 if (name_for_scope == null || name_for_scope == "")101 console.error("scopes: name_for_scope is blank",name_for_scope,obj)102 if ($scopeFor[ name_for_scope ]) {103 console.error("scopes: duplicated name!",name_for_scope,'me=',obj,'existing=',$scopeFor[ name_for_scope ])104 if (dump.locinfo)105 console.log( dump.locinfo );106 }107 else108 $scopeFor.$add( name_for_scope, obj );109 };110 }111 if (dump.locinfo)112 obj.$locinfo = dump.locinfo;113 //let keepExistingParamsOrig = dump.keepExistingParams;114 // трешовая логика но пока лучше не придумал115 // если мы в режиме создания нового объекта то - надо включать и логику сохранения параметров116 // чтобы вновь поступающие фичи, параметры, ссылки, не затирали то что уже создано117 /*118 if (!_existingObj) {119 dump.keepExistingParams = true; 120 }121 */122/*123 if (dump.$scopeParent) {124 obj.$scopes.addScopeRef( dump.$scopeParent );125 // окей сохранили на парента. теперь надо в него записаться..126 if (dump.$scopeParent[ desiredName ]) {127 if (!dump.name_is_autogenerated)128 console.error("scopes: duplicated name!",desiredName,obj)129 }130 else131 dump.$scopeParent[ desiredName ] = obj;132 }133*/134 /// походу надо параметры до фич таки.. но тогда непонятно что есть restorefromdump...135 //let p1 = m.restoreFeatures( dump, obj, manualParamsMode, $scopeFor );136 // таким образом фичи имеют возможность заменить obj.restoreFromDump137 // и стать функторами138 //if (obj.removed)139 //debugger;140 let res = obj.restoreFromDump( dump,manualParamsMode, $scopeFor )141 // отправим событие создания объекта142 // хотя вероятно его стоит запихать в фичи.. но вопрос что это должно быть последним143 res.then( (res2) => {144 // @exp - тпу когда фичи все из описания применены, и параметры, и дети145 if (!_existingObj) {146 obj.emit("cocreate");147 }; // idea и еще emit("synced");148 });149 return res;150 }151 152 // тестовое - получается создает obj а наполнение потом уж153 m.createSyncFromDumpNow = function( dump, _existingObj, parent, desiredName )154 {155 debugger;156 var obj = _existingObj;157 if (!obj || (dump.type && obj.historicalType != dump.type && dump.manual)) {158 if (!obj || obj.ns.parent) { // пусть это работает пока не для корня дерева - там непонятно мне пока159 // var opts = { parent: parent, type: dump.type, name: dump.name }160 var opts = Object.assign( {}, dump, { parent: parent, name: desiredName } );161 obj = dump.type ? m.create_obj_by_type( opts ) : m.createObj( opts );162 if (!obj) {163 console.error("createSyncFromDump: failed to create object! opts=",opts);164 console.error("will create some obj to avoid js errors, but it is not the desired one");165 obj = m.createObj( { parent: parent, name: desiredName || "ehh" });166 }167 }168 }169 // в dump должно быть поле type, оно нам все и создаст что надо170 // F-FEAT-PARAMS171 if (dump.feature_of_env) {172 obj.hosted = true;173 obj.host = dump.feature_of_env;174 } else {175 obj.hosted = false;176 obj.host = obj;177 }178 debugger;179 // F-LEXICAL-PARENT180 if (dump.lexicalParent)181 obj.lexicalParent = dump.lexicalParent;182 // неописанное еще приключение183 if (dump.$name) {184 obj.$env_extra_names ||= {};185 obj.$env_extra_names[ dump.$name ] = true;186 } 187 m.restoreFeatures( dump, obj );188 // таким образом фичи имеют возможность заменить obj.restoreFromDump189 // и стать функторами190 obj.restoreFromDump( dump );191 return obj;192 }193 m.restoreParams = function ( dump, obj, manualParamsMode, $scopeFor) {194 if (dump.manual) manualParamsMode = true; // такой вот прием.. а то "ручные объекты" потом не сохранить получается..195 var h = dump.params || {};196 var keys = Object.keys(h);197 keys.forEach( function(name) {198 //console.log("setting param",name,h[name]);199 // if (name == "manual_features") return; // проверка200 // F-KEEP-EXISTING-PARAMS201 if (dump.keepExistingParams && (obj.hasParam( name ) || obj.hasLinksToParam( name ))) return;202 let v = h[name];203 // фишка. v это у нас общее описание на уровне dump.204 // если мы туда прописываем lexicalParent то мы пишем в общую запись205 // это надо специальным образом как-то зарешать206 // F-LEXICAL-PARENT207 // здесь происходит назначение "лексического родителя" в dump-описания окружений, хранимых в параметрах208 let bemanual = manualParamsMode;209 if (v?.needLexicalParent) {210 if (!$scopeFor)211 debugger;212 //v.lexicalParent = obj;213 if (Array.isArray(v)) // там список окружений - всем назначим..214 {215 // старое for (let q of v) q.lexicalParent = obj;216 // новое - сделаем тупо, потом можно оптимизировать например создавая спец-структуру217 // вида newrecord -> lexicalparent, array..218 219 let ea = v.env_args; // F-ENV-ARGS220 v = v.map(a => ({...a})); // типо копируем.. ну ок...221 if (ea) // F-ENV-ARGS222 v.env_args = ea;223 // updated224 // for (let q of v) q.lexicalParent = obj;225 for (let q of v) 226 q.$scopeFor = $scopeFor;227 //v.this_is_env_list_description = true; 228 bemanual=false;229 }230 }231 obj.setParam( name, v, bemanual ); // ставим true - в том смысле что это установка из232 // F-SCOPE-PARAMS233 /* перенесено в фичу var234 if (obj.is_feature_applied("data"))235 {236 if (Number.isInteger(parseFloat(name)) || name == "args_count")237 {238 }239 else {240 if ($scopeFor[ name ]) {241 console.error("scopes: data param duplicated name!",name,'me=',obj,'cell ',name,'existing=',$scopeFor[ name ])242 if (dump.locinfo)243 console.log( dump.locinfo );244 }245 else246 {247 $scopeFor.$add( name, obj.get_cell(name) );248 console.log("data: added name to scope",name,$scopeFor)249 } 250 };251 };252 */253 // F-LINKS-OVERWRITE254 // удалить ссылки пишушие в этот параметр... типа мы тут со значением пришли...255 // и с учетом что у нас все снизу вверх теперь раскрывается - это сработает256 // и плюс уже учтено keepExistingParams257 if (obj.hasLinksToParam( name )) {258 let larr = obj.linksToParam( name );259 for (let l of larr)260 if (l.params.manual_mode)261 {262 // ладно такую ссылку оставим263 // ибо она часть механики похоже какой-то264 }265 else266 {267 //console.log("p-removing link:", l.getPath(), "reason - setting param",name )268 // временный хак. он в том что если выставлено manual_mode это значит что эта ссылка обеспечивает269 // запись в ручном режиме откуда-то.. и ее стало быть затирать не надобно..270 if (!l.params.manual_mode)271 {272 l.remove();273 }274 }275 }276 277 });278 ///// особый случай - параметры значение которых это список окружений279 // им надо выставить lexicalParent280/*281 var h = dump.env_list_params || {};282 var keys = Object.keys(h);283 keys.forEach( function(name) {284 //console.log("setting param",name,h[name]);285 // F-KEEP-EXISTING-PARAMS286 if (dump.keepExistingParams && obj.hasParam( name )) return;287 let v = h[name];288 v.lexicalParent = obj;289 obj.setParam( name, v, manualParamsMode ); // ставим true - в том смысле что это установка из290 });291*/292 293 }294 // цель - активировать в окружении новую фичу, определенную в dump295 // отличие в том, что там не просто имя, а целое новое под-окружение296 // и мы не можем создать сначала под-окружение а потом его прицепить297 // потому что при создании происходит активация фич, и им уже надо знать298 // что они активируются в режиме аттача к основному новому окружению..299 m.importAsParametrizedFeature = function( dump,obj, $scopeFor ) {300 // todo заменить это все на работу с деревом..301 dump.feature_of_env = obj;302 dump.keepExistingChildren = true; // без этой штуки оно начинает стирать своих собственных детей303 // не надо восстанливать ()-окружения304 // F-LINKS-OVERWRITE305 306 if (dump.features.computer && dump.keepExistingParams) {307 let links = Object.values( dump.links );308 let link = links[0];309 if (links.length > 1)310 debugger;311 312 let output_param_name = link.to.split("->")[1];313 if (obj.hasParam(output_param_name) || obj.hasLinksToParam( output_param_name ))314 {315 // вот нам значит уже и не надо этот объект.316 //console.warn("shadowed computing env skipping", output_param_name, dump, obj )317 return null;318 }319 }320 //fr.keepExistingChildren = true; // странно это все...321 let prom = m.createSyncFromDump( dump, null, null, dump.$name,false, $scopeFor );322 return new Promise( (resolve,reject) => {323 prom.then( (feature_obj) => {324 // если это у нас ()-вычислителный объект, и удаляют ссылку результата325 // то и этот объект надо удалить.326 if (dump.features.computer) {327 //debugger;328 let output_link = feature_obj.ns.getChildByName("arg_link_to");329 if (output_link)330 {331 output_link.on("remove", () => {332 //console.warn("shadowed computing env removed due output link", output_link.params.to, dump, obj )333 if (!feature_obj)334 feature_obj.remove()335 } );336 }337 else {338 // короче если там нет уже ссылки - значит ее потерли339 // и значим нам наше вычисление тож надо потереть340 // ппц.341 debugger;342 feature_obj.remove();343 reject();344 return;345 //debugger;346 }347 }348 // как выяснилось и вот так бывает349 if (obj.removed)350 {351 feature_obj.remove();352 reject();353 return;354 }355 //arr.push( feature_obj );356 //feature_obj.lexialParent = obj;357 //feature_obj.master_env = obj;358 //obj.feature_359 // todo надо бы их в дерево посадить... тем более там по именам потом захочется ходить..360 // вот здесь получается что мы вырубаем x-on "remove"... todo361 // мбыть сделать on_prepend = добавить в начало очереди...362 //console.log("adding ",dump.$name,"and starting monitor remove of host",obj.$vz_unique_id)363 let forget_that = obj.on("remove",() => {364 forget_that = () => {};365 //console.log("calling feature_obj.remove",feature_obj.$vz_unique_id,"because obj is removing",obj.$vz_unique_id)366 feature_obj.remove();367 });368 // $feature_name затем используется... выяснить какую семантику я в него вложил..369 feature_obj.$feature_name = dump.$name || "some_feature"; /// ......370 obj.$feature_list_envs ||= [];371 obj.$feature_list_envs.push( feature_obj );372 obj.$feature_list_envs_table ||= {};373 let kname = feature_obj.$feature_name;374 while (obj.$feature_list_envs_table[kname]) {375 // @todo это место пипец конечно.. надо под-окружения уникальные создавать или типа того..376 //console.warn("$feature_list_envs_table DUPLICATE DETECTED, $feature_name=",kname)377 kname = kname + "_x";378 //console.warn("renamed to",kname);379 }380 obj.$feature_list_envs_table[kname] = feature_obj;381 // надо бы запомнить, как мы ее запомнили..382 feature_obj.$feature_name = kname;383 // протокол F-NEW-MODIFIERS-FTREE384 385 let detach_code = feature_obj.emit("attach",obj)386 // времянка некая.. 387 /*388 let feature_obj_got_attached_signal = false;389 if (!(feature_obj.hasParam("input") || feature_obj.hasLinksToParam("input"))) {390 feature_obj.emit("attach",obj)391 feature_obj_got_attached_signal = true;392 }393 */394 // если фичу просто так удалять будут - надо освободить родителя395 feature_obj.on("remove",() => {396 forget_that()397 // протокол F-NEW-MODIFIERS-FTREE398 feature_obj.emit("detach",obj);399 //if (feature_obj_got_attached_signal)400 // feature_obj.emit("detach",obj);401 // detach_code();402 if (!obj.removed) {403 // почистить таблицу еще надо404 // по сути мы тут children-таблицу заново пишем.. эх405 delete obj.$feature_list_envs_table[kname];406 let myindex = obj.$feature_list_envs.indexOf( feature_obj );407 if (myindex >= 0) obj.$feature_list_envs.splice( myindex,1 );408 }409 });410 resolve( feature_obj );411 }); 412 413 //return feature_obj;414 });415 }416 /* todo417 m.restoreParamizedFeatures = function( dump, obj, $scopeFor, crit_fn ) {418 let feat_arr_0 = []419 // а теперь фиче-листы... F-FEAT-PARAMS420 // restoreFeatures вызывается многократно, и если от однократных фич у нас есть защита то тут нет421 obj.features_list_is_restored ||= new Set();422 423 //var arr = [];424 for (let fr of (dump.features_list || [])) 425 {426 if (obj.features_list_is_restored.has(fr)) continue;427 obj.features_list_is_restored.add( fr ) ;428 if (!crit_fn(fr)) continue;429 fr.keepExistingParams = dump.keepExistingParams;430 let r2 = m.importAsParametrizedFeature( fr, obj, $scopeFor );431 //console.log( "case3 fn=",fr,r2,obj.getPath())432 feat_arr_0.push( Promise.resolve( r2 ) );433 }434 435 //obj.$feature_list_envs = (obj.$feature_list_envs || []).concat( arr );436 // тут бы списочег...437 //obj.setParam("feature_list_envs",arr);438 439 return feat_arr_0;440 } 441 */442 m.restoreParamizedFeatures = function( dump, obj, $scopeFor, crit_fn ) {443 let feat_arr_0 = []444 // а теперь фиче-листы... F-FEAT-PARAMS445 // restoreFeatures вызывается многократно, и если от однократных фич у нас есть защита то тут нет446 obj.features_list_is_restored ||= new Set();447 if (!obj.features_list_is_restored.has(dump.features_list)) {448 //var arr = [];449 for (let fr of (dump.features_list || [])) 450 {451 if (!crit_fn(fr)) continue;452 fr.keepExistingParams = dump.keepExistingParams;453 let r2 = m.importAsParametrizedFeature( fr, obj, $scopeFor );454 //console.log( "case3 fn=",fr,r2,obj.getPath())455 feat_arr_0.push( Promise.resolve( r2 ) );456 }457 obj.features_list_is_restored.add( dump.features_list ) ;458 //obj.$feature_list_envs = (obj.$feature_list_envs || []).concat( arr );459 // тут бы списочег...460 //obj.setParam("feature_list_envs",arr);461 }462 return feat_arr_0;463 }464 m.restoreFeatures = function ( dump, obj, manualparamsmode, $scopeFor) {465 //let feat_arr_0 = m.restoreParamizedFeatures( dump, obj, $scopeFor, (d)=>d.features.computer);466 /*467 // мега-трешовая логика но что делать.468 // если мы не в ручном режиме.. то.. нужно включать режим когда мы 469 let keepExistingParamsOrig = dump.keepExistingParams;470 if (!manualparamsmode) 471 dump.keepExistingParams = true;472 */ 473 let feat_arr_0 = m.restoreParamizedFeatures( dump, obj, $scopeFor, (d)=>true);474 475 // получается что здесь происходит повторный вызов obj.feature476 // (первый в конструкторе объекта за счет опций .features)477 // пока отменим тут 478 // нет не отменим. применение фич на этапе конструкции объекта оказалось тем странно, что479 // фичи применяются вперед, на самом базовом createObj480 // таки отменим.. пусть они там уж применяются481 //return;482 // нет не отменим483 // потому что мы применяем здесь фичи из функтора восстановления из дампа (compalang)484 // есть идея - применять фичи после {{ }}- фич485 // это позволит навесить всякие on-обработчики до появления каких-либо событий внутри486 let res = new Promise( (resolve,reject) => {487 Promise.allSettled( feat_arr_0 ).then( () => {488 let feat_arr = [];489 // NHACK490 if (dump.features && dump.features['base_url_tracing'])491 obj.feature('base_url_tracing', dump.features['base_url_tracing'].params);492 for (let fn of Object.keys(dump.features || {})) 493 {494 // тут считается что feature-code совпадает с feature-name495 // в целом же наверняка это можно расширить до того что код нескольких фич может совпадать.496 // но это надо тогда будет учесть и feature-tools (там отсекается повторное применение фич с одинаковым кодом)497 let r = obj.feature( fn, dump.features[fn].params );498 //console.log( "case1 fn=",fn,r,obj.getPath())499 feat_arr.push( Promise.resolve( r ));500 }501 // белковый представитель manual-features502 // важно эти фичи восстанавливать на 1м проходе, т.к. далее идет присвоение manual_features503 // и сообразно фичи начинают применяться без промисов, а на 2м проходе - они уже считаются примененными и промисов не собрать504 // поэтому мы тут хаком - влазим и применяем не дожидаясь.505 // но вообще - надо по уму что-то другое делать с manual-features-ами. возможно это 506 // вручную набранные модификаторы (скорее всего это они)507 508 if (dump.params?.manual_features) {509 let mf = FT.feature_names_to_arr( dump.params.manual_features );510 //if (!Array.isArray(mf)) mf = [mf];511 for (let fn of mf)512 {513 // тут считается что feature-code совпадает с feature-name514 // в целом же наверняка это можно расширить до того что код нескольких фич может совпадать.515 // но это надо тогда будет учесть и feature-tools (там отсекается повторное применение фич с одинаковым кодом)516 let r = obj.feature( fn );517 //console.log( "case2 fn=",fn,r,obj.getPath())518 feat_arr.push( Promise.resolve( r ));519 }520 }521 Promise.allSettled( feat_arr ).then( resolve );522 /*Promise.allSettled( feat_arr ).then( () => {523 let feat_arr_1 = m.restoreParamizedFeatures( dump, obj, $scopeFor, (d)=>!d.features.computer);524 Promise.allSettled(feat_arr_1).then( resolve );525 });526 */527 });528 });529 //console.log( feat_arr, obj.getPath())530 return res;531 }532 m.restoreLinks = function( dump, obj, manualparamsmode, $scopeFor ) {533 for (var lname of Object.keys(dump.links || {})) {534 535 var lrec = dump.links[lname];536 var arr = lrec.to.split("->");537 if (arr[0] == "." || arr[0] == "~") { // ссылка на поля объекта538 //console.log("cre-link-to",lrec, obj.getPath()) 539 //console.log("cre-link-to",arr[1], lrec,obj.getPath()) 540 //if (arr[1] == "input_kv")541 // debugger;542 if (dump.keepExistingParams) {543 // особый режим сохранения уже существующих параметров544 // проблема что hasLinksToParam заработает только при активации ссылки, которая у нас отложенная...545 // F-LINKS-OVERWRITE546 if (obj.hasLinksToParam( arr[1] ) || obj.hasParam( arr[1] )) {547 //console.log("orig link is kept - keepExistingParams")548 continue;549 }550 }551 else552 {553 // F-LINKS-OVERWRITE554 // удалить ссылки пишушие в этот параметр... типа мы тут со значением пришли...555 // и с учетом что у нас все снизу вверх теперь раскрывается - это сработает556 // и плюс уже учтено keepExistingParams557 if (obj.hasLinksToParam( arr[1] )) {558 let larr = obj.linksToParam( arr[1] );559 for (let l of larr)560 if (l.params.manual_mode)561 {562 // ладно такую ссылку оставим563 // ибо она часть механики похоже какой-то564 }565 else {566 // console.warn("link removed",l.params.to)567 l.remove();568 }569 };570 };571 // разделяем ситуацию куда же нам направить местную ссылку - на себя (на фичу) или на главное окружение572 // затрем параметр целевой... тиак надо... но что-то с этим все ломается573/*574 if (arr[0] == ".") {575 obj.host.setParam( arr[1], undefined );576 }577*/ 578 let lobj = obj.createLinkTo( {param: arr[1], 579 from: lrec.from,580 name: "arg_link_to", 581 target_host_env: (arr[0] == "."),582 soft_mode: lrec.soft_mode583 584 } );585 if ($scopeFor)586 lobj.$scopes.addScopeRef( $scopeFor );587 else debugger; // вроде ничего страшного ж.. или таки мабуть?588 if (lrec.locinfo) 589 lobj.$locinfo = lrec.locinfo;590 //lobj.setParam('locinfo',lrec.locinfo);591/*592 if (lrec.to == ".->crit")593 lobj.on("remove",() => {594 lobj;595 debugger;596 }) 597*/ 598 }599 else600 {601 //console.log("arg-link-to",lrec, obj.getPath())602 let lobj = m.createLink( {parent: obj, name: "arg_link" });603 if ($scopeFor) 604 lobj.$scopes.addScopeRef( $scopeFor );605 else debugger; 606 m.setParam("soft_mode",lrec.soft_mode);607 m.setParam("to",lrec.to);608 m.setParam("from",lrec.from);609 if (lrec.locinfo) 610 lobj.$locinfo = lrec.locinfo;611 // крайне важно давать имена тут ссылкам (типа arg_...) потому что иначе они смешиваются со ссылками612 // задаваемыми через children и начинают с ними конфликтовать по именам (перезаписывают их)613 }614 }615 }616 617 // this is made specially so obj.restoreFromDump may be overriden618 m.restoreObjFromDump = function( dump, obj, manualParamsMode, $scopeFor ) {619 //let k = dump.params.manual_features;620 //delete dump.params['manual_features'];621 m.restoreParams( dump, obj,manualParamsMode,$scopeFor );622 m.restoreLinks( dump, obj,manualParamsMode,$scopeFor );623 let feature_promise = m.restoreFeatures( dump, obj,manualParamsMode,$scopeFor );624 // тут идет дублирование restoreFeatures с createSyncFromDump, но ничего, мы переживем.625 if (dump.manual) {626 manualParamsMode = true; // такой вот прием.. а то "ручные объекты" потом не сохранить получается..627 }; 628 if (manualParamsMode) { // детей сделали - тыркнем объект что вот, восстановились629 // а причем важно это сделать тут так как - там среди детей могет создаться монеторер630 // этого события631 //console.log("emitting manual-restore for",obj.getPath())632 //obj.emit("manual-restore");633 obj.setParam("manual_restore_performed",true);634 }635 return new Promise( (resolve,reject) => {636 feature_promise.then( () => {637 let rc = obj.restoreChildrenFromDump( dump, manualParamsMode,$scopeFor );638 rc.then( () => {639 resolve( obj );640 });641 })642 })643 //let rc = obj.restoreChildrenFromDump( dump, manualParamsMode );644 //return Promise.all( feature_promise,rc );645 }646 647 m.removeChildrenByDump = function( dump, obj, manualParamsMode )648 {649 var c = dump.children || {};650 var ckeys = Object.keys( c );651 ///////////////////////////////////////////////////////////652 // удаляем тех что есть у нас но нет во входящем списке653 // важно на каждой итерации цикла обращаться в getChildren654 var cnames = obj.ns.getChildNames();655 for (var i=0; i<cnames.length; i++) {656 var cname = cnames[i];657 var lc = obj.ns.getChildByName( cname );658 if (lc.protected) continue;659 // режимы:660 // объект был добавлен вручную => входящая информация несет приоритет661 // объект был добавлен программно => вообще его не трогаем (почему-то)662 // объект был добавлен программно с пометкой dumpyInserted/forcecreate => входящая информация несет приоритет если режим ввода программный663 if (lc.manuallyInserted || (lc.dumpyInserted && !manualParamsMode)) {664 if (!c[cname]) { // во входящих нет665 // console.log("removing local unnecessary child lc=",lc);666 lc.remove();667 }668 }669 }670 }671/*672 создать список объектов по дампу673 требования: 674 * при восстановлении сохранить порядок675 * вернуть промису которая разрезолвится когда работа будет готова676 раздельный порядок восстановления: F-DEFINED677 * сначала все load и register_feature678 * а затем все остальное679*/680 // F-ENV-ARGS681 m.createObjectsList = function (env_list, obj, manualParamsMode, $scopeFor)682 {683 var result_p = new Promise( (resolv, reject) => {684 restore( 0,0 );685 function restore( i, priority ) {686 if (i == env_list.length) {687 if (priority == 0)688 return restore( 0,1 ); // переходим на второй этап689 else690 return resolv( obj );691 }692 let child_dump = env_list[i];693 let name = child_dump.$name;694 // без этого оно там кидеается все удалять..695 child_dump.keepExistingChildren = true;696 // если 697 698 let feats = child_dump.features || {};699 let item_priority = (feats.load || feats.when || feats.feature || feats.register_feature) ? 0 : 1700 if (priority != item_priority)701 return restore( i+1, priority );702 let cobj = null;703 var r = m.createSyncFromDump( child_dump, cobj, obj, name, manualParamsMode, $scopeFor );704 // todo вернуть оптимизацию705 r.then( () => {706 restore( i+1, priority );707 });708 709 // the only way to catch errors is here, allSettled will ignore that error710 r.catch( (err) => {711 console.error("createChildrenByDump: error! parent=",obj.getPath(),"child_dump=",child_dump,"error=",err );712 // и че.. по идее надо все-равно вызывать следующих... или вызовется?713 }); 714 }; // функция restore715 });716 717 return result_p; 718 }719 720 // это вынесено в отдельную функцию потому что мы ее захотим овверрайдить для загрузки пакетов721/*722 восстанавливает детей объекту из дампа723 требования: 724 * при восстановлении сохранить порядок детей725 * вернуть промису которая разрезолвится когда работа будет готова726 новое: раздельный порядок восстановления: F-DEFINED727 * сначала все load и register_feature728 * а затем все остальное729 todo оптимизировать - на тему чтобы load несколько параллельно загружались730*/ 731 // F-ENV-ARGS732 m.copyEnvArgsToScope = function( args, env_args, scope ) {733// позиционное копирование734 for (let i=0; i<env_args.length; i++) {735 /*736 let argname = env_args[i];737 scope.$add( argname, args[i] );738 */739 let argname = env_args[i];740 let argvalue = args[i];741 /*742 // придется прикинуться окруженьем743 let param_env = m.createObj();744 param_env.feature("is_positional_env");745 param_env.setParam( 0, argvalue );746 scope.$add( argname, param_env );747 */748 scope.$add( argname, argvalue );749 }750 }751 // F-ENV-ARGS752 // это как createObjectsList только с формированием окружения-scope753 // todo на будущее технически это и может быть env (нашим объектом, процессом)754 // без scope-ов755 m.callEnvFunction = function( env_list, parent_object, manualParamsMode, scope, ...args)756 {757 if (env_list.env_args) {758 let newscope = parent_object.$scopes.createAbandonedScope("$vz_children_function");759 newscope.$lexicalParentScope = env_list[0].$scopeFor || scope;760 //newscope.$lexicalParentScope = env_list[0].$scopeFor || parent_object.$scopes.top();761 //let newscope = scope_env.$scopes.createScope("$vz_children_function");762 //let newscope = scope.createScope("$vz_children_function");763 m.copyEnvArgsToScope( args, env_list.env_args.attrs, newscope);764 // короче история такая что там scope прошит в каждую элемент env_list765 // в параметрах (т.е. alfa={ some; envs} )766 // и поэтому ее надо каждую перешибить767 //debugger;768 if (env_list[0].$scopeFor)769 for (let e of env_list)770 e.$scopeFor = newscope;771 // типа якобы - нам не надо копировать т.к. есть и просто параметр newscope у createObjectsList772 return m.createObjectsList( env_list, parent_object, manualParamsMode, newscope );773 }774 return m.createObjectsList( env_list, parent_object, manualParamsMode, scope );775 }776 // по значению - либо вызовет как функцию либо посмотрит как777 // на набор окружений возможно вызываемый с аргументами778 // update - это чухня. надо делать так чтобы был возврат результата годный для insert-children779 // и прочих createObjectsList780 m.callParamFunction = function( param_value, parent_object, manualParamsMode, scope, ...args) {781 if (typeof(param_value) == "string") {782 let f = eval( param_value );783 param_value = f( ...args )784 }785 else if (param_value.bind) {786 param_value = param_value( ...args );787 }788 return m.callEnvFunction( param_value, parent_object, manualParamsMode, scope, ...args);789 }790 // преобразует значение в dump-массив, пригодный для передачи в insert_children791 // если records это функция то вызывает ее с аргументами792 // если records это { |args|... } то связывает args с аргументами (пока все позиционное)793 m.prepareEnvRecords = function( records, ...args) {794 if (typeof(records) == "string") { // код на js795 let f = eval( records );796 records = f( ...args );797 }798 else if (records.bind) { // ф-я799 records = records( ...args );800 }801 else if (records.env_args) {802 let newscope = m.createAbandonedScope("prepareEnvRecords");803 if (records && records.length > 0)804 newscope.$lexicalParentScope = records[0].$scopeFor;805 m.copyEnvArgsToScope( args, records.env_args.attrs, newscope);806 // короче история такая что там scope прошит в каждую элемент env_list807 // в параметрах (т.е. alfa={ some; envs} )808 // и поэтому ее надо каждую перешибить809 if (records[0].$scopeFor)810 for (let e of records)811 e.$scopeFor = newscope;812 } 813 return records;814 };815 m.createChildrenByDump = function( dump, obj, manualParamsMode,$scopeFor )816 {817 // // F-ENV-ARGS818 obj.$vz_children_function = (...args) => {819 let c = Object.values( dump.children );820 c.env_args = dump.children_env_args;821 m.callEnvFunction( c, obj, manualParamsMode, $scopeFor, ...args )822 };823 // F-ENV-ARGS824 if (dump.children_env_args || obj.$vz_children_autocreate_enabled == false) { 825 return Promise.resolve(obj);826 }827 var c = dump.children || {};828 var ckeys = Object.keys( c );829 var result_p = new Promise( (resolv, reject) => {830 restore( 0,0 );831 function restore( i, priority ) {832 if (i == ckeys.length) {833 if (priority == 0)834 return restore( 0,1 ); // переходим на второй этап835 else836 return resolv( obj );837 }838 name = ckeys[i];839 var child_dump = c[name];840 // если 841 842 let feats = child_dump.features || {};843 let item_priority = (feats.load || feats.when || feats.feature || feats.register_feature) ? 0 : 1844 if (priority != item_priority)845 return restore( i+1, priority );846 var cobj = obj.ns.getChildByName( name );847 if (!c[name].manual && !cobj && !c[name].forcecreate) {848 // ситуация когда объект должен был быть создан автоматически - но его нет!849 console.error("load_from_dump: no child of name found! name=",name,"obj=",obj,"dump=",dump);850 //promises_arr.push( Promise.reject() );851 return restore( i+1, priority );852 }853 854 if (dump.keepExistingChildren)855 child_dump.keepExistingChildren = dump.keepExistingChildren;856 if (dump.keepExistingChildren) cobj = null; // R-NEW-CHILDREN857 var r = m.createSyncFromDump( child_dump, cobj, obj, name, manualParamsMode, $scopeFor );858 // todo вернуть оптимизацию859 r.then( () => {860 restore( i+1, priority );861 });862 863 // the only way to catch errors is here, allSettled will ignore that error864 r.catch( (err) => {865 console.error("createChildrenByDump: error! parent=",obj.getPath(),"child_dump=",child_dump,"error=",err );866 // и че.. по идее надо все-равно вызывать следующих... или вызовется?867 }); 868 }; // функция restore869 });870 871 return result_p;872 }873 874 m.dumpObj = function( obj ) {875 876 //var res = Object.create( obj.params );877 var res = {};878 if (Object.keys( obj.params ).length > 0) {879 //res.params = Object.assign({},obj.params);880 // feature: do not copy some params to dump!881 res.params = {};882 Object.keys( obj.params ).forEach( function(name) {883 var v = obj.dumpParam( name );884 if (v == null) return;885 if (typeof(v) === "string" && v.length > 10000) {886 console.error("dumpObj: because value too long, dump will not save param ",name,"of obj",obj.getPath());887 return;888 }889 // фича по отлову ситуаций890 // ну мб можно было бы тут и строчку сохранять, не знаю891 // но потом тогда надо из дампа ее восстанавливать892 // что тоже в принципе вариант (сохранять { ref: 'obj', path: ....})893 // кстати это удобно было бы. ну мб. smallidea.894 if (v.setParam) {895 console.error("dumpObj: vz object in param value! name=", name, "obj path=",obj.getPath(), obj)896 return;897 }898 res.params[name] = v;899 });900 }901 if (obj.ismanual && obj.ismanual()) {902 res.manual = true;903 res.type = obj.historicalType;904 }905 else if (obj.historicalType) {906 res.type = obj.historicalType;907 //res.type = opts.type; //tttt908 }909 if (obj.module_url) {910 res.module_url = obj.module_url;911 }912 var ch = obj.ns.getChildNames();913 if (ch.length > 0) {914 res.children={};915 ch.forEach( function(cname,index) {916 var c = obj.ns.getChildByName( cname );917 var r = c.dump();918 if (!r) return; // возможность объекту отказаться от сохранения919 res.children[cname] = r;920 if (res.children[cname].manual)921 res.children[cname].order=index;922 } );923 }924 // фича "если не заданы параметры вовсе то не надо делать запись params"925 if (res.params && Object.keys(res.params).length == 0) delete res.params;926 // фича "если не заданы дети вовсе то не надо делать запись children"927 if (res.children && Object.keys(res.children).length == 0) delete res.children;928 return res;929 }930m.chain("create_obj",function( obj, opts ) {931 // @compolang @todo @design - почему вот это нельзя было бы в параметры то перетащить?932 obj.ismanual = function() {933 return obj.manuallyInserted ? true : false;934 }935 obj.setmanual = function(v) {936 return obj.manuallyInserted = v;937 }938 obj.dump = function() {939 return m.dumpObj( obj );940 }941 // manualParamsMode - consider incoming params as manual942 obj.restoreFromDump = function ( dump, manualParamsMode, $scopeFor ) {943 return m.restoreObjFromDump( dump, obj, manualParamsMode, $scopeFor );944 }945 946 // returns promise947 obj.clone = function( opts = {} ) {948 var dump = obj.dump();949 //debugger;950 if (!opts.parent) opts.parent = obj.ns.parent;951 return m.createSyncFromDump( dump, null, opts.parent, opts.name );952 }953 954 // created this method(tpu) to implement R-SETREF-OBJ955 obj.dumpParam = function ( name ) {956 if (obj.getParamOption( name,"internal" ) || name[0] == "@")957 {958 // console.log("skipped dump of name because internal",name);959 }960 else961 {962 return obj.params[name];963 }964 }965 // выделяем восстановление детей в отдельный метод в контексте obj966 // чтобы фичи объекта могли успеть его поменять (конкретно это надо было для repeater)967 obj.restoreChildrenFromDump = (dump, ismanual, $scopeFor) => {968 if (!dump.keepExistingChildren)969 m.removeChildrenByDump( dump, obj, ismanual );970 return m.createChildrenByDump( dump, obj, ismanual, $scopeFor );971 }972 973 if (opts.manual) obj.manuallyInserted = true;974 if (opts.forcecreate) obj.dumpyInserted = true; // @todo раскопать эту тему975 // расскомментировал dumpyInserted так как это признак при очистке детей что их можно очищать..976 // (там идет идейный конфликт - нам приходит дамп и можно ли удалить объект?)977 // и вот у на случай что мы сделали xmlFromChildren.. и хотим повторить... и значит надо всех кого мы не перечислили - убрать..978 // но это приводит к тому что когда приходит дамп из проекта (хеш браузера) то это приводит к очистке всево..979 // значит нужны режимы...980 this.orig( obj, opts );981 return obj;982} ); // create_obj...

Full Screen

Full Screen

imposter.js

Source:imposter.js Github

copy

Full Screen

...42 domain = require('domain').create(),43 errorHandler = createErrorHandler(deferred, creationRequest.port),44 compatibility = require('./compatibility'),45 requests = [],46 logger = require('../util/scopedLogger').create(baseLogger, scopeFor(creationRequest.port)),47 helpers = require('../util/helpers'),48 imposterState = {};49 let stubs;50 let resolver;51 let numberOfRequests = 0;52 compatibility.upcast(creationRequest);53 // If the CLI --mock flag is passed, we record even if the imposter level recordRequests = false54 const recordRequests = config.recordRequests || creationRequest.recordRequests;55 function getResponseFor (request) {56 if (!isAllowedConnection(request.ip, logger)) {57 return Q({ blocked: true, code: 'unauthorized ip address' });58 }59 numberOfRequests += 1;60 if (recordRequests) {61 const recordedRequest = helpers.clone(request);62 recordedRequest.timestamp = new Date().toJSON();63 requests.push(recordedRequest);64 }65 const responseConfig = stubs.getResponseFor(request, logger, imposterState);66 return resolver.resolve(responseConfig, request, logger, imposterState).then(response => {67 if (config.recordMatches && !response.proxy) {68 if (response.response) {69 // Out of process responses wrap the result in an outer response object70 responseConfig.recordMatch(response.response);71 }72 else {73 // In process resolution74 responseConfig.recordMatch(response);75 }76 }77 return Q(response);78 });79 }80 function getProxyResponseFor (proxyResponse, proxyResolutionKey) {81 return resolver.resolveProxy(proxyResponse, proxyResolutionKey, logger).then(response => {82 if (config.recordMatches) {83 response.recordMatch();84 }85 return Q(response);86 });87 }88 domain.on('error', errorHandler);89 domain.run(() => {90 if (!helpers.defined(creationRequest.host) && helpers.defined(config.host)) {91 creationRequest.host = config.host;92 }93 Protocol.createServer(creationRequest, logger, getResponseFor).done(server => {94 if (creationRequest.port !== server.port) {95 logger.changeScope(scopeFor(server.port));96 }97 logger.info('Open for business...');98 stubs = server.stubs;99 resolver = server.resolver;100 if (creationRequest.stubs) {101 creationRequest.stubs.forEach(stubs.addStub);102 }103 function stop () {104 const stopDeferred = Q.defer();105 server.close(() => {106 logger.info('Ciao for now');107 return stopDeferred.resolve({});108 });109 return stopDeferred.promise;...

Full Screen

Full Screen

actions.js

Source:actions.js Github

copy

Full Screen

...62 findScope($el).$broadcast(event, data);63 };64}65function findScope(el) {66 if (scopeFor(el)) {67 return scopeFor(el);68 }69 var children = el.children();70 for (var i = 0; i < children.length; i++) {71 var scope = scopeFor(children[i]);72 if (scope) {73 return scope;74 }75 }76 throw new Error('Cannot find scope on top level children of root element', el);77 function scopeFor(element) {78 return angular.element(element).scope();79 }80}81function wait(timeout) {82 return function () {83 return {84 then: function (callback) {85 setTimeout(callback, timeout || 0);86 }87 };88 };89}90function navigateTo(url) {91 return withAfter(function ($el) {...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var mb = require('mountebank');2var imposter = {3 {4 {5 is: {6 headers: {7 },8 body: JSON.stringify({message: 'Hello world!'})9 }10 }11 }12};13mb.create(imposter, function () {14 scope.get('/').reply(200, {message: 'Hello world!'});15 });16});17### mountebank.create(imposter, callback)18* `port` - the port on which to create the imposter (required)19* `protocol` - the protocol to use for the imposter (required)20* `stubs` - an array of stubs to use for the imposter (optional)21* `name` - a name for the imposter (optional)22* `key` - a key to use for basic authentication (optional)23* `cert` - a certificate to use for SSL (optional)24* `recordRequests` - whether the imposter should record requests (optional, defaults to false)25* `defaultResponse` - the default response to use for the imposter (optional, defaults to `{is: {statusCode: 400}}`)26* `mode` - the mode to use for the imposter (optional, defaults to 'text')27* `defaultMode` - the default mode to use for the imposter (optional, defaults to 'text')28* `stubs` - an array of stubs to use for the imposter (optional)29* `predicates` - an array of predicates to use for the imposter (optional)30* `responses` - an array of responses to use for the imposter (optional)31* `behaviors` - an array of behaviors to use for the imposter (optional)32* `numberOfRequests` - the number of requests to use for the imposter (optional)

Full Screen

Using AI Code Generation

copy

Full Screen

1const mb = require('mountebank');2const scopeFor = mb.scopeFor;3const port = 2525;4 {5 {6 {7 is: {8 }9 }10 }11 }12];13const scope = scopeFor(port);14scope.create(imposters)15 .then(() => {16 })17 .then(response => {18 console.log('Response from imposter:', response.body);19 })20 .then(() => {21 console.log('Imposter deleted');22 })23 .catch(error => {24 console.error(error);25 });26### scopeFor(port, options)27### scope.create(imposter)28### scope.get(path, options)

Full Screen

Using AI Code Generation

copy

Full Screen

1var mb = require('mountebank');2var Q = require('q');3var request = require('request');4var deferred = Q.defer();5var imposter = {6 stubs: [{7 responses: [{8 is: {9 }10 }]11 }]12};13mb.create({port: 2525}, function (error, mbServer) {14 mbServer.post('/imposters', imposter, function (error, response) {15 mbServer.del('/imposters', function () {16 deferred.resolve();17 });18 });19 });20});21deferred.promise.then(function () {22 console.log('done');23});

Full Screen

Using AI Code Generation

copy

Full Screen

1const mb = require('mountebank');2const port = 2525;3const imposterPort = 3000;4const imposterProtocol = 'http';5const imposterName = 'testImposter';6const imposterStub = {7 responses: [{8 is: {9 }10 }]11};12mb.create(port)13 .then(function (mbServer) {14 return mbServer.createImposter({15 });16 })17 .then(function (imposter) {18 })19 .then(function (scope) {20 return scope.get('/').then(function (response) {21 console.log(response.body);22 });23 })24 .catch(function (error) {25 console.error(error);26 });27[MIT](LICENSE)

Full Screen

Using AI Code Generation

copy

Full Screen

1const mb = require('mountebank');2const port = 2525;3mb.create(port, function (error, mbServer) {4 if (error) {5 console.error(error);6 } else {7 mbServer.post('/imposters', {8 {9 {10 equals: {11 }12 }13 {14 is: {15 headers: {16 },17 body: JSON.stringify({18 })19 }20 }21 }22 }, function (error, imposters) {23 if (error) {24 console.error(error);25 } else {26 const imposterPort = imposters[0].port;27 console.log(`Created imposter on port ${imposterPort}`);28 }29 });30 }31});32const mb = require('mountebank');33const port = 2525;34mb.create(port, function (error, mbServer) {35 if (error) {36 console.error(error);37 } else {38 mbServer.post('/imposters', {39 {40 {41 equals: {42 }43 }44 {45 is: {46 headers: {47 },48 body: JSON.stringify({49 })50 }51 }52 }53 }, function (error, imposters) {54 if (error) {55 console.error(error

Full Screen

Using AI Code Generation

copy

Full Screen

1var mb = require('mountebank');2var Q = require('q');3var http = require('http');4var deferred = Q.defer();5var options = {6};7var request = http.request(options, function (response) {8 response.setEncoding('utf8');9 response.on('data', function (chunk) {10 deferred.resolve(chunk);11 });12});13var json = {14 {15 {16 "is": {17 }18 }19 }20};21request.write(JSON.stringify(json));22request.end();23deferred.promise.then(function (chunk) {24 var imposters = JSON.parse(chunk);25 var imposter = imposters[0];26 var imposterPort = imposter.port;27 var imposterProtocol = imposter.protocol;28 var scope = mb.scopeFor(imposterProtocol, imposterPort);29 scope.get('/', 200);30 scope.post('/', 200);31 scope.put('/', 200);32 scope.delete('/', 200);33 scope.head('/', 200);34 scope.options('/', 200);35 scope.patch('/', 200);36 scope.addStub({ responses: [{ is: { body: 'Hello world!' } }] });37 scope.removeStub(0);38 scope.removeStubs();39 scope.remove();40});41var mb = require('mountebank');42var Q = require('q');43var http = require('http');44var deferred = Q.defer();45var options = {46};47var request = http.request(options, function (response) {48 response.setEncoding('utf8');49 response.on('data', function (chunk) {50 deferred.resolve(chunk);51 });52});53var json = {54 {55 {56 "is": {57 }58 }59 }60};61request.write(JSON.stringify(json

Full Screen

Using AI Code Generation

copy

Full Screen

1var mb = require('mountebank');2var port = 2525;3var imposterPort = 3000;4var imposterProtocol = 'http';5var imposterName = 'test';6var imposterStub = {7 {8 is: {9 }10 }11};12var imposterPredicate = {13 equals: {14 }15};16var imposterStub = {17 {18 is: {19 }20 }21};22var imposter = {23 {24 {25 is: {26 }27 }28 }29};30var imposterPredicate = {31 equals: {32 }33};34var imposterStub = {35 {36 is: {37 }38 }39};40mb.create({ port: port }, function (error, mbServer) {41 if (error) {42 console.error(error);43 }44 else {45 console.log('mbServer started at port: ' + port);46 mbServer.post('/imposters', imposter, function (error, response) {47 if (error) {48 console.error(error);49 }50 else {51 console.log('imposter created: ' + response.body.name);52 console.log(response.body);53 }54 });55 }56});57mb.create({ port: port }, function (error, mbServer) {58 if (error) {59 console.error(error);60 }61 else {62 console.log('mbServer started at port: ' + port);63 mbServer.post('/imposters', imposter, function (error, response) {64 if (error) {65 console.error(error);66 }67 else {68 console.log('imposter created: ' + response.body.name);69 console.log(response.body);70 }71 });72 }73});74mb.create({ port: port }, function (error

Full Screen

Using AI Code Generation

copy

Full Screen

1var mb = require('mountebank');2var imposter = mb.create({port: 2525, name: 'test'});3imposter.post('/test', {key: 'value'});4imposter.get('/test', {key: 'value'});5imposter.scopeFor('test').get('/test', {key: 'value'});6imposter.scopeFor('test').post('/test', {key: 'value'});7imposter.scopeFor('test').put('/test', {key: 'value'});8imposter.scopeFor('test').delete('/test', {key: 'value'});9imposter.scopeFor('test').patch('/test', {key: 'value'});10imposter.scopeFor('test').head('/test', {key: 'value'});11imposter.scopeFor('test').options('/test', {key: 'value'});12imposter.scopeFor('test').any('/test', {key: 'value'});13imposter.scopeFor('test').predicate('/test', {key: 'value'});14imposter.scopeFor('test').response('/test', {key: 'value'});15imposter.scopeFor('test').response('/test', {key: 'value'}, 200);16imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'});17imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain');18imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain', 'utf-8');19imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain', 'utf-8', 'test');20imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain', 'utf-8', 'test', 'test');21imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain', 'utf-8', 'test', 'test', 'test');22imposter.scopeFor('test').response('/test', {key: 'value'}, 200, {key: 'value'}, 'text/plain', 'utf-8', 'test', 'test', 'test23 }24 else {25 console.log('imposter created: ' + response.body.name);26 console.log(response.body);27 }28 });29 }30});31mb.create({ port: port }, function (error

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run mountebank automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful