open-index/open-npm huggingface dataset:
npm package: @range3/priconne-squad-detector
Description: ```js const cv = require('opencv4nodejs') const PriconneSquadDetector = require('@range3/priconne-squad-detector')
Author: range3
Latest version: 0.1.0-alpha.1

# priconne-squad-detector
## Usage
```js
const cv = require('opencv4nodejs')
const PriconneSquadDetector = require('@range3/priconne-squad-detector')

;(async () => {
  const screenMat = await cv.imreadAsync('./screen.jpg', cv.IMREAD_COLOR)

  const detector = new PriconneSquadDetector()
  const result = detector.detect(screenMat)

  console.log(
    result
      .slice(0, 5)
      .sort((a, b) => b.position - a.position)
      .map(c => c.name)
      .join(' '),
  )
})()
  .catch(err => console.error(err))
```

## Known issues
- https://github.com/justadudewhohacks/opencv4nodejs/issues/649
npm package: @range3/priconne-squad-seeker
Description: PrincessConnect Re:DIVE Clan Battle Tool
Author: range3
Latest version: 0.1.0-alpha.15

# PrincessConnect! Re:Dive Clan-battle Squad Seeker

work in progress

## Usage
### CLI
```
$ API_KEY=your-youtube-data-api-key npx @range3/priconne-squad-seeker --help
```

### Lib
```js
  const PriconneSquadSeeker = require('@range3/priconne-squad-seeker')
  const seeker = new PriconneSquadSeeker({
    apiKey: process.env.API_KEY // default
  })
  const items = await seeker.seek({
    phase: 4,
    boss: 'カルキノス',
    year: 2020,
    month: 6,
  })
```

### Output Example
```json
[
  {
    "videoId":"exampleIdidid",
    "url":"https://youtu.be/exampleIdidid",
    "title":"[プリコネR] フルオート ワイバーン ４段階目 物理 [1100万]",
    "channelTitle":"ほげほげ",
    "publishedAt":"2020-07-30T08:43:35.000-00:00",
    "phase":4,
    "bosses":["ワイバーン"],
    "squadType":"物理",
    "damage":11000000,
    "oneTurnKill":false,
    "operationType":"フルオート"
  },
  ...
]
```
npm package: @ranger-testing/opencode-plugin
Description: Ranger plugin for OpenCode - feature tracking hooks for AI coding sessions
Latest version: 2.5.0

# Ranger OpenCode Plugin

Ranger hooks for OpenCode sessions. Use this plugin to track features and run browser verification from OpenCode.

## Install

1. Install the Ranger CLI.

```bash
npm install -g @ranger-testing/ranger-cli
```

2. Run setup from your project root.

```bash
ranger setup --opencode
```

This writes `opencode.json` with the plugin entry and completes authentication.

3. Start OpenCode and run the `ranger_enable` tool to enable hooks.

## Manual config

If you prefer to edit the config yourself, add this to `opencode.json`:

```json
{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["@ranger-testing/opencode-plugin"]
}
```
npm package: @ranger-theme/apollo
Description: ## 🎉 Introduce
Latest version: 0.1.1

# @ranger-theme/apollo

## 🎉 Introduce

> apollo工具

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/apollo)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/apollo
# or
$ yarn add --save-dev @ranger-theme/apollo
# or
$ pnpm add --save-dev @ranger-theme/apollo
```

## 🔨 Usage

```js
import { shrinkFetchQuery, useAwaitQuery } from '@ranger-theme/apollo'
```
npm package: @ranger-theme/commitizen-config
Description: Ranger theme commitizen config
Latest version: 0.3.0

# @ranger-theme/commitizen-config

## 🎉 Introduce

> Commitizen 是一个用于生成和校验提交信息的工具，它可以帮助我们生成符合规范的提交信息，并自动校验提交信息是否符合规范.

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/commitizen-config)
- [CHANGELOG](CHANGELOG.md)

