//Setup
  export default async function({login, graphql, data, imports, q, queries, account}, {enabled = false} = {}) {
    //Plugin execution
      try {
        //Check if plugin is enabled and requirements are met
          if ((!enabled)||(!q.stargazers))
            return null

        //Load inputs
          imports.metadata.plugins.stargazers.inputs({data, account, q})

        //Retrieve stargazers from graphql api
          console.debug(`metrics/compute/${login}/plugins > stargazers > querying api`)
          const repositories = data.user.repositories.nodes.map(({name:repository, owner:{login:owner}}) => ({repository, owner})) ?? []
          const dates = []
          for (const {repository, owner} of repositories) {
            //Iterate through stargazers
              console.debug(`metrics/compute/${login}/plugins > stargazers > retrieving stargazers of ${repository}`)
              let cursor = null
              let pushed = 0
              do {
                console.debug(`metrics/compute/${login}/plugins > stargazers > retrieving stargazers of ${repository} after ${cursor}`)
                const {repository:{stargazers:{edges}}} = await graphql(queries.stargazers({login:owner, repository, after:cursor ? `after: "${cursor}"` : ""}))
                cursor = edges?.[edges?.length-1]?.cursor
                dates.push(...edges.map(({starredAt}) => new Date(starredAt)))
                pushed = edges.length
              } while ((pushed)&&(cursor))
            //Limit repositories
              console.debug(`metrics/compute/${login}/plugins > stargazers > loaded ${dates.length} stargazers for ${repository}`)
          }
          console.debug(`metrics/compute/${login}/plugins > stargazers > loaded ${dates.length} stargazers in total`)

        //Compute stargazers increments
          const days = 14
          const increments = {dates:Object.fromEntries([...new Array(days).fill(null).map((_, i) => [new Date(Date.now()-i*24*60*60*1000).toISOString().slice(0, 10), 0]).reverse()]), max:NaN, min:NaN}
          dates
            .map(date => date.toISOString().slice(0, 10))
            .filter(date => date in increments.dates)
            .map(date => increments.dates[date]++)
          increments.min = Math.min(...Object.values(increments.dates))
          increments.max = Math.max(...Object.values(increments.dates))

        //Compute total stargazers
          let {stargazers} = data.computed.repositories
          const total = {dates:{...increments.dates}, max:NaN, min:NaN}
          {
            const dates = Object.keys(total.dates)
            for (let i = dates.length-1; i >= 0; i--) {
              const date = dates[i], tomorrow = dates[i+1]
              stargazers -= (increments.dates[tomorrow] ?? 0)
              total.dates[date] = stargazers
            }
          }
          total.min = Math.min(...Object.values(total.dates))
          total.max = Math.max(...Object.values(total.dates))

        //Months name
          const months = ["", "Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."]

        //Results
          return {total, increments, months}
      }
    //Handle errors
      catch (error) {
        throw {error:{message:"An error occured", instance:error}}
      }
  }
