@memberjunction/global
Advanced tools
| 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 +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"} |
+1
-0
@@ -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"} |
+1
-1
| { | ||
| "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", |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
927583
2.88%198
4.21%11984
2.53%