## ✨ Features

```js
module.exports = {
  types: [
    {
      value: 'feat',
      name: 'feat: A new feature',
    },
    {
      value: 'fix',
      name: 'fix: A bug fix',
    },
    {
      value: 'docs',
      name: 'docs: Documentation only changes',
    },
    {
      value: 'style',
      name: 'style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)',
    },
    {
      value: 'refactor',
      name: 'refactor: A code change that neither fixes a bug nor adds a feature',
    },
    {
      value: 'perf',
      name: 'perf: A code change that improves performance',
    },
    {
      value: 'test',
      name: 'test: Adding missing tests',
    },
    {
      value: 'chore',
      name: 'chore: Changes to the build process or auxiliary tools and libraries such as documentation generation',
    },
    {
      value: 'revert',
      name: 'revert: revert to a commit',
    },
    {
      value: 'build',
      name: 'build: pack',
    },
  ],
  messages: {
    type: '"Select the type of change that you\'re commiting: (Use arrow keys)"',
    customScope: 'Please enter the modification range (optional):',
    subject: 'Please briefly describe the submission (required):',
    body: 'Provide a LONGER description of the change (optional). Use "|" to break new line:\n',
    footer: 'Please enter the issue to close (optional):',
    confirmCommit: 'Are you sure you want to proceed with the commit above? (y/n/e/h)',
  },
  skipQuestions: [],
  subjectLimit: 100,
}
```

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/commitizen-config
# or
$ yarn add --save-dev @ranger-theme/commitizen-config
# or
$ pnpm add --save-dev @ranger-theme/commitizen-config
```

## 🔨 Usage

```js
// .cz-config.js
const commitizenConfig = require('@ranger-theme/admin-commitizen-config')

module.exports = {
  ...commitizenConfig
}
```

```json
"config": {
  "cz-customizable": {
    "config": "./.cz-config.js"
  }
}
```
npm package: @ranger-theme/commitlint-config
Description: Ranger theme commitlint config
Latest version: 0.5.0

# @ranger-theme/commitlint-config

## 🎉 Introduce

> git commit message 规范

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/commitlint-config)
- [CHANGELOG](CHANGELOG.md)

## ✨ Features

```js
module.exports = {
  extends: [require.resolve('@commitlint/config-conventional')],
  rules: {
    'body-max-line-length': [0],
    'type-enum': [
      2,
      'always',
      [
        'feat', // A new feature
        'fix', // A bug fix
        'docs', // Documentation only changes
        'style', // Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
        'refactor', // A code change that neither fixes a bug nor adds a feature
        'perf', // A code change that improves performance
        'test', // Adding missing tests
        'chore', // Changes to the build process or auxiliary tools and libraries such as documentation generation
        'revert', // revert to a commit
        'build', // pack
      ],
    ],
    'subject-case': [0],
  },
}
```

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/commitlint-config
# or
$ yarn add --save-dev @ranger-theme/commitlint-config
# or
$ pnpm add --save-dev @ranger-theme/commitlint-config
```

## 🔨 Usage

```js
// .commitlintrc.js
const commitlintConfig = require('@ranger-theme/admin-commitlint-config')

module.exports = {
  ...commitlintConfig
}
```
npm package: @ranger-theme/common
Description: ## 🎉 Introduce
Latest version: 0.3.0

# @ranger-theme/common

## 🎉 Introduce

> common公共配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/common)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/common
# or
$ yarn add --save-dev @ranger-theme/common
# or
$ pnpm add --save-dev @ranger-theme/common
```

## 🔨 Usage

```js
import {} from '@ranger-theme/common'
```
npm package: @ranger-theme/core
Description: ## 🎉 Introduce
Latest version: 1.7.1

# @ranger-theme/core

## 🎉 Introduce

> core核心架构

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/core)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/core
# or
$ yarn add --save-dev @ranger-theme/core
# or
$ pnpm add --save-dev @ranger-theme/core
```

