@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.
- package/dist/src/dataUtils.d.ts +1 -1
- package/dist/src/dataUtils.d.ts.map +1 -1
- package/dist/src/dataUtils.js +3 -0
- package/dist/src/dataUtils.js.map +1 -1
- package/dist/src/model/NamingHelper.d.ts +2 -0
- package/dist/src/model/NamingHelper.d.ts.map +1 -1
- package/dist/src/model/NamingHelper.js +20 -7
- package/dist/src/model/NamingHelper.js.map +1 -1
- package/dist/src/schemaNormalizer.d.ts.map +1 -1
- package/dist/src/schemaNormalizer.js +15 -4
- package/dist/src/schemaNormalizer.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/type-schema/acl.d.ts.map +1 -1
- package/dist/src/type-schema/acl.js +4 -0
- package/dist/src/type-schema/acl.js.map +1 -1
- package/dist/src/type-schema/condition.d.ts +5 -0
- package/dist/src/type-schema/condition.d.ts.map +1 -0
- package/dist/src/type-schema/condition.js +95 -0
- package/dist/src/type-schema/condition.js.map +1 -0
- package/dist/src/type-schema/index.d.ts +1 -0
- package/dist/src/type-schema/index.d.ts.map +1 -1
- package/dist/src/type-schema/index.js +1 -0
- package/dist/src/type-schema/index.js.map +1 -1
- package/dist/src/type-schema/model.d.ts +1 -0
- package/dist/src/type-schema/model.d.ts.map +1 -1
- package/dist/src/type-schema/model.js +5 -0
- package/dist/src/type-schema/model.js.map +1 -1
- package/dist/src/validation/AclValidator.d.ts.map +1 -1
- package/dist/src/validation/AclValidator.js +13 -2
- package/dist/src/validation/AclValidator.js.map +1 -1
- package/dist/src/validation/MembershipResolver.d.ts +37 -0
- package/dist/src/validation/MembershipResolver.d.ts.map +1 -0
- package/dist/src/validation/MembershipResolver.js +104 -0
- package/dist/src/validation/MembershipResolver.js.map +1 -0
- package/dist/src/validation/ModelValidator.d.ts.map +1 -1
- package/dist/src/validation/ModelValidator.js +11 -4
- package/dist/src/validation/ModelValidator.js.map +1 -1
- package/dist/src/validation/index.d.ts +1 -0
- package/dist/src/validation/index.d.ts.map +1 -1
- package/dist/src/validation/index.js +1 -0
- package/dist/src/validation/index.js.map +1 -1
- package/dist/tests/cases/unit/conditionSchema.test.d.ts +2 -0
- package/dist/tests/cases/unit/conditionSchema.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/conditionSchema.test.js +50 -0
- package/dist/tests/cases/unit/conditionSchema.test.js.map +1 -0
- package/dist/tests/cases/unit/membershipResolver.test.d.ts +2 -0
- package/dist/tests/cases/unit/membershipResolver.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/membershipResolver.test.js +149 -0
- package/dist/tests/cases/unit/membershipResolver.test.js.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -0
- package/package.json +5 -5
- package/src/dataUtils.ts +5 -0
- package/src/model/NamingHelper.ts +19 -8
- package/src/schemaNormalizer.ts +15 -4
- package/src/type-schema/acl.ts +4 -0
- package/src/type-schema/condition.ts +81 -0
- package/src/type-schema/index.ts +1 -0
- package/src/type-schema/model.ts +7 -0
- package/src/validation/AclValidator.ts +12 -2
- package/src/validation/MembershipResolver.ts +133 -0
- package/src/validation/ModelValidator.ts +13 -4
- package/src/validation/index.ts +1 -0
- package/tests/cases/unit/conditionSchema.test.ts +55 -0
- package/tests/cases/unit/membershipResolver.test.ts +161 -0
- package/tests/tsconfig.json +12 -0
- 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.
|
|
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": "
|
|
8
|
+
"test": "vitest"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@contember/schema": "^1.2.0-alpha.
|
|
12
|
-
"@contember/typesafe": "^1.2.0-alpha.
|
|
11
|
+
"@contember/schema": "^1.2.0-alpha.5",
|
|
12
|
+
"@contember/typesafe": "^1.2.0-alpha.5"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@types/node": "^
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
.
|
|
5
|
+
return 'fk_'
|
|
6
|
+
+ fromTable + '_'
|
|
7
|
+
+ fromColumn + '_'
|
|
8
|
+
+ this.createUniqueSuffix([fromTable, fromColumn, toTable, toColumn])
|
|
9
|
+
}
|
|
9
10
|
|
|
10
|
-
|
|
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(
|
|
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
|
}
|
package/src/schemaNormalizer.ts
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
},
|
package/src/type-schema/acl.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/type-schema/index.ts
CHANGED
package/src/type-schema/model.ts
CHANGED
|
@@ -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'
|
|
132
|
-
|
|
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
|
-
|
|
110
|
-
field.type === Model.RelationType.
|
|
111
|
-
|
|
118
|
+
!targetEntity.view &&
|
|
119
|
+
field.type === Model.RelationType.OneHasOne &&
|
|
120
|
+
!('joiningColumn' in field)
|
|
112
121
|
) {
|
|
113
|
-
return errors.add('
|
|
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)) {
|
package/src/validation/index.ts
CHANGED
|
@@ -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
|
+
})
|