Tengo un fragmento de código para eliminar la parte del host de la URL del servidor en la definición de OpenAPI. No sé cómo hacerlo totalmente libre de puntos. (No es necesario hacer eso. Pero solo quiero saber cómo hacerlo).
La parte difícil para mí es deshacerme de la variable local idx . Leí este SO y parece que ap puede resolver. No lo intenté porque no hay ap en lodash.
const convert = _.flow([ _.split('/'), (segments) => { const idx = _.findLastIndex(containAny(['{', '}', ':']))(segments); return _.drop(idx+1, segments); }, _.reject(_.isEmpty), _.join('/'), path => '/' + path, ]);Código completo:
const _ = require('lodash/fp'); const urls = [ 'http://localhost:8080/petstore/v1', '//localhost/petstore/v1', '{server}/batch-service/api/batches/lwm2m/v1', 'https://{server}/batch-service/api/batches/lwm2m/v1', '/batch-service/api/batches/lwm2m/v1', '/', ] const containAny = patterns => str => _.some(pattern => _.includes(pattern, str), patterns); const convert = _.flow([ _.split('/'), (segments) => { const idx = _.findLastIndex(containAny(['{', '}', ':']))(segments); return _.drop(idx+1, segments); }, _.reject(_.isEmpty), _.join('/'), path => '/' + path, ]); _.map(convert)(urls);En su caso, debe llamar a _.findLastIndex() en los segments y luego llamar a _.drop() en los resultados de la búsqueda y los segments :
drop(findLastIndex(segments))(segments)Lo que es equivalente a la función combinadora de cadena :
const chain = f => g => x => f(g(x))(x); Lodash/fp acepta todas las funciones cuando usa _.flow() (que también es un combinador funcional), por lo que puede crear otros combinadores funcionales y usarlos.
const chain = f => g => x => f(g(x))(x); const containAny = patterns => str => _.some(pattern => _.includes(pattern, str), patterns); const findLastSegmentIndex = _.flow( _.findLastIndex(containAny(['{', '}', ':'])), _.add(1) ) const convert = _.flow([ _.split('/'), chain(_.drop)(findLastSegmentIndex), _.reject(_.isEmpty), _.join('/'), path => '/' + path, ]); const urls = [ 'http://localhost:8080/petstore/v1', '//localhost/petstore/v1', '{server}/batch-service/api/batches/lwm2m/v1', 'https://{server}/batch-service/api/batches/lwm2m/v1', '/batch-service/api/batches/lwm2m/v1', '/', ]; const result = _.map(convert)(urls); console.log(result); <script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>Necesitarías converge , que lodash no tiene, pero Ramda sí. Aplica diferentes funciones al mismo argumento y luego usa el resultado de estas aplicaciones como argumentos para otra función dada.
const convert = _.flow([ _.split('/'), R.converge(_.drop, [_.flow([_.findLastIndex(containAny(['{', '}', ':'])), add(1)]), _.identity]), _.reject(_.isEmpty), _.join('/'), path => '/' + path, ]);