## 🔨 Usage

```js
import { withApollo, withRedux, useAwaitQuery, useTransation } from '@ranger-theme/core'
```
npm package: @ranger-theme/hooks
Description: ## 🎉 Introduce
Latest version: 1.2.1

# @ranger-theme/hooks

## 🎉 Introduce

> hooks核心架构

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/hooks)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/hooks
# or
$ yarn add --save-dev @ranger-theme/hooks
# or
$ pnpm add --save-dev @ranger-theme/hooks
```

## 🔨 Usage

```js
import { useRequest } from '@ranger-theme/hooks'
```
npm package: @ranger-theme/nextjs-config
Description: ## 🎉 Introduce
Latest version: 1.0.1

# @ranger-theme/nextjs-config

## 🎉 Introduce

> nextjs配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/nextjs-config)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/nextjs-config
# or
$ yarn add --save-dev @ranger-theme/nextjs-config
# or
$ pnpm add --save-dev @ranger-theme/nextjs-config
```

## 🔨 Usage

```js
const nextConfig = require('@ranger-theme/nextjs-config')

const pkg = require('./package.json')

const isProd = process.env.NODE_ENV === 'production'

/** @type {import('next').NextConfig} */
module.exports = nextConfig({
  pkg,
  timestamp: new Date().getTime(),
  transpilePackages: [],
  compiler: {
    reactRemoveProperties: isProd,
    removeConsole: false,
    emotion: {
      sourceMap: !isProd,
      autoLabel: 'dev-only',
      labelFormat: '[local]',
      importMap: {
        '@mui/system': {
          styled: {
            canonicalImport: ['@emotion/styled', 'default'],
            styledBaseImport: ['@mui/system', 'styled']
          }
        },
        '@mui/material/styles': {
          styled: {
            canonicalImport: ['@emotion/styled', 'default'],
            styledBaseImport: ['@mui/material/styles', 'styled']
          }
        }
      }
    }
  },
  plugins: []
})
```

## SVG Builder
- generate svg builder config file: next.svg.js
```js
module.exports = {
  dir: 'svgs',
  output: 'components',
  componentName: 'SvgResource',
  extension: 'ts'
}
```

- use commond to generate svg components: `pnpm svgbuilder`
```sh
pnpm svgbuilder
```
npm package: @ranger-theme/postcss-config
Description: ## 🎉 Introduce
Latest version: 0.1.0

# @ranger-theme/postcss-config

## 🎉 Introduce

> postcss配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/postcss-config)
- [CHANGELOG](CHANGELOG.md)

## ✨ Features

```js
module.exports = ({ px2vwOptions = {}, ...options }) => {
  return {
    ...options,
    plugins: {
      ...(options?.plugins ?? {}),
      'postcss-px-to-viewport-8-plugin': {
        unitToConvert: 'px', // 要转化的单位
        viewportWidth: 750, // UI设计稿的宽度
        unitPrecision: 4, // 转换后的精度，即小数点位数
        viewportUnit: 'vw',
        propList: ['*', '!border'], // 指定转换的css属性的单位，*代表全部css属性的单位都进行转换
        fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位，默认vw
        minPixelValue: 1, // 默认值1，小于或等于1px则不进行转换
        selectorBlackList: ['.ignore', '.hairlines', 'node_modules'], // 指定不转换为视窗单位的类名
        mediaQuery: true, // 是否在媒体查询的css代码中也进行转换，默认false
        replace: true, // 是否转换后直接更换属性值
        exclude: [], // 设置忽略文件，用正则做目录名匹配
        landscape: true, // 是否处理横屏情况,
        ...px2vwOptions
      }
    }
  }
}
```

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/postcss-config
# or
$ yarn add --save-dev @ranger-theme/postcss-config
# or
$ pnpm add --save-dev @ranger-theme/postcss-config
```

## 🔨 Usage

```ts
const postcssConfig = require('@ranger-theme/postcss-config')

