@contember/schema-utils 1.2.0-alpha.2 → 1.2.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/src/dataUtils.d.ts +1 -1
  2. package/dist/src/dataUtils.d.ts.map +1 -1
  3. package/dist/src/dataUtils.js +3 -0
  4. package/dist/src/dataUtils.js.map +1 -1
  5. package/dist/src/model/NamingHelper.d.ts +2 -0
  6. package/dist/src/model/NamingHelper.d.ts.map +1 -1
  7. package/dist/src/model/NamingHelper.js +20 -7
  8. package/dist/src/model/NamingHelper.js.map +1 -1
  9. package/dist/src/schemaNormalizer.d.ts.map +1 -1
  10. package/dist/src/schemaNormalizer.js +15 -4
  11. package/dist/src/schemaNormalizer.js.map +1 -1
  12. package/dist/src/tsconfig.tsbuildinfo +1 -1
  13. package/dist/src/type-schema/acl.d.ts.map +1 -1
  14. package/dist/src/type-schema/acl.js +4 -0
  15. package/dist/src/type-schema/acl.js.map +1 -1
  16. package/dist/src/type-schema/condition.d.ts +5 -0
  17. package/dist/src/type-schema/condition.d.ts.map +1 -0
  18. package/dist/src/type-schema/condition.js +95 -0
  19. package/dist/src/type-schema/condition.js.map +1 -0
  20. package/dist/src/type-schema/index.d.ts +1 -0
  21. package/dist/src/type-schema/index.d.ts.map +1 -1
  22. package/dist/src/type-schema/index.js +1 -0
  23. package/dist/src/type-schema/index.js.map +1 -1
  24. package/dist/src/type-schema/model.d.ts +1 -0
  25. package/dist/src/type-schema/model.d.ts.map +1 -1
  26. package/dist/src/type-schema/model.js +5 -0
  27. package/dist/src/type-schema/model.js.map +1 -1
  28. package/dist/src/validation/AclValidator.d.ts.map +1 -1
  29. package/dist/src/validation/AclValidator.js +13 -2
  30. package/dist/src/validation/AclValidator.js.map +1 -1
  31. package/dist/src/validation/MembershipResolver.d.ts +37 -0
  32. package/dist/src/validation/MembershipResolver.d.ts.map +1 -0
  33. package/dist/src/validation/MembershipResolver.js +104 -0
  34. package/dist/src/validation/MembershipResolver.js.map +1 -0
  35. package/dist/src/validation/ModelValidator.d.ts.map +1 -1
  36. package/dist/src/validation/ModelValidator.js +11 -4
  37. package/dist/src/validation/ModelValidator.js.map +1 -1
  38. package/dist/src/validation/index.d.ts +1 -0
  39. package/dist/src/validation/index.d.ts.map +1 -1
  40. package/dist/src/validation/index.js +1 -0
  41. package/dist/src/validation/index.js.map +1 -1
  42. package/dist/tests/cases/unit/conditionSchema.test.d.ts +2 -0
  43. package/dist/tests/cases/unit/conditionSchema.test.d.ts.map +1 -0
  44. package/dist/tests/cases/unit/conditionSchema.test.js +50 -0
  45. package/dist/tests/cases/unit/conditionSchema.test.js.map +1 -0
  46. package/dist/tests/cases/unit/membershipResolver.test.d.ts +2 -0
  47. package/dist/tests/cases/unit/membershipResolver.test.d.ts.map +1 -0
  48. package/dist/tests/cases/unit/membershipResolver.test.js +149 -0
  49. package/dist/tests/cases/unit/membershipResolver.test.js.map +1 -0
  50. package/dist/tests/tsconfig.tsbuildinfo +1 -0
  51. package/package.json +5 -5
  52. package/src/dataUtils.ts +5 -0
  53. package/src/model/NamingHelper.ts +19 -8
  54. package/src/schemaNormalizer.ts +15 -4
  55. package/src/type-schema/acl.ts +4 -0
  56. package/src/type-schema/condition.ts +81 -0
  57. package/src/type-schema/index.ts +1 -0
  58. package/src/type-schema/model.ts +7 -0
  59. package/src/validation/AclValidator.ts +12 -2
  60. package/src/validation/MembershipResolver.ts +133 -0
  61. package/src/validation/ModelValidator.ts +13 -4
  62. package/src/validation/index.ts +1 -0
  63. package/tests/cases/unit/conditionSchema.test.ts +55 -0
  64. package/tests/cases/unit/membershipResolver.test.ts +161 -0
  65. package/tests/tsconfig.json +12 -0
  66. package/tsconfig.json +8 -1
