more optimized lcm based on #11 suggestion
This commit is contained in:
parent
09f12437b0
commit
41c8b15552
|
@ -1,6 +1,7 @@
|
||||||
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
||||||
|
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
|
||||||
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
||||||
[![Node CI](https://github.com/juanelas/bigint-mod-arith/workflows/Node%20CI/badge.svg)](https://github.com/juanelas/bigint-mod-arith/actions?query=workflow%3A%22Node+CI%22)
|
[![Node.js CI](https://github.com/juanelas/bigint-mod-arith/workflows/Node.js%20CI/badge.svg)](https://github.com/juanelas/bigint-mod-arith/actions?query=workflow%3A%22Node.js+CI%22)
|
||||||
[![Coverage Status](https://coveralls.io/repos/github/juanelas/bigint-mod-arith/badge.svg?branch=master)](https://coveralls.io/github/juanelas/bigint-mod-arith?branch=master)
|
[![Coverage Status](https://coveralls.io/repos/github/juanelas/bigint-mod-arith/badge.svg?branch=master)](https://coveralls.io/github/juanelas/bigint-mod-arith?branch=master)
|
||||||
|
|
||||||
# bigint-mod-arith
|
# bigint-mod-arith
|
||||||
|
@ -37,7 +38,7 @@ import * as bigintModArith from 'bigint-mod-arith'
|
||||||
|
|
||||||
The appropriate version for browser or node is automatically exported.
|
The appropriate version for browser or node is automatically exported.
|
||||||
|
|
||||||
You can also download the [IIFE bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/iife.js), the [ESM bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/esm.js) or the [UMD bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/umd.js) and manually add it to your project, or, if you have already imported `bigint-mod-arith` to your project, just get the bundles from `node_modules/bigint-mod-arith/dist/bundles/`.
|
You can also download the [IIFE bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/iife.js), the [ESM bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/esm.min.js) or the [UMD bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bundles/umd.js) and manually add it to your project, or, if you have already imported `bigint-mod-arith` to your project, just get the bundles from `node_modules/bigint-mod-arith/dist/bundles/`.
|
||||||
|
|
||||||
An example of usage could be:
|
An example of usage could be:
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,12 @@ const glob = require('glob')
|
||||||
const processedArgs = processArgs(process.argv.slice(2))
|
const processedArgs = processArgs(process.argv.slice(2))
|
||||||
|
|
||||||
// Now we can run a script and invoke a callback when complete, e.g.
|
// Now we can run a script and invoke a callback when complete, e.g.
|
||||||
runScript(path.join(rootDir, 'node_modules/.bin/mocha'), processArgs(processedArgs))
|
runScript(path.join(rootDir, 'node_modules/mocha/bin/mocha'), processedArgs)
|
||||||
|
|
||||||
function processArgs (args) {
|
function processArgs (args) {
|
||||||
args = process.argv.slice(2).map(arg => {
|
args = process.argv.slice(2).map(arg => {
|
||||||
|
// Let us first remove surrounding quotes in string (it gives issues in windows)
|
||||||
|
arg = arg.replace(/^['"]/, '').replace(/['"]$/, '')
|
||||||
const filenames = glob.sync(arg, { cwd: rootDir, matchBase: true })
|
const filenames = glob.sync(arg, { cwd: rootDir, matchBase: true })
|
||||||
if (filenames.length > 0) {
|
if (filenames.length > 0) {
|
||||||
return filenames.map(file => {
|
return filenames.map(file => {
|
||||||
|
@ -56,7 +58,7 @@ function processArgs (args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function runScript (scriptPath, args) {
|
function runScript (scriptPath, args) {
|
||||||
const mochaCmd = childProcess.fork(path.join(rootDir, 'node_modules/.bin/mocha'), processedArgs, {
|
const mochaCmd = childProcess.fork(scriptPath, args, {
|
||||||
cwd: rootDir
|
cwd: rootDir
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,8 @@ async function typedoc () {
|
||||||
includeVersion: true,
|
includeVersion: true,
|
||||||
entryDocument: 'API.md',
|
entryDocument: 'API.md',
|
||||||
readme: 'none',
|
readme: 'none',
|
||||||
hideBreadcrumbs: true
|
hideBreadcrumbs: true,
|
||||||
|
excludePrivate: true
|
||||||
})
|
})
|
||||||
|
|
||||||
const project = app.convert()
|
const project = app.convert()
|
||||||
|
@ -53,6 +54,16 @@ function getRepositoryData () {
|
||||||
repoName: repodata.slice(2).join('/')
|
repoName: repodata.slice(2).join('/')
|
||||||
}
|
}
|
||||||
} else return null
|
} else return null
|
||||||
|
} else {
|
||||||
|
if (pkgJson.repository.url !== 'undefined') {
|
||||||
|
const regex = /(?:.+?\+)?http[s]?:\/\/(?<repoProvider>[\w._-]+)\.\w{2,3}\/(?<repoUsername>[\w._-]+)\/(?<repoName>[\w._\-/]+?)\.git/
|
||||||
|
const match = pkgJson.repository.url.match(regex)
|
||||||
|
return {
|
||||||
|
repoProvider: match[1],
|
||||||
|
repoUsername: match[2],
|
||||||
|
repoName: match[3]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,14 +84,14 @@ if (repoProvider) {
|
||||||
iifeBundle = `[IIFE bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${iifeBundlePath})`
|
iifeBundle = `[IIFE bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${iifeBundlePath})`
|
||||||
esmBundle = `[ESM bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${esmBundlePath})`
|
esmBundle = `[ESM bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${esmBundlePath})`
|
||||||
umdBundle = `[UMD bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${umdBundlePath})`
|
umdBundle = `[UMD bundle](https://raw.githubusercontent.com/${repoUsername}/${repoName}/master/${umdBundlePath})`
|
||||||
workflowBadget = `[![Node CI](https://github.com/${repoUsername}/${repoName}/workflows/Node%20CI/badge.svg)](https://github.com/${repoUsername}/${repoName}/actions?query=workflow%3A%22Node+CI%22)`
|
workflowBadget = `[![Node.js CI](https://github.com/${repoUsername}/${repoName}/workflows/Node.js%20CI/badge.svg)](https://github.com/${repoUsername}/${repoName}/actions?query=workflow%3A%22Node.js+CI%22)`
|
||||||
coverallsBadge = `[![Coverage Status](https://coveralls.io/repos/github/${repoUsername}/${repoName}/badge.svg?branch=master)](https://coveralls.io/github/${repoUsername}/${repoName}?branch=master)`
|
coverallsBadge = `[![Coverage Status](https://coveralls.io/repos/github/${repoUsername}/${repoName}/badge.svg?branch=master)](https://coveralls.io/github/${repoUsername}/${repoName}?branch=master)`
|
||||||
break
|
break
|
||||||
|
|
||||||
case 'gitlab':
|
case 'gitlab':
|
||||||
iifeBundle = `[IIFE bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/dist/${iifeBundlePath}?inline=false)`
|
iifeBundle = `[IIFE bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/${iifeBundlePath}?inline=false)`
|
||||||
esmBundle = `[ESM bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/dist/${esmBundlePath}?inline=false)`
|
esmBundle = `[ESM bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/${esmBundlePath}?inline=false)`
|
||||||
umdBundle = `[UMD bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/dist/${umdBundlePath}?inline=false)`
|
umdBundle = `[UMD bundle](https://gitlab.com/${repoUsername}/${repoName}/-/raw/master/${umdBundlePath}?inline=false)`
|
||||||
break
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -5,10 +5,12 @@ import replace from '@rollup/plugin-replace'
|
||||||
import { terser } from 'rollup-plugin-terser'
|
import { terser } from 'rollup-plugin-terser'
|
||||||
import typescriptPlugin from '@rollup/plugin-typescript'
|
import typescriptPlugin from '@rollup/plugin-typescript'
|
||||||
import commonjs from '@rollup/plugin-commonjs'
|
import commonjs from '@rollup/plugin-commonjs'
|
||||||
|
import json from '@rollup/plugin-json'
|
||||||
|
|
||||||
import { dirname, join } from 'path'
|
import { join } from 'path'
|
||||||
import { existsSync, moveSync, removeSync } from 'fs-extra'
|
import { existsSync } from 'fs-extra'
|
||||||
import { directories, name as _name, dependencies, peerDependencies, exports, types } from '../package.json'
|
import { directories, name as _name, dependencies, peerDependencies, exports } from '../package.json'
|
||||||
|
import { compile } from './rollup-plugin-dts.js'
|
||||||
|
|
||||||
const rootDir = join(__dirname, '..')
|
const rootDir = join(__dirname, '..')
|
||||||
const dstDir = join(rootDir, directories.dist)
|
const dstDir = join(rootDir, directories.dist)
|
||||||
|
@ -31,7 +33,8 @@ if (existsSync(input) !== true) throw new Error('The entry point should be index
|
||||||
const tsBundleOptions = {
|
const tsBundleOptions = {
|
||||||
tsconfig: join(rootDir, 'tsconfig.json'),
|
tsconfig: join(rootDir, 'tsconfig.json'),
|
||||||
outDir: undefined, // ignore outDir in tsconfig.json
|
outDir: undefined, // ignore outDir in tsconfig.json
|
||||||
exclude: ['test/**/*', 'src/**/*.spec.ts', './build/typings/global-this-pkg.d.ts']
|
include: ['src/ts/**/*', 'build/typings/is-browser.d.ts'],
|
||||||
|
exclude: ['src/**/*.spec.ts']
|
||||||
}
|
}
|
||||||
|
|
||||||
const external = [...Object.keys(dependencies || {}), ...Object.keys(peerDependencies || {})]
|
const external = [...Object.keys(dependencies || {}), ...Object.keys(peerDependencies || {})]
|
||||||
|
@ -41,18 +44,17 @@ const sourcemapOutputOptions = {
|
||||||
sourcemapExcludeSources: true
|
sourcemapExcludeSources: true
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveDirPlugin (srcDir, dstDir) {
|
function compileDts () {
|
||||||
return {
|
return {
|
||||||
name: 'move-dir',
|
name: 'compile-dts',
|
||||||
closeBundle () {
|
closeBundle () {
|
||||||
removeSync(dstDir)
|
compile()
|
||||||
moveSync(srcDir, dstDir, { overwrite: true })
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{ // ESM for browsers
|
{ // ESM for browsers and declarations
|
||||||
input: input,
|
input: input,
|
||||||
output: [
|
output: [
|
||||||
{
|
{
|
||||||
|
@ -66,7 +68,9 @@ export default [
|
||||||
IS_BROWSER: true,
|
IS_BROWSER: true,
|
||||||
preventAssignment: true
|
preventAssignment: true
|
||||||
}),
|
}),
|
||||||
typescriptPlugin(tsBundleOptions)
|
typescriptPlugin(tsBundleOptions),
|
||||||
|
compileDts(),
|
||||||
|
json()
|
||||||
],
|
],
|
||||||
external
|
external
|
||||||
},
|
},
|
||||||
|
@ -76,16 +80,24 @@ export default [
|
||||||
{
|
{
|
||||||
file: join(dstDir, 'bundles/iife.js'),
|
file: join(dstDir, 'bundles/iife.js'),
|
||||||
format: 'iife',
|
format: 'iife',
|
||||||
name: pkgCamelisedName
|
name: pkgCamelisedName,
|
||||||
|
plugins: [terser()]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
file: join(dstDir, 'bundles/esm.js'),
|
file: join(dstDir, 'bundles/esm.js'),
|
||||||
|
...sourcemapOutputOptions,
|
||||||
format: 'es'
|
format: 'es'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
file: join(dstDir, 'bundles/esm.min.js'),
|
||||||
|
format: 'es',
|
||||||
|
plugins: [terser()]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
file: join(dstDir, 'bundles/umd.js'),
|
file: join(dstDir, 'bundles/umd.js'),
|
||||||
format: 'umd',
|
format: 'umd',
|
||||||
name: pkgCamelisedName
|
name: pkgCamelisedName,
|
||||||
|
plugins: [terser()]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
|
@ -96,47 +108,33 @@ export default [
|
||||||
typescriptPlugin(tsBundleOptions),
|
typescriptPlugin(tsBundleOptions),
|
||||||
resolve({
|
resolve({
|
||||||
browser: true,
|
browser: true,
|
||||||
exportConditions: ['browser', 'module', 'import', 'default']
|
exportConditions: ['browser', 'module', 'import', 'default'],
|
||||||
|
mainFields: ['browser', 'module', 'main']
|
||||||
}),
|
}),
|
||||||
terser()
|
commonjs({
|
||||||
|
namedExports: {
|
||||||
|
'bn.js': ['BN'],
|
||||||
|
'hash.js': ['hmac', 'ripemd160', 'sha256', 'sha512'],
|
||||||
|
elliptic: ['ec'],
|
||||||
|
'scrypt-js': ['scrypt', 'syncScrypt']
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
json()
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ // Node ESM with declaration files
|
{ // Node
|
||||||
input: input,
|
|
||||||
output: {
|
|
||||||
file: join(rootDir, exports['.'].node.import),
|
|
||||||
...sourcemapOutputOptions,
|
|
||||||
format: 'es'
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
replace({
|
|
||||||
IS_BROWSER: false,
|
|
||||||
preventAssignment: true
|
|
||||||
}),
|
|
||||||
typescriptPlugin({
|
|
||||||
...tsBundleOptions,
|
|
||||||
// outDir: path.join(rootDir, path.dirname(pkgJson.exports['.'].node.import)),
|
|
||||||
declaration: true,
|
|
||||||
declarationDir: 'types',
|
|
||||||
declarationMap: true
|
|
||||||
}),
|
|
||||||
commonjs({ extensions: ['.js', '.cjs', '.ts'] }), // the ".ts" extension is required
|
|
||||||
moveDirPlugin(join(rootDir, dirname(exports['.'].node.import), 'types'), join(rootDir, dirname(types)))
|
|
||||||
],
|
|
||||||
external
|
|
||||||
},
|
|
||||||
{ // Node CJS
|
|
||||||
input: input,
|
input: input,
|
||||||
output: [
|
output: [
|
||||||
{
|
{
|
||||||
file: join(rootDir, exports['.'].node.require),
|
file: join(rootDir, exports['.'].node.require),
|
||||||
...sourcemapOutputOptions,
|
...sourcemapOutputOptions,
|
||||||
format: 'cjs'
|
format: 'cjs',
|
||||||
|
exports: 'auto'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
file: join(rootDir, exports['.'].node.require).slice(0, -4) + '.js', // .js extension instead of .cjs for Node 10 support
|
file: join(rootDir, exports['.'].node.import),
|
||||||
...sourcemapOutputOptions,
|
...sourcemapOutputOptions,
|
||||||
format: 'cjs'
|
format: 'es'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
|
@ -145,7 +143,9 @@ export default [
|
||||||
preventAssignment: true
|
preventAssignment: true
|
||||||
}),
|
}),
|
||||||
typescriptPlugin(tsBundleOptions),
|
typescriptPlugin(tsBundleOptions),
|
||||||
commonjs({ extensions: ['.js', '.cjs', '.ts'] }) // the ".ts" extension is required
|
commonjs({ extensions: ['.js', '.cjs', '.ts', '.jsx', '.cjsx', '.tsx'] }), // the ".ts" extension is required
|
||||||
]
|
json()
|
||||||
|
],
|
||||||
|
external
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
const puppeteer = require('puppeteer')
|
const puppeteer = require('puppeteer')
|
||||||
|
|
||||||
const browserTests = async ({ logWarnings = false, serverPort = 38000, keepServerRunning = false, puppeteerOptions = {} }) => {
|
const browserTests = async (
|
||||||
|
{
|
||||||
|
logWarnings = false,
|
||||||
|
serverPort = 38000,
|
||||||
|
keepServerRunning = false,
|
||||||
|
puppeteerOptions = {
|
||||||
|
headless: false,
|
||||||
|
devtools: true
|
||||||
|
}
|
||||||
|
}) => {
|
||||||
const server = require('./server.js').server
|
const server = require('./server.js').server
|
||||||
await server.init()
|
await server.init()
|
||||||
await server.listen(serverPort)
|
await server.listen(serverPort)
|
||||||
const browser = await puppeteer.launch(puppeteerOptions)
|
const browser = await puppeteer.launch(puppeteerOptions)
|
||||||
const page = await browser.newPage()
|
const page = (await browser.pages())[0]
|
||||||
page.on('console', function (message) {
|
page.on('console', function (message) {
|
||||||
let ignore = message.type() === 'warning' && !logWarnings
|
let ignore = message.type() === 'warning' && !logWarnings
|
||||||
if (message.type() === 'error' && message.location()) {
|
if (message.type() === 'error' && message.location()) {
|
||||||
|
@ -39,28 +48,50 @@ const browserTests = async ({ logWarnings = false, serverPort = 38000, keepServe
|
||||||
}
|
}
|
||||||
console[consoleType](text, ...args)
|
console[consoleType](text, ...args)
|
||||||
})
|
})
|
||||||
|
|
||||||
page.on('error', function (err) { page.emit(new Error(err)) })
|
page.on('error', function (err) { page.emit(new Error(err)) })
|
||||||
|
|
||||||
await page.goto('http://localhost:38000/')
|
page.on('close', async () => {
|
||||||
const watchDog = page.waitForFunction('_mocha.state === \'stopped\'', { timeout: 0 })
|
await close()
|
||||||
await watchDog
|
})
|
||||||
|
|
||||||
if (keepServerRunning === false) {
|
page.goto('http://localhost:38000/').then(async () => {
|
||||||
await page.close()
|
const watchDog = page.waitForFunction('_mocha.state === \'stopped\'', { timeout: 0 })
|
||||||
await browser.close()
|
await watchDog.catch(async (reason) => {
|
||||||
await server.close()
|
console.error(reason)
|
||||||
|
})
|
||||||
|
if (puppeteerOptions.headless === true) {
|
||||||
|
await close()
|
||||||
|
}
|
||||||
|
}).catch(async (reason) => {
|
||||||
|
console.error(reason)
|
||||||
|
})
|
||||||
|
|
||||||
|
async function close () {
|
||||||
|
console.log('Closing browser tests...')
|
||||||
|
await browser.close().catch(() => {})
|
||||||
|
if (keepServerRunning !== true) {
|
||||||
|
await server.close().catch(() => {})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const opts = {
|
const opts = {
|
||||||
// puppeteer options
|
// puppeteer options
|
||||||
puppeteerOptions: {
|
puppeteerOptions: {
|
||||||
headless: true
|
headless: false,
|
||||||
|
devtools: true
|
||||||
// slowMo: 100,
|
// slowMo: 100,
|
||||||
// timeout: 10000
|
// timeout: 10000
|
||||||
},
|
},
|
||||||
doNotLogWarnings: true,
|
logWarnings: false, // log warnings in Node console (usually not needed)
|
||||||
keepServerRunning: false, // keep server running until manually closed with ctrl-c. In combination with puppeteerOptions.headless (or just connecting any browser to the test page) allows debugging in browser
|
keepServerRunning: false, // keep server running until manually closed with ctrl-c. In combination with puppeteerOptions.headless (or just connecting any browser to the test page) allows debugging in browser
|
||||||
serverPort: 38000
|
serverPort: 38000
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const args = process.argv.slice(2)
|
||||||
|
if (args[0] === 'headless') {
|
||||||
|
opts.puppeteerOptions.headless = true
|
||||||
|
}
|
||||||
|
|
||||||
browserTests(opts)
|
browserTests(opts)
|
||||||
|
|
|
@ -9,8 +9,9 @@ const rollup = require('rollup')
|
||||||
const resolve = require('@rollup/plugin-node-resolve').nodeResolve
|
const resolve = require('@rollup/plugin-node-resolve').nodeResolve
|
||||||
const replace = require('@rollup/plugin-replace')
|
const replace = require('@rollup/plugin-replace')
|
||||||
const multi = require('@rollup/plugin-multi-entry')
|
const multi = require('@rollup/plugin-multi-entry')
|
||||||
const typescript = require('@rollup/plugin-typescript')
|
const typescriptPlugin = require('@rollup/plugin-typescript')
|
||||||
const commonjs = require('@rollup/plugin-commonjs')
|
const commonjs = require('@rollup/plugin-commonjs')
|
||||||
|
const json = require('@rollup/plugin-json')
|
||||||
|
|
||||||
const rootDir = path.join(__dirname, '..', '..', '..')
|
const rootDir = path.join(__dirname, '..', '..', '..')
|
||||||
|
|
||||||
|
@ -41,11 +42,18 @@ const indexHtml = `<!DOCTYPE html>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import * as _pkg from './${name}.esm.js'
|
import * as _pkg from './${name}.esm.js'
|
||||||
self._pkg = _pkg
|
self._pkg = _pkg
|
||||||
|
</script>
|
||||||
|
<script type="module">
|
||||||
import './tests.js'
|
import './tests.js'
|
||||||
window._mocha = mocha.run()
|
window._mocha = mocha.run()
|
||||||
</script>
|
</script>
|
||||||
</html>`
|
</html>`
|
||||||
|
|
||||||
|
const tsBundleOptions = {
|
||||||
|
tsconfig: path.join(rootDir, 'tsconfig.json'),
|
||||||
|
outDir: undefined // ignore outDir in tsconfig.json
|
||||||
|
}
|
||||||
|
|
||||||
async function buildTests () {
|
async function buildTests () {
|
||||||
// create a bundle
|
// create a bundle
|
||||||
const inputOptions = {
|
const inputOptions = {
|
||||||
|
@ -56,12 +64,13 @@ async function buildTests () {
|
||||||
IS_BROWSER: true,
|
IS_BROWSER: true,
|
||||||
preventAssignment: true
|
preventAssignment: true
|
||||||
}),
|
}),
|
||||||
typescript(),
|
typescriptPlugin(tsBundleOptions),
|
||||||
resolve({
|
resolve({
|
||||||
browser: true,
|
browser: true,
|
||||||
exportConditions: ['browser', 'module', 'import', 'default']
|
exportConditions: ['browser', 'module', 'import', 'default']
|
||||||
}),
|
}),
|
||||||
commonjs()
|
commonjs(),
|
||||||
|
json()
|
||||||
],
|
],
|
||||||
external: [pkgJson.name]
|
external: [pkgJson.name]
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ module.exports = class RollupBuilder extends Builder {
|
||||||
: bundle.output[0].file
|
: bundle.output[0].file
|
||||||
return file === path.join(rootDir, pkgJson.main)
|
return file === path.join(rootDir, pkgJson.main)
|
||||||
})[0]
|
})[0]
|
||||||
|
delete rollupOptions.output.pop() // remove the second output
|
||||||
|
|
||||||
this.builder = new RollupBundler(rollupOptions, this.watch)
|
this.builder = new RollupBundler(rollupOptions, this.watch)
|
||||||
|
|
||||||
|
|
|
@ -24,17 +24,36 @@ module.exports = class TestsBuilder extends Builder {
|
||||||
|
|
||||||
this.tempDir = tempDir
|
this.tempDir = tempDir
|
||||||
|
|
||||||
const readFileAndMangle = (path) => { // We need to change the include or file in the original file to only compile the tests
|
const tsConfig = JSON5.parse(fs.readFileSync(configPath, 'utf8'))
|
||||||
const fileStr = fs.readFileSync(path, 'utf8')
|
|
||||||
const config = JSON5.parse(fileStr)
|
|
||||||
if (config.file) delete config.file
|
|
||||||
config.include.push('node_modules/**/*.d.ts')
|
|
||||||
config.compilerOptions.module = 'commonjs'
|
|
||||||
return JSON.stringify(config)
|
|
||||||
}
|
|
||||||
const configFile = ts.readJsonConfigFile(configPath, readFileAndMangle)
|
|
||||||
|
|
||||||
const parsedTsConfig = ts.parseJsonSourceFileConfigFileContent(configFile, ts.sys, path.dirname(configPath))
|
tsConfig.file = undefined
|
||||||
|
|
||||||
|
// Exclude already transpiled files in src
|
||||||
|
tsConfig.exclude = ['src/ts/**/!(*.spec).ts']
|
||||||
|
|
||||||
|
// "noResolve": true
|
||||||
|
tsConfig.compilerOptions.noResolve = false
|
||||||
|
|
||||||
|
// we don't need declaration files
|
||||||
|
tsConfig.compilerOptions.declaration = false
|
||||||
|
|
||||||
|
// we need to emit files
|
||||||
|
tsConfig.compilerOptions.noEmit = false
|
||||||
|
|
||||||
|
// source mapping eases debuging
|
||||||
|
tsConfig.compilerOptions.sourceMap = true
|
||||||
|
|
||||||
|
// This prevents SyntaxError: Cannot use import statement outside a module
|
||||||
|
tsConfig.compilerOptions.module = 'commonjs'
|
||||||
|
|
||||||
|
// Removed typeroots (it causes issues)
|
||||||
|
tsConfig.compilerOptions.typeRoots = undefined
|
||||||
|
|
||||||
|
tsConfig.compilerOptions.outDir = path.isAbsolute(tempDir) ? path.relative(rootDir, tempDir) : tempDir
|
||||||
|
|
||||||
|
this.tempTsConfigPath = path.join(rootDir, '.tsconfig.json')
|
||||||
|
|
||||||
|
fs.writeFileSync(this.tempTsConfigPath, JSON.stringify(tsConfig, undefined, 2))
|
||||||
|
|
||||||
const createProgram = ts.createSemanticDiagnosticsBuilderProgram
|
const createProgram = ts.createSemanticDiagnosticsBuilderProgram
|
||||||
|
|
||||||
|
@ -64,15 +83,8 @@ module.exports = class TestsBuilder extends Builder {
|
||||||
// Note that there is another overload for `createWatchCompilerHost` that takes
|
// Note that there is another overload for `createWatchCompilerHost` that takes
|
||||||
// a set of root files.
|
// a set of root files.
|
||||||
this.host = ts.createWatchCompilerHost(
|
this.host = ts.createWatchCompilerHost(
|
||||||
parsedTsConfig.fileNames,
|
this.tempTsConfigPath,
|
||||||
{
|
{},
|
||||||
...parsedTsConfig.options,
|
|
||||||
rootDir,
|
|
||||||
outDir: this.tempDir,
|
|
||||||
noEmit: false,
|
|
||||||
noResolve: true,
|
|
||||||
sourceMap: true
|
|
||||||
},
|
|
||||||
ts.sys,
|
ts.sys,
|
||||||
createProgram,
|
createProgram,
|
||||||
reportDiagnostic,
|
reportDiagnostic,
|
||||||
|
@ -91,5 +103,6 @@ module.exports = class TestsBuilder extends Builder {
|
||||||
async close () {
|
async close () {
|
||||||
await super.close()
|
await super.close()
|
||||||
this.watcher.close()
|
this.watcher.close()
|
||||||
|
fs.unlinkSync(this.tempTsConfigPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@ const TestsBuilder = require('./builders/TestsBuilder.js')
|
||||||
const rootDir = path.join(__dirname, '../../../')
|
const rootDir = path.join(__dirname, '../../../')
|
||||||
|
|
||||||
global.chai = chai
|
global.chai = chai
|
||||||
|
loadPkgToGlobal()
|
||||||
|
|
||||||
|
global.IS_BROWSER = false
|
||||||
|
|
||||||
const watch = process.argv.includes('--watch') || process.argv.includes('-w')
|
const watch = process.argv.includes('--watch') || process.argv.includes('-w')
|
||||||
|
|
||||||
|
@ -31,7 +34,7 @@ exports.mochaHooks = {
|
||||||
|
|
||||||
// Just in case our module had been modified. Reload it when the tests are repeated (for mocha watch mode).
|
// Just in case our module had been modified. Reload it when the tests are repeated (for mocha watch mode).
|
||||||
delete require.cache[require.resolve(rootDir)]
|
delete require.cache[require.resolve(rootDir)]
|
||||||
global._pkg = require(rootDir)
|
loadPkgToGlobal()
|
||||||
|
|
||||||
// And now reset any other transpiled module (just delete the cache so it is fully reloaded)
|
// And now reset any other transpiled module (just delete the cache so it is fully reloaded)
|
||||||
for (const key in require.cache) {
|
for (const key in require.cache) {
|
||||||
|
@ -58,3 +61,14 @@ exports.mochaGlobalTeardown = async function () {
|
||||||
// about files being deleted
|
// about files being deleted
|
||||||
rimraf.sync(tempDir, { disableGlob: true })
|
rimraf.sync(tempDir, { disableGlob: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadPkgToGlobal () {
|
||||||
|
const _pkg = require(rootDir)
|
||||||
|
if (typeof _pkg === 'function') { // If it is just a default export, load it as named (for compatibility)
|
||||||
|
global._pkg = {
|
||||||
|
default: _pkg
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
global._pkg = _pkg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
import * as _pkgModule from '../..'
|
import * as _pkgModule from '../../src/ts/index'
|
||||||
|
|
||||||
declare global {
|
export as namespace _pkg
|
||||||
const _pkg: typeof _pkgModule
|
|
||||||
}
|
|
||||||
export as namespace _pkgTypes
|
|
||||||
export = _pkgModule
|
export = _pkgModule
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
var bigintModArith=function(n){"use strict";function t(n){return n>=0?n:-n}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let r=0n,e=1n,o=1n,i=0n;for(;0n!==n;){const u=t/n,f=t%n,g=r-o*u,b=e-i*u;t=n,n=f,r=o,e=i,o=g,i=b}return{g:t,x:r,y:e}}function e(n,r){let e="number"==typeof n?BigInt(t(n)):t(n),o="number"==typeof r?BigInt(t(r)):t(r);if(0n===e)return o;if(0n===o)return e;let i=0n;for(;0n===(1n&(e|o));)e>>=1n,o>>=1n,i++;for(;0n===(1n&e);)e>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(e>o){const n=e;e=o,o=n}o-=e}while(0n!==o);return e<<i}function o(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const r=n%t;return r<0n?r+t:r}function i(n,t){const e=r(o(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return o(e.x,t)}return n.abs=t,n.bitLength=function(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t},n.eGcd=r,n.gcd=e,n.lcm=function(n,r){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof r&&(r=BigInt(r)),0n===n&&0n===r?BigInt(0):t(n*r)/e(n,r)},n.max=function(n,t){return n>=t?n:t},n.min=function(n,t){return n>=t?t:n},n.modInv=i,n.modPow=function n(r,e,u){if("number"==typeof r&&(r=BigInt(r)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof u&&(u=BigInt(u)),u<=0n)throw new RangeError("n must be > 0");if(1n===u)return 0n;if(r=o(r,u),e<0n)return i(n(r,t(e),u),u);let f=1n;for(;e>0;)e%2n===1n&&(f=f*r%u),e/=2n,r=r**2n%u;return f},n.toZn=o,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
|
var bigintModArith=function(n){"use strict";function t(n){return n>=0?n:-n}function r(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),n<=0n||t<=0n)throw new RangeError("a and b MUST be > 0");let r=0n,e=1n,o=1n,i=0n;for(;0n!==n;){const u=t/n,f=t%n,g=r-o*u,b=e-i*u;t=n,n=f,r=o,e=i,o=g,i=b}return{g:t,x:r,y:e}}function e(n,r){let e="number"==typeof n?BigInt(t(n)):t(n),o="number"==typeof r?BigInt(t(r)):t(r);if(0n===e)return o;if(0n===o)return e;let i=0n;for(;0n===(1n&(e|o));)e>>=1n,o>>=1n,i++;for(;0n===(1n&e);)e>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(e>o){const n=e;e=o,o=n}o-=e}while(0n!==o);return e<<i}function o(n,t){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),t<=0n)throw new RangeError("n must be > 0");const r=n%t;return r<0n?r+t:r}function i(n,t){const e=r(o(n,t),t);if(1n!==e.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${t.toString()}`);return o(e.x,t)}return n.abs=t,n.bitLength=function(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let t=1;do{t++}while((n>>=1n)>1n);return t},n.eGcd=r,n.gcd=e,n.lcm=function(n,r){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof r&&(r=BigInt(r)),0n===n&&0n===r?BigInt(0):t(n/e(n,r)*r)},n.max=function(n,t){return n>=t?n:t},n.min=function(n,t){return n>=t?t:n},n.modInv=i,n.modPow=function n(r,e,u){if("number"==typeof r&&(r=BigInt(r)),"number"==typeof e&&(e=BigInt(e)),"number"==typeof u&&(u=BigInt(u)),u<=0n)throw new RangeError("n must be > 0");if(1n===u)return 0n;if(r=o(r,u),e<0n)return i(n(r,t(e),u),u);let f=1n;for(;e>0;)e%2n===1n&&(f=f*r%u),e/=2n,r=r**2n%u;return f},n.toZn=o,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self).bigintModArith={})}(this,(function(n){"use strict";function e(n){return n>=0?n:-n}function t(n,e){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),n<=0n||e<=0n)throw new RangeError("a and b MUST be > 0");let t=0n,r=1n,o=1n,i=0n;for(;0n!==n;){const f=e/n,u=e%n,g=t-o*f,b=r-i*f;e=n,n=u,t=o,r=i,o=g,i=b}return{g:e,x:t,y:r}}function r(n,t){let r="number"==typeof n?BigInt(e(n)):e(n),o="number"==typeof t?BigInt(e(t)):e(t);if(0n===r)return o;if(0n===o)return r;let i=0n;for(;0n===(1n&(r|o));)r>>=1n,o>>=1n,i++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(r>o){const n=r;r=o,o=n}o-=r}while(0n!==o);return r<<i}function o(n,e){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),e<=0n)throw new RangeError("n must be > 0");const t=n%e;return t<0n?t+e:t}function i(n,e){const r=t(o(n,e),e);if(1n!==r.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${e.toString()}`);return o(r.x,e)}n.abs=e,n.bitLength=function(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let e=1;do{e++}while((n>>=1n)>1n);return e},n.eGcd=t,n.gcd=r,n.lcm=function(n,t){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),0n===n&&0n===t?BigInt(0):e(n*t)/r(n,t)},n.max=function(n,e){return n>=e?n:e},n.min=function(n,e){return n>=e?e:n},n.modInv=i,n.modPow=function n(t,r,f){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof r&&(r=BigInt(r)),"number"==typeof f&&(f=BigInt(f)),f<=0n)throw new RangeError("n must be > 0");if(1n===f)return 0n;if(t=o(t,f),r<0n)return i(n(t,e(r),f),f);let u=1n;for(;r>0;)r%2n===1n&&(u=u*t%f),r/=2n,t=t**2n%f;return u},n.toZn=o,Object.defineProperty(n,"__esModule",{value:!0})}));
|
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self).bigintModArith={})}(this,(function(n){"use strict";function e(n){return n>=0?n:-n}function t(n,e){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),n<=0n||e<=0n)throw new RangeError("a and b MUST be > 0");let t=0n,r=1n,o=1n,i=0n;for(;0n!==n;){const f=e/n,u=e%n,g=t-o*f,b=r-i*f;e=n,n=u,t=o,r=i,o=g,i=b}return{g:e,x:t,y:r}}function r(n,t){let r="number"==typeof n?BigInt(e(n)):e(n),o="number"==typeof t?BigInt(e(t)):e(t);if(0n===r)return o;if(0n===o)return r;let i=0n;for(;0n===(1n&(r|o));)r>>=1n,o>>=1n,i++;for(;0n===(1n&r);)r>>=1n;do{for(;0n===(1n&o);)o>>=1n;if(r>o){const n=r;r=o,o=n}o-=r}while(0n!==o);return r<<i}function o(n,e){if("number"==typeof n&&(n=BigInt(n)),"number"==typeof e&&(e=BigInt(e)),e<=0n)throw new RangeError("n must be > 0");const t=n%e;return t<0n?t+e:t}function i(n,e){const r=t(o(n,e),e);if(1n!==r.g)throw new RangeError(`${n.toString()} does not have inverse modulo ${e.toString()}`);return o(r.x,e)}n.abs=e,n.bitLength=function(n){if("number"==typeof n&&(n=BigInt(n)),1n===n)return 1;let e=1;do{e++}while((n>>=1n)>1n);return e},n.eGcd=t,n.gcd=r,n.lcm=function(n,t){return"number"==typeof n&&(n=BigInt(n)),"number"==typeof t&&(t=BigInt(t)),0n===n&&0n===t?BigInt(0):e(n/r(n,t)*t)},n.max=function(n,e){return n>=e?n:e},n.min=function(n,e){return n>=e?e:n},n.modInv=i,n.modPow=function n(t,r,f){if("number"==typeof t&&(t=BigInt(t)),"number"==typeof r&&(r=BigInt(r)),"number"==typeof f&&(f=BigInt(f)),f<=0n)throw new RangeError("n must be > 0");if(1n===f)return 0n;if(t=o(t,f),r<0n)return i(n(t,e(r),f),f);let u=1n;for(;r>0;)r%2n===1n&&(u=u*t%f),r/=2n,t=t**2n%f;return u},n.toZn=o,Object.defineProperty(n,"__esModule",{value:!0})}));
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
20
docs/API.md
20
docs/API.md
|
@ -43,7 +43,7 @@ The absolute value of a
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[abs.ts:8](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/abs.ts#L8)
|
[abs.ts:8](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/abs.ts#L8)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ The bit length
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[bitLength.ts:7](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/bitLength.ts#L7)
|
[bitLength.ts:7](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/bitLength.ts#L7)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[egcd.ts:18](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/egcd.ts#L18)
|
[egcd.ts:18](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/egcd.ts#L18)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ The greatest common divisor of a and b
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[gcd.ts:10](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/gcd.ts#L10)
|
[gcd.ts:10](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/gcd.ts#L10)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ The least common multiple of a and b
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[lcm.ts:10](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/lcm.ts#L10)
|
[lcm.ts:10](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/lcm.ts#L10)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ Maximum of numbers a and b
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[max.ts:9](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/max.ts#L9)
|
[max.ts:9](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/max.ts#L9)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ Minimum of numbers a and b
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[min.ts:9](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/min.ts#L9)
|
[min.ts:9](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/min.ts#L9)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ The inverse modulo n
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[modInv.ts:14](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/modInv.ts#L14)
|
[modInv.ts:14](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/modInv.ts#L14)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ b**e mod n
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[modPow.ts:16](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/modPow.ts#L16)
|
[modPow.ts:16](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/modPow.ts#L16)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -284,4 +284,4 @@ A bigint with the smallest positive representation of a modulo n
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[toZn.ts:15](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/toZn.ts#L15)
|
[toZn.ts:15](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/toZn.ts#L15)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[egcd.ts:2](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/egcd.ts#L2)
|
[egcd.ts:2](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/egcd.ts#L2)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ ___
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[egcd.ts:3](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/egcd.ts#L3)
|
[egcd.ts:3](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/egcd.ts#L3)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
@ -36,4 +36,4 @@ ___
|
||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[egcd.ts:4](https://github.com/juanelas/bigint-mod-arith/blob/5b2686b/src/ts/egcd.ts#L4)
|
[egcd.ts:4](https://github.com/juanelas/bigint-mod-arith/blob/09f1243/src/ts/egcd.ts#L4)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
42
package.json
42
package.json
|
@ -35,7 +35,7 @@
|
||||||
},
|
},
|
||||||
"default": "./dist/esm/index.browser.js"
|
"default": "./dist/esm/index.browser.js"
|
||||||
},
|
},
|
||||||
"./esm-browser-bundle": "./dist/bundles/esm.js",
|
"./esm-browser-bundle": "./dist/bundles/esm.min.js",
|
||||||
"./iife-browser-bundle": "./dist/bundles/iife.js",
|
"./iife-browser-bundle": "./dist/bundles/iife.js",
|
||||||
"./umd-browser-bundle": "./dist/bundles/umd.js",
|
"./umd-browser-bundle": "./dist/bundles/umd.js",
|
||||||
"./types": "./types/index.d.ts"
|
"./types": "./types/index.d.ts"
|
||||||
|
@ -48,18 +48,19 @@
|
||||||
"test": "./test"
|
"test": "./test"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "run-s lint build:js docs test:browser coverage",
|
"build": "run-s lint build:js docs",
|
||||||
"build:js": "rollup -c build/rollup.config.js",
|
"build:js": "rollup -c build/rollup.config.js",
|
||||||
"clean": "rimraf .nyc_output .mocha-ts coverage dist docs",
|
"clean": "rimraf .nyc_output .mocha-ts coverage dist types docs",
|
||||||
"coverage": "nyc --check-coverage --exclude build --exclude '{src/ts/**/*.spec.ts,test/**/*.ts}' --reporter=text --reporter=lcov node ./build/bin/mocha-ts.js --require build/testing/mocha/mocha-init.js '{src/ts/**/*.spec.ts,test/**/*.ts}'",
|
"coverage": "nyc --check-coverage --exclude build --exclude '{src/ts/**/*.spec.ts,test/**/*.ts,.mocha-ts/**/*}' --reporter=text --reporter=lcov node ./build/bin/mocha-ts.js --require build/testing/mocha/mocha-init.js '{src/ts/**/*.spec.ts,test/**/*.ts}'",
|
||||||
"docs": "node build/build.docs.js",
|
"docs": "node build/build.docs.js",
|
||||||
"git:add": "git add -A",
|
"git:add": "git add -A",
|
||||||
"lint": "ts-standard --fix",
|
"lint": "ts-standard --fix",
|
||||||
"mocha": "node ./build/bin/mocha-ts.js --require build/testing/mocha/mocha-init.js ",
|
"mocha": "node ./build/bin/mocha-ts.js --require build/testing/mocha/mocha-init.js ",
|
||||||
"version": "run-s build git:add",
|
"version": "run-s build test:browser-headless coverage git:add",
|
||||||
"postversion": "git push --follow-tags",
|
"postversion": "git push --follow-tags",
|
||||||
"test": "run-s test:browser test:node",
|
"test": "run-s test:browser-headless test:node",
|
||||||
"test:browser": "node build/testing/browser/index.js",
|
"test:browser": "node build/testing/browser/index.js",
|
||||||
|
"test:browser-headless": "node build/testing/browser/index.js headless",
|
||||||
"test:node": "npm run mocha -- '{src/ts/**/*.spec.ts,test/**/*.ts}'",
|
"test:node": "npm run mocha -- '{src/ts/**/*.spec.ts,test/**/*.ts}'",
|
||||||
"watch": "npm run mocha -- --watch '{src/ts/**/*.spec.ts,test/**/*.ts}'"
|
"watch": "npm run mocha -- --watch '{src/ts/**/*.spec.ts,test/**/*.ts}'"
|
||||||
},
|
},
|
||||||
|
@ -76,34 +77,37 @@
|
||||||
],
|
],
|
||||||
"project": "./tsconfig.json",
|
"project": "./tsconfig.json",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"dist/**/*"
|
"dist/**/*",
|
||||||
|
"types/**/*",
|
||||||
|
"build/testing/types/**/*"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-commonjs": "^20.0.0",
|
"@rollup/plugin-commonjs": "^21.0.0",
|
||||||
|
"@rollup/plugin-json": "^4.1.0",
|
||||||
"@rollup/plugin-multi-entry": "^4.0.0",
|
"@rollup/plugin-multi-entry": "^4.0.0",
|
||||||
"@rollup/plugin-node-resolve": "^13.0.4",
|
"@rollup/plugin-node-resolve": "^13.0.5",
|
||||||
"@rollup/plugin-replace": "^3.0.0",
|
"@rollup/plugin-replace": "^3.0.0",
|
||||||
"@rollup/plugin-typescript": "^8.2.0",
|
"@rollup/plugin-typescript": "^8.2.0",
|
||||||
"@types/chai": "^4.2.14",
|
"@types/chai": "^4.2.22",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^9.0.0",
|
||||||
"chai": "^4.3.3",
|
"chai": "^4.3.3",
|
||||||
"fs-extra": "^10.0.0",
|
"fs-extra": "^10.0.0",
|
||||||
"glob": "^7.1.6",
|
"glob": "^7.2.0",
|
||||||
"json5": "^2.2.0",
|
"json5": "^2.2.0",
|
||||||
"minimatch": "^3.0.4",
|
"minimatch": "^3.0.4",
|
||||||
"mocha": "^9.0.3",
|
"mocha": "^9.1.1",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"nyc": "^15.1.0",
|
"nyc": "^15.1.0",
|
||||||
"pirates": "^4.0.1",
|
"pirates": "^4.0.1",
|
||||||
"puppeteer": "^10.1.0",
|
"puppeteer": "^12.0.1",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"rollup": "^2.40.0",
|
"rollup": "^2.57.0",
|
||||||
"rollup-plugin-terser": "^7.0.2",
|
"rollup-plugin-terser": "^7.0.2",
|
||||||
"ts-standard": "^10.0.0",
|
"ts-standard": "^11.0.0",
|
||||||
"tslib": "^2.1.0",
|
"tslib": "^2.3.1",
|
||||||
"typedoc": "^0.21.5",
|
"typedoc": "^0.22.0",
|
||||||
"typedoc-plugin-markdown": "^3.6.0",
|
"typedoc-plugin-markdown": "^3.11.0",
|
||||||
"typescript": "^4.2.2"
|
"typescript": "^4.4.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
|
||||||
|
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)
|
||||||
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
||||||
{{GITHUB_ACTIONS_BADGES}}
|
{{GITHUB_ACTIONS_BADGES}}
|
||||||
|
|
||||||
|
|
|
@ -12,5 +12,6 @@ export function lcm (a: number|bigint, b: number|bigint): bigint {
|
||||||
if (typeof b === 'number') b = BigInt(b)
|
if (typeof b === 'number') b = BigInt(b)
|
||||||
|
|
||||||
if (a === 0n && b === 0n) return BigInt(0)
|
if (a === 0n && b === 0n) return BigInt(0)
|
||||||
return abs(a * b) as bigint / gcd(a, b)
|
// return abs(a * b) as bigint / gcd(a, b)
|
||||||
|
return abs((a / gcd(a, b)) * b) as bigint
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,8 @@ describe('bitLength', function () {
|
||||||
bitLength: 2
|
bitLength: 2
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: BigInt(11592217955149597331),
|
value: BigInt('11592217955149597331'),
|
||||||
abs: BigInt(11592217955149597331),
|
abs: BigInt('11592217955149597331'),
|
||||||
bitLength: 64
|
bitLength: 64
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -21,12 +21,12 @@
|
||||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
"typeRoots": [ "./build/typings", "./node_modules/@types" ], /* List of folders to include type definitions from. */
|
"typeRoots": [ "node_modules/@types", "build/typings" ], /* List of folders to include type definitions from. */
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
"allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
|
||||||
/* Experimental Options */
|
/* Experimental Options */
|
||||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||||
|
@ -34,7 +34,8 @@
|
||||||
|
|
||||||
/* Advanced Options */
|
/* Advanced Options */
|
||||||
"skipLibCheck": true, /* Skip type checking of declaration files. */
|
"skipLibCheck": true, /* Skip type checking of declaration files. */
|
||||||
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
|
"forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
|
||||||
|
"resolveJsonModule": true
|
||||||
},
|
},
|
||||||
"include": ["src/ts/**/*", "build/typings/**/*", "test/**/*"]
|
"include": ["src/ts/**/*", "test/**/*", "build/typings/**/*.d.ts"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"lcm.d.ts","sourceRoot":"","sources":["../src/ts/lcm.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAE,CAAC,EAAE,MAAM,GAAC,MAAM,EAAE,CAAC,EAAE,MAAM,GAAC,MAAM,GAAG,MAAM,CAM/D"}
|
{"version":3,"file":"lcm.d.ts","sourceRoot":"","sources":["../src/ts/lcm.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAE,CAAC,EAAE,MAAM,GAAC,MAAM,EAAE,CAAC,EAAE,MAAM,GAAC,MAAM,GAAG,MAAM,CAO/D"}
|
Loading…
Reference in New Issue