🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@memberjunction/global

Package Overview
Dependencies
Maintainers
11
Versions
437
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@memberjunction/global - npm Package Compare versions

Comparing version
5.44.0
to
5.45.0
+2
dist/__tests__/CronUtils.test.d.ts
export {};
//# sourceMappingURL=CronUtils.test.d.ts.map
{"version":3,"file":"CronUtils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/CronUtils.test.ts"],"names":[],"mappings":""}
import { describe, it, expect } from 'vitest';
import { BuildCronExpression, DefaultCronSchedule, DescribeCronExpression, IsPlausibleCronExpression, Ordinal, ParseCronExpression, } from '../util/CronUtils.js';
describe('cron-utils', () => {
describe('BuildCronExpression', () => {
it('builds hourly', () => {
expect(BuildCronExpression({ ...DefaultCronSchedule(), Kind: 'hourly', Minute: 15 })).toBe('15 * * * *');
});
it('builds daily', () => {
expect(BuildCronExpression({ ...DefaultCronSchedule(), Kind: 'daily', Minute: 30, Hour: 7 })).toBe('30 7 * * *');
});
it('builds weekly', () => {
expect(BuildCronExpression({ ...DefaultCronSchedule(), Kind: 'weekly', Minute: 0, Hour: 9, DayOfWeek: 5 })).toBe('0 9 * * 5');
});
it('builds monthly', () => {
expect(BuildCronExpression({ ...DefaultCronSchedule(), Kind: 'monthly', Minute: 0, Hour: 6, DayOfMonth: 15 })).toBe('0 6 15 * *');
});
it('passes advanced raw through trimmed', () => {
expect(BuildCronExpression({ ...DefaultCronSchedule(), Kind: 'advanced', Raw: ' */5 * * * * ' })).toBe('*/5 * * * *');
});
});
describe('ParseCronExpression', () => {
it('round-trips each preset', () => {
const cases = [
{ cron: '15 * * * *', kind: 'hourly' },
{ cron: '30 7 * * *', kind: 'daily' },
{ cron: '0 9 * * 5', kind: 'weekly' },
{ cron: '0 6 15 * *', kind: 'monthly' },
];
for (const { cron, kind } of cases) {
const parsed = ParseCronExpression(cron);
expect(parsed.Kind).toBe(kind);
expect(BuildCronExpression(parsed)).toBe(cron);
}
});
it('falls back to advanced for step / range shapes', () => {
expect(ParseCronExpression('*/5 * * * *').Kind).toBe('advanced');
expect(ParseCronExpression('0 9-17 * * 1-5').Kind).toBe('advanced');
expect(ParseCronExpression('0 0 1 1 *').Kind).toBe('advanced'); // month pinned
});
it('preserves Raw for advanced expressions (never lossy)', () => {
const parsed = ParseCronExpression('0 9-17 * * 1-5');
expect(parsed.Raw).toBe('0 9-17 * * 1-5');
expect(BuildCronExpression(parsed)).toBe('0 9-17 * * 1-5');
});
it('treats blank / malformed input as advanced-ish defaults without throwing', () => {
expect(ParseCronExpression('').Kind).toBe('daily'); // fresh default schedule
expect(ParseCronExpression('not a cron').Kind).toBe('advanced');
expect(ParseCronExpression(null).Kind).toBe('daily');
});
});
describe('DescribeCronExpression', () => {
it('describes presets in words', () => {
expect(DescribeCronExpression('0 * * * *')).toBe('Every hour, on the hour');
expect(DescribeCronExpression('15 * * * *')).toBe('Every hour at :15');
expect(DescribeCronExpression('30 7 * * *')).toBe('Daily at 7:30 AM');
expect(DescribeCronExpression('0 13 * * 5')).toBe('Every Friday at 1:00 PM');
expect(DescribeCronExpression('0 6 15 * *')).toBe('Monthly on the 15th at 6:00 AM');
});
it('describes common step shapes', () => {
expect(DescribeCronExpression('* * * * *')).toBe('Every minute');
expect(DescribeCronExpression('*/5 * * * *')).toBe('Every 5 minutes');
expect(DescribeCronExpression('0 */2 * * *')).toBe('Every 2 hours at :00');
});
it('falls back to the raw expression rather than guessing', () => {
expect(DescribeCronExpression('0 9-17 * * 1-5')).toBe('0 9-17 * * 1-5');
});
it('handles midnight and noon correctly', () => {
expect(DescribeCronExpression('0 0 * * *')).toBe('Daily at 12:00 AM');
expect(DescribeCronExpression('0 12 * * *')).toBe('Daily at 12:00 PM');
});
});
describe('Ordinal', () => {
it('handles the tricky teens', () => {
expect(Ordinal(1)).toBe('1st');
expect(Ordinal(2)).toBe('2nd');
expect(Ordinal(3)).toBe('3rd');
expect(Ordinal(11)).toBe('11th');
expect(Ordinal(12)).toBe('12th');
expect(Ordinal(13)).toBe('13th');
expect(Ordinal(21)).toBe('21st');
expect(Ordinal(22)).toBe('22nd');
expect(Ordinal(23)).toBe('23rd');
});
});
describe('IsPlausibleCronExpression', () => {
it('accepts 5 and 6 field expressions', () => {
expect(IsPlausibleCronExpression('0 9 * * *')).toBe(true);
expect(IsPlausibleCronExpression('0 0 9 * * *')).toBe(true);
});
it('rejects other shapes', () => {
expect(IsPlausibleCronExpression('')).toBe(false);
expect(IsPlausibleCronExpression('0 9')).toBe(false);
expect(IsPlausibleCronExpression('a b c d e f g')).toBe(false);
});
});
});
//# sourceMappingURL=CronUtils.test.js.map
{"version":3,"file":"CronUtils.test.js","sourceRoot":"","sources":["../../src/__tests__/CronUtils.test.ts"],"names":[],"mappings":"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"}
/**
* Pure, dependency-free cron helpers: friendly preset (hourly / daily / weekly /
* monthly) ↔ 5-field cron expression round-tripping, human-readable descriptions,
* and a lightweight plausibility check. Originally built for the User Routines
* editor; general-purpose for any schedule-editing UI.
*
* NOT a cron engine: for real validation, is-due checks, and next-occurrence math
* use `CronExpressionHelper` in `@memberjunction/scheduling-engine` (parser-backed;
* it can't live here without pulling cron-parser + core into MJGlobal).
* {@link IsPlausibleCronExpression} is only a UI pre-filter, not validation.
*/
/** Which schedule preset a cron expression corresponds to (or 'advanced' when none). */
export type CronPresetKind = 'hourly' | 'daily' | 'weekly' | 'monthly' | 'advanced';
/** Structured schedule the editor binds to; converted to/from a cron expression. */
export interface CronSchedule {
/** The preset in effect. 'advanced' means Raw is authoritative. */
Kind: CronPresetKind;
/** Minute (0-59). Hourly: minute past each hour. Other presets: minute of the run time. */
Minute: number;
/** Hour (0-23) for daily / weekly / monthly presets. */
Hour: number;
/** Day of week (0-6, 0 = Sunday) for the weekly preset. */
DayOfWeek: number;
/** Day of month (1-31) for the monthly preset. */
DayOfMonth: number;
/** Raw cron expression — authoritative when Kind === 'advanced'. */
Raw: string;
}
/** Weekday display names indexed by cron day-of-week value (0 = Sunday). */
export declare const CRON_DAY_NAMES: readonly string[];
/** A fresh default schedule: daily at 9:00 AM. */
export declare function DefaultCronSchedule(): CronSchedule;
/** Builds the cron expression for a structured schedule. */
export declare function BuildCronExpression(schedule: CronSchedule): string;
/**
* Parses a cron expression back into a structured schedule, detecting the friendly
* presets the editor can render. Anything that doesn't match a preset shape comes
* back as 'advanced' with Raw preserved (never lossy).
*/
export declare function ParseCronExpression(cron: string | null | undefined): CronSchedule;
/**
* Human-friendly description of a cron expression. Covers the editor presets plus a
* couple of common step shapes; anything else falls back to the raw expression so the
* UI never shows a wrong description.
*/
export declare function DescribeCronExpression(cron: string | null | undefined): string;
/** Formats an hour/minute pair as a 12-hour clock time (e.g. "9:05 AM"). */
export declare function FormatTimeOfDay(hour: number, minute: number): string;
/** English ordinal for a day-of-month (1 → "1st", 22 → "22nd"). */
export declare function Ordinal(n: number): string;
/** Loose sanity check for a raw (advanced) cron expression: 5 or 6 whitespace-separated fields. */
export declare function IsPlausibleCronExpression(raw: string): boolean;
//# sourceMappingURL=CronUtils.d.ts.map
{"version":3,"file":"CronUtils.d.ts","sourceRoot":"","sources":["../../src/util/CronUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wFAAwF;AACxF,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF,oFAAoF;AACpF,MAAM,WAAW,YAAY;IACzB,mEAAmE;IACnE,IAAI,EAAE,cAAc,CAAC;IACrB,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;CACf;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAE3C,CAAC;AAEF,kDAAkD;AAClD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAalE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,CA0CjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAiC9E;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAWzC;AAED,mGAAmG;AACnG,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG9D"}
/**
* Pure, dependency-free cron helpers: friendly preset (hourly / daily / weekly /
* monthly) ↔ 5-field cron expression round-tripping, human-readable descriptions,
* and a lightweight plausibility check. Originally built for the User Routines
* editor; general-purpose for any schedule-editing UI.
*
* NOT a cron engine: for real validation, is-due checks, and next-occurrence math
* use `CronExpressionHelper` in `@memberjunction/scheduling-engine` (parser-backed;
* it can't live here without pulling cron-parser + core into MJGlobal).
* {@link IsPlausibleCronExpression} is only a UI pre-filter, not validation.
*/
/** Weekday display names indexed by cron day-of-week value (0 = Sunday). */
export const CRON_DAY_NAMES = [
'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
];
/** A fresh default schedule: daily at 9:00 AM. */
export function DefaultCronSchedule() {
return { Kind: 'daily', Minute: 0, Hour: 9, DayOfWeek: 1, DayOfMonth: 1, Raw: '' };
}
/** Builds the cron expression for a structured schedule. */
export function BuildCronExpression(schedule) {
switch (schedule.Kind) {
case 'hourly':
return `${schedule.Minute} * * * *`;
case 'daily':
return `${schedule.Minute} ${schedule.Hour} * * *`;
case 'weekly':
return `${schedule.Minute} ${schedule.Hour} * * ${schedule.DayOfWeek}`;
case 'monthly':
return `${schedule.Minute} ${schedule.Hour} ${schedule.DayOfMonth} * *`;
case 'advanced':
return schedule.Raw.trim();
}
}
/**
* Parses a cron expression back into a structured schedule, detecting the friendly
* presets the editor can render. Anything that doesn't match a preset shape comes
* back as 'advanced' with Raw preserved (never lossy).
*/
export function ParseCronExpression(cron) {
const result = DefaultCronSchedule();
const raw = (cron ?? '').trim();
result.Raw = raw;
if (!raw) {
return result;
}
const parts = raw.split(/\s+/);
if (parts.length !== 5) {
result.Kind = 'advanced';
return result;
}
const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;
if (!isSimpleInt(minute) || month !== '*') {
result.Kind = 'advanced';
return result;
}
const min = parseInt(minute, 10);
if (hour === '*' && dayOfMonth === '*' && dayOfWeek === '*') {
return { ...result, Kind: 'hourly', Minute: min };
}
if (isSimpleInt(hour) && dayOfMonth === '*' && dayOfWeek === '*') {
return { ...result, Kind: 'daily', Minute: min, Hour: parseInt(hour, 10) };
}
if (isSimpleInt(hour) && dayOfMonth === '*' && isSimpleInt(dayOfWeek)) {
const dow = parseInt(dayOfWeek, 10);
if (dow >= 0 && dow <= 6) {
return { ...result, Kind: 'weekly', Minute: min, Hour: parseInt(hour, 10), DayOfWeek: dow };
}
}
if (isSimpleInt(hour) && isSimpleInt(dayOfMonth) && dayOfWeek === '*') {
const dom = parseInt(dayOfMonth, 10);
if (dom >= 1 && dom <= 31) {
return { ...result, Kind: 'monthly', Minute: min, Hour: parseInt(hour, 10), DayOfMonth: dom };
}
}
result.Kind = 'advanced';
return result;
}
/**
* Human-friendly description of a cron expression. Covers the editor presets plus a
* couple of common step shapes; anything else falls back to the raw expression so the
* UI never shows a wrong description.
*/
export function DescribeCronExpression(cron) {
const raw = (cron ?? '').trim();
if (!raw) {
return '';
}
// Common step shapes that aren't presets but read well in words
const everyMinute = /^\*\s+\*\s+\*\s+\*\s+\*$/;
if (everyMinute.test(raw)) {
return 'Every minute';
}
const minuteStep = /^\*\/(\d+)\s+\*\s+\*\s+\*\s+\*$/.exec(raw);
if (minuteStep) {
return `Every ${minuteStep[1]} minutes`;
}
const hourStep = /^(\d+)\s+\*\/(\d+)\s+\*\s+\*\s+\*$/.exec(raw);
if (hourStep) {
return `Every ${hourStep[2]} hours at :${padTwo(parseInt(hourStep[1], 10))}`;
}
const schedule = ParseCronExpression(raw);
switch (schedule.Kind) {
case 'hourly':
return schedule.Minute === 0 ? 'Every hour, on the hour' : `Every hour at :${padTwo(schedule.Minute)}`;
case 'daily':
return `Daily at ${FormatTimeOfDay(schedule.Hour, schedule.Minute)}`;
case 'weekly':
return `Every ${CRON_DAY_NAMES[schedule.DayOfWeek]} at ${FormatTimeOfDay(schedule.Hour, schedule.Minute)}`;
case 'monthly':
return `Monthly on the ${Ordinal(schedule.DayOfMonth)} at ${FormatTimeOfDay(schedule.Hour, schedule.Minute)}`;
case 'advanced':
return raw;
}
}
/** Formats an hour/minute pair as a 12-hour clock time (e.g. "9:05 AM"). */
export function FormatTimeOfDay(hour, minute) {
const suffix = hour < 12 ? 'AM' : 'PM';
const displayHour = hour % 12 === 0 ? 12 : hour % 12;
return `${displayHour}:${padTwo(minute)} ${suffix}`;
}
/** English ordinal for a day-of-month (1 → "1st", 22 → "22nd"). */
export function Ordinal(n) {
const mod100 = n % 100;
if (mod100 >= 11 && mod100 <= 13) {
return `${n}th`;
}
switch (n % 10) {
case 1: return `${n}st`;
case 2: return `${n}nd`;
case 3: return `${n}rd`;
default: return `${n}th`;
}
}
/** Loose sanity check for a raw (advanced) cron expression: 5 or 6 whitespace-separated fields. */
export function IsPlausibleCronExpression(raw) {
const parts = raw.trim().split(/\s+/);
return parts.length === 5 || parts.length === 6;
}
function isSimpleInt(value) {
return /^\d+$/.test(value);
}
function padTwo(n) {
return n.toString().padStart(2, '0');
}
//# sourceMappingURL=CronUtils.js.map
{"version":3,"file":"CronUtils.js","sourceRoot":"","sources":["../../src/util/CronUtils.ts"],"names":[],"mappings":"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"}
+1
-0

@@ -13,2 +13,3 @@ export { ClassFactory, ClassRegistration } from './ClassFactory.js';

export * from './util/UUIDUtils.js';
export * from './util/CronUtils.js';
export * from './util/SerializationUtils.js';

@@ -15,0 +16,0 @@ export * from './ValidationTypes.js';

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AAMtC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AAMtC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA"}

@@ -14,2 +14,3 @@ // Export all types and utilities

export * from './util/UUIDUtils.js';
export * from './util/CronUtils.js';
export * from './util/SerializationUtils.js';

@@ -16,0 +17,0 @@ export * from './ValidationTypes.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AAEtC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAE/B,6DAA6D;AAC7D,oCAAoC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AAEtC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAE/B,6DAA6D;AAC7D,oCAAoC"}
{
"name": "@memberjunction/global",
"type": "module",
"version": "5.44.0",
"version": "5.45.0",
"description": "MemberJunction: Global Object - Needed for ALL other MJ components",

@@ -6,0 +6,0 @@ "main": "dist/index.js",