From a8c3341271d74bf0cf5a55498544b82899d7c4a2 Mon Sep 17 00:00:00 2001 From: Keijo Kapp Date: Wed, 24 Apr 2024 16:32:45 +0300 Subject: [PATCH] Added `exactOptionalPropertyTypes` TS option --- lib/directory.ts | 12 +-- lib/opts.g.ts | 222 +++++++++++++++++++++---------------------- lib/transaction.ts | 24 +++-- lib/transformer.ts | 13 ++- scripts/gentsopts.ts | 2 +- tsconfig.json | 44 +-------- 6 files changed, 144 insertions(+), 173 deletions(-) diff --git a/lib/directory.ts b/lib/directory.ts index eea29e5..92d7465 100644 --- a/lib/directory.ts +++ b/lib/directory.ts @@ -500,16 +500,16 @@ export class Directory = { @@ -56,7 +56,7 @@ export type KVList = { export {Watch} export type WatchOptions = { - throwAllErrors?: boolean + throwAllErrors?: undefined | boolean } // Polyfill for node < 10.0 to make asyncIterators work (getRange / getRangeBatch). @@ -752,8 +752,16 @@ export default class Transaction { const val = await this._tn.get(this._keyEncoding.pack(key), this.isSnapshot) - return val == null ? null - : { + + if (val == null) { + return null; + } + + return val.length <= 10 + ? { + stamp: val + } + : { stamp: val.slice(0, 10), // So this is a bit opinionated - if you call @@ -762,7 +770,7 @@ export default class Transaction 10 ? this._valueEncoding.unpack(val.slice(10)) : undefined + value: this._valueEncoding.unpack(val.slice(10)) } } diff --git a/lib/transformer.ts b/lib/transformer.ts index 4c1368f..43ea244 100644 --- a/lib/transformer.ts +++ b/lib/transformer.ts @@ -5,7 +5,7 @@ import {asBuf, concat2, strInc, startsWith} from './util' import {UnboundStamp} from './versionstamp' export type Transformer = { - name?: string, // For debugging. + name?: undefined | string, // For debugging. // The tuple type supports embedding versionstamps, but the versionstamp // isn't known until the transaction has been committed. @@ -54,11 +54,16 @@ export const prefixTransformer = (prefix: string | Buffer, inner: Trans if (inner.packUnboundVersionstamp) transformer.packUnboundVersionstamp = (val: In): UnboundStamp => { const innerVal = inner.packUnboundVersionstamp!(val) - return { + const unboundStamp: UnboundStamp = { data: concat2(_prefix, innerVal.data), - stampPos: _prefix.length + innerVal.stampPos, - codePos: innerVal.codePos != null ? _prefix.length + innerVal.codePos : undefined, + stampPos: _prefix.length + innerVal.stampPos + }; + + if (innerVal.codePos != null) { + unboundStamp.codePos = _prefix.length + innerVal.codePos; } + + return unboundStamp; } if (inner.bakeVersionstamp) transformer.bakeVersionstamp = inner.bakeVersionstamp.bind(inner) diff --git a/scripts/gentsopts.ts b/scripts/gentsopts.ts index cd772c7..6ad0563 100755 --- a/scripts/gentsopts.ts +++ b/scripts/gentsopts.ts @@ -68,7 +68,7 @@ parseString(xml, (err, result) => { if (name.endsWith('Option')) { line(`export type ${name}s = {`) options.forEach(({name, type, paramDescription, deprecated}) => { - output.write(` ${name}?: ${typeToTs(type)}`) + output.write(` ${name}?: undefined | ${typeToTs(type)}`) if (deprecated) output.write(` ${comment} DEPRECATED`) else if (paramDescription) output.write(` ${comment} ${paramDescription}`) line() diff --git a/tsconfig.json b/tsconfig.json index f91c329..868def2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,55 +6,13 @@ "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "lib": ["esnext"], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist", /* Redirect output structure to the directory. */ - // "rootDir": "./lib", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "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'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "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. */ - // "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. */ - - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ "stripInternal": true, + "exactOptionalPropertyTypes": true } }