Skip to content

Commit

Permalink
Merge pull request #202 from desktop/misc-cleanup
Browse files Browse the repository at this point in the history
Misc cleanup
  • Loading branch information
niik committed Nov 30, 2020
2 parents 82fc622 + 42f65d6 commit e65b3c2
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 119 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Expand Up @@ -5,7 +5,7 @@ on:
branches:
- master
tags:
- "v*"
- 'v*'
pull_request:

jobs:
Expand Down
9 changes: 4 additions & 5 deletions .npmignore
Expand Up @@ -7,15 +7,14 @@ lib/
script/
test/
.gitattributes
appveyor.yml
tsconfig.json
.yarnrc
vendor/
yarn-error.log
*.tgz
build
jest.json

# just include these specific artifacts
# everything else should be compiled by the client
!dist/lib/*
.node-version
.github
src
dist/test
9 changes: 9 additions & 0 deletions .prettierignore
@@ -0,0 +1,9 @@
.vscode
.prettierrc.yml
benchmarks/
.gitattributes
.yarnrc
vendor/
yarn-error.log
build
dist
4 changes: 2 additions & 2 deletions .prettierrc.yml
@@ -1,6 +1,6 @@
singleQuote: false
singleQuote: true
trailingComma: es5
semi: true
semi: false
proseWrap: always
endOfLine: auto
arrowParens: avoid
2 changes: 1 addition & 1 deletion lib/index.ts
@@ -1 +1 @@
export * from "./registry";
export * from './registry'
116 changes: 58 additions & 58 deletions lib/registry.ts
@@ -1,7 +1,7 @@
const nativeModule =
process.platform === "win32"
? require("../../build/Release/registry.node")
: null;
process.platform === 'win32'
? require('../../build/Release/registry.node')
: null

/**
* Utility function used to achieve exhaustive type checks at compile time.
Expand All @@ -17,7 +17,7 @@ const nativeModule =
*
*/
function assertNever(x: never, message: string): never {
throw new Error(message);
throw new Error(message)
}

/**
Expand All @@ -26,60 +26,60 @@ function assertNever(x: never, message: string): never {
* Source: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx
*/
export enum RegistryValueType {
REG_BINARY = "REG_BINARY",
REG_DWORD = "REG_DWORD",
REG_DWORD_LITTLE_ENDIAN = "REG_DWORD_LITTLE_ENDIAN",
REG_DWORD_BIG_ENDIAN = "REG_DWORD_BIG_ENDIAN",
REG_EXPAND_SZ = "REG_EXPAND_SZ",
REG_LINK = "REG_LINK",
REG_MULTI_SZ = "REG_MULTI_SZ",
REG_NONE = "REG_NONE",
REG_QWORD = "REG_QWORD",
REG_QWORD_LITTLE_ENDIAN = "REG_QWORD_LITTLE_ENDIAN",
REG_SZ = "REG_SZ",
REG_BINARY = 'REG_BINARY',
REG_DWORD = 'REG_DWORD',
REG_DWORD_LITTLE_ENDIAN = 'REG_DWORD_LITTLE_ENDIAN',
REG_DWORD_BIG_ENDIAN = 'REG_DWORD_BIG_ENDIAN',
REG_EXPAND_SZ = 'REG_EXPAND_SZ',
REG_LINK = 'REG_LINK',
REG_MULTI_SZ = 'REG_MULTI_SZ',
REG_NONE = 'REG_NONE',
REG_QWORD = 'REG_QWORD',
REG_QWORD_LITTLE_ENDIAN = 'REG_QWORD_LITTLE_ENDIAN',
REG_SZ = 'REG_SZ',
}

export type RegistryStringEntry = {
readonly name: string;
readonly type: RegistryValueType.REG_SZ | RegistryValueType.REG_EXPAND_SZ;
readonly data: string;
};
readonly name: string
readonly type: RegistryValueType.REG_SZ | RegistryValueType.REG_EXPAND_SZ
readonly data: string
}

