Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/zarthus/custom-calendar

Typescript project for a custom calendar
https://github.com/zarthus/custom-calendar

calendar rpg typescript-library

Last synced: about 1 month ago
JSON representation

Typescript project for a custom calendar

Awesome Lists containing this project

README

        

# Custom Calendar

A library for custom calendar written with typescipt, functionality with zero dependencies,
define your own calendars, and interact with them.

Add your own custom calendar to your software using this library.

## Features

- Easily create a custom calendar with terms we're already familiar with: days, weeks, months, years
- Easily navigate back or forward through a year and calculates year increments/decrements
- A builder with strict error checking to ensure the calendar you're building is correct
- Support for custom holidays/festivities
- Good customizability, so you can use it in your own custom calendars, such as
ones you would need for RPGs or World Building.
- Well tested - the provided API has a good enough coverage %.

### No support for

- Leap years (though you can manually account for it if you only
need a single-year calendar rather than multi-year, by creating
a calendar with the leap-month's days incremented by 1.)
- Workdays / Days off - the calendar does not tell you if a festivity is
a day off or just an observation, nor can you specify
non-working days in a Week object.
- There is no definition of seasons
- Weeks are not transitioned properly into new years, day 1 of year 1 begins with the first day of the week,
no matter if the previous year ended on a different day than the last.

### Caveats

- Calendars start at the year zero unless otherwise specified in the builder.

## Install the library

```
npm install @zarthus/custom-calendar
```

## How to use

```typescript
import { CalendarBuilder, BuilderMonth } from "@zarthus/custom-calendar";

const myCalendar = CalendarBuilder.builder("Gregorian", ["Monday", "Tuesday", "..."])
.addBuilderMonth(
new BuilderMonth("January", 31)
.addFestivity("New Years", 1)
)
.addBuilderMonth(
new BuilderMonth("February", 28)
.addFestivity("Valentines Day", 14)
)
.startingYear(2023)
// and so on..
.build();

const vDay = myCalendar.clone().advance(31 + 14);

// Today is the 14th of February, 2023
console.log(`Today is the ${vDay.getDayOfMonth()}th of ${vDay.getMonth().name}, ${vDay.getYear()}`);
// Let's celebrate Valentines Day
console.log(`Let's celebrate ${vDay.current().getFestivity()?.name ?? ".. nothing!"}`);
```

## Versioning

This repository uses semantic versioning.

## License

Licensed under [MIT](LICENSE)