# Buggy code
def jslink(self, target, code=None, args=None, bidirectional=False, **links):
    """
    Links properties on the source object to those on the target
    object in JS code. Supports two modes, either specify a
    mapping between the source and target model properties as
    keywords or provide a dictionary of JS code snippets which
    maps from the source parameter to a JS code snippet which is
    executed when the property changes.

    Arguments
    ----------
    target: HoloViews object or bokeh Model or panel Viewable
      The target to link the value to.
    code: dict
      Custom code which will be executed when the widget value
      changes.
    bidirectional: boolean
      Whether to link source and target bi-directionally
    **links: dict
      A mapping between properties on the source model and the
      target model property to link it to.

    Returns
    -------
    link: GenericLink
      The GenericLink which can be used unlink the widget and
      the target model.
    """
    if links and code:
        raise ValueError(
            "Either supply a set of properties to "
            "link as keywords or a set of JS code "
            "callbacks, not both."
        )
    elif not links and not code:
        raise ValueError(
            "Declare parameters to link or a set of callbacks, neither was defined."
        )
    if args is None:
        args = {}

    mapping = code or links
    for k in mapping:
        if k.startswith("event:"):
            continue
        elif k not in self.param and k not in list(self._rename.values()):
            matches = difflib.get_close_matches(k, list(self.param))
            if matches:
                matches = " Similar parameters include: %r" % matches
            else:
                matches = ""
            raise ValueError(
                "Could not jslink %r parameter (or property) "
                "on %s object because it was not found.%s"
                % (k, type(self).__name__, matches)
            )
        elif (
            self._source_transforms.get(k, False) is None
            or self._rename.get(k, False) is None
        ):
            raise ValueError(
                "Cannot jslink %r parameter on %s object, "
                "the parameter requires a live Python kernel "
                "to have an effect." % (k, type(self).__name__)
            )

    if isinstance(target, Syncable) and code is None:
        for k, p in mapping.items():
            if k.startswith("event:"):
                continue
            elif p not in target.param and p not in list(target._rename.values()):
                matches = difflib.get_close_matches(p, list(target.param))
                if matches:
                    matches = " Similar parameters include: %r" % matches
                else:
                    matches = ""
                raise ValueError(
                    "Could not jslink %r parameter (or property) "
                    "on %s object because it was not found.%s"
                    % (p, type(self).__name__, matches)
                )
            elif (
                target._source_transforms.get(p, False) is None
                or target._rename.get(p, False) is None
            ):
                raise ValueError(
                    "Cannot jslink %r parameter on %s object "
                    "to %r parameter on %s object. It requires "
                    "a live Python kernel to have an effect."
                    % (k, type(self).__name__, p, type(target).__name__)
                )

    from .links import Link

    return Link(
        self,
        target,
        properties=links,
        code=code,
        args=args,
        bidirectional=bidirectional,
    )


# Traceback (ValueError)
ValueError                                Traceback (most recent call last)
<ipython-input-27-627e90bb010e> in <module>
16 '''
17 #pp.jslink(m, code={'x_range.start': jsupdateinfo})
---> 18 pp.jslink(s, **{'x_range.start': 'value'})
19
20 # params -> plot

~/anaconda3/envs/panel/lib/python3.8/site-packages/panel/viewable.py in jslink(self, target, code, args, bidirectional, **links)
1083                 else:
1084                     matches = ''
-> 1085                 raise ValueError("Could not jslink %r parameter (or property) "
1086                                  "on %s object because it was not found.%s"
1087                                  % (k, type(self).__name__, matches))

ValueError: Could not jslink 'x_range.start' parameter (or property) on Bokeh object because it was not found.

# Fixed code
def jslink(self, target, code=None, args=None, bidirectional=False, **links):
    """
    Links properties on the source object to those on the target
    object in JS code. Supports two modes, either specify a
    mapping between the source and target model properties as
    keywords or provide a dictionary of JS code snippets which
    maps from the source parameter to a JS code snippet which is
    executed when the property changes.

    Arguments
    ----------
    target: HoloViews object or bokeh Model or panel Viewable
      The target to link the value to.
    code: dict
      Custom code which will be executed when the widget value
      changes.
    bidirectional: boolean
      Whether to link source and target bi-directionally
    **links: dict
      A mapping between properties on the source model and the
      target model property to link it to.

    Returns
    -------
    link: GenericLink
      The GenericLink which can be used unlink the widget and
      the target model.
    """
    if links and code:
        raise ValueError(
            "Either supply a set of properties to "
            "link as keywords or a set of JS code "
            "callbacks, not both."
        )
    elif not links and not code:
        raise ValueError(
            "Declare parameters to link or a set of callbacks, neither was defined."
        )
    if args is None:
        args = {}

    mapping = code or links
    for k in mapping:
        if k.startswith("event:"):
            continue
        elif hasattr(self, "object") and isinstance(self.object, LayoutDOM):
            current = self.object
            for attr in k.split("."):
                if not hasattr(current, attr):
                    raise ValueError(
                        f"Could not resolve {k} on "
                        f"{self.object} model. Ensure "
                        "you jslink an attribute that "
                        "exists on the bokeh model."
                    )
                current = getattr(current, attr)
        elif k not in self.param and k not in list(self._rename.values()):
            matches = difflib.get_close_matches(k, list(self.param))
            if matches:
                matches = " Similar parameters include: %r" % matches
            else:
                matches = ""
            raise ValueError(
                "Could not jslink %r parameter (or property) "
                "on %s object because it was not found.%s"
                % (k, type(self).__name__, matches)
            )
        elif (
            self._source_transforms.get(k, False) is None
            or self._rename.get(k, False) is None
        ):
            raise ValueError(
                "Cannot jslink %r parameter on %s object, "
                "the parameter requires a live Python kernel "
                "to have an effect." % (k, type(self).__name__)
            )

    if isinstance(target, Syncable) and code is None:
        for k, p in mapping.items():
            if k.startswith("event:"):
                continue
            elif p not in target.param and p not in list(target._rename.values()):
                matches = difflib.get_close_matches(p, list(target.param))
                if matches:
                    matches = " Similar parameters include: %r" % matches
                else:
                    matches = ""
                raise ValueError(
                    "Could not jslink %r parameter (or property) "
                    "on %s object because it was not found.%s"
                    % (p, type(self).__name__, matches)
                )
            elif (
                target._source_transforms.get(p, False) is None
                or target._rename.get(p, False) is None
            ):
                raise ValueError(
                    "Cannot jslink %r parameter on %s object "
                    "to %r parameter on %s object. It requires "
                    "a live Python kernel to have an effect."
                    % (k, type(self).__name__, p, type(target).__name__)
                )

    from .links import Link

    return Link(
        self,
        target,
        properties=links,
        code=code,
        args=args,
        bidirectional=bidirectional,
    )