Skip to content

Commit ffff530

Browse files
committed
feat(util): unassert
Signed-off-by: Lexus Drumgold <[email protected]>
1 parent 1fb494f commit ffff530

31 files changed

+738
-35
lines changed

.commitlintrc.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const config: UserConfig = {
2121
'scope-enum': [Severity.Error, 'always', scopes([
2222
'chore',
2323
'handlers',
24+
'util',
2425
'visitors'
2526
])]
2627
}

.dictionary.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,6 @@ shfmt
3232
unassert
3333
unstub
3434
vates
35+
vfile
3536
vitest
3637
yarnrc

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
**/node_modules/
1717
**/tsconfig*temp.json
1818
Brewfile
19+
__fixtures__/modules/*.cjs
1920
yarn.lock
2021

2122
# NEGATED PATTERNS

.eslintrc.cjs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,27 @@
1010
*/
1111
const config = {
1212
extends: ['./.eslintrc.base.cjs'],
13-
overrides: [...require('./.eslintrc.base.cjs').overrides],
13+
overrides: [
14+
...require('./.eslintrc.base.cjs').overrides,
15+
{
16+
files: ['__fixtures__/modules/*.mjs'],
17+
rules: {
18+
'@typescript-eslint/no-confusing-void-expression': 0,
19+
'@typescript-eslint/no-unsafe-argument': 0,
20+
'@typescript-eslint/no-unsafe-call': 0,
21+
'@typescript-eslint/no-unsafe-member-access': 0,
22+
'@typescript-eslint/no-unsafe-return': 0,
23+
'@typescript-eslint/require-await': 0,
24+
'@typescript-eslint/restrict-plus-operands': 0,
25+
'@typescript-eslint/restrict-template-expressions': 0,
26+
'@typescript-eslint/strict-boolean-expressions': 0,
27+
'jsdoc/require-file-overview': 0,
28+
'jsdoc/require-jsdoc': 0,
29+
'unicorn/prefer-math-trunc': 0,
30+
'unicorn/prefer-node-protocol': 0
31+
}
32+
}
33+
],
1434
root: true
1535
}
1636

.lintstagedrc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
"src/**/*.ts": [
1010
"vitest run --changed --coverage",
1111
"yarn build",
12-
"bash -c tsc -p tsconfig.build.json"
12+
"bash -c tsc -p tsconfig.json"
1313
]
1414
}

__fixtures__/modules/add.mjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { deprecate, equal, ok } from 'devlop'
2+
3+
function add(a, b) {
4+
ok(typeof a === 'number', 'expected `a` to be a number')
5+
ok(typeof b === 'number', 'expected `b` to be a number')
6+
7+
if (process.env.NODE_ENV !== 'production') {
8+
equal(Number.isNaN(a), false, 'expected `a` not to equal NaN')
9+
equal(Number.isNaN(b), false, 'expected `b` not to equal NaN')
10+
} else {
11+
ok(!Number.isNaN(a), 'expected `a` not to be NaN')
12+
ok(!Number.isNaN(b), 'expected `b` not to be NaN')
13+
}
14+
15+
return a + b
16+
}
17+
18+
export default deprecate(add)

