Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/modules / ___dist / chain-able / test / TransformObserve.js
Size: Mime:
const log = require('fliplog')
const isUrl = require('../src/deps/is/url')
const replace = require('../src/deps/fp/replace')
const pipe = require('../src/deps/fp/pipe')
const curry = require('../src/deps/fp/curry')
const bind = require('../src/deps/fp/bind')
const includesCount = require('../src/deps/fp/includesCount')
const toArr = require('../src/deps/to-arr')
const camelCase = require('../src/deps/string/camelCase')
const not = require('../src/deps/conditional/not')
const eq = require('../src/deps/traversers/eq')
const isEmpty = require('../src/deps/is/empty')
const isFunction = require('../src/deps/is/function')
const isString = require('../src/deps/is/stringPrimitive')
const isMap = require('../src/deps/is/map')
const debounce = require('../src/deps/_/debounce')
const throttle = require('../src/deps/_/throttle')
const objToMap = require('../src/deps/cast/objToMap')
const {Chain, escapeDot, trim} = require('../exports')
const getMeta = require('../src/deps/meta')
const chainPlus = require('../src/chainPlus')

const notEmpty = not(isEmpty)

const isNotFile = x =>
  !isUrl(x) &&
  x.includes('.') &&
  !x.includes('.js') &&
  !x.includes('.ts') &&
  includesCount(x, '.') >= 2

const hrefStripTransform = href => {
  if (!href) return ''
  return href.replace(/\n/, '')
}
const hrefDotToAnchorTransform = href => {
  if (!href) return href || ''
  else if (isNotFile(href)) return replace(href, href.lastIndexOf('.'), '#')
  else return href
}

const getEntryLinks = (block, find) =>
  block
    .split('*')
    .filter(line => line.includes(find))
    .filter(line => (find === '@link' ? !line.includes('@see') : line))
    .map(trim)
    // .map(replace('*', ''))
    .map(link => {
      const pieces = link
        .replace('{@link', '')
        .replace('}\n', '')
        .replace(/\}\s?/, '')
        .split(' ')
        .filter(notEmpty)
        .map(trim)

      // @link vs @see vs @see {@link}
      if (pieces.length === 2) {
        return {href: pieces[0], label: pieces[1]}
      }
      else if (pieces.length === 1) {
        return {label: pieces[0]}
      }
      else {
        // const e = new Error('@link tag with 0 parts ' + block)
        // console.error(e)
        return {}
      }
    })

let links = new Map()

// we should only ever parse 2x?
// let partsMap = new Map()


const getChain = () => {
  const chain = new Chain().methods(['label', 'href']).autoGetSet().build()
  return chainPlus(chain)
}

const cacheLinks = parts =>
  parts
    .filter(link => link.href !== '@see' && link.label !== '@see')
    .forEach(link => links.set(link.label, link.href))

const toRepoSearch = x =>
  `https://github.com/fluents/chain-able/search?utf8=%E2%9C%93&q=${x}&type=`

// @TODO abstract to render anything referencing any other files to links
/* prettier-ignore */
function remapSee(entry) {
  const linesWithLinkTag = getEntryLinks(entry, '@link')
  cacheLinks(linesWithLinkTag)

  const linesWithSeeTag = getEntryLinks(entry, '@see')

  // require('fliplog').quick({linesWithSeeTag, entry})

  // mock `find`
  const find = x => (x.includes('is/eh') ? [x] : [])


  const remappedSee = linesWithSeeTag
    .map(link => {
      const chain = getChain()
      // chain.clear()

      // chain.dot(false)

      // let label = link.label
      // let href = link.href

      // find -----
      let found = find(link.label)
      let foundRel
      if (link.label && found.length)  {
        link.href = found
        // foundRel = found.map(files.toRel)
        // const extractedLink = foundRel.shift()
        // href = files.toRepoPath(extractedLink)
      }

      // transform -----

      // chain.transform('label', [
      //   label => links.has(label) ?
      // ])

      // const labelIs = chain.propIs('label')
      // const hrefIs = chain.propIs('href')
      // const setLabel = chain.set('label')
      // const setHref = chain.set('href')
      // const getLabel = chain.view('label')
      // const setHref = chain.view('href')
      const {
        labelIs,
        labelNot,
        setLabel,
        getLabel,
        labelEq,
        transformLabel,
        labelTransforms,
        observeLabel,
      } = chain.lense('label')

      const hrefLense = chain.lense('href')
      const {
        hrefIs,
        hrefEq,
        hrefNot,
        setHref,
        getHref,
        transformHref,
        escapeDotHref,
        freezeHref,
      } = hrefLense

      // escapeDotHref()
      // require('fliplog').bold('lense').quick(chain.lense('href'))
      // require('fliplog').bold('lense').quick(Object.keys(chain.lense('href')))
      // require('fliplog').bold('lense').quick(chain.lense('href').setHref)

      // we have both label, and href...

      // const setHrefToRepoSearch = () => pipe(toRepoSearch, setHref)
      const setHrefToRepoSearch = () => setHref(toRepoSearch(getHref()))
      const labelToHref = pipe(setHref, getLabel)
      const hrefToLabel = pipe(setLabel, getHref)

      observeLabel(data => {
        const label = data.label
        if (links.has(label)) {
          setHref(links.get(label))
          freezeHref()
        }
      })

      // const {
      //   // query
      //   hrefIs,
      //   hrefEq,
      //   hrefNot,
      //   // getset
      //   setHref,
      //   getHref,
      //   // transform
      //   transformHref,
      //   observeTransform,
      //   // aliasable for better naming
      //   transformObserve,
      //   // presets
      //   escapeDotHref,
      //   freezeHref,
      // } = chain.lense('href')
      //
      // const setLinkAsLabel = pipe(getLink, setHref)
      //
      // observeLabel(({label}) => {
      //   if (hasLinkFor(label)) {
      //     setLinkAsLabel(label)
      //     freezeHref()
      //   }
      // })


      chain
        .ifElse(c => labelIs('@see') && getHref())
        .then(c => hrefToLabel())

      chain
        .ifElse(c => {
          // console.log('HREF', getHref(), getLabel(), chain.get('href'), chain.get('label'), chain)
          return hrefEq('@see') && getLabel()
        })
        .then(c => {
          console.log('not see...')
          return labelToHref()
        })

      chain
        .ifElse(c =>
          // chain.propIs('label', isUrl) &&
          // chain.propIsNot('href', isUrl)
          labelIs(isUrl) &&
          hrefNot(isUrl)
        )
        .then(c => labelToHref())
        .elseIf(c => hrefNot(isUrl))
        .then(c => setHrefToRepoSearch())

      // github.com/Class.method //=> github.com/Class#method
      // transformHref(hrefDotToAnchorTransform)

      observeLabel(data => {
        const {label} = data
        console.log({label, 'has': links.has(label)})
        console.log({[label]: links.get(label)})

        if (links.has(label)) {
          setHref(links.get(label))
          // chain.set('href', links.get(label))
          freezeHref()
        }
      })

      // grab it from the nameMap
      // labelTransforms([
      //   label => {
      //     const href = getHref()
      //     if (labelEq('@see') && href) return href
      //     return label
      //   }]
      // )
      transformLabel(label => {
        const href = getHref()
        if (labelEq('@see') && href) return href
        return label
      })
      // toRepoSearch()

      chain.setSilent('label', link.label).setSilent('href', link.href)
      chain.label(link.label).href(link.href)

      // @TODO
      // chain.meta.delete('transformers')
      // require('fliplog').quick({chain, links, meta: chain.meta})

      const {href, label} = chain.entries()
      return {href, label}
    })
    // .filter(filterNotReal)

  // log.data({remappedSee}).echo()

  return remappedSee
}


const docblock = `
  /**
   * @desc spreads the entries from ChainedMap.store.values
   *       allocates a new array, adds the values from the iterator
   *
   * @memberOf Chainable
   * @since 0.4.0
   *
   * @return {Array<any>} toArr(this.store.values())
   *
   * {@link https://kangax.github.io/compat-table/es6/#test-Array_static_methods compat-array-static-methods}
   * {@link https://stackoverflow.com/questions/20069828/how-to-convert-set-to-array set-to-array}
   * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values mozilla-map-values}
   * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values mozilla-set-values}
   *
   * @see {@link mozilla-map-values}
   * @see {@link mozilla-set-values}
   * @see {@link compat-array-static-methods}
   * @see {@link set-to-array}
   * @see is/eh
   * @see not/found
   *
   * @example
   *
   *  const chain = new Chain()
   *  chain.set('eh', 1)
   *  chain.values()
   *  //=> [1]
   *
   */
`

const _expectedLinks = {
  'compat-array-static-methods': 'https://kangax.github.io/compat-table/es6/#test-Array_static_methods',
  'set-to-array': 'https://stackoverflow.com/questions/20069828/how-to-convert-set-to-array',
  'mozilla-map-values': 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values',
  'mozilla-set-values': 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values',
}

const expectedLinks = objToMap(_expectedLinks)
// _expectedLinks

// throttle, merge all logs into 1
const todo = x => console.log('@TODO: ', x)

todo('lense.set')
todo('lense.freeze')
todo('lense.destructure')
todo('lense.get')
todo('lense.has')
todo('lense.escape')
todo('lense.eq')
todo('lense.is')
todo('lense.not')
todo('lense.silent')
todo('lense.observe')
todo('lense.transform')
todo('ifElse')
todo('unobserve')
todo('untransform')
todo('propIs')
todo('boundMethods')
todo('bind')

test('cast objToMap', () => {
  const linkNames = Object.keys(_expectedLinks)
  expect(isMap(expectedLinks)).toBe(true)
  expect(expectedLinks.size).toBe(linkNames.length)

  const expectEqual = (x, y) => expect(x).toEqual(y)
  linkNames.forEach(name =>
    expectEqual(expectedLinks.get(name), _expectedLinks[name]))
})

test.skip('remapsee', () => {
  const remapped = remapSee(docblock)
  log.quick({remapped})
})


// -----

// href = hrefDotToAnchorTransform(href)
// transform
// if (links.has(label)) {
//   href = links.get(label)
// }
// if (label === '@see' && href) {
//   label = href
// }
// if (href === '@see' && label) {
//   href = label
// }
// if (isUrl(label) && !isUrl(href)) {
//   href = label
// }
// not a url, cannot find it, add search
// else if (!isUrl(href) && href) {
//   href = toRepoSearch(href)
// }

// const transformed = presets(href, label)
// href = transformed.href
// label = transformed.label

// -------

// // .methods(['label', 'href'])
// // .onInvalid(invalidError => {
// //   // ignore invalid links
// // })
// // .type('string')
// // .build()
//
//
// // @TODO need `bestMatch`
// // const foundMatching = found
// // .filter(file => file && isMatch(file, link.label))
//
// if (found.length > 1) {
//   // found = found
//   // .filter(file => file && isMatch(getFileName(file), link.label))
// }
// log.magenta('found').data(found).echo()
//
// const whenFound = _see => {
//   found = found.map(files.toRel)
//
//   if (found.length) {
//     // .filter(isMatch(link.label))
//     const extractedLink = found.shift() || ''
//
//     // when it's a property
//     if (extractedLink.includes('.')) {
//       // @TODO
//     }
//
//     see.set('href', files.toRepoPath(extractedLink))
//   }
// }
// const whenNotFound = _see => {
//   // _see.set('href', link.href)
// }
//
// // we want it before the label transforms
// see.when(found.length, whenFound, whenNotFound)
//
// // @see => http
// see.transform('href', x => (x === '@see' ? see.get('label') || '' : x))
//
// // use label if it's a url
// see.transform('href', href => {
//   const label = see.get('label')
//   if (isUrl(label) && !isUrl(href)) return label
//   else return href
// })
//
// // if href is not a url, transform toGithubRepoPath
// see.transform('href', href => {
//   const label = see.get('label')
//   if (isUrl(href)) return href
//   else return files.toRepoPath(href || label || '')
//   // else return href
// })
//
// // @example
// // github.com/Class.method //=> github.com/Class#method
// see.transform('href', hrefDotToAnchorTransform)
//
// // can be scoped, no need for +1 func
// // strip new lines and default fallback
// see.transform('href', hrefStripTransform)
//
//
// // grab it from the nameMap
// see.transform('label', label => {
//   if (links.has(label)) {
//     see.set('href', links.get(label))
//   }
//   return label
// })
// see.transform('label', label => {
//   const href = see.get('href')
//   if (label === '@see' && href) return href //return humanizeLinkLabel(href)
//   return label
// })
// // ugh this messes with the href...
// // need to tighten up the expected output add more tests
// see.transform('label', label => {
//   if (isUrl(label)) {
//     // return humanizeLinkLabel(label)
//   }
//   return label
// })
//
// // log.data({link, found}).echo()
// // see.when(found.length, whenFound, whenNotFound)
// see.label(link.label).href(link.href)
//
// return see.entries()