diff --git a/.eslintignore b/.eslintignore index cfa92682..82945b25 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,5 +3,5 @@ **/*.json **/dist **/node_modules -**/webpack.config.js +**/webpack.config.* packages/shenanigans-manager/setup/**/* diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index c0078fa2..70955cd0 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at me@joshuakgoldberg.com. All +reported by contacting the project team at git@joshuakgoldberg.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/.github/workflows/dist.yml b/.github/workflows/dist.yml index effd96fd..9b619129 100644 --- a/.github/workflows/dist.yml +++ b/.github/workflows/dist.yml @@ -12,5 +12,4 @@ jobs: steps: - uses: actions/checkout@v3 - uses: ./.github/actions/prepare - - run: yarn compile - run: yarn dist diff --git a/.gitignore b/.gitignore index 1e644c6c..4b455d62 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.map *.tsbuildinfo node_modules/ +packages/*/dist/ packages/*/lib/ packages/*/test/ !packages/shenanigans-manager/setup/**/* \ No newline at end of file diff --git a/cspell.json b/cspell.json index e814ff28..eb0b704f 100644 --- a/cspell.json +++ b/cspell.json @@ -1,6 +1,6 @@ { - "dictionaries": ["typescript"], - "ignorePaths": ["lib", "node_modules", "**/*.d.ts", "**/*.js", "**/*.tsbuildinfo"], + "dictionaries": ["css", "html", "softwareTerms", "typescript"], + "ignorePaths": ["dist", "lib", "node_modules", "**/*.d.ts", "**/*.js", "**/*.tsbuildinfo"], "words": [ "actorhittr", "areaspawnr", @@ -28,11 +28,13 @@ "flagswappr", "fpsanalyzr", "frametickr", + "fullscreensaver", "fullscreenshenanigans", "Gameboy", "gameplay", "genrand", "Gitter", + "Goombas", "Grapher", "Graphr", "groupholdr", diff --git a/docs/walkthrough/8. Collisions.md b/docs/walkthrough/8. Collisions.md index edce1c32..08e492d6 100644 --- a/docs/walkthrough/8. Collisions.md +++ b/docs/walkthrough/8. Collisions.md @@ -57,7 +57,7 @@ export class Collisions extends CollisionsBase + + + + FullScreenSaver + + + + + + + + + + + + + +
+

FullScreenSaver

+
+ +
+ +
+ +
+ You may + download the game for yourself + from GitHub, the location of FullScreenSaver's open source project. +
+ +
+ + + + + + + + diff --git a/examples/FullScreenSaver/dist/theme/Icon.gif b/examples/FullScreenSaver/dist/theme/Icon.gif new file mode 100644 index 00000000..28047a94 Binary files /dev/null and b/examples/FullScreenSaver/dist/theme/Icon.gif differ diff --git a/packages/shenanigans-manager/setup/web/lib/theme/fonts/README.md b/examples/FullScreenSaver/dist/theme/fonts/README.md similarity index 100% rename from packages/shenanigans-manager/setup/web/lib/theme/fonts/README.md rename to examples/FullScreenSaver/dist/theme/fonts/README.md diff --git a/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.eot b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.eot new file mode 100644 index 00000000..98aa442b Binary files /dev/null and b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.eot differ diff --git a/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.svg b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.svg new file mode 100644 index 00000000..b1fb3f5c --- /dev/null +++ b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.ttf b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.ttf new file mode 100644 index 00000000..a6f43ac9 Binary files /dev/null and b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.ttf differ diff --git a/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.woff b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.woff new file mode 100644 index 00000000..5b574105 Binary files /dev/null and b/examples/FullScreenSaver/dist/theme/fonts/pressstart2p-webfont.woff differ diff --git a/examples/FullScreenSaver/lib/index.html b/examples/FullScreenSaver/lib/index.html index f67c2c0c..bdf4a329 100644 --- a/examples/FullScreenSaver/lib/index.html +++ b/examples/FullScreenSaver/lib/index.html @@ -8,6 +8,7 @@ content="FullScreenSaver, full, screen, typescript, javascript, html5, gaming, online, online game, fun, distraction" /> + diff --git a/examples/FullScreenSaver/package.json b/examples/FullScreenSaver/package.json index d439be19..ca12589c 100644 --- a/examples/FullScreenSaver/package.json +++ b/examples/FullScreenSaver/package.json @@ -31,6 +31,7 @@ "shenanigans-manager": "^0.8.1", "sinon": "^14.0.0", "sinon-chai": "^3.7.0", + "ts-loader": "^9.3.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" }, diff --git a/examples/FullScreenSaver/src/FullScreenSaver.test.ts b/examples/FullScreenSaver/src/FullScreenSaver.test.ts index 2db61abb..11c68ded 100644 --- a/examples/FullScreenSaver/src/FullScreenSaver.test.ts +++ b/examples/FullScreenSaver/src/FullScreenSaver.test.ts @@ -1,5 +1,52 @@ +import { expect } from "chai"; + +import { createFullScreenSaver } from "./fakes.test"; + describe("FullScreenSaver", () => { - it("_", () => { - // TODO: Implement me! + it("starts with one square", () => { + // Arrange + const { game } = createFullScreenSaver(); + + // Assert + expect(game.groupHolder.getGroup("Squares")).to.have.length(1); + }); + + it("adds a player when a directional input is pressed", () => { + // Arrange + const { game } = createFullScreenSaver(); + + // Act + game.inputWriter.callEvent("onkeydown", "left"); + + // Assert + expect(game.groupHolder.getGroup("Players")).to.have.length(1); + }); + + it("increases to two squares 150 ticks after a player is added", () => { + // Arrange + const { clock, game } = createFullScreenSaver(); + game.inputWriter.callEvent("onkeydown", "left"); + + // (move the player out of the way) + game.physics.shiftActors(game.groupHolder.getGroup("Players"), 9001, 9001); + + // Act + clock.tick(150 * game.frameTicker.getInterval()); + + // Assert + expect(game.groupHolder.getGroup("Squares")).to.have.length(2); + }); + + it("stops adding squares after the player is hit", () => { + // Arrange + const { clock, game } = createFullScreenSaver(); + game.inputWriter.callEvent("onkeydown", "left"); + + // Act + clock.tick(300 * game.frameTicker.getInterval()); + + // Assert + expect(game.groupHolder.getGroup("Players")).to.have.length(0); + expect(game.groupHolder.getGroup("Squares")).to.have.length(1); }); }); diff --git a/examples/FullScreenSaver/src/FullScreenSaver.ts b/examples/FullScreenSaver/src/FullScreenSaver.ts index 915a0e94..cfc5cf7e 100644 --- a/examples/FullScreenSaver/src/FullScreenSaver.ts +++ b/examples/FullScreenSaver/src/FullScreenSaver.ts @@ -1,5 +1,7 @@ import { factory, member } from "autofieldr"; -import { EightBittr, EightBittrConstructorSettings } from "eightbittr"; +import { Actor, EightBittr, EightBittrConstructorSettings } from "eightbittr"; +import { GroupHoldr } from "groupholdr"; +import { ItemsHoldr } from "itemsholdr"; import { MenuGraphr } from "menugraphr"; import { createMenuGrapher } from "./creators/createMenuGrapher"; @@ -42,6 +44,23 @@ export class FullScreenSaver extends EightBittr { @member(Groups) public readonly groups: Groups; + /** + * General storage abstraction for keyed containers of items. + */ + public readonly groupHolder: GroupHoldr<{ + Squares: Actor; + Players: Actor; + Text: Actor; + }>; + + /** + * Cache-based wrapper around localStorage. + */ + public readonly itemsHolder: ItemsHoldr<{ + highScore: number; + score: number; + }>; + /** * User input filtering and handling. */ diff --git a/examples/FullScreenSaver/src/fakes.test.ts b/examples/FullScreenSaver/src/fakes.test.ts new file mode 100644 index 00000000..a6bcdf67 --- /dev/null +++ b/examples/FullScreenSaver/src/fakes.test.ts @@ -0,0 +1,32 @@ +import { useFakeTimers } from "sinon-timers-repeatable"; + +import { FullScreenSaver } from "./FullScreenSaver"; + +export const mockHeight = 480; + +export const mockWidth = 320; + +export const createFullScreenSaver = () => { + const clock = useFakeTimers(); + + const game = new FullScreenSaver({ + components: { + frameTicker: { + timing: { + cancelFrame: clock.clearTimeout, + getTimestamp: () => clock.now, + requestFrame: (callback) => + clock.setTimeout(() => { + callback(clock.now); + }, 1), + }, + }, + }, + height: mockHeight, + width: mockWidth, + }); + + game.frameTicker.play(); + + return { clock, game }; +}; diff --git a/examples/FullScreenSaver/src/index.ts b/examples/FullScreenSaver/src/index.ts index fc9dfe25..b63a9347 100644 --- a/examples/FullScreenSaver/src/index.ts +++ b/examples/FullScreenSaver/src/index.ts @@ -8,5 +8,6 @@ import { createUserWrapprSettings } from "./interface/InterfaceSettings"; * * @param container HTML element to create within. */ -export const createFullScreenSaverInterface = async (container: HTMLElement): Promise => - new UserWrappr(createUserWrapprSettings()).createDisplay(container); +export const createFullScreenSaverInterface = async (container: HTMLElement): Promise => { + return new UserWrappr(createUserWrapprSettings()).createDisplay(container); +}; diff --git a/examples/FullScreenSaver/src/interface/InterfaceSettings.ts b/examples/FullScreenSaver/src/interface/InterfaceSettings.ts index 1f51fcd6..49539911 100644 --- a/examples/FullScreenSaver/src/interface/InterfaceSettings.ts +++ b/examples/FullScreenSaver/src/interface/InterfaceSettings.ts @@ -1,5 +1,5 @@ import { GameWindow } from "eightbittr"; -import { AbsoluteSizeSchema, UserWrapprSettings, OptionType } from "userwrappr"; +import { AbsoluteSizeSchema, OptionType, UserWrapprSettings } from "userwrappr"; import { FullScreenSaver } from "../FullScreenSaver"; diff --git a/examples/FullScreenSaver/src/main.ts b/examples/FullScreenSaver/src/main.ts index 2dcdb217..50c5f754 100644 --- a/examples/FullScreenSaver/src/main.ts +++ b/examples/FullScreenSaver/src/main.ts @@ -1,8 +1,9 @@ -import { createFullScreenSaverInterface } from "./index"; +import * as index from "./index"; +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion const container = document.getElementById("game")!; -createFullScreenSaverInterface(container).catch((error: Error): void => { +index.createFullScreenSaverInterface(container).catch((error: Error): void => { console.error("An error happened while trying to instantiate FullScreenSaver!"); console.error("requirejs error:", error); }); diff --git a/examples/FullScreenSaver/src/sections/Collisions.ts b/examples/FullScreenSaver/src/sections/Collisions.ts index ecebcce4..187b0669 100644 --- a/examples/FullScreenSaver/src/sections/Collisions.ts +++ b/examples/FullScreenSaver/src/sections/Collisions.ts @@ -9,7 +9,7 @@ export class Collisions extends CollisionsBase + + + + FullScreenSaver Tests + + + + + +
+ + + + + + + + + + + + + + + + diff --git a/package.json b/package.json index b2890b4a..25e6a7ed 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "format:write": "yarn format --write", "hydrate": "lerna exec --scope shenanigans-manager tsc && lerna run hydrate && yarn run compile", "link": "lerna run link && lerna exec yarn link shenanigans-manager", - "lint": "eslint --ignore-path .eslintignore \"./packages/**/*.{js,ts,tsx}\"", + "lint": "eslint --ignore-path .eslintignore --max-warnings 0 \"./{examples,packages}/**/*.{js,ts,tsx}\"", "lint:md": "yarn markdownlint \"**/*.md\" \".github/**/*.md\"", "lint:spelling": "yarn cspell \"**\" \".github/**/*\"", "ncu:all": "lerna exec \"ncu -u\" && lerna run ncu:all", diff --git a/packages/actorhittr/package.json b/packages/actorhittr/package.json index 433e1524..162545a1 100644 --- a/packages/actorhittr/package.json +++ b/packages/actorhittr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/areaspawnr/package.json b/packages/areaspawnr/package.json index 37259589..9a8c57a7 100644 --- a/packages/areaspawnr/package.json +++ b/packages/areaspawnr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/audioplayr/package.json b/packages/audioplayr/package.json index cfc4c2a6..142985be 100644 --- a/packages/audioplayr/package.json +++ b/packages/audioplayr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/autofieldr/package.json b/packages/autofieldr/package.json index b6515a68..8104dd30 100644 --- a/packages/autofieldr/package.json +++ b/packages/autofieldr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/battlemovr/package.json b/packages/battlemovr/package.json index bc2b46d7..f1657d56 100644 --- a/packages/battlemovr/package.json +++ b/packages/battlemovr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/classcyclr/package.json b/packages/classcyclr/package.json index 5a21d43c..29f1a8ca 100644 --- a/packages/classcyclr/package.json +++ b/packages/classcyclr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/devicelayr/package.json b/packages/devicelayr/package.json index 1a161398..1fb71b40 100644 --- a/packages/devicelayr/package.json +++ b/packages/devicelayr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/eightbittr/package.json b/packages/eightbittr/package.json index 80f0c039..17d37e37 100644 --- a/packages/eightbittr/package.json +++ b/packages/eightbittr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/eightbittr/src/EightBittr.ts b/packages/eightbittr/src/EightBittr.ts index 9ba339b0..f4324bf2 100644 --- a/packages/eightbittr/src/EightBittr.ts +++ b/packages/eightbittr/src/EightBittr.ts @@ -79,7 +79,7 @@ export class EightBittr { public readonly frameTicker: FrameTickr; /** - * A general storage abstraction for keyed containers of items. + * General storage abstraction for keyed containers of items. */ @factory(createGroupHolder) public readonly groupHolder: GroupHoldr; diff --git a/packages/eightbittr/src/sections/Graphics.ts b/packages/eightbittr/src/sections/Graphics.ts index d91108e0..a2bb8eb3 100644 --- a/packages/eightbittr/src/sections/Graphics.ts +++ b/packages/eightbittr/src/sections/Graphics.ts @@ -22,7 +22,7 @@ export class Graphics extends Section { public readonly filters?: FilterContainer; /** - * What class name should indicate an Actor is to be flipped verticallu. + * What class name should indicate an Actor is to be flipped vertically. */ public readonly flipVertical?: string; diff --git a/packages/eightbittr/src/sections/Physics.test.ts b/packages/eightbittr/src/sections/Physics.test.ts index 526acf4a..10a1e6b4 100644 --- a/packages/eightbittr/src/sections/Physics.test.ts +++ b/packages/eightbittr/src/sections/Physics.test.ts @@ -377,17 +377,17 @@ describe("Physics", () => { const { physics } = stubEightBittr(); const actor = stubActor(); const newTop = 3.5; - const newbottom = newTop + actor.height; + const newBottom = newTop + actor.height; // Act physics.setTop(actor, newTop); // Assert - expect(actor.bottom).to.be.equal(newbottom); + expect(actor.bottom).to.be.equal(newBottom); }); }); - describe("shiftHoriz", () => { + describe("shiftHorizontal", () => { it("shifts horizontally", (): void => { // Arrange const { physics } = stubEightBittr(); @@ -420,7 +420,7 @@ describe("Physics", () => { }); }); - describe("shiftVert", () => { + describe("shiftVertical", () => { it("shifts vertically", (): void => { // Arrange const { physics } = stubEightBittr(); diff --git a/packages/eightbittr/src/sections/Physics.ts b/packages/eightbittr/src/sections/Physics.ts index b47ffd27..089c3427 100644 --- a/packages/eightbittr/src/sections/Physics.ts +++ b/packages/eightbittr/src/sections/Physics.ts @@ -69,7 +69,7 @@ export class Physics extends Section { } /** - * Sets the height and unitheight of An Actor, and optionally updates the + * Sets the height of An Actor, and optionally updates the * Actor's spriteHeight and spriteHeight pixels, and/or calls updateSize. * * @param actor @@ -191,7 +191,7 @@ export class Physics extends Section { } /** - * Sets the width and unitwidth of An Actor, and optionally updates the + * Sets the width of an Actor, and optionally updates the * Actor's spriteWidth and spriteWidth pixels, and/or calls updateSize. * The actor is marked as having changed appearance. * @@ -212,7 +212,7 @@ export class Physics extends Section { } /** - * Shifts An Actor both horizontally and vertically. + * Shifts an Actor both horizontally and vertically. * * @param dx How far to shift the Actor horizontally. * @param dy How far to shift the Actor vertically. @@ -336,12 +336,12 @@ export class Physics extends Section { * default, Infinity for no maximum). */ public slideToX(actor: Actor, dx: number, maxDistance = Infinity): void { - const midx = this.getMidX(actor); + const midX = this.getMidX(actor); - if (midx < dx) { - this.shiftHorizontal(actor, Math.min(maxDistance, dx - midx)); + if (midX < dx) { + this.shiftHorizontal(actor, Math.min(maxDistance, dx - midX)); } else { - this.shiftHorizontal(actor, Math.max(-maxDistance, dx - midx)); + this.shiftHorizontal(actor, Math.max(-maxDistance, dx - midX)); } } @@ -355,12 +355,12 @@ export class Physics extends Section { * default, Infinity, for no maximum). */ public slideToY(actor: Actor, dy: number, maxDistance = Infinity): void { - const midy = this.getMidY(actor); + const midY = this.getMidY(actor); - if (midy < dy) { - this.shiftVertical(actor, Math.min(maxDistance, dy - midy)); + if (midY < dy) { + this.shiftVertical(actor, Math.min(maxDistance, dy - midY)); } else { - this.shiftVertical(actor, Math.max(-maxDistance, dy - midy)); + this.shiftVertical(actor, Math.max(-maxDistance, dy - midY)); } } diff --git a/packages/flagswappr/package.json b/packages/flagswappr/package.json index 7166b2b7..e507f494 100644 --- a/packages/flagswappr/package.json +++ b/packages/flagswappr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/fpsanalyzr/package.json b/packages/fpsanalyzr/package.json index cca7b95a..32bd57fa 100644 --- a/packages/fpsanalyzr/package.json +++ b/packages/fpsanalyzr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/fpsanalyzr/src/types.ts b/packages/fpsanalyzr/src/types.ts index f0d14ea8..ffa1671e 100644 --- a/packages/fpsanalyzr/src/types.ts +++ b/packages/fpsanalyzr/src/types.ts @@ -14,7 +14,7 @@ export interface Extremes { } /** - * Settings to initialize a new IFPSAnalyzr. + * Settings to initialize a new FPSAnalyzr. */ export interface FpsAnalyzrSettings { /** diff --git a/packages/frametickr/package.json b/packages/frametickr/package.json index 415db64a..b6dba59f 100644 --- a/packages/frametickr/package.json +++ b/packages/frametickr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/groupholdr/package.json b/packages/groupholdr/package.json index f541d9c0..dc51cf58 100644 --- a/packages/groupholdr/package.json +++ b/packages/groupholdr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/groupholdr/src/GroupHoldr.ts b/packages/groupholdr/src/GroupHoldr.ts index a1705d5a..d99509be 100644 --- a/packages/groupholdr/src/GroupHoldr.ts +++ b/packages/groupholdr/src/GroupHoldr.ts @@ -19,7 +19,7 @@ const createGroups = >( }; /** - * A general storage abstraction for keyed containers of items. + * General storage abstraction for keyed containers of items. */ export class GroupHoldr> implements GroupHoldr @@ -51,6 +51,16 @@ export class GroupHoldr> this.actorsById = {}; } + /** + * Gets an Actor by its ID, throwing an error if it doesn't exist. + * + * @param id ID of an Actor. + * @returns Actor under the ID + */ + public assertActor(id: string): TActor { + return this.actorsById[id] as TActor; + } + /** * Adds an Actor to a group. * @@ -109,7 +119,7 @@ export class GroupHoldr> * @returns Actor under the ID, if it exists. */ public getActor(id: string): TActor | undefined { - return this.actorsById[id] as TActor; + return this.actorsById[id] as TActor | undefined; } /** diff --git a/packages/inputwritr/package.json b/packages/inputwritr/package.json index 2fdd6d54..7095041a 100644 --- a/packages/inputwritr/package.json +++ b/packages/inputwritr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/itemsholdr/README.md b/packages/itemsholdr/README.md index edf3e18c..16b19945 100644 --- a/packages/itemsholdr/README.md +++ b/packages/itemsholdr/README.md @@ -50,7 +50,7 @@ localStorage.getItem("name"); // "Blue" #### `defaults` Default attributes for item values. -These are applied to all items, and will be overriden per item by an item-specific `values`. +These are applied to all items, and will be overridden per item by an item-specific `values`. ```typescript const itemsHolder = new ItemsHoldr({ @@ -282,7 +282,7 @@ itemsHolder.setItem("coins", 10); #### `valueDefault` An initial value to use if before any is set. -Will be overriden by what's in `storage` if `storeLocally` is true. +Will be overridden by what's in `storage` if `storeLocally` is true. ```typescript const itemsHolder = new ItemsHoldr({ diff --git a/packages/itemsholdr/package.json b/packages/itemsholdr/package.json index a6a08b2b..40db5262 100644 --- a/packages/itemsholdr/package.json +++ b/packages/itemsholdr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/mapscreatr/package.json b/packages/mapscreatr/package.json index bd4cdbec..eb8707ce 100644 --- a/packages/mapscreatr/package.json +++ b/packages/mapscreatr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/mapscreatr/src/Actor.ts b/packages/mapscreatr/src/Actor.ts index 730620c2..b17d654b 100644 --- a/packages/mapscreatr/src/Actor.ts +++ b/packages/mapscreatr/src/Actor.ts @@ -28,7 +28,7 @@ export interface Actor { entrance?: string; /** - * Which type of Actor thisis. + * Which type of Actor this is. */ groupType: string; diff --git a/packages/mapscreatr/src/types.ts b/packages/mapscreatr/src/types.ts index c108f1b5..8564b084 100644 --- a/packages/mapscreatr/src/types.ts +++ b/packages/mapscreatr/src/types.ts @@ -185,9 +185,9 @@ export interface PreActorsContainer { /** * Adds a PreActorLike to each sorted collection. * - * @param preactorLike A PreactorLike to add. + * @param preActorLike A PreActorLike to add. */ - push(preactorLike: PreActorLike): void; + push(preActorLike: PreActorLike): void; } /** @@ -216,14 +216,14 @@ export type Macros = Record; * A Function to automate placing other PreActorLikes or macros in an Area. * * @param reference The JSON-friendly reference causing the macro. - * @param preactorLikes The container of PreActorLikes this is adding to. + * @param preActorLikes The container of PreActorLikes this is adding to. * @param area The container Area containing the PreActorLikes. * @param map The container Map containing the Area. * @returns A single PreActorLike or macro descriptor, or Array thereof. */ export type Macro = ( reference: any, - preactorLikes: AnalysisContainer, + preActorLikes: AnalysisContainer, area: Area | AreaRaw, map: Map | MapRaw ) => PreActorLike | PreActorLike[] | any; diff --git a/packages/mapscreenr/package.json b/packages/mapscreenr/package.json index 336fbeb7..7201ece4 100644 --- a/packages/mapscreenr/package.json +++ b/packages/mapscreenr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/menugraphr/README.md b/packages/menugraphr/README.md index aae24597..1f17fe79 100644 --- a/packages/menugraphr/README.md +++ b/packages/menugraphr/README.md @@ -66,7 +66,7 @@ new MenuGraphr({ #### `replacements` -Programmatic replacements for deliniated words. +Programmatic replacements for delineated words. Allows texts in menus to contain dynamic values using predetermined strings. These can be hardcoded strings or functions to generate them. diff --git a/packages/menugraphr/package.json b/packages/menugraphr/package.json index c1469b1a..7cfc7479 100644 --- a/packages/menugraphr/package.json +++ b/packages/menugraphr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/menugraphr/src/MenuGraphr.ts b/packages/menugraphr/src/MenuGraphr.ts index 4246e56c..da97132e 100644 --- a/packages/menugraphr/src/MenuGraphr.ts +++ b/packages/menugraphr/src/MenuGraphr.ts @@ -162,7 +162,7 @@ export class MenuGraphr { } /** - * @returns The programmatic replacements for deliniated words. + * @returns The programmatic replacements for delineated words. */ public getReplacements(): Replacements { return this.replacements; @@ -1030,7 +1030,7 @@ export class MenuGraphr { continue; } - // Endlines skip a line; general whitespace moves to the right + // Newlines skip a line; general whitespace moves to the right // (" " spaces at the start do not move to the right) if (word[j] === "\n") { x = menu.textX!; diff --git a/packages/menugraphr/src/types.ts b/packages/menugraphr/src/types.ts index 638be6db..c46086be 100644 --- a/packages/menugraphr/src/types.ts +++ b/packages/menugraphr/src/types.ts @@ -253,7 +253,7 @@ export type SchemaPositionHorizontalModifier = "center" | "right" | "stretch"; export type SchemaPositionVerticalModifier = "center" | "bottom" | "stretch"; /** - * A description of how a meny should be positioned within its container. + * A description of how a menu should be positioned within its container. */ export interface MenuSchemaPosition { /** @@ -787,7 +787,7 @@ export interface SoundEvents { export type Aliases = Record; /** - * Programmatic replacements for deliniated words. + * Programmatic replacements for delineated words. */ export type Replacements = Record; @@ -811,7 +811,7 @@ export interface MenuGraphrSettings { aliases?: Aliases; /** - * Programmatic replacements for deliniated words. + * Programmatic replacements for delineated words. */ replacements?: Replacements; diff --git a/packages/modattachr/package.json b/packages/modattachr/package.json index 4390d826..8d7ecf79 100644 --- a/packages/modattachr/package.json +++ b/packages/modattachr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/numbermakr/package.json b/packages/numbermakr/package.json index e76497d3..583cc0d8 100644 --- a/packages/numbermakr/package.json +++ b/packages/numbermakr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/objectmakr/package.json b/packages/objectmakr/package.json index 2bb41baa..c6c20e2a 100644 --- a/packages/objectmakr/package.json +++ b/packages/objectmakr/package.json @@ -1,9 +1,9 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, - "browser": "./src/index.js", + "browser": "./lib/index.js", "bugs": { "url": "https://github.com/FullScreenShenanigans/EightBittr/issues" }, diff --git a/packages/objectmakr/src/ObjectMakr.ts b/packages/objectmakr/src/ObjectMakr.ts index 8d518b31..303ca165 100644 --- a/packages/objectmakr/src/ObjectMakr.ts +++ b/packages/objectmakr/src/ObjectMakr.ts @@ -165,9 +165,9 @@ export class ObjectMakr { } /** - * Creates an output properties object with the mapping shown in indexMap + * Creates an output properties object with the mapping shown in indexMap. * - * @param properties An array with indiced versions of properties. + * @param properties An array with indexed versions of properties. */ private processIndexMappedProperties(shorthandProperties: string[]): any { const output: any = {}; diff --git a/packages/pixeldrawr/package.json b/packages/pixeldrawr/package.json index 4bae1d2d..d7bb9d8e 100644 --- a/packages/pixeldrawr/package.json +++ b/packages/pixeldrawr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/pixelrendr/README.md b/packages/pixelrendr/README.md index ebe82e15..534f67b2 100644 --- a/packages/pixelrendr/README.md +++ b/packages/pixelrendr/README.md @@ -78,8 +78,7 @@ We know the 0 should be printed 35 times, so the following notation is used to i #### 3. Filters -Many sprites are different versions of other sprites, -often simply identical or miscolored (the only two commands supported so far). +Many sprites are different versions of other sprites, often either identical or differently colored (the only two commands supported so far). So, a library may declare the following filter: ```javascript @@ -131,7 +130,7 @@ filling in the middle. Pipes, then, would use a top and middle. Drawing a simple black square: ```typescript -import { memcpyU8, pixelRender } from "pixelrendr"; +import { memCopyU8, pixelRender } from "pixelrendr"; const pixelRender = new PixelRendr({ paletteDefault: [[0, 0, 0, 255]], @@ -153,7 +152,7 @@ canvas.width = sizing.spriteWidth; canvas.height = sizing.spriteHeight; const imageData = context.getImageData(0, 0, canvas.width, canvas.height); -PixelRender.memcpyU8(sprite, imageData.data); +PixelRender.memCopyU8(sprite, imageData.data); context.putImageData(imageData, 0, 0); ``` @@ -193,7 +192,7 @@ canvas.width = sizing.spriteWidth; canvas.height = sizing.spriteHeight; const imageData = context.getImageData(0, 0, canvas.width, canvas.height); -PixelRender.memcpyU8(sprite, imageData.data); +PixelRender.memCopyU8(sprite, imageData.data); context.putImageData(imageData, 0, 0); ``` diff --git a/packages/pixelrendr/package.json b/packages/pixelrendr/package.json index 15315a96..d2f87b85 100644 --- a/packages/pixelrendr/package.json +++ b/packages/pixelrendr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/pixelrendr/src/PixelRendr.ts b/packages/pixelrendr/src/PixelRendr.ts index 31c563ce..128afa48 100644 --- a/packages/pixelrendr/src/PixelRendr.ts +++ b/packages/pixelrendr/src/PixelRendr.ts @@ -6,7 +6,7 @@ import { StringFilr } from "stringfilr"; import { bindTransforms } from "./bindTransforms"; import { Library } from "./Library"; -import { memcpyU8 } from "./memcpyU8"; +import { memCopyU8 } from "./memCopyU8"; import { Render } from "./Render"; import { SpriteMultiple } from "./SpriteMultiple"; import { SpriteSingle } from "./SpriteSingle"; @@ -635,7 +635,7 @@ export class PixelRendr { for (let i = 0; i < height; i += 1) { // Add it to parsed x scale for (let j = 0; j < this.scale; j += 1) { - memcpyU8(sprite, parsed, readLocation, writeLocation, rowSize); + memCopyU8(sprite, parsed, readLocation, writeLocation, rowSize); writeLocation += rowSize; } diff --git a/packages/pixelrendr/src/memcpyU8.test.ts b/packages/pixelrendr/src/memCopyU8.test.ts similarity index 64% rename from packages/pixelrendr/src/memcpyU8.test.ts rename to packages/pixelrendr/src/memCopyU8.test.ts index b5937b78..0fa4048b 100644 --- a/packages/pixelrendr/src/memcpyU8.test.ts +++ b/packages/pixelrendr/src/memCopyU8.test.ts @@ -1,15 +1,15 @@ import { expect } from "chai"; -import { memcpyU8 } from "./memcpyU8"; +import { memCopyU8 } from "./memCopyU8"; -describe("memcpyU8", () => { +describe("memCopyU8", () => { it("copies members of an array of equal length", (): void => { // Arrange - const receiver: number[] = [0, 0, 0]; - const donor: number[] = [2, 3, 5]; + const receiver = [0, 0, 0]; + const donor = [2, 3, 5]; // Act - memcpyU8(donor, receiver); + memCopyU8(donor, receiver); // Assert expect(donor).to.deep.equal(receiver); @@ -18,10 +18,10 @@ describe("memcpyU8", () => { it("does not copy to an array of length 0", (): void => { // Arrange const receiver: number[] = []; - const donor: number[] = [2, 3, 5]; + const donor = [2, 3, 5]; // Act - memcpyU8(donor, receiver); + memCopyU8(donor, receiver); // Assert expect(receiver).to.deep.equal([]); @@ -29,11 +29,11 @@ describe("memcpyU8", () => { it("does not change receiver when donor has length 0", (): void => { // Arrange - const receiver: number[] = [0, 0, 0]; + const receiver = [0, 0, 0]; const donor: number[] = []; // Act - memcpyU8(donor, receiver); + memCopyU8(donor, receiver); // Assert expect(receiver).to.deep.equal([0, 0, 0]); @@ -41,11 +41,11 @@ describe("memcpyU8", () => { it("copies all of the donor's elements when its length is less than the receiver's", (): void => { // Arrange - const receiver: number[] = [0, 0, 0]; - const donor: number[] = [2, 3]; + const receiver = [0, 0, 0]; + const donor = [2, 3]; // Act - memcpyU8(donor, receiver); + memCopyU8(donor, receiver); // Assert expect(receiver).to.deep.equal([2, 3, 0]); @@ -53,11 +53,11 @@ describe("memcpyU8", () => { it("changes all of the receiver's elements when its length is less than the donor's", (): void => { // Arrange - const receiver: number[] = [0, 0]; - const donor: number[] = [2, 3, 5]; + const receiver = [0, 0]; + const donor = [2, 3, 5]; // Act - memcpyU8(donor, receiver); + memCopyU8(donor, receiver); // Assert expect(receiver).to.deep.equal([2, 3]); diff --git a/packages/pixelrendr/src/memcpyU8.ts b/packages/pixelrendr/src/memCopyU8.ts similarity index 63% rename from packages/pixelrendr/src/memcpyU8.ts rename to packages/pixelrendr/src/memCopyU8.ts index 77b3dba0..bf5ea04c 100644 --- a/packages/pixelrendr/src/memcpyU8.ts +++ b/packages/pixelrendr/src/memCopyU8.ts @@ -5,23 +5,23 @@ * @param destination An Array-like destination to copy to. * @param readLocation Where to start reading from in the source. * @param writeLocation Where to start writing to in the source. - * @param writelength How many members to copy over. + * @param writeLength How many members to copy over. * @see http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/ * @see http://www.javascripture.com/Uint8ClampedArray */ -export const memcpyU8 = ( +export const memCopyU8 = ( source: Uint8ClampedArray | number[], destination: Uint8ClampedArray | number[], readLocation = 0, writeLocation = 0, - writelength = Math.min(source.length, destination.length) + writeLength = Math.min(source.length, destination.length) ): void => { // JIT compilation help - let lwritelength = writelength + 0; - let lwriteloc = writeLocation + 0; - let lreadloc = readLocation + 0; + let lWriteLength = writeLength + 0; + let lWriteLocation = writeLocation + 0; + let lReadLocation = readLocation + 0; - while (lwritelength--) { - destination[lwriteloc++] = source[lreadloc++]; + while (lWriteLength--) { + destination[lWriteLocation++] = source[lReadLocation++]; } }; diff --git a/packages/quadskeepr/package.json b/packages/quadskeepr/package.json index fbc4fbef..e64206d2 100644 --- a/packages/quadskeepr/package.json +++ b/packages/quadskeepr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/quadskeepr/src/types.ts b/packages/quadskeepr/src/types.ts index 10385b38..9a3e5d84 100644 --- a/packages/quadskeepr/src/types.ts +++ b/packages/quadskeepr/src/types.ts @@ -69,7 +69,7 @@ export type ActorsCollection = Record; * For each group name in a Quadrant, how many Actors it has of that name. * * @remarks .numActors[groupName] <= .actors[groupName].length, as the .actors - * Arrays are not resized when Actors are remved. + * Arrays are not resized when Actors are removed. */ export type ActorsCounter = Record; diff --git a/packages/sceneplayr/package.json b/packages/sceneplayr/package.json index 8748dc4d..3607647e 100644 --- a/packages/sceneplayr/package.json +++ b/packages/sceneplayr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/shenanigans-manager/package.json b/packages/shenanigans-manager/package.json index 531ccf1b..79f27fb4 100644 --- a/packages/shenanigans-manager/package.json +++ b/packages/shenanigans-manager/package.json @@ -1,7 +1,7 @@ { "author": { "name": "Josh Goldberg", - "email": "me@joshuakgoldberg.com" + "email": "git@joshuakgoldberg.com" }, "bin": { "shenanigans-manager": "./bin/shenanigans-manager.js" diff --git a/packages/shenanigans-manager/setup/dist/babel.config.js b/packages/shenanigans-manager/setup/dist/babel.config.js deleted file mode 100644 index 4be8dd9a..00000000 --- a/packages/shenanigans-manager/setup/dist/babel.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - plugins: [ - ["@babel/plugin-proposal-decorators", { legacy: true }], - "@babel/plugin-proposal-class-properties", - ], - presets: ["@babel/react", "@babel/typescript"], -}; diff --git a/packages/shenanigans-manager/setup/dist/webpack.config.js b/packages/shenanigans-manager/setup/dist/webpack.config.js index f6c0611b..6ac85a97 100644 --- a/packages/shenanigans-manager/setup/dist/webpack.config.js +++ b/packages/shenanigans-manager/setup/dist/webpack.config.js @@ -1,53 +1,39 @@ +const path = require("path"); const { shenanigans } = require("./package.json"); -const { loading = {} } = shenanigans; -const getEntriesAndSources = () => { - return ( - loading.entries || [ - { - entry: `./lib/index.js`, - name: loading.name || shenanigans.name, - }, - ] - ); -}; +const corePackages = [ + {{ #dependencyNames }} + "{{{ . }}}", + {{ /dependencyNames }} +]; -const getExternals = () => { - const output = {}; - - if (loading.externals === undefined) { - return output; - } - - for (const external of loading.externals) { - output[external.name] = external.name; - } - - return output; -}; - -const entriesAndSources = getEntriesAndSources(); -const externals = getExternals(); - -const entry = {}; - -for (const pair of entriesAndSources) { - entry[pair.name] = pair.entry; -} +const resolveAliasBase = path.join(__dirname, "{{{ resolveAliasBase }}}"); module.exports = { - entry, - externals, + devtool: "source-map", + entry: Object.fromEntries( + ( + shenanigans.loading?.entries ?? [ + { + entry: `./src/main.ts`, + name: shenanigans.loading?.name || shenanigans.name, + }, + ] + ).map((pair) => [pair.name, pair.entry]) + ), + externals: Object.fromEntries( + shenanigans.loading?.externals?.map((external) => [external.name, external.name]) ?? [] + ), mode: "production", module: { rules: [ { - test: /\.(tsx?)|(jsx?)$/, exclude: /node_modules/, + test: /\.(tsx?)|(jsx?)$/, use: { - loader: require.resolve("babel-loader"), + loader: require.resolve("ts-loader"), options: { - rootMode: "upward-optional", + transpileOnly: true, }, }, }, @@ -55,11 +41,16 @@ module.exports = { }, output: { filename: `[name].js`, - libraryTarget: "amd", publicPath: "dist/", }, resolve: { - extensions: [".ts", ".tsx", ".js", ".json"], + alias: Object.fromEntries( + corePackages.map((corePackage) => [ + corePackage, + path.join(resolveAliasBase, corePackage, "src/index.ts"), + ]) + ), + extensions: [".ts", ".tsx", ".json"], symlinks: true, }, }; diff --git a/packages/shenanigans-manager/setup/web/dist/index.html b/packages/shenanigans-manager/setup/web/dist/index.html new file mode 100644 index 00000000..765eaf2e --- /dev/null +++ b/packages/shenanigans-manager/setup/web/dist/index.html @@ -0,0 +1,90 @@ +UPDATED + + + + + + {{shenanigans.name}} + + + + + + + + + + + + + +
+

{{ shenanigans.name }}

+
+ +
+ +
+ {{#shenanigans.web.sections.explanation}} + {{{.}}} + {{/shenanigans.web.sections.explanation}} +
+ +
+ You may download the game for yourself from GitHub, the location of {{shenanigans.name}}'s open source project. +
+ +
+ {{#shenanigans.web.sections.credits}} + {{{.}}} + {{/shenanigans.web.sections.credits}} +
+ + + + + + + + diff --git a/packages/shenanigans-manager/src/cli.ts b/packages/shenanigans-manager/src/cli.ts index 69792cfc..4b54d49d 100644 --- a/packages/shenanigans-manager/src/cli.ts +++ b/packages/shenanigans-manager/src/cli.ts @@ -51,7 +51,7 @@ const main = async (): Promise => { return; } } catch (error) { - console.error("requirejs error:", error); + console.error("shenanigans-manager error:", error); return; } }; diff --git a/packages/shenanigans-manager/src/commands/bootstrapPackage.ts b/packages/shenanigans-manager/src/commands/bootstrapPackage.ts index b319a1a2..0cedd2ac 100644 --- a/packages/shenanigans-manager/src/commands/bootstrapPackage.ts +++ b/packages/shenanigans-manager/src/commands/bootstrapPackage.ts @@ -16,12 +16,12 @@ export interface BootstrapPackageCommandArgs extends RepositoryCommandArgs { description: string; /** - * Whether to include the sheananigans.dist setting in package.json. + * Whether to include the shenanigans.dist setting in package.json. */ dist?: boolean; /** - * Whether to include the sheananigans.game setting in package.json. + * Whether to include the shenanigans.game setting in package.json. */ game?: boolean; @@ -36,7 +36,7 @@ export interface BootstrapPackageCommandArgs extends RepositoryCommandArgs { name: string; /** - * Whether to include the sheananigans.web setting in package.json. + * Whether to include the shenanigans.web setting in package.json. */ web?: boolean; } diff --git a/packages/shenanigans-manager/src/commands/hydrateFiles.ts b/packages/shenanigans-manager/src/commands/hydrateFiles.ts index 05f37b10..2d6bdb2f 100644 --- a/packages/shenanigans-manager/src/commands/hydrateFiles.ts +++ b/packages/shenanigans-manager/src/commands/hydrateFiles.ts @@ -1,3 +1,7 @@ +import chalk from "chalk"; +import { promises as fs } from "fs"; +import * as path from "path"; + import { defaultPathArgs, RepositoryCommandArgs } from "../command.js"; import { copyTemplatesRecursive } from "../copyTemplatesRecursive.js"; import { Runtime } from "../runtime.js"; @@ -30,10 +34,6 @@ export const HydrateFiles = async (runtime: Runtime, args: HydrateFilesCommandAr const { shenanigans } = await getShenanigansPackageContents(args); - if (shenanigans.dist) { - await copyTemplatesRecursive(runtime, args, "dist"); - } - if (shenanigans.external) { await copyTemplatesRecursive(runtime, args, "external"); } @@ -41,4 +41,19 @@ export const HydrateFiles = async (runtime: Runtime, args: HydrateFilesCommandAr if (shenanigans.web) { await copyTemplatesRecursive(runtime, args, "web"); } + + if (shenanigans.dist) { + // Optimization: copy everything from lib/ into dist/ + // (this way the same files don't need to be in shenanigans-manager twice) + const outputDirectory = path.join(args.directory, args.repository); + const libDir = path.join(outputDirectory, "lib"); + const distDir = path.join(outputDirectory, "dist"); + + // First copy over everything from web, so we don't have to duplicate assets + runtime.logger.log(chalk.grey(`Copying directory ${libDir} to ${distDir}`)); + await fs.cp(libDir, distDir, { force: false, recursive: true }); + + // Override copied lib/ files with any new dist/ files + await copyTemplatesRecursive(runtime, args, "dist"); + } }; diff --git a/packages/shenanigans-manager/src/commands/mustache.ts b/packages/shenanigans-manager/src/commands/mustache.ts index 5a5c9493..d2b46244 100644 --- a/packages/shenanigans-manager/src/commands/mustache.ts +++ b/packages/shenanigans-manager/src/commands/mustache.ts @@ -68,6 +68,7 @@ export const Mustache = async (runtime: Runtime, args: MustacheCommandArgs): Pro JSON.stringify(external, null, 4) ), nodeModules, + resolveAliasBase: basePackageJson.shenanigans.example ? "../../packages" : nodeModules, shenanigansPackage: basePackageJson.shenanigans.example ? "../../../packages" : nodeModules, diff --git a/packages/shenanigans-manager/src/copyTemplatesRecursive.ts b/packages/shenanigans-manager/src/copyTemplatesRecursive.ts index 751b503f..f110a134 100644 --- a/packages/shenanigans-manager/src/copyTemplatesRecursive.ts +++ b/packages/shenanigans-manager/src/copyTemplatesRecursive.ts @@ -1,5 +1,5 @@ import chalk from "chalk"; -import { fs } from "mz"; +import { existsSync, promises as fs } from "fs"; import * as path from "path"; import { RepositoryCommandArgs } from "./command.js"; @@ -22,7 +22,7 @@ export const copyTemplatesRecursive = async ( await Promise.all( files.map(async (setupFile) => { - if (fs.statSync(setupFile).isDirectory()) { + if ((await fs.stat(setupFile)).isDirectory()) { return await copyTemplatesRecursive( runtime, args, @@ -39,6 +39,11 @@ export const copyTemplatesRecursive = async ( if (nonTextFileExtensions.has(path.extname(outputLocal))) { runtime.logger.log(chalk.grey(`Copying ${outputAbsolute}`)); await mkdirpSafe(path.dirname(outputAbsolute)); + + if (existsSync(outputAbsolute)) { + await fs.rm(outputAbsolute); + } + await fs.copyFile(setupFile, outputAbsolute); } else { await Mustache(runtime, { diff --git a/packages/shenanigans-manager/src/nameTransformer.ts b/packages/shenanigans-manager/src/nameTransformer.ts index fdfd26a8..58669c95 100644 --- a/packages/shenanigans-manager/src/nameTransformer.ts +++ b/packages/shenanigans-manager/src/nameTransformer.ts @@ -24,7 +24,7 @@ export class NameTransformer { } /** - * Transforms a dashed-case name to PamelCase. + * Transforms a dashed-case name to PascalCase. * * @param name A dashed-case name. * @returns The name as PascalCase. diff --git a/packages/stateholdr/package.json b/packages/stateholdr/package.json index d73d2d67..5e36b26d 100644 --- a/packages/stateholdr/package.json +++ b/packages/stateholdr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/stringfilr/package.json b/packages/stringfilr/package.json index dfc72a53..c151f5eb 100644 --- a/packages/stringfilr/package.json +++ b/packages/stringfilr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/timehandlr/README.md b/packages/timehandlr/README.md index ed6f1246..0772876f 100644 --- a/packages/timehandlr/README.md +++ b/packages/timehandlr/README.md @@ -123,8 +123,7 @@ Parameters: Adds an event interval, waiting to start until it's in sync with the time delay. -This is useful for starting animations of objects intended to be animated in sync, -like Goombas in Mario or flower scenery in Pokemon. +This is useful for starting animations of objects intended to be animated in sync, such as Goombas in Mario or flower scenery in Pokemon. Otherwise identical to `addEventInterval`. ### `cancelEvent` diff --git a/packages/timehandlr/package.json b/packages/timehandlr/package.json index ed587009..3ebb9537 100644 --- a/packages/timehandlr/package.json +++ b/packages/timehandlr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/timehandlr/src/TimeHandlr.ts b/packages/timehandlr/src/TimeHandlr.ts index f89c8241..93e1426b 100644 --- a/packages/timehandlr/src/TimeHandlr.ts +++ b/packages/timehandlr/src/TimeHandlr.ts @@ -51,7 +51,7 @@ export class TimeHandlr { timeDelay?: number | NumericCalculator, ...args: Args ): TimeEvent { - const event: TimeEvent = new TimeEvent(callback, 1, this.time, timeDelay ?? 1, args); + const event = new TimeEvent(callback, 1, this.time, timeDelay ?? 1, args); this.insertEvent(event); return event; } @@ -67,17 +67,11 @@ export class TimeHandlr { */ public addEventInterval( callback: EventCallback, - timeDelay?: number | NumericCalculator, - numRepeats?: number | EventCallback, + timeDelay: number | NumericCalculator = 1, + numRepeats: number | EventCallback = 1, ...args: Args ): TimeEvent { - const event: TimeEvent = new TimeEvent( - callback, - numRepeats ?? 1, - this.time, - timeDelay ?? 1, - args - ); + const event = new TimeEvent(callback, numRepeats, this.time, timeDelay, args); this.insertEvent(event); return event; } diff --git a/packages/touchpassr/package.json b/packages/touchpassr/package.json index f2e01ff9..255358aa 100644 --- a/packages/touchpassr/package.json +++ b/packages/touchpassr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", diff --git a/packages/touchpassr/src/Control.ts b/packages/touchpassr/src/Control.ts index edf0de69..b78021a9 100644 --- a/packages/touchpassr/src/Control.ts +++ b/packages/touchpassr/src/Control.ts @@ -285,7 +285,7 @@ export class Control { * "height". * @param attributeBackup A measurement to check for if the CSS size is falsy, * as "offsetWidth" or "offsetHeight". - * @returns A measurement equal to half the sytleTag/attributeBackup, such as + * @returns A measurement equal to half the styleTag/attributeBackup, such as * "3.5em" or "10px". */ private createHalfSizeMeasurement( diff --git a/packages/userwrappr/README.md b/packages/userwrappr/README.md index 5c3a6306..e2efee2d 100644 --- a/packages/userwrappr/README.md +++ b/packages/userwrappr/README.md @@ -78,7 +78,7 @@ See [`ClassNames.ts`](src/Bootstrapping/ClassNames.ts) for default class names a - `classNames: ClassNames`: Class names to use for display elements. - `createElement: (tagName: string, properties: ElementProperties)`: Creates a new HTML element. -- `defaultSize: RelativeSizeSchema`: nitial size to create contents at _(by default, 100% x 100%)_. +- `defaultSize: RelativeSizeSchema`: initial size to create contents at _(by default, 100% x 100%)_. - `getAvailableContainerHeight`: Gets how much height is available to hold contents _(by default, `window.innerHeight`)_. - `menuInitializer: string`: RequireJS path to the menu initialization script. - `menus: MenuSchema[]`: Menus to create inside the menus area. diff --git a/packages/userwrappr/package.json b/packages/userwrappr/package.json index c3622fb7..f7387195 100644 --- a/packages/userwrappr/package.json +++ b/packages/userwrappr/package.json @@ -1,6 +1,6 @@ { "author": { - "email": "me@joshuakgoldberg.com", + "email": "git@joshuakgoldberg.com", "name": "Josh Goldberg" }, "browser": "./lib/index.js", @@ -27,8 +27,6 @@ "@types/sinon-chai": "^3.2.8", "babel-loader": "8.2.5", "chai": "^4.3.6", - "mobx": "^6.6.1", - "mobx-react": "^7.5.2", "mocha": "^10.0.0", "mocha-headless-chrome": "^4.0.0", "react": "^16.8.6", diff --git a/packages/userwrappr/src/Display.ts b/packages/userwrappr/src/Display.ts index ba8e3e71..4badbcef 100644 --- a/packages/userwrappr/src/Display.ts +++ b/packages/userwrappr/src/Display.ts @@ -17,7 +17,7 @@ import { UserWrappr } from "./UserWrappr"; export type CreateContents = (size: AbsoluteSizeSchema, userWrapper: UserWrappr) => Element; /** - * Menu and content elements, once creatd. + * Menu and content elements, once created. */ interface CreatedElements { /** diff --git a/packages/userwrappr/src/Menus/Options/MultiSelectOption.tsx b/packages/userwrappr/src/Menus/Options/MultiSelectOption.tsx index 4159a4ae..28594210 100644 --- a/packages/userwrappr/src/Menus/Options/MultiSelectOption.tsx +++ b/packages/userwrappr/src/Menus/Options/MultiSelectOption.tsx @@ -41,7 +41,6 @@ export const MultiSelectOption: OptionComponent = ({ option }