Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
be5d697
feat(core): add cullArea property to SceneNode
Jun 26, 2026
bf5cc15
feat(core): add cullArea property to SceneNode
Jun 26, 2026
0b3dc6c
feat(build): add IIFE CDN bundle and size-limit CI gate
Jun 26, 2026
bccef0b
feat(build): add IIFE CDN bundle and size-limit CI gate
Jun 26, 2026
1ee0a0b
feat(tilemap): add Tiled parallax factor support
Jun 26, 2026
f482bb8
feat(tilemap): add Tiled parallax factor support
Jun 26, 2026
274544e
feat(animation): add TweenSequencer for composing animations
Jun 26, 2026
0cc471f
feat(animation): add TweenSequencer
Jun 26, 2026
429dc79
feat(ui): add Tooltip and ScrollContainer widgets
Jun 26, 2026
78e10a1
feat(ui): add Tooltip and ScrollContainer widgets
Jun 26, 2026
c370888
feat(rendering): wire W3C blend modes suite (all 18 modes)
Jun 26, 2026
eb074ac
feat(rendering): wire W3C blend modes suite (all 18 modes)
Jun 26, 2026
6168669
feat(core): add Logger class and expand Signal hookpoints
Jun 26, 2026
9e6b803
style: fix lint/format errors in v0.15 batch (sort imports, remove du…
Jun 26, 2026
aa12ddf
docs: generate API pages for Logger, LogSeverity, TweenSequencer (v0.…
Jun 26, 2026
7e94aca
feat(material): add MeshMaterial.from() and SpriteMaterial.from() sta…
Jun 26, 2026
b3ed3e3
feat(material): add MeshMaterial.from() and SpriteMaterial.from() sta…
Jun 26, 2026
b40704b
feat(resources): add onLoadStart/Progress/Complete/Error signals to L…
Jun 26, 2026
307161e
feat(tilemap): add Wang autotile system (WangSet + autoTile)
Jun 26, 2026
1779835
feat(ldtk): add @codexo/exojs-ldtk package
Jun 26, 2026
f87a7e8
feat(aseprite): add @codexo/exojs-aseprite extension package
Jun 26, 2026
12ac94c
feat(react): add @codexo/exojs-react package with ExoCanvas, useExoAp…
Jun 26, 2026
33ab2c1
feat: add MeshMaterial.from() + SpriteMaterial.from() factory overloads
Jun 26, 2026
d3c93bf
feat: add Loader signals (onLoadStart, onLoadProgress, onLoadComplete…
Jun 26, 2026
ad15f3f
feat(tilemap): add WangSet + autoTile() autotile algorithm
Jun 26, 2026
1292b02
feat: add @codexo/exojs-aseprite package (Aseprite JSON export format)
Jun 26, 2026
1889da2
feat: add @codexo/exojs-ldtk package (LDtk level format)
Jun 26, 2026
7d64872
feat: add @codexo/exojs-react package (useExoApp, ExoCanvas, useScene)
Jun 26, 2026
bb19e3a
chore: register aseprite/ldtk/react packages in workspace + fix lint …
Jun 26, 2026
8fadcf5
fix(ldtk): update public.ts exports to renamed flip constants
Jun 26, 2026
b909965
docs: regenerate API pages for Loader signals, MeshMaterial.from, Spr…
Jun 26, 2026
a2897be
fix(build): rename IIFE global from ExoJS to Exo
Jun 26, 2026
3619f5a
feat(build): add full IIFE bundle (exo.full.iife.js) with all extensi…
Jun 26, 2026
5df2af4
style: prettier format rollup.config.ts + exo-full.entry.ts
Jun 26, 2026
a63c25e
feat(tilemap): add refreshCell, variant-stable WangSet membership, Ti…
Jun 26, 2026
13ca2eb
feat(tiled): support base64 + gzip/zlib tile-layer data via new core …
Jun 26, 2026
763ca55
feat(tilemap): carry Tiled layer/tileset/map metadata into runtime
Jun 26, 2026
fd56bf8
feat(tilemap): per-tile collision, text objects, image layers, Tiled …
Jun 26, 2026
47185c0
docs: regenerate API pages for ImageLayer, collision, text objects, w…
Jun 26, 2026
fb4061a
feat(react): build to dist/esm, useExoApplication hook + live option …
Jun 26, 2026
e396a80
fix(react): type containerRef as Ref for @types/react 18+19 compatibi…
Jun 26, 2026
0a6460c
refactor(react): make useExoApplication generic over container elemen…
Jun 26, 2026
4e5a003
refactor(react): drop the wrapper div, render the canvas directly
Jun 26, 2026
ffcff50
feat(react): make ExoCanvas batteries-included again (positioned wrap…
Jun 26, 2026
c48fedd
docs(react): add README + LICENSE (publish prerequisites)
Jun 26, 2026
29b38de
chore(release): data-drive lockstep package set; wire aseprite/ldtk/r…
Exoridus Jun 27, 2026
a027b12
feat(physics): body sleeping with islands (A1.1) (#186)
Exoridus Jun 27, 2026
f4a088a
feat(physics): sleeping perf gate + drawSleeping debug (A1.2) (#187)
Exoridus Jun 27, 2026
334ab0a
feat(physics): joint infrastructure + DistanceJoint (A2.1) (#188)
Exoridus Jun 27, 2026
ad4c35c
feat(physics): revolute + weld joints (A2.2 + A2.3) (#189)
Exoridus Jun 27, 2026
dc82ede
feat(physics): CCD / bullet-mode (A3.1) (#190)
Exoridus Jun 27, 2026
1e96a4b
feat(physics): rope limits + revolute motor/limits (mechanism pack M1…
Exoridus Jun 27, 2026
105aa41
feat(physics): add PrismaticJoint + WheelJoint (mechanism pack M2) (#…
Exoridus Jun 27, 2026
ef3c1de
feat(physics): CCD bullet-vs-dynamic + normal reflection (P1) (#193)
Exoridus Jun 27, 2026
b023c70
feat(physics): add MouseJoint (soft drag-to-target constraint) (#194)
Exoridus Jun 27, 2026
3a0b09e
fix(core): oriented bounding-box axes for rotated-node SAT collision …
Exoridus Jun 27, 2026
fd396ba
fix(core): world-transform gating for AABB-vs-OBB collision (inherite…
Exoridus Jun 27, 2026
0db4184
feat(core): fixed-timestep loop (Scene.fixedUpdate / onFixedFrame / f…
Exoridus Jun 27, 2026
b78dbb5
docs(api): wire physics / aseprite / ldtk into the generated API docs…
Exoridus Jun 27, 2026
004e1e4
test(aseprite, ldtk): meaningful characterization suites (F1) (#199)
Exoridus Jun 27, 2026
420d8ca
test(react): React Testing Library suite + jsdom project (F1) (#200)
Exoridus Jun 27, 2026
90fe717
feat(tooling): create:package scaffolder (F4) (#201)
Exoridus Jun 27, 2026
3f7ba57
fix(site): rewrite '#'-subpath imports in the playground vendor types…
Exoridus Jun 27, 2026
297a6c1
feat(site): brand assets + favicons from the new wordmark/mark set (#…
Exoridus Jun 27, 2026
a8e5a2d
fix(site): unblock build (subsystem enum) + guide box spacing (#204)
Exoridus Jun 27, 2026
783b6ec
feat(site): hero companion mascot greeter on the home page (#205)
Exoridus Jun 27, 2026
d673d6a
fix(site): make code blocks readable in the light theme (#206)
Exoridus Jun 27, 2026
a40b88c
fix(site): scroll-spy highlights the last guide section at page botto…
Exoridus Jun 27, 2026
0976e82
fix(site): type the Monaco onChange value param (clears ts7006) (#208)
Exoridus Jun 27, 2026
66a1e32
feat(site): land the physics, aseprite, ldtk, and React guides (#209)
Exoridus Jun 27, 2026
f0a341c
feat(site): companion 8-state callouts (#210)
Exoridus Jun 27, 2026
fc0c949
fix(site): rework companion callout badges to match the design mockup…
Exoridus Jun 27, 2026
3249d4a
fix(site): resolve extension typings in the playground editor
Jun 28, 2026
a1b5538
fix(site): fill the example preview + fix cross-realm canvas detection
Jun 28, 2026
7622ea8
feat(site): use the exo.js wordmark as the header logo
Jun 28, 2026
4002bdc
fix(site): activate the clicked TOC link in the guide scroll-spy
Jun 28, 2026
4af4020
feat(site): animate the homepage + playground card links + relocate c…
Jun 28, 2026
d258b5d
fix(site): add renderer-sdk to the playground import-map
Jun 28, 2026
dec8013
fix(ldtk): add renderer-sdk + debug tsconfig paths for cross-package …
Jun 28, 2026
25f5fef
perf(rendering): cross-call render batching (Track A) (#213)
Exoridus Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 6 additions & 3 deletions .github/workflows/_ci-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ jobs:
# Root `pnpm typecheck` only covers src/**; the extension packages own a
# separate tsconfig each, so typecheck them explicitly.
- name: Typecheck extension packages
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" typecheck
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" --filter "@codexo/exojs-aseprite" --filter "@codexo/exojs-ldtk" --filter "@codexo/exojs-react" typecheck

lint:
name: Lint
Expand Down Expand Up @@ -368,11 +368,14 @@ jobs:
- name: Build core
run: pnpm build

- name: Check bundle sizes
run: pnpm size

# The extension packages each have their own rollup build; pnpm runs them
# in workspace-dependency order (tilemap before tiled). A broken package
# build is now caught here instead of only at release time.
- name: Build extension packages
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" build
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" --filter "@codexo/exojs-aseprite" --filter "@codexo/exojs-ldtk" --filter "@codexo/exojs-react" build

- name: Verify core package exports
run: pnpm verify:exports
Expand All @@ -392,7 +395,7 @@ jobs:
# Pack each extension package (dry run) so a broken `files`/`exports` set in
# a package manifest is caught here, not at release time.
- name: Extension package dry runs
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" pack --dry-run
run: pnpm --filter "@codexo/exojs-particles" --filter "@codexo/exojs-tilemap" --filter "@codexo/exojs-tiled" --filter "@codexo/exojs-physics" --filter "@codexo/exojs-audio-fx" --filter "@codexo/exojs-aseprite" --filter "@codexo/exojs-ldtk" --filter "@codexo/exojs-react" pack --dry-run

# publint validates the published package.json itself (exports map, files,
# types resolution, module/main coherence) — the layer attw does NOT cover
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ jobs:
pnpm --filter @codexo/exojs-tiled build
pnpm --filter @codexo/exojs-physics build
pnpm --filter @codexo/exojs-audio-fx build
pnpm --filter @codexo/exojs-aseprite build
pnpm --filter @codexo/exojs-ldtk build
pnpm --filter @codexo/exojs-react build
pnpm site:build

# The site build can regenerate tracked content with platform-dependent
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ codexo-bg-*
!.gitmojirc.json
!.prettierignore
!.prettierrc
!.size-limit.cjs

# Allowlist tracked dot-directories. The directory itself plus all
# non-dotfile contents (workflow YAMLs, husky hooks, etc.). Dotfiles
Expand Down
14 changes: 14 additions & 0 deletions .size-limit.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module.exports = [
{
path: 'dist/exo.esm.js',
limit: '700 KB',
gzip: true,
},
{
path: 'dist/exo.iife.min.js',
limit: '250 KB',
gzip: true,
},
// The full bundle (dist/exo.full.iife.min.js) is opt-in (EXOJS_FULL_BUNDLE=1)
// and not produced by the default build, so it is not size-gated here.
];
32 changes: 28 additions & 4 deletions eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -492,11 +492,11 @@ export default defineConfig([
// policy. Excludes create-exo-app (standalone scaffolding CLI, no ESLint
// integration).
{
files: ['packages/exojs-*/test/**/*.ts'],
files: ['packages/exojs-*/test/**/*.{ts,tsx}'],
...tseslint.configs.disableTypeChecked,
},
{
files: ['packages/exojs-*/test/**/*.ts'],
files: ['packages/exojs-*/test/**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
Expand Down Expand Up @@ -554,7 +554,7 @@ export default defineConfig([
// Site React components. Astro files are type-checked by `astro check`; this
// block covers the TypeScript/TSX islands that ship browser interactivity.
{
files: ['site/src/**/*.{ts,tsx}'],
files: ['site/src/**/*.{ts,tsx}', 'packages/exojs-react/src/**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
Expand Down Expand Up @@ -655,6 +655,30 @@ export default defineConfig([
},
},

// The React integration package holds an imperative ExoJS `Application` handle
// in `useState` and mutates it by design (resize / clearColor / sizingMode),
// which the immutability rule cannot model. `@eslint-react/exhaustive-deps`
// duplicates `react-hooks/exhaustive-deps`; keep the latter as the single
// source so the in-code disables apply once.
{
files: ['packages/exojs-react/src/**/*.{ts,tsx}'],
rules: {
'react-hooks/immutability': 'off',
'@eslint-react/exhaustive-deps': 'off',
// Creating the imperative Application/Scene in an effect and exposing it
// as state is the defining pattern of this bridge, not a bug.
'react-hooks/set-state-in-effect': 'off',
'@eslint-react/set-state-in-effect': 'off',
// Targets React 18; `<Context.Provider>` / `useContext` are correct there
// (the `use()` and bare-`<Context>` forms are React 19+).
'@eslint-react/no-context-provider': 'off',
'@eslint-react/no-use-context': 'off',
// Reading declarative `<Scene>` config via Children.forEach is the
// intended pattern (mirrors react-three-fiber / react-router).
'@eslint-react/no-children-for-each': 'off',
},
},

// ---------------------------------------------------------------------------
// Per-subsystem overrides for src/. Scoped narrowly because these directories
// either have hot-path lifecycle invariants, browser-API variance, or typed-
Expand Down Expand Up @@ -1067,7 +1091,7 @@ export default defineConfig([
// structural test config above; covers both root and package test suites.
{
...vitest.configs.recommended,
files: ['test/**/*.ts', 'packages/exojs-*/test/**/*.ts'],
files: ['test/**/*.ts', 'packages/exojs-*/test/**/*.{ts,tsx}'],
rules: {
...vitest.configs.recommended.rules,
// Primary value: block an accidentally committed `.only`.
Expand Down
12 changes: 9 additions & 3 deletions examples/debug-layer/performance-overlay.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Auto-generated from performance-overlay.ts — edit the .ts source, not this file.
import { Application, Color, Keyboard, Scene, Sprite, Texture } from '@codexo/exojs';
import { Application, Color, Container, Keyboard, Scene, Sprite, Texture } from '@codexo/exojs';
import { DebugOverlay } from '@codexo/exojs/debug';
const app = new Application({
canvas: {
Expand All @@ -17,14 +17,21 @@ const debug = new DebugOverlay(app);
debug.layers.performance.visible = true;
class PerformanceOverlayScene extends Scene {
sprites;
layer;
async load(loader) {
await loader.load(Texture, { bunny: 'image/ship-a.png' });
}
init(loader) {
const { width, height } = this.app.canvas;
// All sprites share one texture, so adding them to a single container and
// rendering it once lets the renderer batch them into a single draw call.
// Rendering each sprite with its own `context.render(sprite)` call would
// instead emit one draw call per sprite and tank the frame rate.
this.layer = new Container();
this.sprites = Array.from({ length: 1600 }, () => {
const sprite = new Sprite(loader.get(Texture, 'bunny')).setAnchor(0.5).setScale(0.25);
sprite.setPosition(Math.random() * width, Math.random() * height);
this.layer.addChild(sprite);
return {
sprite,
vx: (Math.random() - 0.5) * 120,
Expand All @@ -47,8 +54,7 @@ class PerformanceOverlayScene extends Scene {
}
draw(context) {
context.backend.clear();
for (const { sprite } of this.sprites)
context.render(sprite);
context.render(this.layer);
}
}
app.start(new PerformanceOverlayScene());
11 changes: 9 additions & 2 deletions examples/debug-layer/performance-overlay.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Application, Color, Keyboard, Scene, Sprite, Texture } from '@codexo/exojs';
import { Application, Color, Container, Keyboard, Scene, Sprite, Texture } from '@codexo/exojs';
import { DebugOverlay } from '@codexo/exojs/debug';

const app = new Application({
Expand All @@ -19,6 +19,7 @@ debug.layers.performance.visible = true;

class PerformanceOverlayScene extends Scene {
private sprites!: { sprite: Sprite; vx: number; vy: number }[];
private layer!: Container;

override async load(loader): Promise<void> {
await loader.load(Texture, { bunny: 'image/ship-a.png' });
Expand All @@ -27,9 +28,15 @@ class PerformanceOverlayScene extends Scene {
override init(loader): void {
const { width, height } = this.app.canvas;

// All sprites share one texture, so adding them to a single container and
// rendering it once lets the renderer batch them into a single draw call.
// Rendering each sprite with its own `context.render(sprite)` call would
// instead emit one draw call per sprite and tank the frame rate.
this.layer = new Container();
this.sprites = Array.from({ length: 1600 }, () => {
const sprite = new Sprite(loader.get(Texture, 'bunny')).setAnchor(0.5).setScale(0.25);
sprite.setPosition(Math.random() * width, Math.random() * height);
this.layer.addChild(sprite);
return {
sprite,
vx: (Math.random() - 0.5) * 120,
Expand All @@ -53,7 +60,7 @@ class PerformanceOverlayScene extends Scene {

override draw(context): void {
context.backend.clear();
for (const { sprite } of this.sprites) context.render(sprite);
context.render(this.layer);
}
}

Expand Down
12 changes: 12 additions & 0 deletions examples/sprites-textures/blendmodes.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,20 @@ const BLEND_MODES = [
{ mode: BlendModes.Subtract, name: 'Subtract' },
{ mode: BlendModes.Multiply, name: 'Multiply' },
{ mode: BlendModes.Screen, name: 'Screen' },
// Advanced (backdrop-aware) modes — correct coverage, work with alpha.
{ mode: BlendModes.Darken, name: 'Darken' },
{ mode: BlendModes.Lighten, name: 'Lighten' },
{ mode: BlendModes.Overlay, name: 'Overlay' },
{ mode: BlendModes.ColorDodge, name: 'Color Dodge' },
{ mode: BlendModes.ColorBurn, name: 'Color Burn' },
{ mode: BlendModes.HardLight, name: 'Hard Light' },
{ mode: BlendModes.SoftLight, name: 'Soft Light' },
{ mode: BlendModes.Difference, name: 'Difference' },
{ mode: BlendModes.Exclusion, name: 'Exclusion' },
{ mode: BlendModes.Hue, name: 'Hue' },
{ mode: BlendModes.Saturation, name: 'Saturation' },
{ mode: BlendModes.Color, name: 'Color' },
{ mode: BlendModes.Luminosity, name: 'Luminosity' },
];
class BlendmodesScene extends Scene {
background;
Expand Down
12 changes: 12 additions & 0 deletions examples/sprites-textures/blendmodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,20 @@ const BLEND_MODES: Array<{ mode: BlendModes; name: string }> = [
{ mode: BlendModes.Subtract, name: 'Subtract' },
{ mode: BlendModes.Multiply, name: 'Multiply' },
{ mode: BlendModes.Screen, name: 'Screen' },
// Advanced (backdrop-aware) modes — correct coverage, work with alpha.
{ mode: BlendModes.Darken, name: 'Darken' },
{ mode: BlendModes.Lighten, name: 'Lighten' },
{ mode: BlendModes.Overlay, name: 'Overlay' },
{ mode: BlendModes.ColorDodge, name: 'Color Dodge' },
{ mode: BlendModes.ColorBurn, name: 'Color Burn' },
{ mode: BlendModes.HardLight, name: 'Hard Light' },
{ mode: BlendModes.SoftLight, name: 'Soft Light' },
{ mode: BlendModes.Difference, name: 'Difference' },
{ mode: BlendModes.Exclusion, name: 'Exclusion' },
{ mode: BlendModes.Hue, name: 'Hue' },
{ mode: BlendModes.Saturation, name: 'Saturation' },
{ mode: BlendModes.Color, name: 'Color' },
{ mode: BlendModes.Luminosity, name: 'Luminosity' },
];

class BlendmodesScene extends Scene {
Expand Down
14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
"dist/exo.esm.js.map",
"dist/exo.debug.esm.js",
"dist/exo.debug.esm.js.map",
"dist/exo.iife.js",
"dist/exo.iife.js.map",
"dist/exo.iife.min.js",
"dist/exo.iife.min.js.map",
"README.md",
"CHANGELOG.md",
"LICENSE"
Expand Down Expand Up @@ -75,6 +79,7 @@
"verify:release-matrix": "tsx ./scripts/verify-release-matrix.ts",
"verify:create-exo-app": "tsx ./scripts/verify-create-exo-app.ts",
"sync:example-capabilities": "tsx ./scripts/sync-example-capabilities.ts",
"create:package": "tsx scripts/create-package.ts",
"verify:release": "pnpm verify:lockstep && pnpm typecheck && pnpm typecheck:guides && pnpm typecheck:examples && pnpm lint:strict && pnpm format:check && pnpm test && pnpm verify:package && pnpm verify:create-exo-app && pnpm site:build",
"verify:quick": "pnpm typecheck && pnpm typecheck:guides && pnpm typecheck:examples && pnpm typecheck:packages && pnpm lint:all && pnpm format:check && pnpm docs:api:check",
"verify:ci": "pnpm verify:quick && pnpm test",
Expand All @@ -90,11 +95,11 @@
"typecheck": "tsc --noEmit",
"typecheck:examples": "tsc --noEmit -p tsconfig.examples.json",
"typecheck:guides": "tsx scripts/extract-guide-snippets.ts && tsc --noEmit -p tsconfig.guides.json",
"typecheck:packages": "pnpm --filter \"@codexo/exojs-particles\" --filter \"@codexo/exojs-tilemap\" --filter \"@codexo/exojs-tiled\" --filter \"@codexo/exojs-physics\" --filter \"@codexo/exojs-audio-fx\" typecheck",
"typecheck:packages": "pnpm --filter \"@codexo/exojs-particles\" --filter \"@codexo/exojs-tilemap\" --filter \"@codexo/exojs-tiled\" --filter \"@codexo/exojs-physics\" --filter \"@codexo/exojs-audio-fx\" --filter \"@codexo/exojs-aseprite\" --filter \"@codexo/exojs-ldtk\" --filter \"@codexo/exojs-react\" typecheck",
"lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"examples/**/*.js\" \"site/src/**/*.{ts,tsx}\"",
"lint:fix": "eslint --fix \"src/**/*.ts\" \"test/**/*.ts\" \"examples/**/*.js\" \"site/src/**/*.{ts,tsx}\"",
"site:lint": "eslint \"site/src/**/*.{ts,tsx}\"",
"lint:packages": "eslint \"packages/exojs-*/src/**/*.ts\" \"packages/exojs-*/test/**/*.ts\"",
"lint:packages": "eslint \"packages/exojs-*/src/**/*.{ts,tsx}\" \"packages/exojs-*/test/**/*.{ts,tsx}\"",
"lint:all": "pnpm lint && pnpm lint:packages",
"lint:strict": "eslint --max-warnings=0 \"src/**/*.ts\"",
"lint:strict:fast": "eslint --cache --cache-location .cache/eslintcache --max-warnings=0 \"src/**/*.ts\"",
Expand Down Expand Up @@ -131,6 +136,7 @@
"perf:bench:all": "pnpm perf:bench:rendering && pnpm perf:bench:audio && pnpm perf:bench:collision && pnpm perf:bench:scene-graph && pnpm perf:bench:interaction",
"perf:profile": "tsx test/perf/profile-benchmark.ts",
"perf:profile:gc": "node --expose-gc --import tsx/esm test/perf/profile-benchmark.ts",
"size": "size-limit",
"prepare": "husky",
"commit": "gitmoji -c"
},
Expand All @@ -154,6 +160,9 @@
"@rollup/plugin-replace": "^6.0.3",
"@rollup/plugin-terser": "^1.0.0",
"@rollup/plugin-typescript": "^12.3.0",
"@size-limit/preset-small-lib": "^11.2.0",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.2",
"@types/css-font-loading-module": "0.0.14",
"@types/jsdom": "^28.0.1",
"@types/node": "^25.6.0",
Expand All @@ -179,6 +188,7 @@
"rimraf": "^6.1.3",
"rollup": "^4.60.3",
"rollup-plugin-string": "^3.0.0",
"size-limit": "^11.2.0",
"tslib": "^2.8.1",
"tsx": "^4.21.0",
"typescript": "~6.0.3",
Expand Down
21 changes: 21 additions & 0 deletions packages/exojs-aseprite/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Codexo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading