node/test/parallel/test-eslint-iterator-result-done-first.js
Trivikram Kamat 92f48f43fe
tools: enforce iterator result property order
Add a custom ESLint rule requiring iterator result objects to place
`done` before `value`, and update existing lib iterator result objects
to follow the rule.

Signed-off-by: Kamat, Trivikram <16024985+trivikr@users.noreply.github.com>
Assisted-by: openai:gpt-5.5
PR-URL: https://github.com/nodejs/node/pull/63526
Reviewed-By: Mattias Buelens <mattias@buelens.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2026-05-26 17:19:42 +00:00

60 lines
2.3 KiB
JavaScript

'use strict';
const common = require('../common');
if ((!common.hasCrypto) || (!common.hasIntl)) {
common.skip('ESLint tests require crypto and Intl');
}
common.skipIfEslintMissing();
const { RuleTester } = require('../../tools/eslint/node_modules/eslint');
const rule = require('../../tools/eslint-rules/iterator-result-done-first');
const message = 'Iterator result objects should place `done` before `value`.';
new RuleTester().run('iterator-result-done-first', rule, {
valid: [
'function next() { return { done: true, value: undefined }; }',
'function next() { return { __proto__: null, done: false, value: chunk }; }',
'function next() { return { done, value }; }',
'function next() { return { value }; }',
'function next() { return { done }; }',
'function next() { return { value: 1, other: 2 }; }',
'function next() { return { [value]: 1, done: true }; }',
'function next() { return { value: 1, [done]: true }; }',
'function next() { return { "done": true, "value": undefined }; }',
'function next() { return { ["done"]: true, ["value"]: undefined }; }',
],
invalid: [
{
code: 'function next() { return { value: undefined, done: true }; }',
errors: [{ message }],
output: 'function next() { return { done: true, value: undefined }; }',
},
{
code: 'function next() { return { __proto__: null, value: chunk, done: false }; }',
errors: [{ message }],
output: 'function next() { return { __proto__: null, done: false, value: chunk }; }',
},
{
code: 'function next() { return { value, done }; }',
errors: [{ message }],
output: 'function next() { return { done, value }; }',
},
{
code: 'function next() { return { "value": undefined, "done": true }; }',
errors: [{ message }],
output: 'function next() { return { "done": true, "value": undefined }; }',
},
{
code: 'function next() { return { ["value"]: undefined, ["done"]: true }; }',
errors: [{ message }],
output: 'function next() { return { ["done"]: true, ["value"]: undefined }; }',
},
{
code: 'function next() { return { value: result, extra: true, done: false }; }',
errors: [{ message }],
output: 'function next() { return { done: false, extra: true, value: result }; }',
},
],
});