From 9aba4c7f7016e341cf8e86bb345ae9ad76b87699 Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Wed, 20 Sep 2023 01:59:25 +0900 Subject: [PATCH] setup project --- .editorconfig | 9 ++ .gitattributes | 1 + .githooks/pre-commit | 2 + .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/.gitkeep | 0 .github/PULL_REQUEST_TEMPLATE.md | 22 ++++ .github/labels.yml | 87 ++++++++++++++ .github/release.yml | 45 +++++++ .github/workflows/ci.yml | 150 ++++++++++++++++++++++++ .github/workflows/github-label-sync.yml | 16 +++ .github/workflows/release.yml | 68 +++++++++++ .gitignore | 12 ++ .npmignore | 4 + .vscode/settings.json | 6 + LICENSE | 20 ++++ README.md | 2 +- build.config.ts | 9 ++ bun.lockb | Bin 0 -> 127064 bytes deno.jsonc | 25 ++++ package.json | 70 +++++++++++ scripts/bump-edge.ts | 19 +++ scripts/preinstall.js | 11 ++ scripts/release.sh | 20 ++++ tsconfig.json | 109 +++++++++++++++++ 24 files changed, 707 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100755 .githooks/pre-commit create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/.gitkeep create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/labels.yml create mode 100644 .github/release.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/github-label-sync.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 build.config.ts create mode 100755 bun.lockb create mode 100644 deno.jsonc create mode 100644 package.json create mode 100644 scripts/bump-edge.ts create mode 100644 scripts/preinstall.js create mode 100755 scripts/release.sh create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..df3ddcb --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.json linguist-language=JSON-with-Comments \ No newline at end of file diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..e874da3 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,2 @@ +#!/bin/sh +npx --no-install lint-staged diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..491b724 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: kazupon diff --git a/.github/ISSUE_TEMPLATE/.gitkeep b/.github/ISSUE_TEMPLATE/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..c78a959 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ + + +### Description + + + +### Linked Issues + +### Additional context + + diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..0fdc1ca --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,87 @@ +- name: feature + description: Includes new features + color: 'ffff00' +- name: bug + description: Includes new features + color: 'ee0701' +- name: improvement + description: Includes backwards-compatible fixes + color: '1d76db' +- name: breaking + description: Includes backwards-incompatible fixes + color: 'b60205' +- name: refactoring + description: A code change that neither fixes a bug nor adds a feature + color: 'fbca04' +- name: security + description: Security fixes + color: 'b60205' +- name: documentation + description: Includes documetation fixes + color: '5319e7' +- name: example + description: Includes example and demo code fixes + color: 'db0875' +- name: deprecated + description: Includes deprecate fixes + color: 'f7ffa8' +- name: performance + description: Includes performance fixes + color: 'cc317c' +- name: i18n + description: Includes internationalization fixes + color: 'ffd412' +- name: a11y + description: Inlucdes accessibility fixes + color: '0000ff' +- name: dependency + description: Includes dependency fixes + color: 'ffbce7' +- name: todo + description: todo tasks + color: 'c2e0c6' +- name: duplicate + description: This issue or Pull Request already exists + color: 'ededed' +- name: help wanted + description: Extra attention is needed + color: 'e99695' +- name: good first issue + description: Good for newcomers + color: '7057ff' +- name: 'status: abandoned' + description: The issue or Pull Request is wontfix + color: '000000' +- name: 'status: blocked' + description: Progress on the issue is Blocked + color: 'ee0701' +- name: 'status: in progress' + description: Work in Progress + color: 'cccccc' +- name: 'status: proposal' + description: Request for comments + color: 'd4c5f9' +- name: 'status: pull request welcome' + description: Welcome to Pull Request + color: '2E7733' +- name: 'status: review needed' + description: Request for review + color: 'fbca04' +- name: 'status: need more repro codes or info' + description: Lacks enough info to make progress + color: 'F9C90A' +- name: '๐Ÿงน p1-chore' + description: 'Priority 1: no change in change code behavior' + color: '#FDDFD7' +- name: '๐Ÿฐ p2-nice-to-have' + description: "Priority 2: nothing is broken but it's worth addressing" + color: '#0e8a16' +- name: '๐Ÿ”จ p3-minor-bug' + description: 'Priority 3: a bug in an edge case that only affects very specific usage' + color: '#fbca04' +- name: 'โ— p4-important' + description: 'Priority 4: bugs that violate documented behavior, or significantly impact perf' + color: '#d93f0b' +- name: '๐Ÿ”ฅ p5-urgent' + description: 'Priority 5: build-breaking bugs that affect most users and should be fixed ASAP' + color: '#ee0701' diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..6a050e8 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,45 @@ +changelog: + exclude: + labels: + - ignore-for-release + authors: + - octocat + - renovate[bot] + categories: + - title: ๐ŸŒŸ Features + labels: + - feature + - title: ๐Ÿ› Bug Fixes + labels: + - bug + - title: ๐Ÿ’ฅ Breaking Changes + labels: + - breaking + - title: โš ๏ธ Deprecated Features + labels: + - deprecated + - title: โšก Improvement Features + labels: + - improvement + - title: ๐Ÿ”’ Security Fixes + labels: + - security + - title: ๐Ÿ“ˆ Performance Fixes + labels: + - performance + - title: ๐Ÿ“๏ธ Documentations + labels: + - documentation + - title: ๐Ÿ‘• Refactoring + labels: + - refactoring + - title: ๐Ÿญ Examples + labels: + - example + - title: ๐ŸŒ โ™ฟ Internationalization or Accessibility Fixes + labels: + - a11y + - i18n + - title: ๐Ÿช„ Others + labels: + - chore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0959ee9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + lint: + name: Lint + strategy: + matrix: + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout codes + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Lint codes + run: deno lint + + build: + name: Build + strategy: + matrix: + os: [ubuntu-latest] + node: [18.x] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout codes + uses: actions/checkout@v4 + + - name: Setup deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Setup bun + uses: oven-sh/setup-bun@v1 + + - name: Enable corepack + run: corepack enable + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + + - name: Install dependencies + run: bun install + + - name: Build codes + run: npm run build + + test: + name: Test + strategy: + matrix: + os: [ubuntu-latest] + node: [18.x] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout codes + uses: actions/checkout@v4 + + - name: Setup deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Setup bun + uses: oven-sh/setup-bun@v1 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + + - name: Enable corepack + run: corepack enable + + - name: Install dependencies + run: bun install + + - name: Build codes + run: npm test + + edge-release: + name: Edge Release + needs: + - lint + - build + - test + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + node: [18] + steps: + - name: Checkout codes + uses: actions/checkout@v4 + + - name: Setup deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Setup bun + uses: oven-sh/setup-bun@v1 + + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + + - name: Enable corepack + run: corepack enable + + - name: Install dependencies + run: bun install + + - name: Build + run: npm run build + + - name: Release Edge + if: | + github.event_name == 'push' && + !startsWith(github.event.head_commit.message, '[skip-release]') && + !startsWith(github.event.head_commit.message, 'chore') && + !startsWith(github.event.head_commit.message, 'release') && + !startsWith(github.event.head_commit.message, 'docs') + run: ./scripts/release.sh + env: + NPM_TOKEN: ${{secrets.NPM_ORG_TOKEN}} + EDGE_RELEASE: 'true' diff --git a/.github/workflows/github-label-sync.yml b/.github/workflows/github-label-sync.yml new file mode 100644 index 0000000..5dcfbe1 --- /dev/null +++ b/.github/workflows/github-label-sync.yml @@ -0,0 +1,16 @@ +name: Label sync + +on: + push: + branches: + - main + paths: + - .github/labels.yml + - .github/workflows/github-label-sync.yml + workflow_dispatch: + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - uses: r7kamura/github-label-sync-action@v0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b71f0dd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,68 @@ +name: Release + +on: + push: + branches-ignore: + - '**' + tags: + - 'v*' + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout codes + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Setup deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + + - name: Setup bun + uses: oven-sh/setup-bun@v1 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Enable corepack + run: corepack enable + + - name: Extract version tag + if: startsWith( github.ref, 'refs/tags/v' ) + uses: jungwinter/split@v2 + id: split + with: + msg: ${{ github.ref }} + separator: '/' + + - name: Create Github Release + run: gh release create ${{ steps.split.outputs._2 }} --generate-notes + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate changelog + run: | + git restore --source=HEAD --staged --worktree -- package.json bun.lockb + bun install + npm run build + npm run changelog --tag=${{ steps.split.outputs._2 }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Commit changelog + uses: stefanzweifel/git-auto-commit-action@v4 + with: + branch: main + file_pattern: '*.md' + commit_message: 'chore: sync changelog' + + - name: Publish package + run: ./scripts/release.sh + env: + NPM_TOKEN: ${{secrets.NPM_ORG_TOKEN}} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97aed75 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +dist +node_modules +coverage +.DS_Store +.idea + +*.log +*.swp +*.tgz +*.zip +*~ +.env \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..4c00c76 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +coverage +.* +*.log +*.swp \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ba4b1a2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "deno.enable": false, + "deno.lint": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "denoland.vscode-deno" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d14476d --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2023 kazuya kawaguchi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 9252f9c..3a13087 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # @intilfy/utils -Common utilities for i18n +Collection of i18n utilities **NOTICE: This is a work in progress ๐Ÿ‘ท** diff --git a/build.config.ts b/build.config.ts new file mode 100644 index 0000000..d20a7a9 --- /dev/null +++ b/build.config.ts @@ -0,0 +1,9 @@ +import { defineBuildConfig } from 'unbuild' + +export default defineBuildConfig({ + declaration: true, + rollup: { + emitCJS: true, + }, + entries: ['./src/index.ts'], +}) diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..1b0935cbb9bdd5841fbc47dd0e6fec04124a5ef8 GIT binary patch literal 127064 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 z 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 18" + }, + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./dist/*": "./dist/*", + "./package.json": "./package.json" + }, + "scripts": { + "prepare": "git config --local core.hooksPath .githooks", + "preinstall": "node scripts/preinstall.js", + "changelog": "gh-changelogen --repo=intlify/h3", + "release": "bumpp --commit \"release: v%s\" --push --tag", + "lint": "deno lint", + "format": "deno fmt", + "build": "unbuild", + "test": "vitest run", + "test:coverage": "npm test -- --reporter verbose --coverage" + }, + "lint-staged": { + "*.{js,ts,jsx,tsx,md,json,jsonc}": [ + "deno fmt" + ], + "*.{js,ts,jsx,tsx}": [ + "deno lint" + ] + }, + "devDependencies": { + "@types/node": "^20.6.0", + "@vitest/coverage-v8": "^0.34.4", + "bumpp": "^9.2.0", + "gh-changelogen": "^0.2.8", + "lint-staged": "^14.0.0", + "typescript": "^5.2.2", + "unbuild": "^2.0.0", + "vitest": "^0.34.4" + } +} diff --git a/scripts/bump-edge.ts b/scripts/bump-edge.ts new file mode 100644 index 0000000..369e04e --- /dev/null +++ b/scripts/bump-edge.ts @@ -0,0 +1,19 @@ +import { execSync } from 'node:child_process' +import { promises as fs } from 'node:fs' +import { resolve } from 'node:path' + +async function main() { + const commit = execSync('git rev-parse --short HEAD').toString('utf-8').trim() + const date = Math.round(Date.now() / (1000 * 60)) + + const pkgPath = resolve(process.cwd(), 'package.json') + const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8').catch(() => '{}')) + pkg.version = `${pkg.version}-${date}.${commit}` + pkg.name = pkg.name + '-edge' + await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n') +} + +main().catch((err) => { + console.error(err) + process.exit(1) +}) diff --git a/scripts/preinstall.js b/scripts/preinstall.js new file mode 100644 index 0000000..bfa4dad --- /dev/null +++ b/scripts/preinstall.js @@ -0,0 +1,11 @@ +import { spawnSync } from 'child_process' + +const { status } = spawnSync('which', ['deno'], { stdio: 'ignore' }) + +if (status) { + console.warn( + `\u001b[33mThis repository requires using deno` + + ` for scripts to work properly.\u001b[39m\n`, + ) + process.exit(1) +} diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..ab9a507 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -xe + +# Check edge release +if [[ ! -z ${EDGE_RELEASE} ]] ; then + bunx tsx ./scripts/bump-edge +fi + +# Update token +if [[ ! -z ${NPM_TOKEN} ]] ; then + echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> ~/.npmrc + echo "registry=https://registry.npmjs.org/" >> ~/.npmrc + echo "always-auth=true" >> ~/.npmrc + npm whoami +fi + +# Release packages +echo "Publishing" +npm publish diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0ccdee7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "ESNext", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "Bundler", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +}