Skip to content

Instantly share code, notes, and snippets.

Avatar
👾

Yosuke Kurami Quramy

👾
View GitHub Profile
@Quramy
Quramy / index.ts
Created Jun 16, 2021
Remove unused GraphQL fragment
View index.ts
import assert from "assert";
import { parse, print, DocumentNode, visit } from "graphql";
function removeUnusedFragment(document: DocumentNode) {
const usedFragmentSet = new Set<string>();
// mark used
visit(document, {
FragmentSpread(node) {
usedFragmentSet.add(node.name.value);
View README.md
@Quramy
Quramy / mini_calc_interpreter.ts
Last active Sep 2, 2020
Mini calc compiler with TS template string types
View mini_calc_interpreter.ts
/**
*
* Mini calc with TypeScript template string types
*
* EBNF
*
* ```
* expr = mul ("+" mul)*
* mul = primary ("*" primary)*
* primary = num | "(" expr ")"
View GraphQLとクライアントサイドの実装指針.md
View no-new-date.ts
import { Rule } from "eslint";
const rule: Rule.RuleModule = {
create: (context) => {
return {
['NewExpression:not(:has(*.arguments)) > Identifier[name="Date"], CallExpression > MemberExpression:has(Identifier.object[name="Date"]) > Identifier.property[name="now"]']: (node: any) => {
context.report({
message: "Don't use side-effective Date function.",
node,
});
@Quramy
Quramy / main.ts
Last active Jul 18, 2019
How to get ESLint result from TypeScript AST using @typescript-eslint/typescript-estree
View main.ts
import * as ts from "typescript";
import { SourceCode, Linter, AST } from "eslint";
import { Extra } from "@typescript-eslint/typescript-estree/dist/parser-options";
import convert from "@typescript-eslint/typescript-estree/dist/ast-converter";
function initExtra() {
return {
tokens: null,
range: false,
loc: false,
@Quramy
Quramy / ama_answers.md
Last active May 20, 2019
InsideFE2019 A-5のAMAで時間内にできなかった質問に対する回答
View ama_answers.md

実際にBFFの開発向けUIは、開発者以外に使ってもらってどのようなコメントがありましたか?

「便利」と言ってもらえたのがやはり一番うれしかったですね。 別の事例だと、社外のシステムへの外接部分について、必ずしもテスト環境から接続可能とは限らないケースで、API呼び出しをフックできる機能としても使えた、というのが好評でした。

フロントエンドが使いやすいように API を定義することで、バックエンド側の実装に影響を与えてしまうことはありましたか?

BFFの存在意義の1つに「マイクロサービスを開発しやすく」がある以上、なるべくそういうケースとならないように注意はしていますが、満足にできているかはわからないですね。。。 もしかしたら、より良いAPI粒度が存在するのに、バックエンドがある程度我慢してくれている部分もあるかもしれませんね。。。

@Quramy
Quramy / how-to-fix.js
Last active Jan 15, 2019
minimal reproducer for nested dispatching error with spork / thunk
View how-to-fix.js
require('babel-polyfill');
const { createStore, applyMiddleware, bindActionCreators, compose } = require('redux');
const { enableBatching, batchActions, batchDispatchMiddleware, BATCH } = require('redux-batched-actions');
const thunk = require('redux-thunk').default;
const { fork, createMiddleware } = require('redux-spork');
function main() {
// reducer
const count = (prev = 0, action) => {
@Quramy
Quramy / _readme.md
Created Nov 14, 2018
extract identifiers and split files
View _readme.md

I want a tsssercmd to extract a selected identifier (function, const, class, type, etc...) to other new file.

{
  command: "extractAndCreateFile",
  file: "./main.js",
  location: {
    line: 2, col: 10
  },
  toFile: "./sum.js"
@Quramy
Quramy / combineLatest.ts
Created Sep 21, 2018
Example of TS 3.1 Mapped Tuple Type
View combineLatest.ts
interface Observable<T> {
subscribe(cb: (v: T) => void): void;
}
type StreamValue<S> = S extends Observable<infer T> ? T : never;
type Unwrap<S> = { [P in keyof S]: StreamValue<S[P]> };
declare function combineLatest<U extends Observable<any>[]>(...streams: U): Observable<Unwrap<U>>;