const configs = postcssConfig()

module.exports = {
  ...configs
}
```
npm package: @ranger-theme/prettier-config
Description: ## 🎉 Introduce
Latest version: 0.2.0

# @ranger-theme/prettier-config

## 🎉 Introduce

> prettier配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/prettier-config)
- [CHANGELOG](CHANGELOG.md)

## ✨ Features

```js
module.exports = {
  printWidth: 100, // 单行长度
  tabWidth: 2, // 缩进长度
  useTabs: false, // 使用空格代替tab缩进
  semi: false, // 句末使用分号
  singleQuote: true, // 使用单引号
  quoteProps: 'as-needed', // 仅在必需时为对象的key添加引号
  jsxSingleQuote: false, // jsx中使用单引号
  trailingComma: 'none', // 多行时尽可能打印尾随逗号
  bracketSpacing: true, // 在对象前后添加空格
  jsxBracketSameLine: true, // 多属性html标签的‘>’折行放置
  arrowParens: 'always', // 单参数箭头函数参数周围使用圆括号
  requirePragma: false, // 无需顶部注释即可格式化
  insertPragma: false, // 在已被preitter格式化的文件顶部加上标注
  htmlWhitespaceSensitivity: 'ignore', // 对HTML全局空白不敏感
  vueIndentScriptAndStyle: false, // 不对vue中的script及style标签缩进
  endOfLine: 'lf', // 结束行形式
  embeddedLanguageFormatting: 'auto' // 对引用代码进行格式化
}
```

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/prettier-config
# or
$ yarn add --save-dev @ranger-theme/prettier-config
# or
$ pnpm add --save-dev @ranger-theme/prettier-config
```

## 🔨 Usage

```ts
const prettierConfig = require('@ranger-theme/prettier-config')

module.exports = {
  ...prettierConfig
}
```
npm package: @ranger-theme/pwa-config
Description: ## 🎉 Introduce
Latest version: 0.3.0

# @ranger-theme/pwa-config

## 🎉 Introduce

> pwa配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/pwa-config)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/pwa-config
# or
$ yarn add --save-dev @ranger-theme/pwa-config
# or
$ pnpm add --save-dev @ranger-theme/pwa-config
```

## 🔨 Usage

```js
const nextConfig = require('@ranger-theme/nextjs-config')
const pwaConfig = require('@ranger-theme/pwa-config')

const pkg = require('./package.json')

const isProd = process.env.NODE_ENV === 'production'
const timestamp = new Date().getTime()

/** @type {import('next').NextConfig} */
module.exports = nextConfig({
  pkg,
  dirname: process.cwd(),
  timestamp,
  transpilePackages: [],
  compiler: {
    reactRemoveProperties: isProd,
    removeConsole: false
  },
  plugins: [...pwaConfig({ timestamp })]
})
```
npm package: @ranger-theme/stylelint-config
Description: ## 🎉 Introduce
Latest version: 0.5.0

# @ranger-theme/stylelint-config

## 🎉 Introduce

> stylelint配置项

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/stylelint-config)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/stylelint-config
# or
$ yarn add --save-dev @ranger-theme/stylelint-config
# or
$ pnpm add --save-dev @ranger-theme/stylelint-config
```

## 🔨 Usage

```js
module.exports = {
  extends: '@ranger-theme/stylelint-config'
};
```
npm package: @ranger-theme/tracking
Description: <p>   <a href='https://www.npmjs.com/package/@ranger-theme/tracking'><img src='https://img.shields.io/npm/v/@ranger-theme/tracking.svg' alt='Latest npm version'></a> </p>
Latest version: 0.4.0

# @ranger-theme/tracking

<p>
  <a href='https://www.npmjs.com/package/@ranger-theme/tracking'><img src='https://img.shields.io/npm/v/@ranger-theme/tracking.svg' alt='Latest npm version'></a>
</p>

## 🎉 Introduce

> tracking工具

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/tracking)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/tracking
# or
$ yarn add --save-dev @ranger-theme/tracking
# or
$ pnpm add --save-dev @ranger-theme/tracking
```

## 🔨 Usage

```js
import { BaiduAnalytics, GoogleTagManager } from '@ranger-theme/tracking'
```

### Baidu Tracking Router Events
```tsx
import { Router } from 'next/router'
import { useEffect } from 'react'

useEffect(() => {
  const routeChangeComplete = (url) => {
    try {
      window._hmt.push(['_trackPageview', url]);
    } catch (e) {
      console.info(e)
    }
  }

  Router.events.on('routeChangeComplete', routeChangeComplete)

  return () => {
    Router.events.off('routeChangeComplete', routeChangeComplete)
  }
}, [])

```
npm package: @ranger-theme/ts-config
Description: ## 🎉 Introduce
Latest version: 0.1.0

# @ranger-theme/ts-config

## 🎉 Introduce

> ts config配置
- `base.json` 基础配置
- `nestjs.json` nestjs 应用配置
- `nextjs.json` nextjs 应用配置
- `react-app.json` react app配置
- `react-library.json` react 组件库配置
- `vite.json` vite 应用配置

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/ts-config)
- [CHANGELOG](CHANGELOG.md)

## ✨ Features

```js
{
  "extends": "@ranger-theme/ts-config/react-library.json"
}

```

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/ts-config
# or
$ yarn add --save-dev @ranger-theme/ts-config
# or
$ pnpm add --save-dev @ranger-theme/ts-config
```

## 🔨 Usage

```ts
{
  "extends": "@ranger-theme/ts-config/react-library.json",
}
```
npm package: @ranger-theme/ui
Description: <p>   <a href='https://www.npmjs.com/package/@ranger-theme/ui'><img src='https://img.shields.io/npm/v/@ranger-theme/ui.svg' alt='Latest npm version'></a> </p>
Latest version: 0.14.3

# @ranger-theme/ui

<p>
  <a href='https://www.npmjs.com/package/@ranger-theme/ui'><img src='https://img.shields.io/npm/v/@ranger-theme/ui.svg' alt='Latest npm version'></a>
</p>

## 🎉 Introduce

> ui工具

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/ui)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/ui
# or
$ yarn add --save-dev @ranger-theme/ui
# or
$ pnpm add --save-dev @ranger-theme/ui
```

## 🔨 Usage

```js
import { CopyBoard, CountDown, CsvLink, HeadRoom, InfiniteScroll, Player, Portal, PrintScreen } from '@ranger-theme/ui'
```

### nextjs dynimac import
```tsx
import dynamic from 'next/dynamic'

const CsvLink = dynamic(
  import('@ranger-theme/ui').then((module) => module.CsvLink),
  {
    ssr: false
  }
)

const MediaQuery = dynamic(
  import('@ranger-theme/ui').then((module) => module.MediaQuery),
  {
    ssr: false
  }
)
```
npm package: @ranger-theme/utils
Description: ## 🎉 Introduce
Latest version: 1.0.0

# @ranger-theme/utils

## 🎉 Introduce

> utils工具

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/utils)
- [CHANGELOG](CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/utils
# or
$ yarn add --save-dev @ranger-theme/utils
# or
$ pnpm add --save-dev @ranger-theme/utils
```

## 🔨 Usage

```js
import { events, parseCookies, destroyCookie, setItem, getItem, removeItem, isPropValid } from '@ranger-theme/utils'
```
npm package: @ranger-theme/vite-config
Description: ## 🎉 Introduce
Latest version: 1.6.0

# @ranger-theme/vite-config

## 🎉 Introduce

> vite配置项

## 📚 Documentation

