( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ HEX
HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux mail.thebrand.ai 6.8.0-107-generic #107-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 13 19:51:50 UTC 2026 x86_64
User: www-data (33)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/tmpr/..//node_modules/dot-object/test/array_notation.js
'use strict'

/* jshint -W030 */

require('should')
var Dot = require('../index')

describe('Dotted Array notation', function () {
  var src

  beforeEach(function () {
    src = {
      path: [{
        longitude: 5.512482166290283,
        latitude: 52.5006217956543
      }, {
        longitude: 5.512370586395264,
        latitude: 52.50059509277344
      }, {
        longitude: 5.512370586395264,
        latitude: 52.50059509277344
      }]
    }
  })

  function runVariant (type) {
    var v = function (v) {
      if (type === 'bracket') {
        // rewrite some.prop.1 to some.prop[1]
        return v.replace(/\.(-?\d+)/g, '[$1]')
      } else {
        return v
      }
    }

    describe('can pick', function () {
      it('index', function () {
        Dot.pick(v('path.0'), src).should.eql(src.path[0])
        Dot.pick(v('path.2'), src).should.eql(src.path[2])
        ;(typeof Dot.pick(v('path.9'), src)).should.eql('undefined')
      })

      it('negative index', function () {
        Dot.pick(v('path.-1'), src).should.eql(src.path[2])
        Dot.pick(v('path.-2'), src).should.eql(src.path[1])
        Dot.pick(v('path.-3'), src).should.eql(src.path[0])
        ;(typeof Dot.pick(v('path.-9'), src)).should.eql('undefined')
      })

      it('non-array `-` prefixed properties', function () {
        var src = {
          path: {
            '-1': 'test1',
            '-2': 'test2',
            '-3': 'test3',
            '----key': 'test4'
          }
        }
        Dot.pick(v('path.-1'), src).should.eql('test1')
        Dot.pick(v('path.-2'), src).should.eql('test2')
        Dot.pick(v('path.-3'), src).should.eql('test3')
        Dot.pick(v('path.----key'), src).should.eql('test4')
        ;(typeof Dot.pick(v('path.-9'), src)).should.eql('undefined')
      })

      it('multiple indexes', function () {
        var src = {
          I: [
            { am: [{ nes: ['ted'] }] },
            { me: 'too' }
          ]
        }

        Dot.pick(v('I.0'), src).should.eql(src.I[0])
        Dot.pick(v('I.0.am'), src).should.eql(src.I[0].am)
        Dot.pick(v('I.0.am.0'), src).should.eql(src.I[0].am[0])
        Dot.pick(v('I.0.am.0.nes'), src).should.eql(src.I[0].am[0].nes)
        Dot.pick(v('I.0.am.0.nes.0'), src).should.eql('ted')
        Dot.pick(v('I.1.me'), src).should.eql('too')
      })
    })

    describe('can set', function () {
      it('index at target', function () {
        var obj = { path: [] }

        Dot.set(v('path.0'), 'test', obj)
        Dot.set(v('path.1'), 'test2', obj)

        obj.path.should.be.instanceOf(Array)
        obj.should.eql({ path: ['test', 'test2'] })
      })

      it('index and set undefined for empty indices', function () {
        var obj = { path: [] }

        Dot.set(v('path.0'), 'test', obj)
        Dot.set(v('path.2'), 'test2', obj)

        obj.path.should.be.instanceOf(Array)

        // array will have an undefined index.
        JSON.stringify(obj)
          .should.eql(
            JSON.stringify({ path: ['test', undefined, 'test2'] })
          )

        // to json will converted it to null
        JSON.stringify(obj).should.eql('{"path":["test",null,"test2"]}')
      })

      it('index and overwrite existing values', function () {
        var obj = { path: ['still', 'shall', 'be', 'gone', 'here'] }

        Dot.set(v('path.1'), 'x', obj)
        Dot.set(v('path.2'), 'xx', obj)
        Dot.set(v('path.3'), 'xxx', obj)

        obj.should.eql({ path: ['still', 'x', 'xx', 'xxx', 'here'] })
      })
    })

    describe('can remove', function () {
      it('indexes one by one leaving traces', function () {
        var obj = { path: ['still', 'shall', 'really', 'be', 'gone', 'here'] }

        Dot.remove(v('path.1'), obj)
        Dot.remove(v('path.2'), obj)
        Dot.del(v('path.3'), obj) // use alias
        Dot.del(v('path.4'), obj)

        // array will have an undefined index.
        JSON.stringify(obj)
          .should.eql(
            JSON.stringify({
              path: [
                'still', undefined, undefined, undefined, undefined, 'here'
              ]
            })
          )

        // to json will converted it to null
        JSON.stringify(obj).should.eql(
          '{"path":["still",null,null,null,null,"here"]}'
        )
      })

      it('array of indexes leaving no traces', function () {
        var obj = { path: ['still', 'shall', 'really', 'be', 'gone', 'here'] }

        Dot.remove([
          v('path.1'),
          v('path.2'),
          v('path.3'),
          v('path.4')], obj)

        JSON.stringify(obj).should.eql('{"path":["still","here"]}')
      })
    })
  }

  describe('with dot notation', function () {
    runVariant()
  })

  // extra logic no real benefit.
  describe('with bracket notation', function () {
    runVariant('bracket')
  })

  describe('Refuse to update __proto__', function () {
    var obj = { path: [] }

    ;(() => Dot.set('path[0].__proto__.toString', 'test', obj)).should.throw(/Refusing to update/)
  })
})