Skip to content

Instantly share code, notes, and snippets.

View cometkim's full-sized avatar

Hyeseong Kim cometkim

View GitHub Profile
@cometkim
cometkim / gatsby-typed-query.md
Last active May 4, 2022 11:35
GatsbyJS typed query generation RFC

RFC: Gatsby Typed Query

Motivation

As a maintainer of graphql-plugin-typegen, I have been thinking about an ergonomic way to provide GraphQL types in the Gatsby project for a long time.

In the first version of the plugin, users always had to directly import the type definitions from the generated files.

import * as React from 'react';
@cometkim
cometkim / index.mjs
Created March 25, 2022 16:55
Search all packages that doesn't support ESM from node_modules directory
import * as path from 'node:path';
import * as fs from 'node:fs/promises';
const nodeModules = path.resolve('node_modules');
let moduleNames = await fs.readdir(nodeModules);
moduleNames = (await Promise.all(
moduleNames.map(async name => {
if (name.startsWith('.')) {
return [];

In this tutorial we're going to build a set of parser combinators.

What is a parser combinator?

We'll answer the above question in 2 steps

  1. what is a parser?
  2. and.. what is a parser combinator?

So first question: What is parser?

In this tutorial we're going to build a set of parser combinators.

What is a parser combinator?

We'll answer the above question in 2 steps

  1. what is a parser?
  2. and.. what is a parser combinator?

So first question: What is parser?

@cometkim
cometkim / tsserver.js
Last active March 12, 2021 02:08
coc.nvim + tsserver + pnpify (lbrayner/vim-rzip plugin required)
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.js";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
@cometkim
cometkim / build-fontset.sh
Last active October 26, 2020 08:54
Font subset script for l10n
#!/bin/bash
set -eux
# borrowed subset range from: https://www.44bits.io/ko/post/optimization_webfont_with_pyftsubnet
OPTS_SUBSET_KO='--text-file=glyphs-ko.txt'
# borrowed subset range from: https://fonts.googleapis.com/css2?family=Prompt&display=swap&subset=thai
OPTS_SUBSET_THAI='--unicodes=U+0E01-0E5B, U+200C-200D, U+25CC, U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD'
@cometkim
cometkim / machine.js
Last active November 7, 2020 12:16
Generated by XState Viz: https://xstate.js.org/viz
// 충돌시 데미지
const HIT_DAMAGE = 30;
// 충돌 후 무적 시간
const INVINCIBLE_TIME = 2000;
// 시간당 데미지
const TICK_DAMAGE = 5;
const gameMachine = Machine({
@cometkim
cometkim / main.js
Created September 8, 2020 10:48
The minimal Storybook(v6) configuration for Gatsby + TypeScript + Pnpm
module.exports = {
stories: [
'../src/**/*.stories.mdx',
'../src/**/*.stories.@(js|jsx|ts|tsx)',
],
addons: [
'@storybook/addon-links',
'@storybook/addon-essentials',
],
webpackFinal: async config => {
@cometkim
cometkim / xstate-typestate-guard.tsx
Created July 8, 2020 16:11
Type guard for XState
export type UserContext = {
};
type UserSuccessContext = UserContext & {
user: User;
};
type UserErrorContext = UserContext & {
error: Error;
};
@cometkim
cometkim / directives.graphql
Created October 17, 2019 04:43
Prisma 1 directive mock declarations
directive @db(name: String!) on FIELD_DEFINITION | OBJECT
directive @relationTable on OBJECT
directive @id on FIELD_DEFINITION
directive @unique on FIELD_DEFINITION
directive @createdAt on FIELD_DEFINITION
directive @updatedAt on FIELD_DEFINITION
directive @default(value: Any) on FIELD_DEFINITION
directive @relation(link: RelationLink! = TABLE, name: String) on FIELD_DEFINITION
enum RelationLink {