@@ -0,0 +1 @@
1
+ {"program":{"fileNames":["../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../../node_modules/typescript/lib/lib.esnext.d.ts","../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../../node_modules/@types/node/assert.d.ts","../../../../node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/@types/node/globals.d.ts","../../../../node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/@types/node/buffer.d.ts","../../../../node_modules/@types/node/child_process.d.ts","../../../../node_modules/@types/node/cluster.d.ts","../../../../node_modules/@types/node/console.d.ts","../../../../node_modules/@types/node/constants.d.ts","../../../../node_modules/@types/node/crypto.d.ts","../../../../node_modules/@types/node/dgram.d.ts","../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/@types/node/dns.d.ts","../../../../node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/@types/node/domain.d.ts","../../../../node_modules/@types/node/events.d.ts","../../../../node_modules/@types/node/fs.d.ts","../../../../node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/@types/node/http.d.ts","../../../../node_modules/@types/node/http2.d.ts","../../../../node_modules/@types/node/https.d.ts","../../../../node_modules/@types/node/inspector.d.ts","../../../../node_modules/@types/node/module.d.ts","../../../../node_modules/@types/node/net.d.ts","../../../../node_modules/@types/node/os.d.ts","../../../../node_modules/@types/node/path.d.ts","../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/@types/node/process.d.ts","../../../../node_modules/@types/node/punycode.d.ts","../../../../node_modules/@types/node/querystring.d.ts","../../../../node_modules/@types/node/readline.d.ts","../../../../node_modules/@types/node/repl.d.ts","../../../../node_modules/@types/node/stream.d.ts","../../../../node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/@types/node/stream/web.d.ts","../../../../node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/@types/node/timers.d.ts","../../../../node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/@types/node/tls.d.ts","../../../../node_modules/@types/node/trace_events.d.ts","../../../../node_modules/@types/node/tty.d.ts","../../../../node_modules/@types/node/url.d.ts","../../../../node_modules/@types/node/util.d.ts","../../../../node_modules/@types/node/v8.d.ts","../../../../node_modules/@types/node/vm.d.ts","../../../../node_modules/@types/node/wasi.d.ts","../../../../node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/@types/node/zlib.d.ts","../../../../node_modules/@types/node/globals.global.d.ts","../../../../node_modules/@types/node/index.d.ts","../../../../node_modules/esbuild/lib/main.d.ts","../../../../node_modules/rollup/dist/rollup.d.ts","../../../../node_modules/source-map-js/source-map.d.ts","../../../../node_modules/postcss/lib/comment.d.ts","../../../../node_modules/postcss/lib/at-rule.d.ts","../../../../node_modules/postcss/lib/rule.d.ts","../../../../node_modules/postcss/lib/container.d.ts","../../../../node_modules/postcss/lib/declaration.d.ts","../../../../node_modules/postcss/lib/previous-map.d.ts","../../../../node_modules/postcss/lib/input.d.ts","../../../../node_modules/postcss/lib/css-syntax-error.d.ts","../../../../node_modules/postcss/lib/warning.d.ts","../../../../node_modules/postcss/lib/document.d.ts","../../../../node_modules/postcss/lib/root.d.ts","../../../../node_modules/postcss/lib/lazy-result.d.ts","../../../../node_modules/postcss/lib/no-work-result.d.ts","../../../../node_modules/postcss/lib/processor.d.ts","../../../../node_modules/postcss/lib/result.d.ts","../../../../node_modules/postcss/lib/node.d.ts","../../../../node_modules/postcss/lib/list.d.ts","../../../../node_modules/postcss/lib/postcss.d.ts","../../../../node_modules/vite/dist/node/index.d.ts","../../../../node_modules/tinyspy/dist/index.d.ts","../../../../node_modules/@types/chai/index.d.ts","../../../../node_modules/vitest/dist/index.d.ts","../../../schema/dist/src/schema/value.d.ts","../../../schema/dist/src/schema/input.d.ts","../../../schema/dist/src/schema/model.d.ts","../../../schema/dist/src/schema/json.d.ts","../../../schema/dist/src/schema/acl.d.ts","../../../schema/dist/src/schema/validation.d.ts","../../../schema/dist/src/schema/result.d.ts","../../../schema/dist/src/ProjectRole.d.ts","../../../schema/dist/src/index.d.ts","../../../typesafe/dist/src/index.d.ts","../src/type-schema/acl.d.ts","../src/type-schema/condition.d.ts","../src/type-schema/model.d.ts","../src/type-schema/validation.d.ts","../src/type-schema/index.d.ts","../../tests/cases/unit/conditionSchema.test.ts","../src/model/modelUtils.d.ts","../src/model/NamingHelper.d.ts","../src/model/index.d.ts","../src/acl/AllowAllPermissionFactory.d.ts","../src/acl/PredicateDefinitionProcessor.d.ts","../src/acl/schemaUtils.d.ts","../src/acl/index.d.ts","../src/dataUtils.d.ts","../src/validation/errors.d.ts","../src/validation/AclValidator.d.ts","../src/validation/ModelValidator.d.ts","../src/validation/ValidationValidator.d.ts","../src/validation/SchemaValidator.d.ts","../src/validation/MembershipResolver.d.ts","../src/validation/index.d.ts","../src/schemaNormalizer.d.ts","../src/schemaFilter.d.ts","../src/utils/assertNever.d.ts","../src/utils/isIt.d.ts","../src/utils/deepCompare.d.ts","../src/utils/index.d.ts","../src/index.d.ts","../../tests/cases/unit/membershipResolver.test.ts","../../../../node_modules/@types/accepts/index.d.ts","../../../../node_modules/@types/bcrypt/index.d.ts","../../../../node_modules/@types/connect/index.d.ts","../../../../node_modules/@types/body-parser/index.d.ts","../../../../node_modules/@types/keyv/index.d.ts","../../../../node_modules/@types/http-cache-semantics/index.d.ts","../../../../node_modules/@types/responselike/index.d.ts","../../../../node_modules/@types/cacheable-request/index.d.ts","../../../../node_modules/@types/caseless/index.d.ts","../../../../node_modules/@types/chai-subset/index.d.ts","../../../../node_modules/@types/content-disposition/index.d.ts","../../../../node_modules/@types/cookiejar/index.d.ts","../../../../node_modules/@types/keygrip/index.d.ts","../../../../node_modules/@types/range-parser/index.d.ts","../../../../node_modules/@types/qs/index.d.ts","../../../../node_modules/@types/express-serve-static-core/index.d.ts","../../../../node_modules/@types/mime/index.d.ts","../../../../node_modules/@types/serve-static/index.d.ts","../../../../node_modules/@types/express/index.d.ts","../../../../node_modules/@types/cookies/index.d.ts","../../../../node_modules/@types/fs-extra/index.d.ts","../../../../node_modules/@types/http-assert/index.d.ts","../../../../node_modules/@types/http-errors/index.d.ts","../../../../node_modules/@types/js-yaml/index.d.ts","../../../../node_modules/@types/json-buffer/index.d.ts","../../../../node_modules/@types/json-schema/index.d.ts","../../../../node_modules/@types/json-stable-stringify/index.d.ts","../../../../node_modules/@types/jsonwebtoken/index.d.ts","../../../../node_modules/@types/koa-compose/index.d.ts","../../../../node_modules/@types/koa/index.d.ts","../../../../node_modules/@types/koa-bodyparser/index.d.ts","../../../../node_modules/@types/koa-compress/index.d.ts","../../../../node_modules/@types/koa__cors/index.d.ts","../../../../node_modules/@types/mime-types/index.d.ts","../../../../node_modules/@types/mustache/index.d.ts","../../../../node_modules/form-data/index.d.ts","../../../../node_modules/@types/node-fetch/externals.d.ts","../../../../node_modules/@types/node-fetch/index.d.ts","../../../../node_modules/@types/nodemailer/lib/dkim/index.d.ts","../../../../node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts","../../../../node_modules/@types/nodemailer/lib/xoauth2.d.ts","../../../../node_modules/@types/nodemailer/lib/mailer/index.d.ts","../../../../node_modules/@types/nodemailer/lib/mime-node/index.d.ts","../../../../node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts","../../../../node_modules/@types/nodemailer/lib/shared.d.ts","../../../../node_modules/@types/nodemailer/lib/json-transport.d.ts","../../../../node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts","../../../../node_modules/@types/nodemailer/lib/ses-transport.d.ts","../../../../node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts","../../../../node_modules/@types/nodemailer/lib/smtp-transport.d.ts","../../../../node_modules/@types/nodemailer/lib/stream-transport.d.ts","../../../../node_modules/@types/nodemailer/index.d.ts","../../../../node_modules/@types/npm-package-arg/index.d.ts","../../../../node_modules/@types/parse-json/index.d.ts","../../../../node_modules/pg-types/index.d.ts","../../../../node_modules/pg-protocol/dist/messages.d.ts","../../../../node_modules/pg-protocol/dist/serializer.d.ts","../../../../node_modules/pg-protocol/dist/parser.d.ts","../../../../node_modules/pg-protocol/dist/index.d.ts","../../../../node_modules/@types/pg/index.d.ts","../../../../node_modules/@types/prompts/index.d.ts","../../../../node_modules/@types/request/node_modules/form-data/index.d.ts","../../../../node_modules/@types/tough-cookie/index.d.ts","../../../../node_modules/@types/request/index.d.ts","../../../../node_modules/@types/sinonjs__fake-timers/index.d.ts","../../../../node_modules/@types/sinon/index.d.ts","../../../../node_modules/buffer/index.d.ts","../../../../node_modules/@types/superagent/index.d.ts","../../../../node_modules/@types/supertest/index.d.ts","../../../../node_modules/@types/uuid/index.d.ts","../../../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"f5c28122bee592cfaf5c72ed7bcc47f453b79778ffa6e301f45d21a0970719d4","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","3eb679a56cab01203a1ba7edeade937f6a2a4c718513b2cd930b579807fa9359","aea179452def8a6152f98f63b191b84e7cbd69b0e248c91e61fb2e52328abe8c",{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357","affectsGlobalScope":true},{"version":"181f1784c6c10b751631b24ce60c7f78b20665db4550b335be179217bacc0d5f","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"cd483c056da900716879771893a3c9772b66c3c88f8943b4205aec738a94b1d0","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"ff667ee99e5a28c3dc5063a3cfd4d3436699e3fb035d4451037da7f567da542a","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"6ea9ab679ea030cf46c16a711a316078e9e02619ebaf07a7fcd16964aba88f2d","affectsGlobalScope":true},{"version":"6bda95ea27a59a276e46043b7065b55bd4b316c25e70e29b572958fa77565d43","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"c37f8a49593a0030eecb51bbfa270e709bec9d79a6cc3bb851ef348d4e6b26f8","affectsGlobalScope":true},"0d5a2ee1fdfa82740e0103389b9efd6bfe145a20018a2da3c02b89666181f4d9","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"2f6c9750131d5d2fdaba85c164a930dc07d2d7e7e8970b89d32864aa6c72620c","affectsGlobalScope":true},"56d13f223ab40f71840795f5bef2552a397a70666ee60878222407f3893fb8d0",{"version":"aeeee3998c5a730f8689f04038d41cf4245c9edbf6ef29a698e45b36e399b8ed","affectsGlobalScope":true},"95843d5cfafced8f3f8a5ce57d2335f0bcd361b9483587d12a25e4bd403b8216","afc6e96061af46bcff47246158caee7e056f5288783f2d83d6858cd25be1c565",{"version":"34f5bcac12b36d70304b73de5f5aab3bb91bd9919f984be80579ebcad03a624e","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","90b94d3d2aa3432cc9dd2d15f56a38b166163fc555404c74243e1af29c5549d8","f50c975ab7b50e25a69e3d8a3773894125b44e9698924105f23b812bf7488baf","c993aac3b6d4a4620ef9651497069eb84806a131420e4f158ea9396fb8eb9b8c","76650408392bf49a8fbf3e2b6b302712a92d76af77b06e2da1cc8077359c4409","0af3121e68297b2247dd331c0d24dba599e50736a7517a5622d5591aae4a3122","6972fca26f6e9bd56197568d4379f99071a90766e06b4fcb5920a0130a9202be",{"version":"4a2628e95962c8ab756121faa3ac2ed348112ff7a87b5c286dd2cc3326546b4c","affectsGlobalScope":true},"be57ed74f6dc1a2c92e6f8e00b1d758bb6ec513680b5547c67ac7c0193371b93","57951685bd0e57e5a7aebfd62512e365bc1db66315992211a647cacfcfa65965","e3b886bacdd1fbf1f72e654596c80a55c7bc1d10bdf464aaf52f45ecd243862f","d2f5c67858e65ebb932c2f4bd2af646f5764e8ad7f1e4fbe942a0b5ea05dc0e7","4b9a003b5c556c96784132945bb41c655ea11273b1917f5c8d0c154dd5fd20dd","7f249c599e7a9335dd8e94a4bfe63f00e911756c3c23f77cdb6ef0ec4d479e4a",{"version":"e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5","affectsGlobalScope":true},"2cabc86ea4f972f2c8386903eccb8c19e2f2370fb9808b66dd8759c1f2ab30c7","abc1c425b2ad6720433f40f1877abfa4223f0f3dd486c9c28c492179ca183cb6","945a841f9a591197154c85386bc5a1467d42d325104bb36db51bc566bbb240be","10c39ce1df102994b47d4bc0c71aa9a6aea76f4651a5ec51914431f50bc883a1",{"version":"8207e7e6db9aa5fc7e61c8f17ba74cf9c115d26f51f91ee93f790815a7ea9dfb","affectsGlobalScope":true},"9f1069b9e2c051737b1f9b4f1baf50e4a63385a6a89c32235549ae87fc3d5492","ee18f2da7a037c6ceeb112a084e485aead9ea166980bf433474559eac1b46553","29c2706fa0cc49a2bd90c83234da33d08bb9554ecec675e91c1f85087f5a5324","0acbf26bf958f9e80c1ffa587b74749d2697b75b484062d36e103c137c562bc3","02b3239cf1b1ff8737e383ed5557f0247499d15f5bd21ab849b1a24687b6100c","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff",{"version":"806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0","affectsGlobalScope":true},"33eee034727baf564056b4ea719075c23d3b4767d0b5f9c6933b81f3d77774d2","c33a6ea7147af60d8e98f1ac127047f4b0d4e2ce28b8f08ff3de07ca7cc00637",{"version":"aee7013623e7632fba449d4df1da92925b27d9b816cb05546044dbfe54c88ef4","affectsGlobalScope":true},"664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980","f6b2d700c02c818151361abb13737527e8bc0aab9b7065b662b25d9eaba4c5de","998a3de5237518c0b3ac00a11b3b4417affb008aa20aedee52f3fdae3cb86151","ad41008ffe077206e1811fc873f4d9005b5fd7f6ab52bb6118fef600815a5cb4",{"version":"1aad825534c73852a1f3275e527d729a2c0640f539198fdfdfeb83b839851910","affectsGlobalScope":true},"badae0df9a8016ac36994b0a0e7b82ba6aaa3528e175a8c3cb161e4683eec03e","c3db860bcaaaeb3bbc23f353bbda1f8ab82756c8d5e973bebb3953cb09ea68f2","235a53595bd20b0b0eeb1a29cb2887c67c48375e92f03749b2488fbd46d0b1a0","bc09393cd4cd13f69cf1366d4236fbae5359bb550f0de4e15767e9a91d63dfb1","9c266243b01545e11d2733a55ad02b4c00ecdbda99c561cd1674f96e89cdc958","c71155c05fc76ff948a4759abc1cb9feec036509f500174bc18dad4c7827a60c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"1503a452a67127e5c2da794d1c7c44344d5038373aae16c9b03ac964db159edd","f6801b113c81e3b4ef0b2b27e457cd1a269b72339312bb716be93a199d8d0bc3","f6ae4d70775f50beaaa1a3968ed7b6e2a7185c172243c4ac1c8ecb3d39c3faf6","858d0d831826c6eb563df02f7db71c90e26deadd0938652096bea3cc14899700","d1c89db652113258e4ba4bbdf5cc7a2a3a600403d4d864a2087b95186253cd5b","11a90d2cb2eaf7fdf931a63b58279e8161f1477a1bd1e914ae026c1bbf9afed3","af18e30f3ba06e9870b61dfa4a109215caabdaa337590c51b4a044a9f338ce96","ace603f7b60599f2dcdbd71c07137b60a747dd33be540f4a294b890f9e0b89dc","7658fbdd425c656fb1849b44932ae7431e8c3198d22c65ce1490deb582743b52","7786c75c1b46e93b33c63dccf689143a5f47ff451a6b3bd9b10e4801cdeadcc2","615b7264db151461b896cd79719414d63f7b2b2100b275828e53cab95a356e2f","31491a01ed7466e0b3b0ef8407f2524683055eceb955b1d5ccf7096129468b39","f4b12f7dde4fc0e386648318481bdcfe861b566be246bebf0e8a11ebd909adf9","e8966f7c424780bb0b9d411ebe13eda8555ca15aa675603316c2952bc027b0e3","df0e5f3c4a518111d160cf3bebc9a3ac7d39c6e3bfb7a21d43c304896c3015e2","df4e2f161f74870708c2cc5e1036a6405b878496408fda1ee50d5b10e50d6601","bf791da347fb1c0ffc1e2fcd35867e64bb8355270ae26278198c521bdcf94569","e0e0e3c068e145fbb322120979299ff130ffdd39f0dcd0d5aeaa9f3f8a0d01d9","fde91356172e35b9ea68bbdf33721f7c80307a4ce65b82105eac800e9e744995","9bd5e5a4a1e66b35efe3c48ddac1116537ef86e041717f3a9b9f1e060c74efa6","d7e4a5f4ccfb749c3033fafc233073b4d1dcca0249785186c589602a81f9d86f","68161b6f3004fc10f8bb47a4986cef13c3b0728fb1ca3e1dc7316227d09b2c8d","5c04c4365e9f414be022f135826efec439299d8ac1e532d612612fe27f936477","a7157ee945ba3e7ccf605cf5f2e83e62f7694b92a3ddf8bc69c5182fe93aa98f",{"version":"3a15910b7f45dfc393f010ee8f913580b08d65752800fc48147ea13445acd5f7","affectsGlobalScope":true},{"version":"7624987e641632fb95f4d4c661744d3c0a952a62ee0b96de0e1f55c1a207d886","affectsGlobalScope":true},"54d7b38e70f49e16e409e31bc3aa3f783333883d10b4a64288f26d8182e40317","2dcc342b8f20fdc8f20146b6044e890c59facfbbe4494a007e51b1f80c3595d4","240272203a065c27dd673986642965cc0ce6cf25fbb64ca78f0aa1b34a42df52","1a56e890ce283cffb5fcfd798dcf611537671c01aaf65c777583f2628c14a420","670f91ec754cd7169ac33ccb5f3dd2ff1b943b152169da61f6f15b035928988b","bd9cf823528e4b898ab79fecc4d065ac5bea2b949fa412cbba3a939c0c19d90c","1f8e74f5c12a8a589a3481e16de762f3793231c820d39fc48b8667e03c270496","63b9eee470bd3614d3e4d9bc984817bf83643caec9cfdaada125c56c1552906c","41161650713d47bf2be0f63ecb56240e828212c883952cb149b39cf9bf7052dc","c2b80ece688f0b975dbb874dac0a9aac1e53b47c752b3cbb36c44e6977bc00ff","26ca46f6e4aa5153805c46b1b6ace3dae47fd1966b5cb9f0d112450deb6ac35f","b99a11b75c6dc7a6653a469b893367a76550f750180cbdd1d7075f1f40f02ee0","58559e87bff56195169e0f79cba5e91c140abd8bc47b409c6e9b9f103b736beb","4e3b73bcd3b645372ed8b2a6196f4a3334543f121549e3c7a688d90f2bce8962","f91f80abab09f00e389566b377368142d8e4892f23e3f8258e3cde02f1931b96",{"version":"2f81a163fdb114f7c65f82d5c8e303c63bcfd0c49590ee151da88762a6f72ef3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"594aea27f4b909e676763ded405f16036c051ccb4de64d7f8a4067646d121662","dea76be2a527c8af8356e2102cfcc79a4527e1506d8aa2073af98bcedf27be8e","191b630015687186f270d7128f06f84153a8bd818be4db760994abd02fff150c","94cbd6e195ba666580972c589a6742ceb7737df80cdf4463e3a1a0b692d8ee71","5339c4ddf8f1342c63751bd5e186ab67818e780f7203d040aa1688b6a3628fe6","91fde34f0434e94fc67c9f2eaa418b661b50c5c170db6f67459616d846436886","a0fb3491fd481df80018ea786a687229f19aab04897efda1db40fecaf016f3c3","31f0efc8ce4f09a1e5bfd9cb920b6862c5ba9f42a0a9f691f6ab4f166a7031ed","d898c836432c8b1727b629d84eb33ef2247c9420213152e530c7e28ba6049f78","451a650793c87c70c699b68f940954b4bf95d5115eae277595c590b470312b31","dfae5468e1cfa976e5f19388bfe4e64fac62838e3418a0cc72d7a45d9df0902d","96e37cf5e50bac5af9ffc1df2ebe3582dcde0905f4a4ef987f9c188434da12a1","803ebdaff877e156078806a22f9d24e038c8f1690cb67943619a4647b799202f","ee2c7f06f890565e9a636162b7ec6144f2039336e9302dd599f5225f87cca45c","07f6acddb30ad60bcefd2c6738e14086b733cabd0bb0ee752b9cd9ca1b49a877","2cbe1796c1a0028e0ecb0a82143f15a9815c0efb7611fddfec8170ee437fb88c","a4803090dd5bc992b44cefefe7b8f9a4023011b594d6194e8efe517de2b2f5e8","15be5bd580a13feacf1da73771a1325d35aea3c76baf8cf9d3bac422a03c86c8","f0923c98945e86e8516418c4a32275c1856d6a5a3dee23a840f38e95ea5dab8e","89b96b06bfbee597ca294e8286df549064529a31f51cc0962549613a43d47810","80ede86db6081ea65dde877fe0d214bd3157aaa9197d32476b69d42e15ca1002","a70fbb03fef0f10e07ea335a233a9745ce7363f2d8094284cc56d893399fdf64",{"version":"0597960a735f43f442b5237a9023777a279a9378715abb7fb84eb5e3c5149d63","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"6738101ae8e56cd3879ab3f99630ada7d78097fc9fd334df7e766216778ca219","57ddc4e066366bbe04f497f9afce1c88e088dbd09be0618e072754450de3acbb","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","cab425b5559edac18327eb2c3c0f47e7e9f71b667290b7689faafd28aac69eae","3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562","5343f3c160282dfbaab9af350119a0c3b59b7076ef0117bb5995a66e240dab28",{"version":"f4c0db3a49cea9babd5d224ba14243a6a6119bf65a65198994033aaea3a60a71","affectsGlobalScope":true},"204dbe6c72467fb14bbe8f06510b11fb541b6ce29580c6e10ebd3bdb2eb0c1f9","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6","ce013414484233b24f42c0fcfca48a60bb66ab4e13c82953662305e8f1ee4925","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"101eb8b4e972b9326f39591e2e40e967e3331e8d960f81248daeb266ea1affec","affectsGlobalScope":true},"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","0b85cb069d0e427ba946e5eb2d86ef65ffd19867042810516d16919f6c1a5aec","15c88bfd1b8dc7231ff828ae8df5d955bae5ebca4cf2bcb417af5821e52299ae","eb96a2321f717bccc3e49e104e299152984b927ea4546b559ae631c06565819c","ed19da84b7dbf00952ad0b98ce5c194f1903bcf7c94d8103e8e0d63b271543ae","e98185f4249720ace1921d59c1ff4612fa5c633a183fc9bf28e2e7b8e3c7fd51","6168414aa12d33d0fcfac4f9870aa81ce27e136db6faf182001a5f3792e1d720","686e548ae30250d62532c8cacb43fccc922b693408371bd3503563c4a0f28eed","75bdc1b420f0ffc6cc6fd0b6694d89f5072bf755b4e6c7e65a2fda797ca0bb8a","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","13cc3979e1f548aacaa23911f2d6e69c1a2999266c4a1952806de1e9593bdaaa","e5dd317ef2c7a2882b152337b03d592fafa8351b40351849a16a908b198bd3b5","5006668996956580886022c05108e32c742823e1b5652aff7914917233731518","0c52f5366c9146ad79b546e70162c659972a2798522806e8283f3137feab3965","aff59cc6a1f2049bc6ac37cdd5a7d449584f28e7ee5ba240bd903aefdaef6418","77224b06a9d39e8710eca2050acadd9f9e062b068d74aa98e38a6854c272d35e","dcb9aa62f2662b999047096125adfa905cca0c988d7f5130e38ab41afeb96a3f","c757372a092924f5c16eaf11a1475b80b95bb4dae49fe3242d2ad908f97d5abe","2d5c29f803f71f0c768684f98c4ab2e95fff0104b42f0644eb65479d05eccdc3","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","208bb742e0f201470da121bc73847c74b62cff4172f38ae5949ae77d6c9c6b71","3663d1b50f356656a314e5df169bb51cb9d5fd75905fa703f75db6bb32030568","bb654d426b82e0846cd4bd7de91d637039ecdfd63c94447373490178f80846fe","db90f54098b237753ac9c846e39cd49aa538dcad07a2e1c68a138f3c0f8e621d","892f8cf5db77196b9f4da151423570a9ad92f01692740d6137c0a13a006d9121","6e41751646fe275206d052a2e5ba87d27dd0df4dcbca134fc3fd2dc4d3d410d2","eecb2ea10a1500dcc6bdeff14be1fb43806f63a9b8562e16e1b4fc8baa8dfa8d","221a6ab66d611349faaf80af49c7a34d95623787610fd153fed4da0811abdcae","40122dcc63746bc8827d17f5f981668844e6c12537ca3b3e5e1a35883a50d666","966418bf54ad347058abfd433deb2f74480e859adb80b9ddbe90bb3ada1a8eda","e79130cf2ba010f2b79747bf43b086252ad041b130768331a1144c0a86185877","5945e7a91249d0dcbce4609279cb8fa95e45a4ac0edf6b81742724ed38e5018f","dafce7a7b279977940b6b4b50017625e4f922f73094433d2875994bdc0b27e87","ec630acd5a4ac97faadbfff935eb00df5318a6302dd25938685ad8c25c70465c","b3edafa3cb2b51781dffced9ec03613b8fe4981c44dea915f119996d201c1d03","6c559dee3c6251c261b67df08e01d4cbc89cbd7a63300150c636705733cebfff","9b5a5e0d06f8646aa2978afb1b5bb5e608649751e9cfc7290e86be42605ba42f","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","f60e3e3060207ac982da13363181fd7ee4beecc19a7c569f0d6bb034331066c2","17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","87ed0f84f0691d5c724b23159db96342e6b04ac69201b02c65936f4281ce1fbe","13868c5792808236b17dfe2803eafce911ea4d09d3b2fda95391891a494f988f","0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","fa5c2d3fcd8e227e180815df0a0903ed4b116400452af8a75ac5b68e5e1de9da","5f7614d60b32dc66e5d665eafd10d7619eedca3a20f0e876e9ec73141735e364","e91ad231af87f864b3f07cd0e39b1cf6c133988156f087c1c3ccb0a5491c9115","cc256fd958b33576ed32c7338c64adb0d08fc0c2c6525010202fab83f32745da","bf0b1297461549a0e32cd57dffb992c63d7c7134fe0f9e15d359abcc88dbd28c","f83b320cceccfc48457a818d18fc9a006ab18d0bdd727aa2c2e73dc1b4a45e98","24a09dc3e07d69b0a224dbd14b2994c40d1efd0954e759004b61b9e683dabe5f","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","31c502014e5ba046d5cb060136929b73fd53f0f989aa37b2b0424644cb0d93ef","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778","fab58e600970e66547644a44bc9918e3223aa2cbd9e8763cec004b2cfb48827e","b4358a89fcd9c579f84a6c68e2ce44ca91b07e4db3f8f403c2b7a72c1a1e04b6"],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noEmitOnError":true,"outDir":"./","sourceMap":true,"strict":true,"target":5},"fileIdsList":[[71,96,103],[96,103],[71,96,103,170],[68,71,95,96,103,172,173,174],[96],[96,127],[71,96,103,170,180,186],[68,71,96,103,181,182],[96,171,182,183,185],[69,96,103],[68,96,103],[96,197],[96,101,103,197],[68,71,72,76,82,95,96,103,168,178,180,187,189,190,196],[71,95,96,103,203,204],[53,96],[56,96],[57,62,96],[58,68,69,76,85,95,96],[58,59,68,76,96],[60,96],[61,62,69,77,96],[62,85,92,96],[63,65,68,76,96],[64,96],[65,66,96],[67,68,96],[68,96],[68,69,70,85,95,96],[68,69,70,85,96],[71,76,85,95,96],[68,69,71,72,76,85,92,95,96],[71,73,85,92,95,96],[53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102],[68,74,96],[75,95,96],[65,68,76,85,96],[77,96],[78,96],[56,79,96],[80,94,96,100],[81,96],[82,96],[68,83,96],[83,84,96,98],[68,85,86,87,96],[85,87,96],[85,86,96],[88,96],[89,96],[68,90,91,96],[90,91,96],[62,76,92,96],[93,96],[76,94,96],[57,71,82,95,96],[62,96],[85,96,97],[96,98],[96,99],[57,62,68,70,79,85,95,96,98,100],[85,96,101],[96,103,207,209,213,214,215,216,217,218],[85,96,103],[68,96,103,207,209,210,212,219],[68,76,85,95,96,103,206,207,208,210,211,212,219],[85,96,103,209,210],[85,96,103,209,211],[96,103,207,209,210,212,219],[85,96,103,211],[68,76,85,92,96,103,208,210,212],[68,96,103,207,209,210,211,212,219],[68,85,96,103,207,208,209,210,211,212,219],[68,85,96,103,207,209,210,212,219],[71,85,96,103,212],[68,85,92,96,103,222,223,226,227],[69,71,73,76,85,95,96,103,176,229,230],[71,85,96,103],[71,96,103,184],[96,232],[57,69,71,85,96,103,179],[96,235],[68,71,73,85,92,95,96,101,103],[96,103,223,224,225],[85,96,103,223],[96,110],[96,110,122],[96,107,108,109,111,122],[96,113],[96,110,117,121,124],[96,112,124],[96,115,117,120,121,124],[96,115,117,118,120,121,124],[96,107,108,109,110,111,113,114,115,116,117,121,124],[96,106,107,108,109,110,111,113,114,115,116,117,118,120,121,122,123],[96,106,124],[96,117,118,119,121,124],[96,120,124],[96,110,116,121,124],[96,114,122],[96,106],[68,69,71,73,76,85,92,95,96,101,103,104,105,124],[96,100,125,126,127,128],[96,137],[96,148,149,150],[96,137,138,147,151,152,159,160,161,165],[96,145,146],[96,137,138],[96,139,140,141,142],[96,162,163,164],[96,137,153],[96,153,154,155,156,157,158],[96,128,137,143],[96,128,137,166],[96,129,130,131,132,133,134,135,136],[96,130,132],[96,129],[96,130],[96,132]],"referencedMap":[[168,1],[169,2],[171,3],[175,4],[176,5],[177,6],[127,5],[170,1],[178,5],[179,5],[187,7],[183,8],[186,9],[188,10],[189,5],[173,5],[190,5],[191,5],[192,5],[193,5],[194,5],[195,2],[180,5],[172,11],[198,12],[196,12],[199,13],[197,14],[200,12],[201,5],[184,5],[202,5],[204,5],[205,15],[53,16],[54,16],[56,17],[57,18],[58,19],[59,20],[60,21],[61,22],[62,23],[63,24],[64,25],[65,26],[66,26],[67,27],[68,28],[69,29],[70,30],[55,5],[102,5],[71,31],[72,32],[73,33],[103,34],[74,35],[75,36],[76,37],[77,38],[78,39],[79,40],[80,41],[81,42],[82,43],[83,44],[84,45],[85,46],[87,47],[86,48],[88,49],[89,50],[90,51],[91,52],[92,53],[93,54],[94,55],[95,56],[96,57],[97,58],[98,59],[99,60],[100,61],[101,62],[219,63],[206,64],[213,65],[209,66],[207,67],[210,68],[214,69],[215,65],[212,70],[211,71],[216,72],[217,73],[218,74],[208,75],[220,5],[221,5],[227,76],[228,64],[182,5],[181,5],[231,77],[229,78],[174,78],[185,79],[233,80],[232,5],[235,81],[236,82],[230,5],[237,5],[238,83],[234,5],[104,5],[203,78],[226,84],[223,2],[225,85],[224,2],[222,5],[108,86],[107,87],[110,88],[114,89],[111,87],[116,90],[113,91],[118,92],[123,5],[119,93],[122,94],[124,95],[112,96],[120,97],[121,98],[117,99],[109,86],[115,100],[105,5],[106,101],[126,5],[12,5],[11,5],[2,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[3,5],[4,5],[24,5],[21,5],[22,5],[23,5],[25,5],[26,5],[27,5],[5,5],[28,5],[29,5],[30,5],[31,5],[6,5],[32,5],[33,5],[34,5],[35,5],[7,5],[36,5],[41,5],[42,5],[37,5],[38,5],[39,5],[40,5],[8,5],[46,5],[43,5],[44,5],[45,5],[47,5],[9,5],[48,5],[49,5],[50,5],[51,5],[1,5],[10,5],[52,5],[125,102],[128,103],[148,104],[149,104],[151,105],[150,104],[152,104],[166,106],[146,5],[147,107],[145,104],[161,104],[160,104],[139,108],[140,108],[143,109],[141,108],[142,108],[162,5],[164,5],[165,110],[163,5],[154,111],[158,104],[155,111],[157,111],[156,111],[153,5],[159,112],[144,113],[167,114],[136,5],[137,115],[133,116],[130,117],[132,5],[131,118],[135,117],[134,119],[129,5],[138,5]],"exportedModulesMap":[[168,1],[169,2],[171,3],[175,4],[176,5],[177,6],[127,5],[170,1],[178,5],[179,5],[187,7],[183,8],[186,9],[188,10],[189,5],[173,5],[190,5],[191,5],[192,5],[193,5],[194,5],[195,2],[180,5],[172,11],[198,12],[196,12],[199,13],[197,14],[200,12],[201,5],[184,5],[202,5],[204,5],[205,15],[53,16],[54,16],[56,17],[57,18],[58,19],[59,20],[60,21],[61,22],[62,23],[63,24],[64,25],[65,26],[66,26],[67,27],[68,28],[69,29],[70,30],[55,5],[102,5],[71,31],[72,32],[73,33],[103,34],[74,35],[75,36],[76,37],[77,38],[78,39],[79,40],[80,41],[81,42],[82,43],[83,44],[84,45],[85,46],[87,47],[86,48],[88,49],[89,50],[90,51],[91,52],[92,53],[93,54],[94,55],[95,56],[96,57],[97,58],[98,59],[99,60],[100,61],[101,62],[219,63],[206,64],[213,65],[209,66],[207,67],[210,68],[214,69],[215,65],[212,70],[211,71],[216,72],[217,73],[218,74],[208,75],[220,5],[221,5],[227,76],[228,64],[182,5],[181,5],[231,77],[229,78],[174,78],[185,79],[233,80],[232,5],[235,81],[236,82],[230,5],[237,5],[238,83],[234,5],[104,5],[203,78],[226,84],[223,2],[225,85],[224,2],[222,5],[108,86],[107,87],[110,88],[114,89],[111,87],[116,90],[113,91],[118,92],[123,5],[119,93],[122,94],[124,95],[112,96],[120,97],[121,98],[117,99],[109,86],[115,100],[105,5],[106,101],[126,5],[12,5],[11,5],[2,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[3,5],[4,5],[24,5],[21,5],[22,5],[23,5],[25,5],[26,5],[27,5],[5,5],[28,5],[29,5],[30,5],[31,5],[6,5],[32,5],[33,5],[34,5],[35,5],[7,5],[36,5],[41,5],[42,5],[37,5],[38,5],[39,5],[40,5],[8,5],[46,5],[43,5],[44,5],[45,5],[47,5],[9,5],[48,5],[49,5],[50,5],[51,5],[1,5],[10,5],[52,5],[125,102],[128,103],[148,104],[149,104],[151,105],[150,104],[152,104],[166,106],[146,5],[147,107],[145,104],[161,104],[160,104],[139,108],[140,108],[143,109],[141,108],[142,108],[162,5],[164,5],[165,110],[163,5],[154,111],[158,104],[155,111],[157,111],[156,111],[153,5],[159,112],[136,5],[137,115],[133,116],[130,117],[132,5],[131,118],[135,117],[134,119],[129,5],[138,5]],"semanticDiagnosticsPerFile":[168,169,171,175,176,177,127,170,178,179,187,183,186,188,189,173,190,191,192,193,194,195,180,172,198,196,199,197,200,201,184,202,204,205,53,54,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,55,102,71,72,73,103,74,75,76,77,78,79,80,81,82,83,84,85,87,86,88,89,90,91,92,93,94,95,96,97,98,99,100,101,219,206,213,209,207,210,214,215,212,211,216,217,218,208,220,221,227,228,182,181,231,229,174,185,233,232,235,236,230,237,238,234,104,203,226,223,225,224,222,108,107,110,114,111,116,113,118,123,119,122,124,112,120,121,117,109,115,105,106,126,12,11,2,13,14,15,16,17,18,19,20,3,4,24,21,22,23,25,26,27,5,28,29,30,31,6,32,33,34,35,7,36,41,42,37,38,39,40,8,46,43,44,45,47,9,48,49,50,51,1,10,52,125,128,148,149,151,150,152,166,146,147,145,161,160,139,140,143,141,142,162,164,165,163,154,158,155,157,156,153,159,144,167,136,137,133,130,132,131,135,134,129,138]},"version":"4.7.3"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@contember/schema-utils",
3
- "version": "1.2.0-alpha.2",
3
+ "version": "1.2.0-alpha.5",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
7
7
  "scripts": {
8
- "test": "echo 'No tests'"
8
+ "test": "vitest"
9
9
  },
10
10
  "dependencies": {
11
- "@contember/schema": "^1.2.0-alpha.2",
12
- "@contember/typesafe": "^1.2.0-alpha.2"
11
+ "@contember/schema": "^1.2.0-alpha.5",
12
+ "@contember/typesafe": "^1.2.0-alpha.5"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/node": "^17.0.5"
15
+ "@types/node": "^16"
16
16
  }
17
17
  }
package/src/dataUtils.ts CHANGED
@@ -7,6 +7,11 @@ export interface Providers {
7
7
 
8
8
  export const resolveDefaultValue = (column: Model.AnyColumn, providers: Pick<Providers, 'now'>) => {
9
9
  const type = column.type
10
+
11
+ if (type === Model.ColumnType.Int && column.sequence) {
12
+ return undefined
13
+ }
14
+
10
15
  switch (type) {
11
16
  case Model.ColumnType.String:
12
17
  case Model.ColumnType.Int:
@@ -2,20 +2,31 @@ import crypto from 'crypto'
2
2
 
3
3
  export class NamingHelper {
4
4
  public static createForeignKeyName(fromTable: string, fromColumn: string, toTable: string, toColumn: string): string {
5
- const uniqueSuffix = crypto
6
- .createHash('sha256')
7
- .update(JSON.stringify([fromTable, fromColumn, toTable, toColumn]), 'ascii')
8
- .digest('hex')
5
+ return 'fk_'
6
+ + fromTable + '_'
7
+ + fromColumn + '_'
8
+ + this.createUniqueSuffix([fromTable, fromColumn, toTable, toColumn])
9
+ }
9
10
 
10
- return 'fk_' + fromTable + '_' + fromColumn + '_' + uniqueSuffix.slice(0, 6)
11
+ public static createIndexName = (entityName: string, fields: readonly string[]): string => {
12
+ return 'idx_'
13
+ + entityName + '_'
14
+ + fields.join('_') + '_'
15
+ + this.createUniqueSuffix([entityName, ...fields])
11
16
  }
12
17
 
13
18
  public static createUniqueConstraintName = (entityName: string, fields: readonly string[]): string => {
19
+ return 'unique_'
20
+ + entityName + '_'
21
+ + fields.join('_') + '_'
22
+ + this.createUniqueSuffix([entityName, ...fields])
23
+ }
24
+
25
+ private static createUniqueSuffix = (values: string[]): string => {
14
26
  const uniqueSuffix = crypto
15
27
  .createHash('sha256')
16
- .update(JSON.stringify([entityName, ...fields]), 'ascii')
28
+ .update(JSON.stringify(values), 'ascii')
17
29
  .digest('hex')
18
-
19
- return 'unique_' + entityName + '_' + fields.join('_') + '_' + uniqueSuffix.slice(0, 6)
30
+ return uniqueSuffix.slice(0, 6)
20
31
  }
21
32
  }
@@ -18,6 +18,14 @@ export const normalizeSchema = <S extends Schema>(schema: S): S => {
18
18
  read: true,
19
19
  },
20
20
  },
21
+ content: {
22
+ export: true,
23
+ import: true,
24
+ },
25
+ system: {
26
+ export: true,
27
+ import: true,
28
+ },
21
29
  ...((schema.acl.roles?.[ProjectRole.ADMIN] as Acl.RolePermissions | undefined) || {}),
22
30
  },
23
31
  [ProjectRole.CONTENT_ADMIN]: {
@@ -30,11 +38,14 @@ export const normalizeSchema = <S extends Schema>(schema: S): S => {
30
38
  read: true,
31
39
  },
32
40
  },
41
+ content: {
42
+ export: true,
43
+ import: true,
44
+ },
33
45
  system: {
34
- diff: Acl.SystemPermissionsLevel.any,
35
- history: Acl.SystemPermissionsLevel.any,
36
- release: Acl.SystemPermissionsLevel.any,
37
- rebase: Acl.SystemPermissionsLevel.any,
46
+ history: true,
47
+ export: true,
48
+ import: true,
38
49
  },
39
50
  ...((schema.acl.roles?.[ProjectRole.CONTENT_ADMIN] as Acl.RolePermissions | undefined) || {}),
40
51
  },
@@ -28,11 +28,15 @@ const systemPermissionsSchema = Typesafe.partial({
28
28
  history: Typesafe.union(Typesafe.boolean, Typesafe.enumeration('any', 'none')),
29
29
  migrate: Typesafe.boolean,
30
30
  assumeIdentity: Typesafe.boolean,
31
+ export: Typesafe.boolean,
32
+ import: Typesafe.boolean,
31
33
  })
32
34
  const systemSchemaCheck: Typesafe.Equals<Acl.SystemPermissions, ReturnType<typeof systemPermissionsSchema>> = true
33
35
 
34
36
  const contentPermissionsSchema = Typesafe.partial({
35
37
  assumeMembership: membershipMatchRuleSchema,
38
+ export: Typesafe.boolean,
39
+ import: Typesafe.boolean,
36
40
  })
37
41
  const contentSchemaCheck: Typesafe.Equals<Acl.ContentPermissions, ReturnType<typeof contentPermissionsSchema>> = true
38
42
 
@@ -0,0 +1,81 @@
1
+ import * as Typesafe from '@contember/typesafe'
2
+ import { Type } from '@contember/typesafe'
3
+ import { Input, Model, Value } from '@contember/schema'
4
+
5
+ export const conditionSchema = <T extends Value.FieldValue>(type?: Model.ColumnType): Type<Input.Condition<T>> => {
6
+ const metadata = type ? resolveColumnMetadata(type) : { type: Typesafe.scalar }
7
+ return conditionSchemaInner(metadata)
8
+ }
9
+
10
+ interface ResolvedColumnMetadata<T> {
11
+ type: Typesafe.Type<T>
12
+ isJson?: boolean
13
+ isString?: boolean
14
+ }
15
+
16
+ const conditionSchemaInner = <T>(metadata: ResolvedColumnMetadata<T>): Type<Input.Condition<T>> => {
17
+ return (input: unknown, path: PropertyKey[] = []): Input.Condition<T> => {
18
+ const self = conditionSchemaInner(metadata)
19
+ const inner = metadata.type
20
+ const objectSchema = Typesafe.noExtraProps(Typesafe.partial({
21
+ and: Typesafe.array(self),
22
+ or: Typesafe.array(self),
23
+ not: self,
24
+ null: Typesafe.boolean,
25
+ isNull: Typesafe.boolean,
26
+ never: Typesafe.true_,
27
+ always: Typesafe.true_,
28
+ ...(metadata.isJson !== true ? {
29
+ eq: inner,
30
+ notEq: inner,
31
+ in: Typesafe.array(inner),
32
+ notIn: Typesafe.array(inner),
33
+ lt: inner,
34
+ lte: inner,
35
+ gt: inner,
36
+ gte: inner,
37
+ } : {}),
38
+ ...(metadata.isString !== false ? {
39
+ contains: Typesafe.string,
40
+ startsWith: Typesafe.string,
41
+ endsWith: Typesafe.string,
42
+ containsCI: Typesafe.string,
43
+ startsWithCI: Typesafe.string,
44
+ endsWithCI: Typesafe.string,
45
+ } : {}),
46
+ }))
47
+ return objectSchema(input, path) as Input.Condition<T>
48
+ }
49
+ }
50
+
51
+ const resolveColumnMetadata = (type: Model.ColumnType): ResolvedColumnMetadata<any> => {
52
+ const resolvedType = Typesafe.nullable(resolveColumnTypeSchema(type))
53
+ return {
54
+ type: resolvedType,
55
+ isJson: type === Model.ColumnType.Json,
56
+ isString: type === Model.ColumnType.String,
57
+
58
+ }
59
+ }
60
+
61
+
62
+ const resolveColumnTypeSchema = (type: Model.ColumnType) => {
63
+ switch (type) {
64
+ case Model.ColumnType.Bool:
65
+ return Typesafe.boolean
66
+
67
+ // todo: validate format of string-like inputs uuid, date, enum
68
+ case Model.ColumnType.Date:
69
+ case Model.ColumnType.DateTime:
70
+ case Model.ColumnType.Uuid:
71
+ case Model.ColumnType.Enum:
72
+ case Model.ColumnType.String:
73
+ return Typesafe.string
74
+ case Model.ColumnType.Double:
75
+ return Typesafe.number
76
+ case Model.ColumnType.Int:
77
+ return Typesafe.integer
78
+ case Model.ColumnType.Json:
79
+ return Typesafe.anyJson
80
+ }
81
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './acl'
2
+ export * from './condition'
2
3
  export * from './model'
3
4
  export * from './validation'
@@ -147,6 +147,12 @@ const viewSchemaInner = Typesafe.intersection(
147
147
  const viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true
148
148
  const viewSchema: Typesafe.Type<Model.View> = viewSchemaInner
149
149
 
150
+
151
+ const indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(Typesafe.record(Typesafe.string, Typesafe.object({
152
+ fields: Typesafe.array(Typesafe.string),
153
+ name: Typesafe.string,
154
+ })), { })
155
+
150
156
  const entitySchema = Typesafe.intersection(
151
157
  Typesafe.object({
152
158
  name: Typesafe.string,
@@ -158,6 +164,7 @@ const entitySchema = Typesafe.intersection(
158
164
  fields: Typesafe.array(Typesafe.string),
159
165
  name: Typesafe.string,
160
166
  })),
167
+ indexes: indexesSchema,
161
168
  eventLog: eventLogSchema,
162
169
  }),
163
170
  Typesafe.partial({
@@ -2,6 +2,8 @@ import { Acl, Model } from '@contember/schema'
2
2
  import { PredicateDefinitionProcessor } from '../acl'
3
3
  import { getEntity } from '../model'
4
4
  import { ErrorBuilder, ValidationError } from './errors'
5
+ import { conditionSchema } from '../type-schema/condition'
6
+ import { anyJson } from '@contember/typesafe'
5
7
 
6
8
 
7
9
  export class AclValidator {
@@ -128,8 +130,16 @@ export class AclValidator {
128
130
  const processor = new PredicateDefinitionProcessor(this.model)
129
131
  processor.process(entity, predicate, {
130
132
  handleColumn: ctx => {
131
- if (typeof ctx.value === 'string' && !variables[ctx.value]) {
132
- errorBuilder.for(...ctx.path).add(`Undefined variable ${ctx.value}`)
133
+ if (typeof ctx.value === 'string') {
134
+ if (!variables[ctx.value]) {
135
+ errorBuilder.for(...ctx.path).add(`Undefined variable ${ctx.value}`)
136
+ }
137
+ } else {
138
+ try {
139
+ conditionSchema(ctx.column.type)(ctx.value)
140
+ } catch (e: any) {
141
+ errorBuilder.for(...ctx.path).add(`Invalid condition (${e.message}): ${JSON.stringify(ctx.value)}`)
142
+ }
133
143
  }
134
144
  return ctx.value
135
145
  },
@@ -0,0 +1,133 @@
1
+ import { Acl, Input } from '@contember/schema'
2
+ import { getRoleVariables } from '../acl'
3
+ import { conditionSchema } from '../type-schema'
4
+
5
+
6
+ export class MembershipResolver {
7
+ public static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }
8
+
9
+ resolve(
10
+ acl: Acl.Schema,
11
+ memberships: readonly Acl.Membership[],
12
+ identity: {
13
+ identityId: string
14
+ personId?: string
15
+ },
16
+ ): MembershipReadResult {
17
+ const errors: MembershipValidationError[] = []
18
+ const parsed: ParsedMembership[] = []
19
+ const roles = acl.roles
20
+ for (const membership of memberships) {
21
+ if (!roles[membership.role]) {
22
+ errors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))
23
+ continue
24
+ }
25
+ const roleVariables = getRoleVariables(membership.role, acl)
26
+ for (const variable of membership.variables) {
27
+ if (!roleVariables[variable.name] || roleVariables[variable.name].type === Acl.VariableType.predefined) {
28
+ errors.push(
29
+ new MembershipValidationError(
30
+ membership.role,
31
+ MembershipValidationErrorType.VARIABLE_NOT_FOUND,
32
+ variable.name,
33
+ ),
34
+ )
35
+ }
36
+ }
37
+ const [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity)
38
+ errors.push(...membershipErrors)
39
+ parsed.push({
40
+ role: membership.role,
41
+ variables: parsedVariables,
42
+ })
43
+ }
44
+ return new MembershipReadResult(errors, parsed)
45
+ }
46
+
47
+ private readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {
48
+ identityId: string
49
+ personId?: string
50
+ }): [MembershipValidationError[], ParsedMembershipVariable[]] {
51
+ const errors: MembershipValidationError[] = []
52
+ const parsedVariables: ParsedMembershipVariable[] = []
53
+ for (const [name, variable] of Object.entries(roleVariables)) {
54
+ const inputVariable = membership.variables.find(it => it.name === name)
55
+ if (variable.type === Acl.VariableType.predefined) {
56
+ switch (variable.value) {
57
+ case 'identityID':
58
+ parsedVariables.push({ name, condition: { in: [identity.identityId] } })
59
+ break
60
+ case 'personID':
61
+ parsedVariables.push({
62
+ name,
63
+ condition: { in: identity.personId ? [identity.personId] : [] },
64
+ })
65
+ break
66
+ default:
67
+ parsedVariables.push({ name, condition: { never: true } })
68
+ errors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))
69
+ break
70
+ }
71
+ continue
72
+ }
73
+
74
+ if (!inputVariable) {
75
+ errors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))
76
+ parsedVariables.push({ name, condition: { never: true } })
77
+ continue
78
+ }
79
+
80
+ if (variable.type === Acl.VariableType.entity) {
81
+ parsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int
82
+
83
+ } else if (variable.type === Acl.VariableType.condition) {
84
+ try {
85
+ const conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))
86
+ parsedVariables.push({
87
+ name,
88
+ condition: conditions.length === 1 ? conditions[0] : { or: conditions },
89
+ })
90
+ } catch {
91
+ errors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))
92
+ parsedVariables.push({ name, condition: { never: true } })
93
+ }
94
+ }
95
+ }
96
+ return [errors, parsedVariables]
97
+ }
98
+ }
99
+
100
+ export class MembershipReadResult {
101
+ constructor(
102
+ public readonly errors: MembershipValidationError[],
103
+ public readonly memberships: ParsedMembership[],
104
+ ) {
105
+ }
106
+ }
107
+
108
+ export class MembershipValidationError {
109
+ constructor(
110
+ public readonly role: string,
111
+ public readonly error: MembershipValidationErrorType,
112
+ public readonly variable?: string,
113
+ ) {
114
+ }
115
+ }
116
+
117
+ export enum MembershipValidationErrorType {
118
+ ROLE_NOT_FOUND = 'roleNotFound',
119
+ VARIABLE_NOT_FOUND = 'variableNotFound',
120
+ VARIABLE_EMPTY = 'variableEmpty',
121
+ VARIABLE_INVALID = 'variableInvalid',
122
+ }
123
+
124
+
125
+ export interface ParsedMembershipVariable {
126
+ readonly name: string
127
+ readonly condition: Input.Condition
128
+ }
129
+
130
+ export interface ParsedMembership {
131
+ readonly role: string
132
+ readonly variables: readonly ParsedMembershipVariable[]
133
+ }
@@ -105,12 +105,21 @@ export class ModelValidator {
105
105
  })