export type RegistryNumberEntry = {
readonly name: string;
readonly type: RegistryValueType.REG_DWORD;
readonly data: number;
};
readonly name: string
readonly type: RegistryValueType.REG_DWORD
readonly data: number
}

// TODO: define some other shapes of data
export type RegistryValue = RegistryStringEntry | RegistryNumberEntry;
export type RegistryValue = RegistryStringEntry | RegistryNumberEntry

export enum HKEY {
HKEY_CLASSES_ROOT = "HKEY_CLASSES_ROOT",
HKEY_CURRENT_CONFIG = "HKEY_CURRENT_CONFIG",
HKEY_DYN_DATA = "HKEY_DYN_DATA",
HKEY_CURRENT_USER_LOCAL_SETTINGS = "HKEY_CURRENT_USER_LOCAL_SETTINGS",
HKEY_CURRENT_USER = "HKEY_CURRENT_USER",
HKEY_LOCAL_MACHINE = "HKEY_LOCAL_MACHINE",
HKEY_PERFORMANCE_DATA = "HKEY_PERFORMANCE_DATA",
HKEY_PERFORMANCE_TEXT = "HKEY_PERFORMANCE_TEXT",
HKEY_PERFORMANCE_NLSTEXT = "HKEY_PERFORMANCE_NLSTEXT",
HKEY_USERS = "HKEY_USERS",
HKEY_CLASSES_ROOT = 'HKEY_CLASSES_ROOT',
HKEY_CURRENT_CONFIG = 'HKEY_CURRENT_CONFIG',
HKEY_DYN_DATA = 'HKEY_DYN_DATA',
HKEY_CURRENT_USER_LOCAL_SETTINGS = 'HKEY_CURRENT_USER_LOCAL_SETTINGS',
HKEY_CURRENT_USER = 'HKEY_CURRENT_USER',
HKEY_LOCAL_MACHINE = 'HKEY_LOCAL_MACHINE',
HKEY_PERFORMANCE_DATA = 'HKEY_PERFORMANCE_DATA',
HKEY_PERFORMANCE_TEXT = 'HKEY_PERFORMANCE_TEXT',
HKEY_PERFORMANCE_NLSTEXT = 'HKEY_PERFORMANCE_NLSTEXT',
HKEY_USERS = 'HKEY_USERS',
}

function mapToLong(key: HKEY): number {
if (key === HKEY.HKEY_CLASSES_ROOT) return 0x80000000;
if (key === HKEY.HKEY_CURRENT_USER) return 0x80000001;
if (key === HKEY.HKEY_LOCAL_MACHINE) return 0x80000002;
if (key === HKEY.HKEY_USERS) return 0x80000003;
if (key === HKEY.HKEY_PERFORMANCE_DATA) return 0x80000004;
if (key === HKEY.HKEY_CURRENT_CONFIG) return 0x80000005;
if (key === HKEY.HKEY_DYN_DATA) return 0x80000006;
if (key === HKEY.HKEY_CURRENT_USER_LOCAL_SETTINGS) return 0x80000007;
if (key === HKEY.HKEY_PERFORMANCE_TEXT) return 0x80000050;
if (key === HKEY.HKEY_PERFORMANCE_NLSTEXT) return 0x80000060;

return assertNever(key, "The key does not map to an expected number value");
if (key === HKEY.HKEY_CLASSES_ROOT) return 0x80000000
if (key === HKEY.HKEY_CURRENT_USER) return 0x80000001
if (key === HKEY.HKEY_LOCAL_MACHINE) return 0x80000002
if (key === HKEY.HKEY_USERS) return 0x80000003
if (key === HKEY.HKEY_PERFORMANCE_DATA) return 0x80000004
if (key === HKEY.HKEY_CURRENT_CONFIG) return 0x80000005
if (key === HKEY.HKEY_DYN_DATA) return 0x80000006
if (key === HKEY.HKEY_CURRENT_USER_LOCAL_SETTINGS) return 0x80000007
if (key === HKEY.HKEY_PERFORMANCE_TEXT) return 0x80000050
if (key === HKEY.HKEY_PERFORMANCE_NLSTEXT) return 0x80000060

return assertNever(key, 'The key does not map to an expected number value')
}

