npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

epitech.js

v0.2.4

Published

Library to interact with the Epitech intranet

Downloads

15

Readme

epitech.js

Wrapper for Epitech intranet for NodeJS with complete TypeScript typings.

Install

npm install epitech.js

Getting started

You might want to take a look at files in src/examples.

You may also want to have a look at the Usage section below to discover how login to the intranet.

Usage

Login to the intranet (Puppeteer auth provider)

Epitech.js can be used with Puppeteer to login to the intranet without using an autologin link and without having to renew the session manually.

To do so, you need to install an additional dependency:

npm install @epitech.js/puppeteer-auth-provider

You will then need to import the RawIntra and PuppeteerAuthProvider classes:

import { RawIntra } from 'epitech.js';
import { PuppeteerAuthProvider } from '@epitech.js/puppeteer-auth-provider';

// or

const { RawIntra } = require('epitech.js');
const { PuppeteerAuthProvider } = require('@epitech.js/puppeteer-auth-provider');

The RawIntra class will provide you a low-abstraction access to the Intranet endpoints.

The PuppeteerAuthProvider class will provide you a way to login to the intranet for a long period of time.

You may want to read the @epitech.js/puppeteer-auth-provider documentation to know how to make adjustments and how to fix common issues.

const intra = new RawIntra({
    provider: new PuppeteerAuthProvider({
        // path to the file where the auth data will be stored
        storageFilePath: './storage.json',

        // ... additional options for the PuppeteerAuthProvider are available
    })
});

You can then use the RawIntra class to access the intranet endpoints! Feel free to have a look at the Documentation section to see the available endpoints.

Puppeteer is only one way to login to the intranet with epitech.js, but not the only one! See the sections below to learn more about other ways to login to the intranet and access endpoints with epitech.js.

Login to the intranet (custom auth provider - cookie auth)

Import the RawIntra class, that provides you a low-abstraction access to the Intranet endpoints:

import { RawIntra } from "epitech.js";  // TypeScript / ES6
// or
const { RawIntra } = require("epitech.js");  // Classic NodeJS

You will also need to use an auth provider to get an access cookie.

See the auth providers section for more information on how to create your own auth provider.

Here is an example provider, the access cookie can be grabbed from a browser authenticated to the intranet (Inspector -> Storage -> Cookies -> user -> Value).

Please note that authentication cookies are only valid for a limited time (usually up to a week), which is why you may only directly use this provider for testing purposes or short automation scripts.

class MyProvider {
    async refresh() {
        return "{authentication cookie}";
    }
}

Once you have the access cookie, you can create a RawIntra instance:

const intra = new RawIntra({
    provider: new MyProvider(),
});

And now you can access the intranet endpoints!

Login to the intranet (autologin - legacy)

Since August 2022, autologin access doesn't work any more and is locked behind a whitelist. You will probably need to use an auth provider in order to manually provide and refresh authentication cookies instead.

Go into https://intra.epitech.eu/admin/autolog and grab your autologin link.

Import the RawIntra class, that provides you a low-abstraction access to the Intranet endpoints:

import { RawIntra } from "epitech.js";  // TypeScript / ES6
// or
const { RawIntra } = require("epitech.js");  // Classic NodeJS
const intra = new RawIntra({
    autologin: "https://intra.epitech.eu/auth-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
});

Safety concerns

This section describes some safety concerns regarding the usage of previous versions of this library.

Old versions of epitech.js did not have any security measures or sanity checks built-in. It is therefore recommended having a recent version of epitech.js (at least v0.1.7).

Since v0.2.0, epitech.js performs an autologin link validation. Previous versions of epitech.js did not perform this check, which could lead to security issues when using invalid autologin links.

Since v0.2.0, epitech.js provides an indirect authentication strategy to avoid leaking your autologin link. This strategy performs an authentication request separately from your requests. As of this release, it is the default strategy. Previous versions used a direct strategy, which was insecure.

Documentation

Raw classes (bindings)

Here is a table matching each method of the raw classes and the corresponding endpoint:

RawIntra (intra.epitech.eu)

| Binding | Endpoint | |--------------------------------|----------------------------------------------------------------| | getDashboard | / | | getUser | /user/:user or /user | | getUserDetails | /user/:user/print/ | | getUserNetsoul | /user/:user/netsoul | | getUserPartners | /user/:user/binome | | getUserEducationalOverview | none (scraped from /user/:user/#!/pedago) | | getUserAbsences | /user/:user/absences | | getPlanning | /planning/load | | getCalendarFile | /planning/load?format=ical | | getModuleBoard | /module/board | | filterCourses | /course/filter | | getModule | /module/:year/:module/:instance | | getModuleRegistered | /module/:year/:module/:instance/registered | | getActivity | /module/:year/:module/:instance/:activity | | getActivityAppointments | /module/:year/:module/:instance/:activity/rdv | | getProject | /module/:year/:module/:instance/:activity/project | | getProjectRegistered | /module/:year/:mod/:ins/:act/project/registered | | getProjectUnregistered | /module/:year/:mod/:ins/:act/project/exportunregistered | | getProjectFiles | /module/:year/:mod/:ins/:act/project/file | | getEventRegistered | /module/:year/:mod/:ins/:act/:event/registered | | getInternships | /stage | | getAutologin | /admin/autologin |

| Binding | Endpoint | |--------------------------------|----------------------------------------------------------------| | registerEventByUrl | /module/:year/:mod/:ins/:act/:event/register | | unregisterEventByUrl | /module/:year/:mod/:ins/:act/:event/unregister | | registerProjectByUrl | /module/:year/:mod/:ins/:act/project/register | | registerProjectGroupByUrl | /module/:year/:mod/:ins/:act/project/register | | destroyProjectGroupByUrl | /module/:year/:mod/:ins/:act/project/destroygroup | | joinGroupByUrl | /module/:year/:mod/:ins/:act/project/confirmjoingroup | | declineJoinGroupByUrl | /module/:year/:mod/:ins/:act/project/declinejoingroup | | leaveGroupByUrl | /module/:year/:mod/:ins/:act/project/confirmleavegroup |

Note: The same endpoints can be used to perform different actions or fetch different data, as the parameters or the payloads can be different.

Classes

RawIntra

getDashboard(): Promise<RawDashboard>

Get the dashboard information.

getUser(login?: string): Promise<RawUser>

Get the user overall information.

If login is not provided, the current user will be used.

If login is provided and is not the current user, you might need additional permissions.

getUserDetails(login: string): Promise<RawUserDetails>

Get the detailed profile of the user. If the specified user is not the current user, you might need additional permissions.

getUserNetsoul(login: string): Promise<RawUser>

Get the user netsoul stats. If the specified user is not the current user, you might need additional permissions.

getUserPartners(login: string): Promise<RawUserPartnersOutput>

Get the other users with which the user has been with in projects and/or activities. If the specified user is not the current user, you might need additional permissions.

getUserEducationalOverview(login: string): Promise<RawUserEducationalUpdate[]>

Get the educational history of the specified user (courses changes, semester changes, location changes, ...). If the specified user is not the current user, you might need additional permissions.

Note: The current implementation relies on JSON extraction and scraping techniques since no endpoint is available.

getUserAbsences(login: string): Promise<RawUserAbsencesOutput>

Get the absences of the user. If the specified user is not the current user, you might need additional permissions.

getPlanning(start?: Date, end?: Date): Promise<RawPlanningElement[]>

Gets the planning between the specified dates, both parameters are required to show planning in a range.

Otherwise, the full year planning will be loaded.

getCalendarFile({ locations, semesters, ... })

Gets the calendar file stream.

The file will be downloaded and returned as an axios stream, which can be then be handled. See the calendar download example.

    const stream = await intra.getCalendarFile({
        locations: ['FR/PAR', 'FR'],
        semesters: [0, 3, 4],
        onlyMyEvent: false,
        onlyMyPromo: true,
        onlyMyModule: true
    });
    stream.pipe(fs.createWriteStream("calendar.ical"));
getModuleBoard(start: Date, end: Date): Promise<RawModuleBoardActivity[]>

Get every modules' activities between the start date and the end date.

filterCourses(filter: RawCourseFilters): Promise<RawCourseFilterOutput>

Get the modules matching the specified filter.

Filter format:

{
    preload?: boolean;
    locations?: string[],
    courses?: `${string}/${string}`[],
    scolaryears?: number[]
}

Example usage:

const coursesPromise = intra.filterCourses({
    locations: [ "FR", "FR/PAR" ],
    courses: [ "bachelor/classic" ],
    scolaryears: [ 2021 ]
});
getModule({ scolaryear, module, instance }): Promise<RawModule>

Get the specified module.

getModuleByUrl(url: ModuleUrl | string): Promise<RawModule>

Get the specified module by url.

getModuleRegistered({ scolaryear, module, instance }): Promise<RawModuleRegisteredUser[]>

Get the registered users for a module.

getModuleRegisteredByUrl(url: ModuleUrl | string): Promise<RawModuleRegisteredUser[]>

Get the registered users for a module by module url.

getActivity({ scolaryear, module, instance, activity }): Promise<RawActivity>

Get the activity information.

getActivityByUrl(url): Promise<RawActivity>

Get the activity information by activity url.

getActivityAppointments({ scolaryear, module, instance, activity }): Promise<RawModuleActivityAppointment>

Get the activity appointments (rdv).

getActivityAppointmentsByUrl(url): Promise<RawModuleActivityAppointment>

Get the activity appointments (rdv) by activity url.

getProject({ scolaryear, module, instance, activity }): Promise<RawProject>

Get the project.

getProjectByUrl(url): Promise<RawProject>

Get the project by project or activity url.

getProjectRegistered({ scolaryear, module, instance, activity }): Promise<RawProjectRegisteredGroup[]>

Get the registered groups for the project.

getProjectRegisteredByUrl(url): Promise<RawProjectRegisteredGroup[]>

Get the registered groups for the project by project or activity url.

getProjectUnregistered({ scolaryear, module, instance, activity }): Promise<string[]>

Get an array of unregistered users logins for the project.

getProjectUnregisteredByUrl(url): Promise<string[]>

Get an array of unregistered users logins for the project by project or activity url.

getProjectFiles({ scolaryear, module, instance, activity }): Promise<RawProjectFile[]>

Get an array of files for the project.

downloadFile(url): Promise<stream>

Download a file from the intranet by its url.

The file will be downloaded and returned as an axios stream, which can be then be handled. See the file download example.

getProjectFilesByUrl(url): Promise<RawProjectFile[]>

Get an array of files for the project by project or activity url.

getEventRegistered({ scolaryear, module, instance, activity, event }): Promise<RawEventRegisteredUser[]>

Get the users registered to the event.

getEventRegisteredByUrl(eventUrl): Promise<RawEventRegisteredUser[]>

Get the users registered to the event by url.

getInternships(): Promise<RawInternshipOutput>

Get the internships for current user.

getAutologin(): Promise<string>

Get autologin link for the current session.

registerEventByUrl(eventUrl): Promise<void>

Register to event by event url.

unregisterEventByUrl(eventUrl): Promise<void>

Unregister to event by event url.

registerProjectByUrl(projectUrl): Promise<void>

Register to project by project url.

registerProjectGroupByUrl(projectUrl, { title: string, membersLogins: string[] }): Promise<void>

Register a project group by project url.

destroyProjectGroupByUrl(projectUrl, groupCode?: string): Promise<void>

Destroy a project group by project url and group code (searched if not specified).

joinGroupByUrl(projectUrl, userLogin?: string): Promise<void>

Make the specified user join a project group by project url.

If user login is not specified, current user login is used. Additional permissions might be required if user login is not the current user.

declineJoinGroupByUrl(projectUrl): Promise<void>

Decline joining the inviting group for this project, by project url.

leaveGroupByUrl(projectUrl, userLogin?: string): Promise<void>

Make the specified user leave a project group by project url.

If user login is not specified, current user login is used. Additional permissions might be required if user login is not the current user.

solveUrl(url: string, validTypes: string[] = ["all"]): string

Get the underlying route from specified intranet URL. Will strip the autologin part if present.

Valid types: "all", "module", "project", "activity".

Unless "all" is specified in the valid types, path checks will be performed.

In case of no match with any valid types provided, if possible, a path transformation will be attempted (e.g. activity -> project).

If url doesn't match any valid types and the path transformation fails, an error is thrown.

solveModuleUrl({ scolaryear, module, instance }): ActivityUrl

Get the module route using the provided information.

solveActivityUrl({ scolaryear, module, instance, activity }): ActivityUrl

Get the activity route using the provided information.

solveProjectUrl({ scolaryear, module, instance, activity }): ProjectUrl

Get the project route using the provided information.

getRequestProvider(): IntraRequestProvider

Get the request provider that performs the API calls.

IntraRequestProvider

json(route: string, config?: AxiosRequestConfig): Promise<AxiosResponse>
get(route: string, config?: AxiosRequestConfig): Promise<AxiosResponse>
getStream(route: string, config?: AxiosRequestConfig): Promise<AxiosResponse>
post(route: string, body: any, config?: AxiosRequestConfig): Promise<AxiosResponse>

Auth Providers

Auth providers are used to provide authentication cookies to epitech.js in order to perform API calls.

An auth provider is a class that implements the AuthProvider interface.

AuthProvider

refresh(): Promise<string> - Refresh the authentication cookie.

Returns a promise that resolves to the new authentication cookie. Is called a first time before the first API call, and then each time the authentication cookie has expired.

Please note that if a request still fails after a refresh, no further refreshes will be made until the next request is done and the current request will fail.