Skip to content

Instantly share code, notes, and snippets.

@AriPerkkio
AriPerkkio / increase-specificity.scss
Last active January 18, 2024 13:09
SCSS Increase specificity mixin
@mixin increase-specificity($times: 1) {
$selector: "";
@for $index from 1 through $times {
$selector: #{$selector}#{&};
}
&#{$selector} {
@content;
}
@AriPerkkio
AriPerkkio / script.sh
Created October 4, 2023 07:01
NPM publish snapshot
$ npm --no-git-tag-version version ${npm_package_version}-snapshot-${GIT_COMMIT}
$ npm publish --tag snapshot
@AriPerkkio
AriPerkkio / print-headings.js
Created August 2, 2023 06:30
Query HTML headings and print them
printHeadings();
function printHeadings() {
const headings = document.querySelectorAll("h1,h2,h3,h4,h5,h6");
const formatted = Array.from(headings).map((element) => {
const tag = element.tagName;
const padding = parseInt(tag.charAt(1)) - 1;
const text = element.textContent?.replace(/\s{2,}/g, " ");
@AriPerkkio
AriPerkkio / invert-binary-tree.ts
Created April 20, 2023 09:15
Typescript type system binary tree inversion
type InvertTree<Tree extends Leaf> = Tree extends {
left: infer Left;
right: infer Right;
}
? Left extends Leaf
? Right extends Leaf
? { left: InvertTree<Right>; right: InvertTree<Left>; id: Tree["id"] }
: { left: undefined; right: InvertTree<Left>; id: Tree["id"] } // There is left but no right
: Right extends Leaf
? { left: InvertTree<Right>; right: undefined; id: Tree["id"] } // There is right but no left
@AriPerkkio
AriPerkkio / tic-tac-toe.ts
Created April 9, 2023 09:17
Typescript type system Tic-tac-toe game
/* Typings */
type TicTacToe<
MovesOrNextBoard extends Board | Turn[], // On initial round this will be a Turn[], on next rounds it will be a Board with some moves done
MovesOrMissing extends Turn[] = [], // On initial round this will be empty, on next rounds it will be the moves
PreviousMark extends ValidMark | undefined = undefined, // On initial round this will be missing, on next rounds it will be the mark of the last move
CurrentBoard extends Board = ResolveBoardFromArgs<MovesOrNextBoard>, // Parsed argument
Moves extends Turn[] = ResolveNextMovesFromArgs<MovesOrNextBoard, MovesOrMissing> // Parsed argument
> =
Moves extends [infer NextMove, ...infer NextMoves] ?
NextMove extends Turn ?
@AriPerkkio
AriPerkkio / . vm.mjs
Last active March 17, 2023 07:07
isolated vm + dynamic import
/*
$ node --watch --no-warnings --experimental-vm-modules --experimental-import-meta-resolve vm.mjs
*/
import vm from "node:vm";
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { JSDOM } from "jsdom";
const server = {
async fetchModule(filename) {
@AriPerkkio
AriPerkkio / process.mjs
Last active March 8, 2023 09:43
Node inspector worker_threads + child_process
/*
* Run as `node process.mjs` and open Chrome DevTools or similar debugging tool
*/
import { fork } from "node:child_process";
import { fileURLToPath } from "node:url";
import inspector from "node:inspector";
const filename = fileURLToPath(import.meta.url);
if (!process.env.SOME_FLAG) {
@AriPerkkio
AriPerkkio / . index.mjs
Last active January 31, 2023 13:36
node:inspector + V8 Profiler.*PreciseCoverage
import { writeFileSync } from "node:fs";
import inspector from "node:inspector";
function firstMethod() {}
function secondMethod() {}
const session = new inspector.Session();
const collectedCoverage = [];
session.connect();
/*
rm -rf ./profiling
node --cpu-prof --cpu-prof-dir=./profiling index.mjs
*/
import { fileURLToPath } from "node:url";
import vm from "node:vm";
import { Worker, isMainThread } from "node:worker_threads";
globalThis.variableInGlobalScope = "Hello world";
@AriPerkkio
AriPerkkio / tannerlinsley_react-table.md
Created October 3, 2022 15:24
react#25360, react-hooks/no-nested-components, react-table

Rule: react-hooks/no-nested-components

  • Message: Component "Header" is declared during render. You should move this declaration outside of render to ensure this component's state is persisted across re-renders of its parent. If this component is memoized, you should still refactor the component to be able to move it outside of render. If you want to reset its state use a key instead (see https://reactjs.org/docs/lists-and-keys.html#keys).
  • Path: tannerlinsley/react-table/old-examples/expanding/src/App.js
  • Link
  90 |         // Build our expander column
  91 |         id: 'expander', // Make sure it has an ID
> 92 |         Header: ({ getToggleAllRowsExpandedProps, isAllRowsExpanded }) => (