export function enumerateValues(
Expand All @@ -88,27 +88,27 @@ export function enumerateValues(
): ReadonlyArray<RegistryValue> {
if (!nativeModule) {
// this code is a no-op when the module is missing
return [];
return []
}

const hkey = mapToLong(key);
const hkey = mapToLong(key)

const result: ReadonlyArray<RegistryValue> = nativeModule.readValues(
hkey,
subkey
);
)

return result;
return result
}

export function enumerateValuesSafe(
key: HKEY,
subkey: string
): ReadonlyArray<RegistryValue> {
try {
return enumerateValues(key, subkey);
return enumerateValues(key, subkey)
} catch {
return [];
return []
}
}

Expand All @@ -118,23 +118,23 @@ export function enumerateKeys(
): ReadonlyArray<string> {
if (!nativeModule) {
// this code is a no-op when the module is missing
return [];
return []
}

const hkey = mapToLong(key);
const hkey = mapToLong(key)

const result: ReadonlyArray<string> = nativeModule.enumKeys(hkey, subkey);
const result: ReadonlyArray<string> = nativeModule.enumKeys(hkey, subkey)

return result;
return result
}

export function enumerateKeysSafe(
key: HKEY,
subkey?: string | null
): ReadonlyArray<string> {
try {
return enumerateKeys(key, subkey);
return enumerateKeys(key, subkey)
} catch {
return [];
return []
}
}
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -12,8 +12,8 @@
"prepublishOnly": "yarn build && yarn test",
"postpublish": "git push --follow-tags",
"benchmark": "ts-node benchmarks/reg.ts",
"prettier": "prettier --write lib/*.ts test/*.ts",
"check-prettier": "prettier --list-different lib/*.ts test/*.ts",
"prettier": "yarn prettier --write",
"check-prettier": "prettier --check \"./**/*.{ts,tsx,js,json,jsx,scss,html,yaml,yml}\"",
"prebuild-node": "prebuild -t 10.11.0 -t 11.9.0 -t 12.0.0 -t 14.8.0 --strip",
"prebuild-node-ia32": "prebuild -t 10.11.0 -t 11.9.0 -t 12.0.0 -t 14.8.0 -a ia32 --strip",
"prebuild-electron": "prebuild -t 7.0.0 -t 8.0.0 -t 9.0.0 -t 10.0.0 -t 11.0.0 -r electron --strip",
Expand Down
100 changes: 50 additions & 50 deletions test/registry-test.ts
@@ -1,63 +1,63 @@
import { enumerateValues, enumerateKeys, HKEY } from "../lib/index";
import { enumerateValues, enumerateKeys, HKEY } from '../lib/index'

if (process.platform === "win32") {
describe("enumerateValue", () => {
it("can read strings from the registry", () => {
if (process.platform === 'win32') {
describe('enumerateValue', () => {
it('can read strings from the registry', () => {
const values = enumerateValues(
HKEY.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion"
);
'SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
)

const programFilesDir = values.find(v => v.name == "ProgramFilesDir");
expect(programFilesDir!.type).toBe("REG_SZ");
expect(programFilesDir!.data).toContain(":\\Program Files");
const programFilesDir = values.find(v => v.name == 'ProgramFilesDir')
expect(programFilesDir!.type).toBe('REG_SZ')
expect(programFilesDir!.data).toContain(':\\Program Files')

const programFilesPath = values.find(v => v.name == "ProgramFilesPath");
expect(programFilesPath!.type).toBe("REG_EXPAND_SZ");
expect(programFilesPath!.data).toBe("%ProgramFiles%");
});
const programFilesPath = values.find(v => v.name == 'ProgramFilesPath')
expect(programFilesPath!.type).toBe('REG_EXPAND_SZ')
expect(programFilesPath!.data).toBe('%ProgramFiles%')
})

it("can read numbers from the registry", () => {
it('can read numbers from the registry', () => {
const values = enumerateValues(
HKEY.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting"
);
'SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting'
)

const serviceTimeout = values.find(v => v.name == "ServiceTimeout");
expect(serviceTimeout!.type).toBe("REG_DWORD");
expect(serviceTimeout!.data).toBe(60000);
});
const serviceTimeout = values.find(v => v.name == 'ServiceTimeout')
expect(serviceTimeout!.type).toBe('REG_DWORD')
expect(serviceTimeout!.data).toBe(60000)
})

it("can read values from HKCU", () => {
it('can read values from HKCU', () => {
const values = enumerateValues(
HKEY.HKEY_CURRENT_USER,
"SOFTWARE\\Microsoft\\Windows\\DWM"
);

const composition = values.find(v => v.name == "Composition");
expect(composition!.type).toBe("REG_DWORD");
expect(composition!.data).toBe(1);
});

it("returns empty array when key is missing", () => {
const values = enumerateValues(HKEY.HKEY_LOCAL_MACHINE, "blahblahblah");

expect(values).toEqual([]);
});
});
describe("enumerateKeys", () => {
it("can enumerate key names from the registry (No subkey)", () => {
const values = enumerateKeys(HKEY.HKEY_LOCAL_MACHINE, null);

expect(values.indexOf("HARDWARE")).toBeGreaterThanOrEqual(0);
expect(values.indexOf("SOFTWARE")).toBeGreaterThanOrEqual(0);
expect(values.indexOf("SYSTEM")).toBeGreaterThanOrEqual(0);
});
it("can enumerate key names from the registry", () => {
const values = enumerateKeys(HKEY.HKEY_LOCAL_MACHINE, "SOFTWARE");

expect(values.indexOf("Classes")).toBeGreaterThanOrEqual(0);
expect(values.indexOf("Microsoft")).toBeGreaterThanOrEqual(0);
});
});
'SOFTWARE\\Microsoft\\Windows\\DWM'
)

const composition = values.find(v => v.name == 'Composition')
expect(composition!.type).toBe('REG_DWORD')
expect(composition!.data).toBe(1)
})

it('returns empty array when key is missing', () => {
const values = enumerateValues(HKEY.HKEY_LOCAL_MACHINE, 'blahblahblah')

expect(values).toEqual([])
})
})
describe('enumerateKeys', () => {
it('can enumerate key names from the registry (No subkey)', () => {
const values = enumerateKeys(HKEY.HKEY_LOCAL_MACHINE, null)

expect(values.indexOf('HARDWARE')).toBeGreaterThanOrEqual(0)
expect(values.indexOf('SOFTWARE')).toBeGreaterThanOrEqual(0)
expect(values.indexOf('SYSTEM')).toBeGreaterThanOrEqual(0)
})
it('can enumerate key names from the registry', () => {
const values = enumerateKeys(HKEY.HKEY_LOCAL_MACHINE, 'SOFTWARE')

expect(values.indexOf('Classes')).toBeGreaterThanOrEqual(0)
expect(values.indexOf('Microsoft')).toBeGreaterThanOrEqual(0)
})
})
}
2 changes: 2 additions & 0 deletions tsconfig.json
Expand Up @@ -3,7 +3,9 @@
"module": "commonjs",
"moduleResolution": "node",
"target": "es6",
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noFallthroughCasesInSwitch": true,
"noUnusedLocals": true,
"strict": true,
Expand Down

0 comments on commit e65b3c2

Please sign in to comment.