__fixtures__/modules/assert.mjs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function assert(value, message, ...params) {
2+
return void console.assert(value, message, ...params)
3+
}
4+
5+
export default assert
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import {
2+
DOT,
3+
at,
4+
define,
5+
set
6+
} from '@flex-development/tutils'
7+
import { ok, unreachable } from 'devlop'
8+
import { CONTINUE } from 'estree-util-visit'
9+
import { is } from 'unist-util-is'
10+
11+
function CallExpression(node, key, index) {
12+
if (
13+
(
14+
is(node.callee, 'Identifier') &&
15+
this.identifiers.has(node.callee.name)
16+
) ||
17+
(
18+
is(node.callee, 'MemberExpression') &&
19+
is(node.callee.object, 'Identifier') &&
20+
this.identifiers.has(node.callee.object.name)
21+
) ||
22+
(
23+
is(node.callee, 'MemberExpression') &&
24+
is(node.callee.object, 'Identifier') &&
25+
is(node.callee.property, 'Identifier') &&
26+
node.callee.object.name === 'console' &&
27+
node.callee.property.name === 'assert'
28+
)
29+
) {
30+
ok(this.parent, 'expected `parent`')
31+
ok(key, 'expected `key`')
32+
ok(key in this.parent, `expected \`parent.${key}\``)
33+
const zero = { raw: '0', type: 'Literal', value: 0 }
34+
const void0 = {
35+
argument: zero,
36+
operator: 'void',
37+
prefix: true,
38+
type: 'UnaryExpression'
39+
}
40+
switch (this.parent.type) {
41+
case 'ArrayExpression':
42+
case 'CallExpression':
43+
ok(typeof index === 'number', 'expected `index` to be a number')
44+
set(this.parent, key + DOT + index, void0)
45+
break
46+
case 'AssignmentExpression':
47+
if (is(this.grandparent, 'ExpressionStatement')) {
48+
this.trash.add(this.grandparent)
49+
} else {
50+
define(this.parent, key, { value: void0 })
51+
}
52+
break
53+
case 'ArrowFunctionExpression':
54+
case 'AssignmentPattern':
55+
case 'ConditionalExpression':
56+
case 'LogicalExpression':
57+
case 'Property':
58+
define(this.parent, key, { value: void0 })
59+
break
60+
case 'AwaitExpression':
61+
if (is(this.grandparent, 'ExpressionStatement')) {
62+
this.trash.add(this.grandparent)
63+
} else {
64+
define(this.parent, key, { value: void0 })
65+
}
66+
break
67+
case 'ExpressionStatement':
68+
this.trash.add(this.parent)
69+
break
70+
case 'ExportDefaultDeclaration':
71+
define(this.parent, key, { value: at(node.arguments, 0, void0) })
72+
break
73+
case 'ReturnStatement':
74+
case 'YieldExpression':
75+
define(this.parent, key, { value: null })
76+
break
77+
case 'UnaryExpression':
78+
if (is(this.grandparent, 'ExpressionStatement')) {
79+
this.trash.add(this.grandparent)
80+
} else {
81+
define(this.parent, key, {
82+
value: this.parent.operator === 'void' ? zero : void0
83+
})
84+
}
85+
break
86+
default:
87+
console.dir(this.parent, { depth: 10 })
88+
void unreachable(`unexpected parent: ${this.parent.type}`)
89+
}
90+
}
91+
return CONTINUE
92+
}
93+
94+
var call_expression_default = CallExpression
95+
export {
96+
call_expression_default as default
97+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const { ok } = await import('devlop')
2+
const assert = await import('node:assert/strict')
3+
4+
const centuryFromYear = year => {
5+
ok(typeof year === 'number', 'expected `year` to be a number')
6+
assert.notEqual(Number.isNaN(year), true, 'expected `year` not to be NaN')
7+
return Math.ceil(year / 100)
8+
}
9+
10+
export default centuryFromYear

__fixtures__/modules/digitize.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { ok } from 'devlop'
2+
import * as assert from 'node:assert/strict'
3+
4+
function digitize(n) {
5+
ok(typeof n === 'number', 'expected `n` to be a number')
6+
7+
if (process.env.NODE_ENV !== 'production') {
8+
assert.notEqual(Number.isNaN(n), true, 'expected `n` not to be NaN')
9+
} else ok(n >= 0, 'expected `n` to be a non-negative number')
10+
11+
if (n <= 9) return [n]
12+
const digits = []
13+
while (n > 0) digits.push(n % 10 | 0) && (n = n / 10 | 0)
14+
return digits
15+
}
16+
17+
export default digitize

0 commit comments

Comments
 (0)