Skip to content

Commit

Permalink
Refactor file structure
Browse files Browse the repository at this point in the history
  • Loading branch information
Jack Steam committed Mar 10, 2020
1 parent c5af655 commit 1273b6e
Show file tree
Hide file tree
Showing 8 changed files with 276 additions and 389 deletions.
File renamed without changes.
396 changes: 199 additions & 197 deletions src/jest-chrome.d.ts → jest-chrome.d.ts

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
"author": "Jack Steam <jacksteamdev@gmail.com>",
"files": [
"lib",
"types"
"types",
"jest-chrome-schema.json",
"jest-chrome.d.ts"
],
"main": "lib/index.cjs.js",
"module": "lib/index.esm.js",
Expand Down
2 changes: 1 addition & 1 deletion src/add-elements.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createEvent } from './create-event'
import { Storage } from './jest-chrome'
import { Storage } from '../jest-chrome'

/**
* Namespace member data format from jest-chrome-schema.json
Expand Down
68 changes: 68 additions & 0 deletions src/createHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import jestChromeSchema from '../jest-chrome-schema.json';
import { addEvent, addFunction, addProperty } from './add-elements';
import { JestChrome } from '../jest-chrome';

export function createHandler(schema = jestChromeSchema as any): ProxyHandler<JestChrome> {
return {
ownKeys() {
return Reflect.ownKeys(schema);
},
getOwnPropertyDescriptor(target, prop) {
if (prop in schema) {
return {
enumerable: true,
configurable: true,
};
}
else {
return {
enumerable: false,
configurable: false,
};
}
},
set(target, key, value) {
if (key in schema &&
key === 'lastError' &&
!(typeof value === 'object' &&
typeof value?.message === 'string')) {
throw new TypeError('chrome.runtime.lastError should be type { message: string }');
}
return Reflect.set(target, key, value);
},
deleteProperty(target, key) {
// Mark property as deleted, so it won't be retrieved from the schema
return Reflect.set(target, key, null);
},
has(target, key) {
const inTarget = key in target && Reflect.get(target, key);
return inTarget !== null && !!inTarget;
},
get(target, key) {
if (key in target) {
const value = Reflect.get(target, key);
// Check that the value wasn't deleted
return value !== null ? value : undefined;
}
else if (key in schema) {
switch (schema[key].type) {
case 'event':
return addEvent(schema[key], target);
case 'function':
return addFunction(schema[key], target);
case 'property':
return addProperty(schema[key], target);
// default is namespace
default: {
const proxy = new Proxy<Record<string, any>>({}, createHandler(schema[key]));
Object.assign(target, { [key]: proxy });
return proxy;
}
}
}
else {
return undefined;
}
},
};
}
100 changes: 0 additions & 100 deletions src/demo.test.ts

This file was deleted.

6 changes: 3 additions & 3 deletions src/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { chrome } from '.'
import { Storage, Runtime } from './jest-chrome'
import { Storage, Runtime } from '../jest-chrome'
import {
CallableEvent,
EventCallback,
MonotypeEventSelector,
} from './create-event'
import { readJSONSync } from 'fs-extra'
import { join } from 'path'
import { resolve } from 'path'

const chromeSchema = readJSONSync(
join(__dirname, 'jest-chrome-schema.json'),
resolve(__dirname, '..', 'jest-chrome-schema.json'),
)

afterEach(() => {
Expand Down
89 changes: 2 additions & 87 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,92 +1,7 @@
import { JestChrome as JestChromeNamespace } from './jest-chrome'
import jestChromeSchema from './jest-chrome-schema.json'
import {
addEvent,
addFunction,
addProperty,
} from './add-elements'

export type JestChrome = typeof JestChromeNamespace
import { JestChrome } from '../jest-chrome'
import { createHandler } from './createHandler'

export const chrome = new Proxy<JestChrome>(
{} as JestChrome,
createHandler(),
)

export function createHandler(
schema = jestChromeSchema as any,
): ProxyHandler<JestChrome> {
return {
ownKeys() {
return Reflect.ownKeys(schema)
},
getOwnPropertyDescriptor(target, prop) {
if (prop in schema) {
return {
enumerable: true,
configurable: true,
}
} else {
return {
enumerable: false,
configurable: false,
}
}
},
set(target, key, value) {
if (
key in schema &&
key === 'lastError' &&
!(
typeof value === 'object' &&
typeof value?.message === 'string'
)
) {
throw new TypeError(
'chrome.runtime.lastError should be type { message: string }',
)
}

return Reflect.set(target, key, value)
},
deleteProperty(target, key) {
// Mark property as deleted, so it won't be retrieved from the schema
return Reflect.set(target, key, null)
},
has(target, key) {
const inTarget = key in target && Reflect.get(target, key)

return inTarget !== null && !!inTarget
},
get(target, key) {
if (key in target) {
const value = Reflect.get(target, key)
// Check that the value wasn't deleted
return value !== null ? value : undefined
} else if (key in schema) {
switch (schema[key].type) {
case 'event':
return addEvent(schema[key], target)
case 'function':
return addFunction(schema[key], target)
case 'property':
return addProperty(schema[key], target)

// default is namespace
default: {
const proxy = new Proxy<Record<string, any>>(
{},
createHandler(schema[key]),
)

Object.assign(target, { [key]: proxy })

return proxy
}
}
} else {
return undefined
}
},
}
}

0 comments on commit 1273b6e

Please sign in to comment.