Skip to content

Instantly share code, notes, and snippets.

View jacob-ebey's full-sized avatar

Jacob Ebey jacob-ebey

View GitHub Profile
@jacob-ebey
jacob-ebey / toggle.jsx
Created October 27, 2023 16:05 — forked from AndrewIngram/toggle.jsx
Naive sketch of mutation API
function getIsLiked(viewerId, entityId) {
// hit a database or something
}
function toggleLikeStatus(viewerId, entityId) {
// hit a database or something
return !currentStatus;
}
@jacob-ebey
jacob-ebey / server.js
Last active October 6, 2023 21:14
remix cjs server
const fs = require("node:fs");
const { createRequestHandler } = require("@remix-run/express");
const { broadcastDevReady, installGlobals } = require("@remix-run/node");
const compression = require("compression");
const express = require("express");
const morgan = require("morgan");
const sourceMapSupport = require("source-map-support");
sourceMapSupport.install();
@jacob-ebey
jacob-ebey / event-stream-reload-middleware.ts
Created September 28, 2023 06:51
Event Stream Dev Middleware
export function createDevMiddleware(pathname: string) {
return {
hmr(request: Request) {
return new Response(
new ReadableStream({
start(controller) {
controller.enqueue(
`id:0\nevent: message\ndata: ${JSON.stringify({
type: "connected",
})}\n\n`
@jacob-ebey
jacob-ebey / loader.ts
Last active September 21, 2023 17:31
Node RSC on-demand transform / resolution for RSC
import { readFile } from 'node:fs/promises'
import * as path from 'node:path'
import { type LoadHook, type ResolveHook, type ResolveHookContext } from 'node:module'
import { fileURLToPath } from 'node:url'
import * as oxy from '@oxidation-compiler/napi'
import type { ModuleExport } from './module-info.js'
import * as clientTransforms from './transform-client.js'
@jacob-ebey
jacob-ebey / recursive-rsc-stream-inline.ts
Last active March 25, 2024 07:05
Inline RSC stream with a recursive async component that is streamed as part of the SSR renderToXYZ call.
import * as React from "react";
// @ts-ignore
import * as ReactDOM from "#react-dom-server-implementation";
// @ts-ignore
import * as ReactDOMClient from "#react-server-dom-client-implementation";
export async function fetch(
request: Request,
{
browserEntry,
@jacob-ebey
jacob-ebey / example.js
Last active August 27, 2023 01:47
Webpack Federation Expose Remotes Plugin
const remote = () => "@app/" + "other";
__webpack_chunk_load__(remote()).then(async () => {
const container = __webpack_require__(remote());
const factory = await container.get("./federated");
const mod = factory();
console.log({
APP_NAME,
REMOTE: mod.name,
});
@jacob-ebey
jacob-ebey / fetch-server.d.ts
Created August 23, 2023 07:42
Node Fetch Server
import type { Server } from "node:http";
export type Handler = (request: Request) => Response | Promise<Response>;
export type CreateServerOptions = {
onError?: (error: unknown) => void;
};
export declare function createServer(
handler: Handler,
@jacob-ebey
jacob-ebey / event-delegation.ts
Last active September 28, 2023 06:53
Remix Event Delegation
import * as React from "react";
import { useNavigate, useSubmit } from "@remix-run/react";
export function useEventDelegation() {
const navigate = useNavigate();
const submit = useSubmit();
React.useEffect(() => {
const handleClick = (e: MouseEvent) => {
const target = e.target as HTMLElement;
if (
@jacob-ebey
jacob-ebey / bye-bye-blue.js
Created July 28, 2023 17:31
ByeByeBlue Boost
setInterval(() => {
const tweets = document.querySelectorAll(
`[data-testid="cellInnerDiv"] [data-testid="tweet"]`
);
for (const tweet of tweets) {
if (tweet.querySelector(`[data-testid="icon-verified"]`)) {
tweet.style.display = "none";
}
}
@jacob-ebey
jacob-ebey / RSC-exploration.md
Created February 28, 2023 18:44
RSC Exploration

React Server Components Exploration

High level:

  • Separation of SSR vs RSC rendering environments is both unnecessary and a pain point for existing application migration to the new paradigms.
  • "Client Component can't import Server Component" seems to be an artificial limitation of the mental model of separate SSR vs RSC env and the lack of built in support for inlining RSC streams into the HTML document
  • Removal of "client only hooks" is also an artificial limitation brought on by trying to make SSR and RSC independent concepts. Zero reason to remove hooks that work in SSR today to support RSC.
  • Inlining of RSC JSON representation should not be needed and the intermediate tree should be able to be revived from the SSR'd DOM, not an inlined RSC format.