greensock/GSAP · warning

Please gsap.registerPlugin(CustomEase)

Error message

Please gsap.registerPlugin(CustomEase)

What it means

CustomEase requires a GSAP core instance to register its "_CE" ease parser. _initCore warns when gsap cannot be found (window.gsap missing or registerPlugin unavailable), because without core the ease cannot hook into GSAP.

Solutions

  1. Call gsap.registerPlugin(CustomEase) at startup before creating eases
  2. Ensure gsap core is loaded/imported before CustomEase initialization
  3. Check window.gsap exists when using script tags
  4. Use the same gsap instance everywhere (single package version)

Example fix

// before
import { CustomEase } from 'gsap/all'; // gsap core never imported
// after
import { gsap, CustomEase } from 'gsap/all';
gsap.registerPlugin(CustomEase);
const ease = CustomEase.create('myEase', 'M0,0 C0.1,0 ...');
Defensive patterns

Strategy: validation

Validate before calling

if (typeof gsap === 'undefined' || !gsap.registerPlugin) {
  throw new Error('CustomEase requires gsap core; load gsap first');
}
gsap.registerPlugin(CustomEase);

Type guard

function gsapCoreReady() {
  return typeof gsap !== 'undefined' && typeof gsap.registerPlugin === 'function';
}

Prevention

When it happens

Trigger: Importing CustomEase but never calling gsap.registerPlugin(CustomEase); loading CustomEase before the gsap core script; running in an environment without window (SSR); a custom gsap build without registerPlugin.

Common situations: Script tag order wrong (CustomEase before gsap.js); bundler importing CustomEase from 'gsap/all' but gsap from a different copy; forgetting registration entirely.

Related errors


AI-assisted analysis of greensock/GSAP@13e2b79054 (2026-08-29). Data as JSON: /api/errors/bec15f6407e3f900. Report an issue: GitHub.

Appendix: source

Thrown at src/CustomEase.js:21

 * https://gsap.com
 *
 * @license Copyright 2008-2026, GreenSock. All rights reserved.
 * Subject to the terms at https://gsap.com/standard-license
 * @author: Jack Doyle, jack@greensock.com
*/
/* eslint-disable */

import { stringToRawPath, rawPathToString, transformRawPath } from "./utils/paths.js";

let gsap, _coreInitted,
	_getGSAP = () => gsap || (typeof(window) !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap),
	_initCore = () => {
		gsap = _getGSAP();
		if (gsap) {
			gsap.registerEase("_CE", CustomEase.create);
			_coreInitted = 1;
		} else {
			console.warn("Please gsap.registerPlugin(CustomEase)");
		}
	},
	_bigNum = 1e20,
	_round = value => ~~(value * 1000 + (value < 0 ? -.5 : .5)) / 1000,
	_bonusValidated = 1, //<name>CustomEase</name>
	_numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/gi, //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.
	_needsParsingExp = /[cLlsSaAhHvVtTqQ]/g,
	_findMinimum = values => {
		let l = values.length,
			min = _bigNum,
			i;
		for (i = 1; i < l; i += 6) {
			+values[i] < min && (min = +values[i]);
		}
		return min;
	},
	//takes all the points and translates/scales them so that the x starts at 0 and ends at 1.
	_normalize = (values, height, originY) => {

View on GitHub (pinned to 13e2b79054)