Open6

使ったことがあるTips

HimenonHimenon

文字列をspilitした際にdelimiterを削除せずに含めて返す

"/{a}/b/{a}/c{a}/".split(new RegExp("({a})"))
// => ["/", "{a}", "/b/", "{a}", "/c", "{a}", "/"]
HimenonHimenon

Docker + Nginx + SSL

オレオレ証明を使ったnginxのreverse proxyを作る

#!/bin/bash

BASE_DIR=ssl
mkdir -p $BASE_DIR

openssl genrsa -out "$BASE_DIR/server.key" 2048
openssl req -new -key "$BASE_DIR/server.key" -subj "/C=JP/ST=Some-State/O=Some-Org/CN=my.localhost.com" > server.csr -out "$BASE_DIR/server.csr"
openssl x509 -req -days 3650 -extfile subjectnames.txt -signkey "$BASE_DIR/server.key" < "$BASE_DIR/server.csr" > "$BASE_DIR/server.crt"
server {
    listen       443 ssl;
    server_name  my.localhost.com;

    ssl_certificate      /etc/nginx/ssl/server.crt;
    ssl_certificate_key  /etc/nginx/ssl/server.key;

    ssl_protocols        TLSv1.2 SSLv3;
    ssl_ciphers          HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

    location / {
        # https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
        proxy_pass http://host.docker.internal:3000;
        proxy_redirect off;
    }
}
FROM nginx:1.19.7

RUN mkdir -p /etc/nginx/ssl
COPY ./ssl /etc/nginx/ssl
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
services:
  reverse-proxy:
    build: .
    restart: always
    ports:
      # - "80:80"
      - "443:443"
    volumes:
      - ./ssl:/etc/nginx/ssl
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
subjectAltName = DNS:my.localhost.com, IP:127.0.0.1
HimenonHimenon

lerna publish --canaryの注意点

  • package単位でコミットハッシュが変更されていなければ、そのパッケージはpublishされない
    • 下位のパッケージが変更ある場合は更新される
  • package.jsonに記述されるバージョンは、1.0.1-next.1+1234567の形式だが、実際にtar.gzのURLは+とコミットハッシュ1234567を除いた1.0.1-next.1でリリースされる。

デフォルトオプションだとキャレットがつく

  • "1.0.1-alpha.1+12345"でpublishしたつもりが、"^1.0.1-alpha.1+12345"となってしまう。
  • --exactオプションを付ける必要がある。lerna/publishのREADMEの方には書いてないけど。
HimenonHimenon

Objectのkeyをアルファベット順にソートする

export const compareBasename = (a: string, b: string): 0 | -1 | 1 => {
  if (a.toLowerCase() < b.toLowerCase()) {
    return -1;
  }
  if (a.toLowerCase() > b.toLowerCase()) {
    return 1;
  }
  return 0;
};

export const sortObjectKey = (obj: Record<string, any>): Record<string, any> => {
  const sortedKeys = Object.keys(obj).sort(compareBasename);
  return sortedKeys.reduce((newObject, currentKey) => {
    return { ...newObject, [currentKey]: obj[currentKey] };
  }, {});
};


sortObjectKey({ "c": "3", "b": "2", "a": "1" })
// => { "a": "1", "b": "2", "c": "3" }