- [Npm](https://www.npmjs.com/package/@ranger-theme/vite-config)
- [CHANGELOG](https://www.npmjs.com/package/@ranger-theme/vite-config/CHANGELOG.md)

## 📦 Install

```bash
$ npm install --save-dev @ranger-theme/vite-config
# or
$ yarn add --save-dev @ranger-theme/vite-config
# or
$ pnpm add --save-dev @ranger-theme/vite-config
```

## 🔨 Usage

```ts
// vite.config.ts

import { baseConfig } from '@ranger-theme/vite-config'
import path from 'node:path'
import type { ConfigEnv } from 'vite'
import { defineConfig } from 'vite'

import pkg from './package.json'

const viteConfig: any = ({ mode }: ConfigEnv) => {
  const defaultConfig: any = baseConfig({
    mode,
    pkg,
    https: true,
    entry: '/bootstrap/main.tsx',
    outDir: 'build',
    cdnOptions: {
      enableInDevMode: true,
      modules: ['react', 'react-dom']
    }
  })

  return defineConfig({
    ...defaultConfig,
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './'),
        '~': path.resolve(__dirname, './')
      }
    },
    server: {
      host: '127.0.0.1',
      port: 3000
    }
  })
}

export default viteConfig
```
npm package: @rangerrick/moment-javaformat
Description: Format Moment.js using Java format strings
Author: Benjamin Reed
Latest version: 2.0.12

# moment-javaformat

[![CircleCI](https://circleci.com/gh/RangerRick/moment-javaformat/tree/main.svg?style=svg)](https://circleci.com/gh/RangerRick/moment-javaformat/tree/main)

This plugin for [Moment.js](https://momentjs.com/) adds support for formatting using the Java [SimpleDateFormat](https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) and [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) format options.

It differs from [moment-jdateformatparser](https://github.com/MadMG/moment-jdateformatparser) in that it doesn't just try to translate Java format strings to Moment, but instead implements a new set of format methods that can handle a wider range of Java format strings, at the expense of speed.

Thanks to [moment-jdateformatparser](https://github.com/MadMG/moment-jdateformatparser) for the basic idea, I ran with it in my own way because we needed some formats that just plain aren't possible in a simple format string translation. :)

## Version History

Changes made in the `develop` branch are checked against unit tests upon commit.
The latest [CHANGELOG.md](https://github.com/RangerRick/moment-javaformat/blob/main/CHANGELOG.md) is then auto-generated from the commit history and merged to `main`.

## Requirements

This plugin requires loading either `moment` or `moment-timezone`, but some functionality will be undefined or fail if you are using Moment.js without timezone support.

## Usage

In most cases, all you should have to do is load this module after you load moment, and then new methods are available to you for formatting:

```javascript
const moment = require("moment-timezone");
require("@rangerrick/moment-javaformat");

let now = moment("2020-01-01T15:00:00Z");
// a format matching Java 8 SimpleDateFormat definitions
now.formatJavaSDF("yyyy-MM-dd HH:mm"); // 2020-01-01 15:00

// a format matching Java 8 DateTimeFormatter definitions
now.formatJavaDTF("yyyy-MM-dd HH:mm:ss O"); // 2020-01-01 15:00:00 GMT-05:00
```

## Installation

You can install `moment-javaformat` from npm in the usual ways:

```shell
# install using npm
npm install --save @rangerrick/moment-javaformat

# install using yarn
yarn add @rangerrick/moment-javaformat
```

## Caveats

A few format strings are difficult to implement without going deeper down the rabbit hole than I was willing to go. ;)

- SimpleDateFormat: `W` (week-of-month), `F` (day-of-week-in-month)
- DateTimeFormatter: `W` (week-of-month), `F` (day-of-week-in-month), `n` (nano-of-second), `N` (nano-of-day)

I might implement the nano ones if I get around to doing the math (and probing `window.performance.now()`) but Date objects don't have that level of accuracy anyway.

## License

`moment-javaformat` is freely distributable under the terms of the MIT license.

Copyright (c) 2020-2024 Benjamin Reed.