All files / src/domain DomainObjectView.ts

0% Statements 0/0
0% Branches 0/0
0% Functions 0/0
0% Lines 0/0

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73                                                                                                                                                 
/*
 * Copyright 2019 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import DomainObject from './DomainObject';
 
/**
 * DomainObjectView is a mapped type that converts any
 * DomainObject into their corresponding view. In particular:
 * 
 * - If a field is a DomainObject, that field is mapped to a number
 *   (the DomainObject's id).
 * 
 * - If a field is a nullable DomainObject, that field is mapped to a number|null
 *   (the DomainObject's id, if present, or null, if not present).
 * 
 * - If a field is a collection of DomainObjects, that field is mapped to a number[]
 *   (an array of the DomainObjects' ids).
 * 
 * Since TypeScript does not support field renaming as of yet
 * (https://github.com/Microsoft/TypeScript/issues/12754),
 * if P is a property that is a DomainObject, then its corresponding
 * property has the same name. Below is an example of a DomainObject and its
 * corresponding DomainObjectView:
 * 
 * @example 
 * DomainObject (Employee)
 * {
 *   id: 1,
 *   version: 0,
 *   name: "Amy",
 *   contract: { id: 10, version: 0, name: "A contract", ... },
 *   skillProficiencySet: [
 *     { id: 12, version: 0, name: "Skill A" },
 *     { id: 20, version: 0, name: "Skill B" }
 *   ]
 * }
 * 
 * DomainObjectView (DomainObjectView<Employee>)
 * {
 *   id: 1,
 *   version: 0,
 *   name: "Amy",
 *   contract: 10,
 *   skillProficiencySet: [12, 20]
 * }
 * 
 * @see {DomainObject}
 * @exports
*/
 
type DomainObjectView<T extends DomainObject> = {
  [K in keyof T]: 
  T[K] extends DomainObject[]? number[] :
    T[K] extends DomainObject? number :
      T[K] extends (DomainObject | null)? number | null :
        T[K];
}
 
// eslint-disable-next-line no-undef
export default DomainObjectView;