thi-ng/umbrella

View on GitHub
scripts/make-module

Summary

Maintainability
Test Coverage
#!/usr/bin/env bash

readonly MODULE="packages/$1"
readonly AUTHOR="Karsten Schmidt"
readonly AUTHOR_EMAIL="k+npm@thi.ng"
readonly AUTHOR_URL="https://thi.ng"

IFS='-' read -r -a parts <<< "$1"

for i in "${parts[@]}"; do
    INITIAL="$INITIAL${i:0:1}"
done

echo "generating module: $MODULE ($INITIAL)"
mkdir -p "$MODULE"

echo "creating /src /test /bench /dev /export /tools"
mkdir -p "$MODULE"/src "$MODULE"/test "$MODULE"/bench "$MODULE"/dev "$MODULE"/export "$MODULE"/tools

echo "creating index.ts stubs..."
touch "$MODULE"/src/index.ts "$MODULE"/tools/index.ts

cp packages/api/LICENSE "$MODULE"/

echo "writing test skeleton..."
cat << EOF > "$MODULE"/test/main.test.ts
import { expect, test } from "bun:test";
// import { } from "../src/index.js"

test.todo("$1", () => {});
EOF

echo "writing test tsconfig..."
cat << EOF > "$MODULE"/test/tsconfig.json
{
    "extends": "../../../tsconfig.json",
    "compilerOptions": {
        "types": ["bun-types"],
        "noEmit": true
    },
    "include": ["./**/*.ts"]
}
EOF

echo "writing bench skeleton..."
cat << EOF > "$MODULE"/bench/index.ts
import { suite } from "@thi.ng/bench";
// import { } from "../src/index.js";

suite([
    { title: "", fn: () => {}, opts: {} },
], {
    iter: 1000,
    warmup: 100,
    size: 1,
});
EOF

echo "writing package.json..."
cat << EOF > "$MODULE"/package.json
{
    "name": "@thi.ng/$1",
    "version": "0.0.1",
    "description": "TODO",
    "type": "module",
    "module": "./index.js",
    "typings": "./index.d.ts",
    "sideEffects": false,
    "repository": {
        "type": "git",
        "url": "https://github.com/thi-ng/umbrella.git"
    },
    "homepage": "https://thi.ng/$1",
    "funding": [
        {
            "type": "github",
            "url": "https://github.com/sponsors/postspectacular"
        },
        {
            "type": "patreon",
            "url": "https://patreon.com/thing_umbrella"
        }
    ],
    "author": "$AUTHOR ($AUTHOR_URL)",
    "license": "Apache-2.0",
    "scripts": {
        "build": "yarn build:esbuild && yarn build:decl",
        "build:decl": "tsc --declaration --emitDeclarationOnly",
        "build:esbuild": "esbuild --format=esm --platform=neutral --target=es2022 --tsconfig=tsconfig.json --outdir=. src/**/*.ts",
        "clean": "bun ../../tools/src/clean-package.ts",
        "doc": "typedoc --options ../../typedoc.json --out doc src/index.ts",
        "doc:ae": "mkdir -p .ae/doc .ae/temp && api-extractor run --local --verbose",
        "doc:readme": "bun ../../tools/src/module-stats.ts && bun ../../tools/src/readme.ts",
        "pub": "yarn npm publish --access public",
        "test": "bun test",
        "tool:tangle": "../../node_modules/.bin/tangle src/**/*.ts"
    },
    "dependencies": {
        "@thi.ng/api": "^8.11.8"
    },
    "devDependencies": {
        "@microsoft/api-extractor": "^7.47.5",
        "esbuild": "^0.23.0",
        "typedoc": "^0.26.5",
        "typescript": "^5.6.2"
    },
    "keywords": [
        "typescript"
    ],
    "publishConfig": {
        "access": "public"
    },
    "engines": {
        "node": ">=18"
    },
    "browser": {
        "process": false,
        "setTimeout": false
    },
    "files": [
        "./*.js",
        "./*.d.ts"
    ],
    "exports": {
        ".": {
            "default": "./index.js"
        }
    },
    "thi.ng": {
        "status": "alpha",
        "year": 2024
    }
}
EOF

echo "writing module tsconfig.json..."
cat << EOF > "$MODULE"/tsconfig.json
{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "."
    },
    "include": [
        "./src/**/*.ts"
    ]
}
EOF

echo "writing api-extractor.json..."
cat << EOF > "$MODULE"/api-extractor.json
{
    "extends": "../../api-extractor.json"
}
EOF

echo "writing tpl.readme.md..."
cat << 'EOF' > "$MODULE"/tpl.readme.md
<!-- include ../../assets/tpl/header.md -->

<!-- toc -->

## About

{{pkg.description}}

{{meta.status}}

{{repo.supportPackages}}

{{repo.relatedPackages}}

{{meta.blogPosts}}

## Installation

{{pkg.install}}

{{pkg.size}}

## Dependencies

{{pkg.deps}}

{{repo.examples}}

## API

{{pkg.docs}}

TODO

<!-- include ../../assets/tpl/footer.md -->
EOF

echo "refreshing monorepo index..."
yarn install &>/dev/null
echo "DONE"