106
106
  }
107
107
  if (partialEntity.view) {
108
+ if (field.type === Model.RelationType.ManyHasMany) {
109
+ return errors.add('Many-has-many relation is not allowed on a view entity.')
110
+ }
111
+ if (
112
+ !targetEntity.view &&
113
+ field.type === Model.RelationType.OneHasMany
114
+ ) {
115
+ return errors.add('One-has-many relation fields on views must point to a view entity.')
116
+ }
108
117
  if (
109
- field.type === Model.RelationType.ManyHasMany ||
110
- field.type === Model.RelationType.OneHasMany ||
111
- (field.type === Model.RelationType.OneHasOne && !('joiningColumn' in field))
118
+ !targetEntity.view &&
119
+ field.type === Model.RelationType.OneHasOne &&
120
+ !('joiningColumn' in field)
112
121
  ) {
113
- return errors.add('This relation type is not allowed on a view entity. Only one-has-one owning and many-has one are allowed.')
122
+ return errors.add('One-has-one relation fields on views must be owning or point to a view entity.')
114
123
  }
115
124
  }
116
125
  if (isInverseRelation(field)) {
@@ -3,3 +3,4 @@ export * from './ModelValidator'
3
3
  export * from './ValidationValidator'
4
4
  export * from './errors'
5
5
  export * from './SchemaValidator'
6
+ export * from './MembershipResolver'
@@ -0,0 +1,55 @@
1
+ import { assert, test, describe } from 'vitest'
2
+ import { conditionSchema } from '../../../src/type-schema'
3
+ import { Model } from '@contember/schema'
4
+
5
+ describe('condition schema', () => {
6
+ test('accept composite type', () => {
7
+ const condition = {
8
+ and: [{ isNull: true }, { not: { isNull: false } }],
9
+ }
10
+ assert.deepStrictEqual(conditionSchema()(condition), condition)
11
+ })
12
+
13
+ test('accept string-only condition for unknown type', () => {
14
+ const condition = {
15
+ containsCI: 'foo',
16
+ }
17
+ assert.deepStrictEqual(conditionSchema()(condition), condition)
18
+ })
19
+
20
+ test('accept string-only condition for string type', () => {
21
+ const condition = {
22
+ containsCI: 'foo',
23
+ }
24
+ assert.deepStrictEqual(conditionSchema(Model.ColumnType.String)(condition), condition)
25
+ })
26
+
27
+ test('reject string-only condition for int type', () => {
28
+ const condition = {
29
+ containsCI: 'foo',
30
+ }
31
+ assert.throw(() => conditionSchema(Model.ColumnType.Int)(condition), 'value at root: extra property containsCI found')
32
+ })
33
+
34
+
35
+ test('accept non-json condition for unknown type', () => {
36
+ const condition = {
37
+ eq: 'foo',
38
+ }
39
+ assert.deepStrictEqual(conditionSchema()(condition), condition)
40
+ })
41
+
42
+ test('accept non-json condition for string type', () => {
43
+ const condition = {
44
+ eq: 'foo',
45
+ }
46
+ assert.deepStrictEqual(conditionSchema(Model.ColumnType.String)(condition), condition)
47
+ })
48
+
49
+ test('reject non-json condition for json type', () => {
50
+ const condition = {
51
+ eq: 'foo',
52
+ }
53
+ assert.throw(() => conditionSchema(Model.ColumnType.Json)(condition), 'value at root: extra property eq found')
54
+ })
55
+ })