mirror of
https://github.com/roleypoly/roleypoly.git
synced 2025-06-16 17:49:09 +00:00
feat: Add majority of design system components, build system fixes (#11)
* feat(design-system): pre-port of roleypoly/ui * feat(design-system): port molecules * chore(design-system): prettier * feat(design-system): add intro card and MDX components * fix(common/utils): hack fixtures test data moved to design-system, update accordingly * chore: document protoReflection.ts * fix(design-system): some molecules missed the magic fuckery * ci: keep going on bazel test failures * fix(design-system): server masthead molecule missed the magic fuckery * chore: fix ts paths * chore: fix docker publisher * chore: fix docker publisher names * chore(discord-bot): fix publisher * chore(discord-bot): fix publisher
This commit is contained in:
parent
c41fcabfd0
commit
89f237cf22
133 changed files with 2795 additions and 278 deletions
|
@ -19,7 +19,7 @@ react_library(
|
|||
jest_test(
|
||||
src = ":utils",
|
||||
deps = [
|
||||
"//hack/fixtures",
|
||||
"//src/design-system/shared-types",
|
||||
"//src/rpc/shared",
|
||||
],
|
||||
)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { hasPermission, permissions, hasPermissionOrAdmin } from './hasPermission';
|
||||
import { Role } from 'roleypoly/src/rpc/shared';
|
||||
import { guildRoles } from 'roleypoly/hack/fixtures/storyData';
|
||||
import { guildRoles } from 'roleypoly/src/design-system/shared-types/storyData';
|
||||
|
||||
const roles: Role.AsObject[] = [
|
||||
{
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { DiscordUser } from 'roleypoly/src/rpc/shared';
|
||||
import { user } from 'roleypoly/hack/fixtures/storyData';
|
||||
import { user } from 'roleypoly/src/design-system/shared-types/storyData';
|
||||
import { AsObjectToProto } from './protoReflection';
|
||||
|
||||
it('converts a RoleypolyUser.AsObject back to protobuf', () => {
|
||||
|
|
|
@ -1,26 +1,43 @@
|
|||
import * as pbjs from 'google-protobuf';
|
||||
|
||||
// Protobuf Message itself
|
||||
type GenericObject<T extends pbjs.Message> = T;
|
||||
|
||||
// Message's "setter" call
|
||||
type ProtoFunction<T extends pbjs.Message, U extends ReturnType<T['toObject']>> = (
|
||||
value: U[keyof U]
|
||||
) => void;
|
||||
|
||||
/**
|
||||
* AsObjectToProto does the opposite of ProtoMessage.toObject().
|
||||
* This function turns regular JS objects back into their source protobuf message type,
|
||||
* with the help us copious amounts of reflection.
|
||||
* @param protoClass A protobuf message class
|
||||
* @param input A JS object that corresponds to the protobuf message class.
|
||||
*/
|
||||
export const AsObjectToProto = <T extends pbjs.Message>(
|
||||
protoClass: { new (): T },
|
||||
input: ReturnType<T['toObject']>
|
||||
): GenericObject<T> => {
|
||||
// First, we create the message itself
|
||||
const proto = new protoClass();
|
||||
|
||||
// We want the keys from the message, this will give us the setter names we need.
|
||||
const protoKeys = Object.getOwnPropertyNames((proto as any).__proto__);
|
||||
|
||||
// Loop over the input data keys
|
||||
for (let inputKey in input) {
|
||||
// As we loop, find the setter function for the key
|
||||
const setCallName = protoKeys.find(
|
||||
(key) => `set${inputKey.toLowerCase()}` === key.toLowerCase()
|
||||
) as keyof typeof proto;
|
||||
|
||||
// If we encounter a key without a place to go, we silently ignore it.
|
||||
if (!setCallName) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// But, if it all succeeds, we call the setter with the JS object's value.
|
||||
((proto[setCallName] as unknown) as ProtoFunction<T, typeof input>)(
|
||||
input[inputKey]
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue