diff --git a/packages/language/src/generated/ast.ts b/packages/language/src/generated/ast.ts index e63fa013c..7dd5c073c 100644 --- a/packages/language/src/generated/ast.ts +++ b/packages/language/src/generated/ast.ts @@ -14,16 +14,10 @@ export function isAbstractDeclaration(item: unknown): item is AbstractDeclaratio return reflection.isInstance(item, AbstractDeclaration); } -export type AttributeAttributeName = string; - -export function isAttributeAttributeName(item: unknown): item is AttributeAttributeName { - return typeof item === 'string'; -} - -export type AttributeName = AttributeAttributeName | DataModelAttributeName | DataModelFieldAttributeName; +export type AttributeName = DataModelAttributeName | DataModelFieldAttributeName | InternalAttributeName; export function isAttributeName(item: unknown): item is AttributeName { - return isDataModelAttributeName(item) || isDataModelFieldAttributeName(item) || isAttributeAttributeName(item); + return isDataModelAttributeName(item) || isDataModelFieldAttributeName(item) || isInternalAttributeName(item); } export type BuiltinType = 'BigInt' | 'Boolean' | 'Bytes' | 'DateTime' | 'Decimal' | 'Float' | 'Int' | 'Json' | 'String'; @@ -58,6 +52,12 @@ export function isExpressionType(item: unknown): item is ExpressionType { return item === 'String' || item === 'Int' || item === 'Float' || item === 'Boolean' || item === 'DateTime' || item === 'Null' || item === 'Object' || item === 'Any' || item === 'Unsupported'; } +export type InternalAttributeName = string; + +export function isInternalAttributeName(item: unknown): item is InternalAttributeName { + return typeof item === 'string'; +} + export type QualifiedName = string; export function isQualifiedName(item: unknown): item is QualifiedName { @@ -114,7 +114,7 @@ export function isArrayExpr(item: unknown): item is ArrayExpr { export interface Attribute extends AstNode { readonly $container: Model; readonly $type: 'Attribute'; - attributes: Array + attributes: Array name: AttributeName params: Array } @@ -126,7 +126,7 @@ export function isAttribute(item: unknown): item is Attribute { } export interface AttributeArg extends AstNode { - readonly $container: AttributeAttribute | DataModelAttribute | DataModelFieldAttribute; + readonly $container: DataModelAttribute | DataModelFieldAttribute | InternalAttribute; readonly $type: 'AttributeArg'; name?: RegularID value: Expression @@ -138,19 +138,6 @@ export function isAttributeArg(item: unknown): item is AttributeArg { return reflection.isInstance(item, AttributeArg); } -export interface AttributeAttribute extends AstNode { - readonly $container: Attribute; - readonly $type: 'AttributeAttribute'; - args: Array - decl: Reference -} - -export const AttributeAttribute = 'AttributeAttribute'; - -export function isAttributeAttribute(item: unknown): item is AttributeAttribute { - return reflection.isInstance(item, AttributeAttribute); -} - export interface AttributeParam extends AstNode { readonly $container: Attribute; readonly $type: 'AttributeParam'; @@ -339,6 +326,7 @@ export function isFieldInitializer(item: unknown): item is FieldInitializer { export interface FunctionDecl extends AstNode { readonly $container: Model; readonly $type: 'FunctionDecl'; + attributes: Array expression?: Expression name: RegularID params: Array @@ -405,6 +393,19 @@ export function isGeneratorField(item: unknown): item is GeneratorField { return reflection.isInstance(item, GeneratorField); } +export interface InternalAttribute extends AstNode { + readonly $container: Attribute | FunctionDecl; + readonly $type: 'InternalAttribute'; + args: Array + decl: Reference +} + +export const InternalAttribute = 'InternalAttribute'; + +export function isInternalAttribute(item: unknown): item is InternalAttribute { + return reflection.isInstance(item, InternalAttribute); +} + export interface InvocationExpr extends AstNode { readonly $container: Argument | ArrayExpr | AttributeArg | BinaryExpr | DataSourceField | FieldInitializer | FunctionDecl | GeneratorField | MemberAccessExpr | PluginField | UnaryExpr | UnsupportedFieldType; readonly $type: 'InvocationExpr'; @@ -586,7 +587,6 @@ export type ZModelAstType = { ArrayExpr: ArrayExpr Attribute: Attribute AttributeArg: AttributeArg - AttributeAttribute: AttributeAttribute AttributeParam: AttributeParam AttributeParamType: AttributeParamType BinaryExpr: BinaryExpr @@ -606,6 +606,7 @@ export type ZModelAstType = { FunctionParamType: FunctionParamType GeneratorDecl: GeneratorDecl GeneratorField: GeneratorField + InternalAttribute: InternalAttribute InvocationExpr: InvocationExpr LiteralExpr: LiteralExpr MemberAccessExpr: MemberAccessExpr @@ -627,7 +628,7 @@ export type ZModelAstType = { export class ZModelAstReflection extends AbstractAstReflection { getAllTypes(): string[] { - return ['AbstractDeclaration', 'Argument', 'ArrayExpr', 'Attribute', 'AttributeArg', 'AttributeAttribute', 'AttributeParam', 'AttributeParamType', 'BinaryExpr', 'DataModel', 'DataModelAttribute', 'DataModelField', 'DataModelFieldAttribute', 'DataModelFieldType', 'DataSource', 'DataSourceField', 'Enum', 'EnumField', 'Expression', 'FieldInitializer', 'FunctionDecl', 'FunctionParam', 'FunctionParamType', 'GeneratorDecl', 'GeneratorField', 'InvocationExpr', 'LiteralExpr', 'MemberAccessExpr', 'Model', 'ModelImport', 'NullExpr', 'ObjectExpr', 'Plugin', 'PluginField', 'ReferenceArg', 'ReferenceExpr', 'ReferenceTarget', 'ThisExpr', 'TypeDeclaration', 'UnaryExpr', 'UnsupportedFieldType']; + return ['AbstractDeclaration', 'Argument', 'ArrayExpr', 'Attribute', 'AttributeArg', 'AttributeParam', 'AttributeParamType', 'BinaryExpr', 'DataModel', 'DataModelAttribute', 'DataModelField', 'DataModelFieldAttribute', 'DataModelFieldType', 'DataSource', 'DataSourceField', 'Enum', 'EnumField', 'Expression', 'FieldInitializer', 'FunctionDecl', 'FunctionParam', 'FunctionParamType', 'GeneratorDecl', 'GeneratorField', 'InternalAttribute', 'InvocationExpr', 'LiteralExpr', 'MemberAccessExpr', 'Model', 'ModelImport', 'NullExpr', 'ObjectExpr', 'Plugin', 'PluginField', 'ReferenceArg', 'ReferenceExpr', 'ReferenceTarget', 'ThisExpr', 'TypeDeclaration', 'UnaryExpr', 'UnsupportedFieldType']; } protected override computeIsSubtype(subtype: string, supertype: string): boolean { @@ -669,11 +670,6 @@ export class ZModelAstReflection extends AbstractAstReflection { getReferenceType(refInfo: ReferenceInfo): string { const referenceId = `${refInfo.container.$type}:${refInfo.property}`; switch (referenceId) { - case 'AttributeAttribute:decl': - case 'DataModelAttribute:decl': - case 'DataModelFieldAttribute:decl': { - return Attribute; - } case 'AttributeParamType:reference': case 'DataModelFieldType:reference': case 'FunctionParamType:reference': { @@ -682,6 +678,11 @@ export class ZModelAstReflection extends AbstractAstReflection { case 'DataModel:superTypes': { return DataModel; } + case 'DataModelAttribute:decl': + case 'DataModelFieldAttribute:decl': + case 'InternalAttribute:decl': { + return Attribute; + } case 'InvocationExpr:function': { return FunctionDecl; } @@ -716,14 +717,6 @@ export class ZModelAstReflection extends AbstractAstReflection { ] }; } - case 'AttributeAttribute': { - return { - name: 'AttributeAttribute', - mandatory: [ - { name: 'args', type: 'array' } - ] - }; - } case 'AttributeParam': { return { name: 'AttributeParam', @@ -818,6 +811,7 @@ export class ZModelAstReflection extends AbstractAstReflection { return { name: 'FunctionDecl', mandatory: [ + { name: 'attributes', type: 'array' }, { name: 'params', type: 'array' } ] }; @@ -846,6 +840,14 @@ export class ZModelAstReflection extends AbstractAstReflection { ] }; } + case 'InternalAttribute': { + return { + name: 'InternalAttribute', + mandatory: [ + { name: 'args', type: 'array' } + ] + }; + } case 'InvocationExpr': { return { name: 'InvocationExpr', diff --git a/packages/language/src/generated/grammar.ts b/packages/language/src/generated/grammar.ts index 96b8840ea..03814f026 100644 --- a/packages/language/src/generated/grammar.ts +++ b/packages/language/src/generated/grammar.ts @@ -1004,42 +1004,6 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel "parameters": [], "wildcard": false }, - { - "$type": "ParserRule", - "name": "UnaryExpr", - "definition": { - "$type": "Group", - "elements": [ - { - "$type": "Assignment", - "feature": "operator", - "operator": "=", - "terminal": { - "$type": "Keyword", - "value": "!" - } - }, - { - "$type": "Assignment", - "feature": "operand", - "operator": "=", - "terminal": { - "$type": "RuleCall", - "rule": { - "$ref": "#/rules@9" - }, - "arguments": [] - } - } - ] - }, - "definesHiddenTokens": false, - "entry": false, - "fragment": false, - "hiddenTokens": [], - "parameters": [], - "wildcard": false - }, { "$type": "ParserRule", "name": "MemberAccessExpr", @@ -1102,6 +1066,42 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel "parameters": [], "wildcard": false }, + { + "$type": "ParserRule", + "name": "UnaryExpr", + "definition": { + "$type": "Group", + "elements": [ + { + "$type": "Assignment", + "feature": "operator", + "operator": "=", + "terminal": { + "$type": "Keyword", + "value": "!" + } + }, + { + "$type": "Assignment", + "feature": "operand", + "operator": "=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$ref": "#/rules@20" + }, + "arguments": [] + } + } + ] + }, + "definesHiddenTokens": false, + "entry": false, + "fragment": false, + "hiddenTokens": [], + "parameters": [], + "wildcard": false + }, { "$type": "ParserRule", "name": "CollectionPredicateExpr", @@ -1115,7 +1115,7 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel { "$type": "RuleCall", "rule": { - "$ref": "#/rules@21" + "$ref": "#/rules@20" }, "arguments": [] }, @@ -1522,28 +1522,28 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel { "$type": "RuleCall", "rule": { - "$ref": "#/rules@19" + "$ref": "#/rules@21" }, "arguments": [] }, { "$type": "RuleCall", "rule": { - "$ref": "#/rules@11" + "$ref": "#/rules@19" }, "arguments": [] }, { "$type": "RuleCall", "rule": { - "$ref": "#/rules@14" + "$ref": "#/rules@11" }, "arguments": [] }, { "$type": "RuleCall", "rule": { - "$ref": "#/rules@20" + "$ref": "#/rules@14" }, "arguments": [] }, @@ -2242,6 +2242,19 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel { "$type": "Keyword", "value": "}" + }, + { + "$type": "Assignment", + "feature": "attributes", + "operator": "+=", + "terminal": { + "$type": "RuleCall", + "rule": { + "$ref": "#/rules@50" + }, + "arguments": [] + }, + "cardinality": "*" } ] }, @@ -2492,7 +2505,7 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel }, { "$type": "ParserRule", - "name": "AttributeAttributeName", + "name": "InternalAttributeName", "dataType": "string", "definition": { "$type": "Group", @@ -2988,7 +3001,7 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel }, { "$type": "ParserRule", - "name": "AttributeAttribute", + "name": "InternalAttribute", "definition": { "$type": "Group", "elements": [ diff --git a/packages/language/src/zmodel.langium b/packages/language/src/zmodel.langium index baa0736c4..a06bd120e 100644 --- a/packages/language/src/zmodel.langium +++ b/packages/language/src/zmodel.langium @@ -73,9 +73,6 @@ FieldInitializer: InvocationExpr: function=[FunctionDecl] '(' ArgumentList? ')'; -UnaryExpr: - operator=('!') operand=Expression; - // binary operator precedence follow Javascript's rules: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table @@ -85,6 +82,9 @@ MemberAccessExpr infers Expression: ('.' member=[DataModelField]) )*; +UnaryExpr: + operator=('!') operand=MemberAccessExpr; + CollectionPredicateExpr infers Expression: MemberAccessExpr ( {infer BinaryExpr.left=current} @@ -141,10 +141,10 @@ PrimaryExpr infers Expression: ThisExpr | NullExpr | LiteralExpr | + UnaryExpr | InvocationExpr | ArrayExpr| ReferenceExpr | - UnaryExpr | ObjectExpr; fragment ArgumentList: @@ -188,7 +188,7 @@ EnumField: // function FunctionDecl: - TRIPLE_SLASH_COMMENT* 'function' name=RegularID '(' (params+=FunctionParam (',' params+=FunctionParam)*)? ')' ':' returnType=FunctionParamType '{' (expression=Expression)? '}'; + TRIPLE_SLASH_COMMENT* 'function' name=RegularID '(' (params+=FunctionParam (',' params+=FunctionParam)*)? ')' ':' returnType=FunctionParamType '{' (expression=Expression)? '}' (attributes+=InternalAttribute)*; FunctionParam: TRIPLE_SLASH_COMMENT* name=RegularID ':' type=FunctionParamType (optional?='?')?; @@ -205,8 +205,8 @@ RegularID returns string: // include keywords that we'd like to work as ID in most places ID | 'model' | 'enum' | 'attribute' | 'datasource' | 'plugin' | 'abstract' | 'in' | 'sort'; -// attribute-level attribute -AttributeAttributeName returns string: +// internal attribute +InternalAttributeName returns string: '@@@' QualifiedName; // model-level attribute @@ -218,11 +218,11 @@ DataModelFieldAttributeName returns string: '@' QualifiedName; AttributeName returns string: - DataModelAttributeName | DataModelFieldAttributeName | AttributeAttributeName; + DataModelAttributeName | DataModelFieldAttributeName | InternalAttributeName; // attribute Attribute: - TRIPLE_SLASH_COMMENT* 'attribute' name=AttributeName '(' (params+=AttributeParam (',' params+=AttributeParam)*)? ')' (attributes+=AttributeAttribute)*; + TRIPLE_SLASH_COMMENT* 'attribute' name=AttributeName '(' (params+=AttributeParam (',' params+=AttributeParam)*)? ')' (attributes+=InternalAttribute)*; AttributeParam: TRIPLE_SLASH_COMMENT* (default?='_')? name=RegularID ':' type=AttributeParamType; @@ -240,8 +240,8 @@ DataModelFieldAttribute: DataModelAttribute: TRIPLE_SLASH_COMMENT* decl=[Attribute:DataModelAttributeName] ('(' AttributeArgList? ')')?; -AttributeAttribute: - decl=[Attribute:AttributeAttributeName] ('(' AttributeArgList? ')')?; +InternalAttribute: + decl=[Attribute:InternalAttributeName] ('(' AttributeArgList? ')')?; fragment AttributeArgList: args+=AttributeArg (',' args+=AttributeArg)*; diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index 080de50ee..50ece8a61 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -24,7 +24,7 @@ "author": "ZenStack Team", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^4.7.1", + "@prisma/generator-helper": "4.10.0", "@zenstackhq/runtime": "workspace:*", "@zenstackhq/sdk": "workspace:*", "change-case": "^4.1.2", @@ -36,7 +36,7 @@ "zod-validation-error": "^0.2.1" }, "devDependencies": { - "@prisma/internals": "^4.7.1", + "@prisma/internals": "4.10.0", "@readme/openapi-parser": "^2.4.0", "@types/jest": "^29.5.0", "@types/lower-case-first": "^1.0.1", diff --git a/packages/plugins/openapi/src/rpc-generator.ts b/packages/plugins/openapi/src/rpc-generator.ts index e563f2874..303ac3f83 100644 --- a/packages/plugins/openapi/src/rpc-generator.ts +++ b/packages/plugins/openapi/src/rpc-generator.ts @@ -1,6 +1,6 @@ // Inspired by: https://github.com/omar-dulaimi/prisma-trpc-generator -import { DMMF } from '@prisma/generator-helper'; +import type { DMMF } from '@prisma/generator-helper'; import { analyzePolicies, AUXILIARY_FIELDS, PluginError, requireOption, resolvePath } from '@zenstackhq/sdk'; import { DataModel, isDataModel } from '@zenstackhq/sdk/ast'; import { diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json index 6f3beafb3..694eece48 100644 --- a/packages/plugins/swr/package.json +++ b/packages/plugins/swr/package.json @@ -25,7 +25,7 @@ "author": "ZenStack Team", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^4.7.1", + "@prisma/generator-helper": "4.10.0", "@zenstackhq/sdk": "workspace:*", "change-case": "^4.1.2", "decimal.js": "^10.4.2", diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json index 059c4e8b4..bbc448a50 100644 --- a/packages/plugins/tanstack-query/package.json +++ b/packages/plugins/tanstack-query/package.json @@ -25,7 +25,7 @@ "author": "ZenStack Team", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^4.7.1", + "@prisma/generator-helper": "4.10.0", "@zenstackhq/sdk": "workspace:*", "change-case": "^4.1.2", "decimal.js": "^10.4.2", diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 198f8ce8a..9323dd61c 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -24,8 +24,8 @@ "author": "ZenStack Team", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^4.7.1", - "@prisma/internals": "^4.7.1", + "@prisma/generator-helper": "4.10.0", + "@prisma/internals": "4.10.0", "@zenstackhq/sdk": "workspace:*", "change-case": "^4.1.2", "lower-case-first": "^2.0.2", diff --git a/packages/plugins/trpc/src/generator.ts b/packages/plugins/trpc/src/generator.ts index 1ffdeaafb..8f21b2700 100644 --- a/packages/plugins/trpc/src/generator.ts +++ b/packages/plugins/trpc/src/generator.ts @@ -27,7 +27,6 @@ import { } from './helpers'; import { project } from './project'; import removeDir from './utils/removeDir'; -import { generate as PrismaZodGenerator } from './zod/generator'; export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.Document) { let outDir = requireOption(options, 'output'); @@ -42,11 +41,13 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF. throw new PluginError(name, `Option "generateClientHelpers" only support values "react" and "next"`); } + if (options.zodSchemasImport && typeof options.zodSchemasImport !== 'string') { + throw new PluginError(name, `Option "zodSchemasImport" must be a string`); + } + await fs.promises.mkdir(outDir, { recursive: true }); await removeDir(outDir, true); - await PrismaZodGenerator(model, options, dmmf); - const prismaClientDmmf = dmmf; const modelOperations = prismaClientDmmf.mappings.modelOperations; @@ -54,7 +55,16 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF. const hiddenModels: string[] = []; resolveModelsComments(models, hiddenModels); - createAppRouter(outDir, modelOperations, hiddenModels, generateModelActions, generateClientHelpers, model); + const zodSchemasImport = (options.zodSchemasImport as string) ?? '@zenstackhq/runtime/zod'; + createAppRouter( + outDir, + modelOperations, + hiddenModels, + generateModelActions, + generateClientHelpers, + model, + zodSchemasImport + ); createHelper(outDir); await saveProject(project); @@ -66,7 +76,8 @@ function createAppRouter( hiddenModels: string[], generateModelActions: string[] | undefined, generateClientHelpers: string[] | undefined, - zmodel: Model + zmodel: Model, + zodSchemasImport: string ) { const indexFile = path.resolve(outDir, 'routers', `index.ts`); const appRouter = project.createSourceFile(indexFile, undefined, { @@ -138,7 +149,8 @@ function createAppRouter( outDir, generateModelActions, generateClientHelpers, - zmodel + zmodel, + zodSchemasImport ); appRouter.addImportDeclaration({ @@ -207,7 +219,8 @@ function generateModelCreateRouter( outputDir: string, generateModelActions: string[] | undefined, generateClientHelpers: string[] | undefined, - zmodel: Model + zmodel: Model, + zodSchemasImport: string ) { const modelRouter = project.createSourceFile(path.resolve(outputDir, 'routers', `${model}.router.ts`), undefined, { overwrite: true, @@ -222,7 +235,7 @@ function generateModelCreateRouter( }, ]); - generateRouterSchemaImports(modelRouter, model); + generateRouterSchemaImports(modelRouter, model, zodSchemasImport); generateHelperImport(modelRouter); if (generateClientHelpers) { generateRouterTypingImports(modelRouter, zmodel); diff --git a/packages/plugins/trpc/src/helpers.ts b/packages/plugins/trpc/src/helpers.ts index 0df70aae5..78780344c 100644 --- a/packages/plugins/trpc/src/helpers.ts +++ b/packages/plugins/trpc/src/helpers.ts @@ -1,10 +1,10 @@ import { DMMF } from '@prisma/generator-helper'; import { PluginError, getPrismaClientImportSpec } from '@zenstackhq/sdk'; +import { Model } from '@zenstackhq/sdk/ast'; +import { lowerCaseFirst } from 'lower-case-first'; import { CodeBlockWriter, SourceFile } from 'ts-morph'; import { upperCaseFirst } from 'upper-case-first'; import { name } from '.'; -import { uncapitalizeFirstLetter } from './utils/uncapitalizeFirstLetter'; -import { Model } from '@zenstackhq/sdk/ast'; export function generateProcedure( writer: CodeBlockWriter, @@ -17,16 +17,18 @@ export function generateProcedure( const prismaMethod = opType.replace('One', ''); if (procType === 'query') { + // the cast "as any" is to circumvent a TS compiler misfired error in certain cases writer.write(` - ${opType}: procedure.input(${typeName}).query(({ctx, input}) => checkRead(db(ctx).${uncapitalizeFirstLetter( + ${opType}: procedure.input(${typeName}).query(({ctx, input}) => checkRead(db(ctx).${lowerCaseFirst( modelName - )}.${prismaMethod}(input))), + )}.${prismaMethod}(input as any))), `); } else if (procType === 'mutation') { + // the cast "as any" is to circumvent a TS compiler misfired error in certain cases writer.write(` - ${opType}: procedure.input(${typeName}).mutation(async ({ctx, input}) => checkMutate(db(ctx).${uncapitalizeFirstLetter( + ${opType}: procedure.input(${typeName}).mutation(async ({ctx, input}) => checkMutate(db(ctx).${lowerCaseFirst( modelName - )}.${prismaMethod}(input))), + )}.${prismaMethod}(input as any))), `); } } @@ -238,8 +240,9 @@ export function generateRouterTypingImports(sourceFile: SourceFile, model: Model ]); } -export function generateRouterSchemaImports(sourceFile: SourceFile, name: string) { - sourceFile.addStatements(`import { ${name}Schema } from '../schemas/${name}.schema';`); +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function generateRouterSchemaImports(sourceFile: SourceFile, name: string, zodSchemasImport: string) { + sourceFile.addStatements(`import { ${name}InputSchema } from '${zodSchemasImport}/input';`); } export function generateHelperImport(sourceFile: SourceFile) { @@ -250,46 +253,46 @@ export const getInputSchemaByOpName = (opName: string, modelName: string) => { let inputType; switch (opName) { case 'findUnique': - inputType = `${modelName}Schema.findUnique`; + inputType = `${modelName}InputSchema.findUnique`; break; case 'findFirst': - inputType = `${modelName}Schema.findFirst`; + inputType = `${modelName}InputSchema.findFirst`; break; case 'findMany': - inputType = `${modelName}Schema.findMany`; + inputType = `${modelName}InputSchema.findMany`; break; case 'findRaw': - inputType = `${modelName}Schema.findRawObject`; + inputType = `${modelName}InputSchema.findRawObject`; break; case 'createOne': - inputType = `${modelName}Schema.create`; + inputType = `${modelName}InputSchema.create`; break; case 'createMany': - inputType = `${modelName}Schema.createMany`; + inputType = `${modelName}InputSchema.createMany`; break; case 'deleteOne': - inputType = `${modelName}Schema.delete`; + inputType = `${modelName}InputSchema.delete`; break; case 'updateOne': - inputType = `${modelName}Schema.update`; + inputType = `${modelName}InputSchema.update`; break; case 'deleteMany': - inputType = `${modelName}Schema.deleteMany`; + inputType = `${modelName}InputSchema.deleteMany`; break; case 'updateMany': - inputType = `${modelName}Schema.updateMany`; + inputType = `${modelName}InputSchema.updateMany`; break; case 'upsertOne': - inputType = `${modelName}Schema.upsert`; + inputType = `${modelName}InputSchema.upsert`; break; case 'aggregate': - inputType = `${modelName}Schema.aggregate`; + inputType = `${modelName}InputSchema.aggregate`; break; case 'aggregateRaw': - inputType = `${modelName}Schema.aggregateRawObject`; + inputType = `${modelName}InputSchema.aggregateRawObject`; break; case 'groupBy': - inputType = `${modelName}Schema.groupBy`; + inputType = `${modelName}InputSchema.groupBy`; break; default: console.log('getInputTypeByOpName: ', { opName, modelName }); diff --git a/packages/plugins/trpc/src/index.ts b/packages/plugins/trpc/src/index.ts index 578885874..9be85b19d 100644 --- a/packages/plugins/trpc/src/index.ts +++ b/packages/plugins/trpc/src/index.ts @@ -4,6 +4,7 @@ import { Model } from '@zenstackhq/sdk/ast'; import { generate } from './generator'; export const name = 'tRPC'; +export const dependencies = ['@core/zod']; export default async function run(model: Model, options: PluginOptions, dmmf: DMMF.Document) { return generate(model, options, dmmf); diff --git a/packages/plugins/trpc/src/utils/uncapitalizeFirstLetter.ts b/packages/plugins/trpc/src/utils/uncapitalizeFirstLetter.ts deleted file mode 100644 index 827643e89..000000000 --- a/packages/plugins/trpc/src/utils/uncapitalizeFirstLetter.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const uncapitalizeFirstLetter = (str: string) => { - return str.charAt(0).toLowerCase() + str.slice(1); -}; diff --git a/packages/plugins/trpc/src/zod/README.md b/packages/plugins/trpc/src/zod/README.md deleted file mode 100644 index 6af0cf15b..000000000 --- a/packages/plugins/trpc/src/zod/README.md +++ /dev/null @@ -1 +0,0 @@ -This plugin is based on [prisma-zod-generator](https://github.com/omar-dulaimi/prisma-zod-generator). diff --git a/packages/plugins/trpc/src/zod/generator.ts b/packages/plugins/trpc/src/zod/generator.ts deleted file mode 100644 index 72b0cf335..000000000 --- a/packages/plugins/trpc/src/zod/generator.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { ConnectorType, DMMF } from '@prisma/generator-helper'; -import { Dictionary } from '@prisma/internals'; -import { PluginOptions, getLiteral, resolvePath } from '@zenstackhq/sdk'; -import { DataSource, Model, isDataSource } from '@zenstackhq/sdk/ast'; -import { - AggregateOperationSupport, - addMissingInputObjectTypes, - resolveAggregateOperationSupport, -} from '@zenstackhq/sdk/dmmf-helpers'; -import { promises as fs } from 'fs'; -import path from 'path'; -import Transformer from './transformer'; -import removeDir from './utils/removeDir'; -import { writeFileSafely } from './utils/writeFileSafely'; - -export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.Document) { - let output = (options.output as string) ?? './generated'; - output = resolvePath(output, options); - - await handleGeneratorOutputValue(output); - - const prismaClientDmmf = dmmf; - - const modelOperations = prismaClientDmmf.mappings.modelOperations; - const inputObjectTypes = prismaClientDmmf.schema.inputObjectTypes.prisma; - const outputObjectTypes = prismaClientDmmf.schema.outputObjectTypes.prisma; - const models: DMMF.Model[] = prismaClientDmmf.datamodel.models; - - await generateEnumSchemas( - prismaClientDmmf.schema.enumTypes.prisma, - prismaClientDmmf.schema.enumTypes.model ?? [], - model - ); - - const dataSource = model.declarations.find((d): d is DataSource => isDataSource(d)); - - const dataSourceProvider = getLiteral( - dataSource?.fields.find((f) => f.name === 'provider')?.value - ) as ConnectorType; - - Transformer.provider = dataSourceProvider; - - const generatorConfigOptions: Dictionary = {}; - Object.entries(options).forEach(([k, v]) => (generatorConfigOptions[k] = v as string)); - - addMissingInputObjectTypes(inputObjectTypes, outputObjectTypes, models); - - const aggregateOperationSupport = resolveAggregateOperationSupport(inputObjectTypes); - - await generateObjectSchemas(inputObjectTypes, output, model); - await generateModelSchemas(models, modelOperations, aggregateOperationSupport, model); -} - -async function handleGeneratorOutputValue(output: string) { - // create the output directory and delete contents that might exist from a previous run - await fs.mkdir(output, { recursive: true }); - const isRemoveContentsOnly = true; - await removeDir(output, isRemoveContentsOnly); - - Transformer.setOutputPath(output); -} - -async function generateEnumSchemas( - prismaSchemaEnum: DMMF.SchemaEnum[], - modelSchemaEnum: DMMF.SchemaEnum[], - zmodel: Model -) { - const enumTypes = [...prismaSchemaEnum, ...modelSchemaEnum]; - const enumNames = enumTypes.map((enumItem) => enumItem.name); - Transformer.enumNames = enumNames ?? []; - const transformer = new Transformer({ - enumTypes, - zmodel, - }); - await transformer.generateEnumSchemas(); -} - -async function generateObjectSchemas(inputObjectTypes: DMMF.InputType[], output: string, zmodel: Model) { - const moduleNames: string[] = []; - for (let i = 0; i < inputObjectTypes.length; i += 1) { - const fields = inputObjectTypes[i]?.fields; - const name = inputObjectTypes[i]?.name; - const transformer = new Transformer({ name, fields, zmodel }); - const moduleName = await transformer.generateObjectSchema(); - moduleNames.push(moduleName); - } - await writeFileSafely( - path.join(output, `schemas/objects/index.ts`), - moduleNames.map((name) => `export * from './${name}';`).join('\n') - ); -} - -async function generateModelSchemas( - models: DMMF.Model[], - modelOperations: DMMF.ModelMapping[], - aggregateOperationSupport: AggregateOperationSupport, - zmodel: Model -) { - const transformer = new Transformer({ - models, - modelOperations, - aggregateOperationSupport, - zmodel, - }); - await transformer.generateModelSchemas(); -} diff --git a/packages/plugins/trpc/src/zod/index.ts b/packages/plugins/trpc/src/zod/index.ts deleted file mode 100644 index aee2371d4..000000000 --- a/packages/plugins/trpc/src/zod/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DMMF } from '@prisma/generator-helper'; -import { PluginOptions } from '@zenstackhq/sdk'; -import { Model } from '@zenstackhq/sdk/ast'; -import { generate } from './generator'; - -export const name = 'Zod'; - -export default async function run(model: Model, options: PluginOptions, dmmf: DMMF.Document) { - return generate(model, options, dmmf); -} diff --git a/packages/plugins/trpc/src/zod/transformer.ts b/packages/plugins/trpc/src/zod/transformer.ts deleted file mode 100644 index 585cab5de..000000000 --- a/packages/plugins/trpc/src/zod/transformer.ts +++ /dev/null @@ -1,594 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import type { DMMF as PrismaDMMF } from '@prisma/generator-helper'; -import { AUXILIARY_FIELDS, getPrismaClientImportSpec } from '@zenstackhq/sdk'; -import { Model } from '@zenstackhq/sdk/ast'; -import { checkModelHasModelRelation, findModelByName, isAggregateInputType } from '@zenstackhq/sdk/dmmf-helpers'; -import indentString from '@zenstackhq/sdk/utils'; -import path from 'path'; -import { AggregateOperationSupport, TransformerParams } from './types'; -import { writeFileSafely } from './utils/writeFileSafely'; - -export default class Transformer { - name: string; - fields: PrismaDMMF.SchemaArg[]; - schemaImports = new Set(); - models: PrismaDMMF.Model[]; - modelOperations: PrismaDMMF.ModelMapping[]; - aggregateOperationSupport: AggregateOperationSupport; - enumTypes: PrismaDMMF.SchemaEnum[]; - - static enumNames: string[] = []; - static rawOpsMap: { [name: string]: string } = {}; - static provider: string; - private static outputPath = './generated'; - private hasJson = false; - private zmodel: Model; - - constructor(params: TransformerParams) { - this.name = params.name ?? ''; - this.fields = params.fields ?? []; - this.models = params.models ?? []; - this.modelOperations = params.modelOperations ?? []; - this.aggregateOperationSupport = params.aggregateOperationSupport ?? {}; - this.enumTypes = params.enumTypes ?? []; - this.zmodel = params.zmodel; - } - - static setOutputPath(outPath: string) { - this.outputPath = outPath; - } - - static getOutputPath() { - return this.outputPath; - } - - async generateEnumSchemas() { - for (const enumType of this.enumTypes) { - const { name, values } = enumType; - const filteredValues = values.filter((v) => !AUXILIARY_FIELDS.includes(v)); - - await writeFileSafely( - path.join(Transformer.outputPath, `schemas/enums/${name}.schema.ts`), - `/* eslint-disable */\n${this.generateImportZodStatement()}\n${this.generateExportSchemaStatement( - `${name}`, - `z.enum(${JSON.stringify(filteredValues)})` - )}` - ); - } - - await writeFileSafely( - path.join(Transformer.outputPath, `schemas/enums/index.ts`), - this.enumTypes.map((enumType) => `export * from './${enumType.name}.schema';`).join('\n') - ); - } - - generateImportZodStatement() { - return "import { z } from 'zod';\n"; - } - - generateExportSchemaStatement(name: string, schema: string) { - return `export const ${name}Schema = ${schema}`; - } - - async generateObjectSchema() { - const zodObjectSchemaFields = this.generateObjectSchemaFields(); - const objectSchema = this.prepareObjectSchema(zodObjectSchemaFields); - - await writeFileSafely( - path.join(Transformer.outputPath, `schemas/objects/${this.name}.schema.ts`), - '/* eslint-disable */\n' + objectSchema - ); - return `${this.name}.schema`; - } - - generateObjectSchemaFields() { - const zodObjectSchemaFields = this.fields - .filter((field) => !AUXILIARY_FIELDS.includes(field.name)) - .map((field) => this.generateObjectSchemaField(field)) - .flatMap((item) => item) - .map((item) => { - const [zodStringWithMainType, field, skipValidators] = item; - - const value = skipValidators - ? zodStringWithMainType - : this.generateFieldValidators(zodStringWithMainType, field); - - return value.trim(); - }); - return zodObjectSchemaFields; - } - - generateObjectSchemaField(field: PrismaDMMF.SchemaArg): [string, PrismaDMMF.SchemaArg, boolean][] { - const lines = field.inputTypes; - - if (lines.length === 0) { - return []; - } - - let alternatives = lines.reduce((result, inputType) => { - if (inputType.type === 'String') { - result.push(this.wrapWithZodValidators('z.string()', field, inputType)); - } else if (inputType.type === 'Int' || inputType.type === 'Float' || inputType.type === 'Decimal') { - result.push(this.wrapWithZodValidators('z.number()', field, inputType)); - } else if (inputType.type === 'BigInt') { - result.push(this.wrapWithZodValidators('z.bigint()', field, inputType)); - } else if (inputType.type === 'Boolean') { - result.push(this.wrapWithZodValidators('z.boolean()', field, inputType)); - } else if (inputType.type === 'DateTime') { - result.push(this.wrapWithZodValidators(['z.date()', 'z.string().datetime()'], field, inputType)); - } else if (inputType.type === 'Bytes') { - result.push(this.wrapWithZodValidators('z.number().array()', field, inputType)); - } else if (inputType.type === 'Json') { - this.hasJson = true; - result.push(this.wrapWithZodValidators('jsonSchema', field, inputType)); - } else if (inputType.type === 'True') { - result.push(this.wrapWithZodValidators('z.literal(true)', field, inputType)); - } else { - const isEnum = inputType.location === 'enumTypes'; - - if (inputType.namespace === 'prisma' || isEnum) { - if (inputType.type !== this.name && typeof inputType.type === 'string') { - this.addSchemaImport(inputType.type); - } - - result.push(this.generatePrismaStringLine(field, inputType, lines.length)); - } - } - - return result; - }, []); - - if (alternatives.length === 0) { - return []; - } - - if (alternatives.length > 1) { - alternatives = alternatives.map((alter) => alter.replace('.optional()', '')); - } - - const fieldName = alternatives.some((alt) => alt.includes(':')) ? '' : ` ${field.name}:`; - - const opt = !field.isRequired ? '.optional()' : ''; - - let resString = - alternatives.length === 1 ? alternatives.join(',\r\n') : `z.union([${alternatives.join(',\r\n')}])${opt}`; - - if (field.isNullable) { - resString += '.nullable()'; - } - - return [[` ${fieldName} ${resString} `, field, true]]; - } - - wrapWithZodValidators( - mainValidators: string | string[], - field: PrismaDMMF.SchemaArg, - inputType: PrismaDMMF.SchemaArgInputType - ) { - let line = ''; - - const base = Array.isArray(mainValidators) ? mainValidators : [mainValidators]; - - line += base - .map((validator) => { - let r = validator; - if (inputType.isList) { - r += '.array()'; - } - if (!field.isRequired) { - r += '.optional()'; - } - return r; - }) - .join(', '); - - if (base.length > 1) { - line = `z.union([${line}])`; - } - - return line; - } - - addSchemaImport(name: string) { - this.schemaImports.add(name); - } - - generatePrismaStringLine( - field: PrismaDMMF.SchemaArg, - inputType: PrismaDMMF.SchemaArgInputType, - inputsLength: number - ) { - const isEnum = inputType.location === 'enumTypes'; - - const { isModelQueryType, modelName, queryName } = this.checkIsModelQueryType(inputType.type as string); - - const objectSchemaLine = isModelQueryType - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.resolveModelQuerySchemaName(modelName!, queryName!) - : `${inputType.type}ObjectSchema`; - const enumSchemaLine = `${inputType.type}Schema`; - - const schema = inputType.type === this.name ? objectSchemaLine : isEnum ? enumSchemaLine : objectSchemaLine; - - const arr = inputType.isList ? '.array()' : ''; - - const opt = !field.isRequired ? '.optional()' : ''; - - return inputsLength === 1 - ? ` ${field.name}: z.lazy(() => ${schema})${arr}${opt}` - : `z.lazy(() => ${schema})${arr}${opt}`; - } - - generateFieldValidators(zodStringWithMainType: string, field: PrismaDMMF.SchemaArg) { - const { isRequired, isNullable } = field; - - if (!isRequired) { - zodStringWithMainType += '.optional()'; - } - - if (isNullable) { - zodStringWithMainType += '.nullable()'; - } - - return zodStringWithMainType; - } - - prepareObjectSchema(zodObjectSchemaFields: string[]) { - const objectSchema = `${this.generateExportObjectSchemaStatement( - this.addFinalWrappers({ zodStringFields: zodObjectSchemaFields }) - )}\n`; - - const prismaImportStatement = this.generateImportPrismaStatement(); - - const json = this.generateJsonSchemaImplementation(); - - return `${this.generateObjectSchemaImportStatements()}${prismaImportStatement}${json}${objectSchema}`; - } - - generateExportObjectSchemaStatement(schema: string) { - let name = this.name; - - if (isAggregateInputType(name)) { - name = `${name}Type`; - } - const end = `export const ${this.name}ObjectSchema = Schema`; - return `const Schema: z.ZodType "'" + f + "'").join( - '|' - )}>> = ${schema};\n\n ${end}`; - } - - addFinalWrappers({ zodStringFields }: { zodStringFields: string[] }) { - const fields = [...zodStringFields]; - - return this.wrapWithZodObject(fields) + '.strict()'; - } - - generateImportPrismaStatement() { - const importingFrom = path.resolve(Transformer.outputPath, 'schemas', 'objects'); - const prismaClientImportPath = getPrismaClientImportSpec(this.zmodel, importingFrom); - return `import type { Prisma } from '${prismaClientImportPath}';\n\n`; - } - - generateJsonSchemaImplementation() { - let jsonSchemaImplementation = ''; - - if (this.hasJson) { - jsonSchemaImplementation += `\n`; - jsonSchemaImplementation += `const literalSchema = z.union([z.string(), z.number(), z.boolean()]);\n`; - jsonSchemaImplementation += `const jsonSchema: z.ZodType = z.lazy(() =>\n`; - jsonSchemaImplementation += ` z.union([literalSchema, z.array(jsonSchema.nullable()), z.record(jsonSchema.nullable())])\n`; - jsonSchemaImplementation += `);\n\n`; - } - - return jsonSchemaImplementation; - } - - generateObjectSchemaImportStatements() { - let generatedImports = this.generateImportZodStatement(); - generatedImports += this.generateSchemaImports(); - generatedImports += '\n\n'; - return generatedImports; - } - - generateSchemaImports() { - return [...this.schemaImports] - .map((name) => { - const { isModelQueryType, modelName } = this.checkIsModelQueryType(name); - if (isModelQueryType) { - return `import { ${modelName}Schema } from '../${modelName}.schema'`; - } else if (Transformer.enumNames.includes(name)) { - return `import { ${name}Schema } from '../enums/${name}.schema'`; - } else { - return `import { ${name}ObjectSchema } from './${name}.schema'`; - } - }) - .join(';\r\n'); - } - - checkIsModelQueryType(type: string) { - const modelQueryTypeSuffixToQueryName: Record = { - FindManyArgs: 'findMany', - }; - for (const modelQueryType of ['FindManyArgs']) { - if (type.includes(modelQueryType)) { - const modelQueryTypeSuffixIndex = type.indexOf(modelQueryType); - return { - isModelQueryType: true, - modelName: type.substring(0, modelQueryTypeSuffixIndex), - queryName: modelQueryTypeSuffixToQueryName[modelQueryType], - }; - } - } - return { isModelQueryType: false }; - } - - resolveModelQuerySchemaName(modelName: string, queryName: string) { - const modelNameCapitalized = modelName.charAt(0).toUpperCase() + modelName.slice(1); - return `${modelNameCapitalized}Schema.${queryName}`; - } - - wrapWithZodUnion(zodStringFields: string[]) { - let wrapped = ''; - - wrapped += 'z.union(['; - wrapped += '\n'; - wrapped += ' ' + zodStringFields.join(','); - wrapped += '\n'; - wrapped += '])'; - return wrapped; - } - - wrapWithZodObject(zodStringFields: string | string[]) { - let wrapped = ''; - - wrapped += 'z.object({'; - wrapped += '\n'; - wrapped += ' ' + zodStringFields; - wrapped += '\n'; - wrapped += '})'; - return wrapped; - } - - async generateModelSchemas() { - const globalExports: string[] = []; - - for (const modelOperation of this.modelOperations) { - const { - model: modelName, - findUnique, - findFirst, - findMany, - // @ts-expect-error - createOne, - createMany, - // @ts-expect-error - deleteOne, - // @ts-expect-error - updateOne, - deleteMany, - updateMany, - // @ts-expect-error - upsertOne, - aggregate, - groupBy, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } = modelOperation; - - globalExports.push(`export { ${modelName}Schema as ${modelName} } from './${modelName}.schema'`); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const model = findModelByName(this.models, modelName)!; - - const { selectImport, includeImport, selectZodSchemaLineLazy, includeZodSchemaLineLazy } = - this.resolveSelectIncludeImportAndZodSchemaLine(model); - - let imports = [`import { z } from 'zod'`, selectImport, includeImport]; - let codeBody = ''; - - if (findUnique) { - imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` - ); - codeBody += `findUnique: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema }),`; - } - - if (findFirst) { - imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${modelName}ScalarFieldEnumSchema } from './enums/${modelName}ScalarFieldEnum.schema'` - ); - codeBody += `findFirst: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereInputObjectSchema.optional(), orderBy: z.union([${modelName}OrderByWithRelationInputObjectSchema, ${modelName}OrderByWithRelationInputObjectSchema.array()]).optional(), cursor: ${modelName}WhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.array(${modelName}ScalarFieldEnumSchema).optional() }),`; - } - - if (findMany) { - imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${modelName}ScalarFieldEnumSchema } from './enums/${modelName}ScalarFieldEnum.schema'` - ); - codeBody += `findMany: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereInputObjectSchema.optional(), orderBy: z.union([${modelName}OrderByWithRelationInputObjectSchema, ${modelName}OrderByWithRelationInputObjectSchema.array()]).optional(), cursor: ${modelName}WhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.array(${modelName}ScalarFieldEnumSchema).optional() }),`; - } - - if (createOne) { - imports.push( - `import { ${modelName}CreateInputObjectSchema } from './objects/${modelName}CreateInput.schema'`, - `import { ${modelName}UncheckedCreateInputObjectSchema } from './objects/${modelName}UncheckedCreateInput.schema'` - ); - codeBody += `create: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: z.union([${modelName}CreateInputObjectSchema, ${modelName}UncheckedCreateInputObjectSchema]) }),`; - } - - if (createMany) { - imports.push( - `import { ${modelName}CreateManyInputObjectSchema } from './objects/${modelName}CreateManyInput.schema'` - ); - codeBody += `createMany: z.object({ data: z.union([${modelName}CreateManyInputObjectSchema, z.array(${modelName}CreateManyInputObjectSchema)]) }),`; - } - - if (deleteOne) { - imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` - ); - codeBody += `'delete': z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema }),`; - } - - if (deleteMany) { - imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'` - ); - codeBody += `deleteMany: z.object({ where: ${modelName}WhereInputObjectSchema.optional() }),`; - } - - if (updateOne) { - imports.push( - `import { ${modelName}UpdateInputObjectSchema } from './objects/${modelName}UpdateInput.schema'`, - `import { ${modelName}UncheckedUpdateInputObjectSchema } from './objects/${modelName}UncheckedUpdateInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` - ); - codeBody += `update: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: z.union([${modelName}UpdateInputObjectSchema, ${modelName}UncheckedUpdateInputObjectSchema]), where: ${modelName}WhereUniqueInputObjectSchema }),`; - } - - if (updateMany) { - imports.push( - `import { ${modelName}UpdateManyMutationInputObjectSchema } from './objects/${modelName}UpdateManyMutationInput.schema'`, - `import { ${modelName}UncheckedUpdateManyInputObjectSchema } from './objects/${modelName}UncheckedUpdateManyInput.schema'`, - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'` - ); - codeBody += `updateMany: z.object({ data: z.union([${modelName}UpdateManyMutationInputObjectSchema, ${modelName}UncheckedUpdateManyInputObjectSchema]), where: ${modelName}WhereInputObjectSchema.optional() }),`; - } - - if (upsertOne) { - imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${modelName}CreateInputObjectSchema } from './objects/${modelName}CreateInput.schema'`, - `import { ${modelName}UncheckedCreateInputObjectSchema } from './objects/${modelName}UncheckedCreateInput.schema'`, - `import { ${modelName}UpdateInputObjectSchema } from './objects/${modelName}UpdateInput.schema'`, - `import { ${modelName}UncheckedUpdateInputObjectSchema } from './objects/${modelName}UncheckedUpdateInput.schema'` - ); - codeBody += `upsert: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema, create: z.union([${modelName}CreateInputObjectSchema, ${modelName}UncheckedCreateInputObjectSchema]), update: z.union([${modelName}UpdateInputObjectSchema, ${modelName}UncheckedUpdateInputObjectSchema]) }),`; - } - - if (aggregate) { - imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` - ); - const aggregateOperations = []; - if (this.aggregateOperationSupport[modelName].count) { - imports.push( - `import { ${modelName}CountAggregateInputObjectSchema } from './objects/${modelName}CountAggregateInput.schema'` - ); - aggregateOperations.push( - `_count: z.union([ z.literal(true), ${modelName}CountAggregateInputObjectSchema ]).optional()` - ); - } - if (this.aggregateOperationSupport[modelName].min) { - imports.push( - `import { ${modelName}MinAggregateInputObjectSchema } from './objects/${modelName}MinAggregateInput.schema'` - ); - aggregateOperations.push(`_min: ${modelName}MinAggregateInputObjectSchema.optional()`); - } - if (this.aggregateOperationSupport[modelName].max) { - imports.push( - `import { ${modelName}MaxAggregateInputObjectSchema } from './objects/${modelName}MaxAggregateInput.schema'` - ); - aggregateOperations.push(`_max: ${modelName}MaxAggregateInputObjectSchema.optional()`); - } - if (this.aggregateOperationSupport[modelName].avg) { - imports.push( - `import { ${modelName}AvgAggregateInputObjectSchema } from './objects/${modelName}AvgAggregateInput.schema'` - ); - aggregateOperations.push(`_avg: ${modelName}AvgAggregateInputObjectSchema.optional()`); - } - if (this.aggregateOperationSupport[modelName].sum) { - imports.push( - `import { ${modelName}SumAggregateInputObjectSchema } from './objects/${modelName}SumAggregateInput.schema'` - ); - aggregateOperations.push(`_sum: ${modelName}SumAggregateInputObjectSchema.optional()`); - } - - codeBody += `aggregate: z.object({ where: ${modelName}WhereInputObjectSchema.optional(), orderBy: z.union([${modelName}OrderByWithRelationInputObjectSchema, ${modelName}OrderByWithRelationInputObjectSchema.array()]).optional(), cursor: ${modelName}WhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), ${aggregateOperations.join( - ', ' - )} }),`; - } - - if (groupBy) { - imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithAggregationInputObjectSchema } from './objects/${modelName}OrderByWithAggregationInput.schema'`, - `import { ${modelName}ScalarWhereWithAggregatesInputObjectSchema } from './objects/${modelName}ScalarWhereWithAggregatesInput.schema'`, - `import { ${modelName}ScalarFieldEnumSchema } from './enums/${modelName}ScalarFieldEnum.schema'` - ); - codeBody += `groupBy: z.object({ where: ${modelName}WhereInputObjectSchema.optional(), orderBy: z.union([${modelName}OrderByWithAggregationInputObjectSchema, ${modelName}OrderByWithAggregationInputObjectSchema.array()]), having: ${modelName}ScalarWhereWithAggregatesInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), by: z.array(${modelName}ScalarFieldEnumSchema) }),`; - } - - imports = [...new Set(imports)]; - - await writeFileSafely( - path.join(Transformer.outputPath, `schemas/${modelName}.schema.ts`), - ` -/* eslint-disable */ -${imports.join(';\n')} - -export const ${modelName}Schema = { -${indentString(codeBody, 4)} -}; - ` - ); - } - - await writeFileSafely( - path.join(Transformer.outputPath, 'schemas/index.ts'), - ` -/* eslint-disable */ -${globalExports.join(';\n')} -` - ); - } - - generateImportStatements(imports: (string | undefined)[]) { - let generatedImports = this.generateImportZodStatement(); - generatedImports += imports?.filter((importItem) => !!importItem).join(';\r\n') ?? ''; - generatedImports += '\n\n'; - return generatedImports; - } - - resolveSelectIncludeImportAndZodSchemaLine(model: PrismaDMMF.Model) { - const { name: modelName } = model; - - const hasRelationToAnotherModel = checkModelHasModelRelation(model); - - const selectImport = `import { ${modelName}SelectObjectSchema } from './objects/${modelName}Select.schema'`; - - const includeImport = hasRelationToAnotherModel - ? `import { ${modelName}IncludeObjectSchema } from './objects/${modelName}Include.schema'` - : ''; - - let selectZodSchemaLine = ''; - let includeZodSchemaLine = ''; - let selectZodSchemaLineLazy = ''; - let includeZodSchemaLineLazy = ''; - - const zodSelectObjectSchema = `${modelName}SelectObjectSchema.optional()`; - selectZodSchemaLine = `select: ${zodSelectObjectSchema},`; - selectZodSchemaLineLazy = `select: z.lazy(() => ${zodSelectObjectSchema}),`; - - if (hasRelationToAnotherModel) { - const zodIncludeObjectSchema = `${modelName}IncludeObjectSchema.optional()`; - includeZodSchemaLine = `include: ${zodIncludeObjectSchema},`; - includeZodSchemaLineLazy = `include: z.lazy(() => ${zodIncludeObjectSchema}),`; - } - - return { - selectImport, - includeImport, - selectZodSchemaLine, - includeZodSchemaLine, - selectZodSchemaLineLazy, - includeZodSchemaLineLazy, - }; - } -} diff --git a/packages/plugins/trpc/src/zod/types.ts b/packages/plugins/trpc/src/zod/types.ts deleted file mode 100644 index 2e5a8e624..000000000 --- a/packages/plugins/trpc/src/zod/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { DMMF as PrismaDMMF } from '@prisma/generator-helper'; -import { Model } from '@zenstackhq/sdk/ast'; - -export type TransformerParams = { - enumTypes?: PrismaDMMF.SchemaEnum[]; - fields?: PrismaDMMF.SchemaArg[]; - name?: string; - models?: PrismaDMMF.Model[]; - modelOperations?: PrismaDMMF.ModelMapping[]; - aggregateOperationSupport?: AggregateOperationSupport; - isDefaultPrismaClientOutput?: boolean; - prismaClientOutputPath?: string; - zmodel: Model; -}; - -export type AggregateOperationSupport = { - [model: string]: { - count?: boolean; - min?: boolean; - max?: boolean; - sum?: boolean; - avg?: boolean; - }; -}; diff --git a/packages/plugins/trpc/src/zod/utils/formatFile.ts b/packages/plugins/trpc/src/zod/utils/formatFile.ts deleted file mode 100644 index 11c151ad9..000000000 --- a/packages/plugins/trpc/src/zod/utils/formatFile.ts +++ /dev/null @@ -1,31 +0,0 @@ -import prettier from 'prettier'; - -export const formatFile = (content: string): Promise => { - return new Promise((res, rej) => - prettier.resolveConfig(process.cwd()).then((options) => { - let formatOptions = options; - if (!options) { - formatOptions = { - trailingComma: 'all', - tabWidth: 2, - printWidth: 80, - bracketSpacing: true, - semi: true, - singleQuote: true, - useTabs: false, - }; - } - - try { - const formatted = prettier.format(content, { - ...formatOptions, - parser: 'typescript', - }); - - res(formatted); - } catch (error) { - rej(error); - } - }) - ); -}; diff --git a/packages/plugins/trpc/src/zod/utils/removeDir.ts b/packages/plugins/trpc/src/zod/utils/removeDir.ts deleted file mode 100644 index 03f8d74f5..000000000 --- a/packages/plugins/trpc/src/zod/utils/removeDir.ts +++ /dev/null @@ -1,15 +0,0 @@ -import path from 'path'; -import { promises as fs } from 'fs'; - -export default async function removeDir(dirPath: string, onlyContent: boolean) { - const dirEntries = await fs.readdir(dirPath, { withFileTypes: true }); - await Promise.all( - dirEntries.map(async (dirEntry) => { - const fullPath = path.join(dirPath, dirEntry.name); - return dirEntry.isDirectory() ? await removeDir(fullPath, false) : await fs.unlink(fullPath); - }) - ); - if (!onlyContent) { - await fs.rmdir(dirPath); - } -} diff --git a/packages/plugins/trpc/src/zod/utils/writeFileSafely.ts b/packages/plugins/trpc/src/zod/utils/writeFileSafely.ts deleted file mode 100644 index 0f953a2a5..000000000 --- a/packages/plugins/trpc/src/zod/utils/writeFileSafely.ts +++ /dev/null @@ -1,11 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { formatFile } from './formatFile'; - -export const writeFileSafely = async (writeLocation: string, content: string) => { - fs.mkdirSync(path.dirname(writeLocation), { - recursive: true, - }); - - fs.writeFileSync(writeLocation, await formatFile(content)); -}; diff --git a/packages/runtime/package.json b/packages/runtime/package.json index b9ced493e..54daaccc4 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -9,12 +9,14 @@ }, "scripts": { "clean": "rimraf dist", - "build": "pnpm lint && pnpm clean && tsc && copyfiles ./package.json ./README.md ../../LICENSE dist", + "build": "pnpm lint && pnpm clean && tsc && copyfiles ./package.json ./README.md ../../LICENSE dist && copyfiles -u1 'res/**/*' dist", "watch": "tsc --watch", "lint": "eslint src --ext ts", "prepublishOnly": "pnpm build", "publish-dev": "pnpm publish --tag dev" }, + "main": "index.js", + "types": "index.d.ts", "publishConfig": { "directory": "dist", "linkDirectory": true @@ -31,6 +33,7 @@ "pluralize": "^8.0.0", "superjson": "^1.11.0", "tslib": "^2.4.1", + "upper-case-first": "^2.0.2", "zod": "3.21.1", "zod-validation-error": "^0.2.1" }, diff --git a/packages/runtime/res/zod/index.d.ts b/packages/runtime/res/zod/index.d.ts new file mode 100644 index 000000000..243078ae6 --- /dev/null +++ b/packages/runtime/res/zod/index.d.ts @@ -0,0 +1,2 @@ +export * as models from './models'; +export * as input from './input'; diff --git a/packages/runtime/res/zod/index.js b/packages/runtime/res/zod/index.js new file mode 100644 index 000000000..605ce7946 --- /dev/null +++ b/packages/runtime/res/zod/index.js @@ -0,0 +1,4 @@ +module.exports = { + models: require('./models'), + input: require('./input'), +}; diff --git a/packages/runtime/res/zod/input.d.ts b/packages/runtime/res/zod/input.d.ts new file mode 100644 index 000000000..3768bcf6a --- /dev/null +++ b/packages/runtime/res/zod/input.d.ts @@ -0,0 +1 @@ +export * from '.zenstack/zod/input'; diff --git a/packages/runtime/res/zod/input.js b/packages/runtime/res/zod/input.js new file mode 100644 index 000000000..ddfb9dcc9 --- /dev/null +++ b/packages/runtime/res/zod/input.js @@ -0,0 +1,8 @@ +let schemas; +try { + schemas = require('.zenstack/zod/input/index'); +} catch {} + +module.exports = schemas && { + ...schemas, +}; diff --git a/packages/runtime/res/zod/models.d.ts b/packages/runtime/res/zod/models.d.ts new file mode 100644 index 000000000..a5a7395ac --- /dev/null +++ b/packages/runtime/res/zod/models.d.ts @@ -0,0 +1 @@ +export * from '.zenstack/zod/models'; diff --git a/packages/runtime/res/zod/models.js b/packages/runtime/res/zod/models.js new file mode 100644 index 000000000..b60f88486 --- /dev/null +++ b/packages/runtime/res/zod/models.js @@ -0,0 +1,8 @@ +let schemas; +try { + schemas = require('.zenstack/zod/models/index'); +} catch {} + +module.exports = schemas && { + ...schemas, +}; diff --git a/packages/runtime/src/enhancements/model-meta.ts b/packages/runtime/src/enhancements/model-meta.ts index bb16d9e67..0211304d7 100644 --- a/packages/runtime/src/enhancements/model-meta.ts +++ b/packages/runtime/src/enhancements/model-meta.ts @@ -1,13 +1,19 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ import { lowerCaseFirst } from 'lower-case-first'; import { ModelMeta } from './types'; +import path from 'path'; /** * Load model meta from standard location. */ export function getDefaultModelMeta(): ModelMeta { try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - return require('.zenstack/model-meta').default; + if (process.env.NODE_ENV === 'test') { + // handling the case when running as tests, resolve relative to CWD + return require(path.join(process.cwd(), 'node_modules', '.zenstack', 'model-meta')); + } else { + return require('.zenstack/model-meta').default; + } } catch { throw new Error('Model meta cannot be loaded. Please make sure "zenstack generate" has been run.'); } diff --git a/packages/runtime/src/enhancements/policy/handler.ts b/packages/runtime/src/enhancements/policy/handler.ts index b7cbea7f4..0883cdd45 100644 --- a/packages/runtime/src/enhancements/policy/handler.ts +++ b/packages/runtime/src/enhancements/policy/handler.ts @@ -3,7 +3,7 @@ import { CrudFailureReason } from '../../constants'; import { AuthUser, DbClientContract, PolicyOperationKind } from '../../types'; import { BatchResult, PrismaProxyHandler } from '../proxy'; -import { ModelMeta, PolicyDef } from '../types'; +import type { ModelMeta, PolicyDef, ZodSchemas } from '../types'; import { formatObject, prismaClientValidationError } from '../utils'; import { Logger } from './logger'; import { PolicyUtil } from './policy-utils'; @@ -19,12 +19,20 @@ export class PolicyProxyHandler implements Pr private readonly prisma: DbClient, private readonly policy: PolicyDef, private readonly modelMeta: ModelMeta, + private readonly zodSchemas: ZodSchemas | undefined, private readonly model: string, private readonly user?: AuthUser, private readonly logPrismaQuery?: boolean ) { this.logger = new Logger(prisma); - this.utils = new PolicyUtil(this.prisma, this.modelMeta, this.policy, this.user, this.logPrismaQuery); + this.utils = new PolicyUtil( + this.prisma, + this.modelMeta, + this.policy, + this.zodSchemas, + this.user, + this.logPrismaQuery + ); } private get modelClient() { @@ -39,7 +47,7 @@ export class PolicyProxyHandler implements Pr throw prismaClientValidationError(this.prisma, 'where field is required in query argument'); } - const guard = await this.utils.getAuthGuard(this.model, 'read'); + const guard = this.utils.getAuthGuard(this.model, 'read'); if (guard === false) { return null; } @@ -49,7 +57,7 @@ export class PolicyProxyHandler implements Pr } async findUniqueOrThrow(args: any) { - const guard = await this.utils.getAuthGuard(this.model, 'read'); + const guard = this.utils.getAuthGuard(this.model, 'read'); if (guard === false) { throw this.utils.notFound(this.model); } @@ -62,7 +70,7 @@ export class PolicyProxyHandler implements Pr } async findFirst(args: any) { - const guard = await this.utils.getAuthGuard(this.model, 'read'); + const guard = this.utils.getAuthGuard(this.model, 'read'); if (guard === false) { return null; } @@ -72,7 +80,7 @@ export class PolicyProxyHandler implements Pr } async findFirstOrThrow(args: any) { - const guard = await this.utils.getAuthGuard(this.model, 'read'); + const guard = this.utils.getAuthGuard(this.model, 'read'); if (guard === false) { throw this.utils.notFound(this.model); } @@ -85,7 +93,7 @@ export class PolicyProxyHandler implements Pr } async findMany(args: any) { - const guard = await this.utils.getAuthGuard(this.model, 'read'); + const guard = this.utils.getAuthGuard(this.model, 'read'); if (guard === false) { return []; } @@ -340,8 +348,8 @@ export class PolicyProxyHandler implements Pr return this.modelClient.count(args); } - async tryReject(operation: PolicyOperationKind) { - const guard = await this.utils.getAuthGuard(this.model, operation); + tryReject(operation: PolicyOperationKind) { + const guard = this.utils.getAuthGuard(this.model, operation); if (guard === false) { throw this.utils.deniedByPolicy(this.model, operation); } diff --git a/packages/runtime/src/enhancements/policy/index.ts b/packages/runtime/src/enhancements/policy/index.ts index 24578258f..59c4fb453 100644 --- a/packages/runtime/src/enhancements/policy/index.ts +++ b/packages/runtime/src/enhancements/policy/index.ts @@ -3,7 +3,7 @@ import { AuthUser, DbClientContract } from '../../types'; import { getDefaultModelMeta } from '../model-meta'; import { makeProxy } from '../proxy'; -import { ModelMeta, PolicyDef } from '../types'; +import type { ModelMeta, PolicyDef, ZodSchemas } from '../types'; import { PolicyProxyHandler } from './handler'; /** @@ -27,6 +27,11 @@ export type WithPolicyOptions = { */ modelMeta?: ModelMeta; + /** + * Zod schemas for validation + */ + zodSchemas?: ZodSchemas; + /** * Whether to log Prisma query */ @@ -48,6 +53,8 @@ export function withPolicy( ): DbClient { const _policy = options?.policy ?? getDefaultPolicy(); const _modelMeta = options?.modelMeta ?? getDefaultModelMeta(); + const _zodSchemas = options?.zodSchemas ?? getDefaultZodSchemas(); + return makeProxy( prisma, _modelMeta, @@ -56,6 +63,7 @@ export function withPolicy( _prisma as DbClientContract, _policy, _modelMeta, + _zodSchemas, model, context?.user, options?.logPrismaQuery @@ -74,3 +82,12 @@ function getDefaultPolicy(): PolicyDef { ); } } + +function getDefaultZodSchemas(): ZodSchemas | undefined { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + return require('.zenstack/zod'); + } catch { + return undefined; + } +} diff --git a/packages/runtime/src/enhancements/policy/policy-utils.ts b/packages/runtime/src/enhancements/policy/policy-utils.ts index 653be0e33..eccdbb94e 100644 --- a/packages/runtime/src/enhancements/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/policy/policy-utils.ts @@ -4,6 +4,7 @@ import { createId } from '@paralleldrive/cuid2'; import deepcopy from 'deepcopy'; import { lowerCaseFirst } from 'lower-case-first'; import pluralize from 'pluralize'; +import { upperCaseFirst } from 'upper-case-first'; import { fromZodError } from 'zod-validation-error'; import { AUXILIARY_FIELDS, CrudFailureReason, GUARD_FIELD_NAME, TRANSACTION_FIELD_NAME } from '../../constants'; import { @@ -16,8 +17,8 @@ import { } from '../../types'; import { getVersion } from '../../version'; import { resolveField } from '../model-meta'; -import { NestedWriteVisitor, VisitorContext } from '../nested-write-vistor'; -import { ModelMeta, PolicyDef, PolicyFunc } from '../types'; +import { NestedWriteVisitor, type VisitorContext } from '../nested-write-vistor'; +import type { ModelMeta, PolicyDef, PolicyFunc, ZodSchemas } from '../types'; import { enumerate, formatObject, @@ -40,6 +41,7 @@ export class PolicyUtil { private readonly db: DbClientContract, private readonly modelMeta: ModelMeta, private readonly policy: PolicyDef, + private readonly zodSchemas: ZodSchemas | undefined, private readonly user?: AuthUser, private readonly logPrismaQuery?: boolean ) { @@ -103,7 +105,7 @@ export class PolicyUtil { * @returns true if operation is unconditionally allowed, false if unconditionally denied, * otherwise returns a guard object */ - async getAuthGuard(model: string, operation: PolicyOperationKind, preValue?: any): Promise { + getAuthGuard(model: string, operation: PolicyOperationKind, preValue?: any): boolean | object { const guard = this.policy.guard[lowerCaseFirst(model)]; if (!guard) { throw this.unknownError(`unable to load policy guard for ${model}`); @@ -120,6 +122,10 @@ export class PolicyUtil { return provider({ user: this.user, preValue }); } + private hasValidation(model: string): boolean { + return this.policy.validation?.[lowerCaseFirst(model)]?.hasValidation === true; + } + private async getPreValueSelect(model: string): Promise { const guard = this.policy.guard[lowerCaseFirst(model)]; if (!guard) { @@ -128,8 +134,8 @@ export class PolicyUtil { return guard.preValueSelect; } - private async getModelSchema(model: string) { - return this.policy.schema[lowerCaseFirst(model)]; + private getModelSchema(model: string) { + return this.hasValidation(model) && this.zodSchemas?.models?.[`${upperCaseFirst(model)}Schema`]; } /** @@ -143,7 +149,7 @@ export class PolicyUtil { await this.injectGuardForFields(model, args.where, operation); } - const guard = await this.getAuthGuard(model, operation); + const guard = this.getAuthGuard(model, operation); args.where = this.and(args.where, guard); } @@ -171,7 +177,7 @@ export class PolicyUtil { payload: { some?: any; every?: any; none?: any }, operation: PolicyOperationKind ) { - const guard = await this.getAuthGuard(fieldInfo.type, operation); + const guard = this.getAuthGuard(fieldInfo.type, operation); if (payload.some) { await this.injectGuardForFields(fieldInfo.type, payload.some, operation); // turn "some" into: { some: { AND: [guard, payload.some] } } @@ -204,7 +210,7 @@ export class PolicyUtil { payload: { is?: any; isNot?: any } & Record, operation: PolicyOperationKind ) { - const guard = await this.getAuthGuard(fieldInfo.type, operation); + const guard = this.getAuthGuard(fieldInfo.type, operation); if (payload.is || payload.isNot) { if (payload.is) { await this.injectGuardForFields(fieldInfo.type, payload.is, operation); @@ -420,8 +426,8 @@ export class PolicyUtil { // args processor for create const processCreate = async (model: string, args: any) => { - const guard = await this.getAuthGuard(model, 'create'); - const schema = await this.getModelSchema(model); + const guard = this.getAuthGuard(model, 'create'); + const schema = this.getModelSchema(model); if (guard === false) { throw this.deniedByPolicy(model, 'create'); } else if (guard !== true || schema) { @@ -465,7 +471,7 @@ export class PolicyUtil { // args processor for update/upsert const processUpdate = async (model: string, where: any, context: VisitorContext) => { - const preGuard = await this.getAuthGuard(model, 'update'); + const preGuard = this.getAuthGuard(model, 'update'); if (preGuard === false) { throw this.deniedByPolicy(model, 'update'); } else if (preGuard !== true) { @@ -517,7 +523,7 @@ export class PolicyUtil { // args processor for updateMany const processUpdateMany = async (model: string, args: any, context: VisitorContext) => { - const guard = await this.getAuthGuard(model, 'update'); + const guard = this.getAuthGuard(model, 'update'); if (guard === false) { throw this.deniedByPolicy(model, 'update'); } else if (guard !== true) { @@ -531,8 +537,8 @@ export class PolicyUtil { // for models with post-update rules, we need to read and store // entity values before the update for post-update check const preparePostUpdateCheck = async (model: string, context: VisitorContext) => { - const postGuard = await this.getAuthGuard(model, 'postUpdate'); - const schema = await this.getModelSchema(model); + const postGuard = this.getAuthGuard(model, 'postUpdate'); + const schema = this.getModelSchema(model); // post-update check is needed if there's post-update rule or validation schema if (postGuard !== true || schema) { @@ -567,7 +573,7 @@ export class PolicyUtil { // args processor for delete const processDelete = async (model: string, args: any, context: VisitorContext) => { - const guard = await this.getAuthGuard(model, 'delete'); + const guard = this.getAuthGuard(model, 'delete'); if (guard === false) { throw this.deniedByPolicy(model, 'delete'); } else if (guard !== true) { @@ -641,7 +647,7 @@ export class PolicyUtil { // eslint-disable-next-line @typescript-eslint/no-unused-vars deleteMany: async (model, args, _context) => { - const guard = await this.getAuthGuard(model, 'delete'); + const guard = this.getAuthGuard(model, 'delete'); if (guard === false) { throw this.deniedByPolicy(model, 'delete'); } else if (guard !== true) { @@ -741,8 +747,8 @@ export class PolicyUtil { operation: PolicyOperationKind, db: Record ) { - const guard = await this.getAuthGuard(model, operation); - const schema = (operation === 'create' || operation === 'update') && (await this.getModelSchema(model)); + const guard = this.getAuthGuard(model, operation); + const schema = (operation === 'create' || operation === 'update') && this.getModelSchema(model); if (guard === true && !schema) { // unconditionally allowed @@ -839,7 +845,7 @@ export class PolicyUtil { // this.logger.info(`Checking post-update policy for ${model}#${ids}, preValue: ${formatObject(preValue)}`); // } - const guard = await this.getAuthGuard(model, 'postUpdate', preValue); + const guard = this.getAuthGuard(model, 'postUpdate', preValue); // build a query condition with policy injected const guardedQuery = { where: this.and(ids, guard) }; @@ -856,7 +862,7 @@ export class PolicyUtil { } // TODO: push down schema check to the database - const schema = await this.getModelSchema(model); + const schema = this.getModelSchema(model); if (schema) { const schemaCheckResult = schema.safeParse(entity); if (!schemaCheckResult.success) { diff --git a/packages/runtime/src/enhancements/types.ts b/packages/runtime/src/enhancements/types.ts index 8f81a3887..8834e73c2 100644 --- a/packages/runtime/src/enhancements/types.ts +++ b/packages/runtime/src/enhancements/types.ts @@ -34,7 +34,13 @@ export type PolicyDef = { preValueSelect?: object; } >; + validation: Record; +}; - // zod schema for post-write validation - schema: Record; +/** + * Zod schemas for validation + */ +export type ZodSchemas = { + models: Record; + input: Record>; }; diff --git a/packages/runtime/src/serialization-utils.ts b/packages/runtime/src/utils/serialization-utils.ts similarity index 100% rename from packages/runtime/src/serialization-utils.ts rename to packages/runtime/src/utils/serialization-utils.ts diff --git a/packages/runtime/src/zod.ts b/packages/runtime/src/zod.ts deleted file mode 100644 index 15ee465cd..000000000 --- a/packages/runtime/src/zod.ts +++ /dev/null @@ -1,21 +0,0 @@ -import z from 'zod'; -import { DbOperations } from './types'; - -/** - * Mapping from model type name to zod schema for Prisma operations - */ -export type ModelZodSchema = Record>; - -/** - * Load zod schema from standard location. - */ -export function getModelZodSchemas(): ModelZodSchema { - try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - return require('.zenstack/zod').default; - } catch { - throw new Error( - 'Zod schemas cannot be loaded. Please make sure "@core/zod" plugin is enabled in schema.zmodel.' - ); - } -} diff --git a/packages/schema/.eslintrc.json b/packages/schema/.eslintrc.json index b34c9c23b..1073f49a8 100644 --- a/packages/schema/.eslintrc.json +++ b/packages/schema/.eslintrc.json @@ -13,7 +13,8 @@ "plugin:jest/recommended" ], "rules": { - "jest/expect-expect": "off" + "jest/expect-expect": "off", + "@typescript-eslint/no-unused-vars": ["error", { "varsIgnorePattern": "^_", "argsIgnorePattern": "^_" }] }, "ignorePatterns": ["src/language-server/generated/*"] } diff --git a/packages/schema/package.json b/packages/schema/package.json index fb66a6d44..c31dca452 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -83,8 +83,8 @@ }, "dependencies": { "@paralleldrive/cuid2": "^2.2.0", - "@prisma/generator-helper": "^4.0.0", - "@prisma/internals": "^4.0.0", + "@prisma/generator-helper": "4.10.0", + "@prisma/internals": "4.10.0", "@zenstackhq/language": "workspace:*", "@zenstackhq/sdk": "workspace:*", "async-exit-hook": "^2.0.1", @@ -103,6 +103,7 @@ "sleep-promise": "^9.1.0", "strip-color": "^0.1.0", "ts-morph": "^16.0.0", + "ts-pattern": "^4.3.0", "upper-case-first": "^2.0.2", "uuid": "^9.0.0", "vscode-jsonrpc": "^8.0.2", diff --git a/packages/schema/src/cli/plugin-runner.ts b/packages/schema/src/cli/plugin-runner.ts index bb748fd00..e7aa32b3c 100644 --- a/packages/schema/src/cli/plugin-runner.ts +++ b/packages/schema/src/cli/plugin-runner.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-var-requires */ import type { DMMF } from '@prisma/generator-helper'; import { getDMMF } from '@prisma/internals'; @@ -7,13 +8,23 @@ import colors from 'colors'; import fs from 'fs'; import ora from 'ora'; import path from 'path'; +import { ensureDefaultOutputFolder } from '../plugins/plugin-utils'; import telemetry from '../telemetry'; import type { Context } from '../types'; import { getVersion } from '../utils/version-utils'; import { config } from './config'; +type PluginInfo = { + name: string; + provider: string; + options: PluginOptions; + run: PluginFunction; + dependencies: string[]; + module: any; +}; + /** - * ZenStack code generator + * ZenStack plugin runner */ export class PluginRunner { /** @@ -23,75 +34,105 @@ export class PluginRunner { const version = getVersion(); console.log(colors.bold(`⌛️ ZenStack CLI v${version}, running plugins`)); - const plugins: Array<{ - provider: string; - name: string; - run: PluginFunction; - options: PluginOptions; - }> = []; + ensureDefaultOutputFolder(); + const plugins: PluginInfo[] = []; const pluginDecls = context.schema.declarations.filter((d): d is Plugin => isPlugin(d)); - const prereqPlugins = ['@core/prisma', '@core/model-meta', '@core/access-policy']; - const allPluginProviders = prereqPlugins.concat( - pluginDecls - .map((p) => this.getPluginProvider(p)) - .filter((p): p is string => !!p && !prereqPlugins.includes(p)) - ); - let prismaOutput = resolvePath('./prisma/schema.prisma', { schemaPath: context.schemaPath, name: '' }); - for (const pluginProvider of allPluginProviders) { - const plugin = pluginDecls.find((p) => this.getPluginProvider(p) === pluginProvider); - if (plugin) { - const pluginModulePath = this.getPluginModulePath(pluginProvider); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let pluginModule: any; - try { - pluginModule = require(pluginModulePath); - } catch (err) { - console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}, ${err}`); - throw new PluginError('', `Unable to load plugin module ${pluginProvider}`); - } + let prismaOutput = resolvePath('./prisma/schema.prisma', { schemaPath: context.schemaPath, name: '' }); - if (!pluginModule.default || typeof pluginModule.default !== 'function') { - console.error(`Plugin provider ${pluginProvider} is missing a default function export`); - throw new PluginError('', `Plugin provider ${pluginProvider} is missing a default function export`); - } + for (const pluginDecl of pluginDecls) { + const pluginProvider = this.getPluginProvider(pluginDecl); + if (!pluginProvider) { + console.error(`Plugin ${pluginDecl.name} has invalid provider option`); + throw new PluginError('', `Plugin ${pluginDecl.name} has invalid provider option`); + } + const pluginModulePath = this.getPluginModulePath(pluginProvider); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let pluginModule: any; + try { + pluginModule = require(pluginModulePath); + } catch (err) { + console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}, ${err}`); + throw new PluginError('', `Unable to load plugin module ${pluginProvider}`); + } - const pluginName = this.getPluginName(pluginModule, pluginProvider); - const options: PluginOptions = { schemaPath: context.schemaPath, name: pluginName }; + if (!pluginModule.default || typeof pluginModule.default !== 'function') { + console.error(`Plugin provider ${pluginProvider} is missing a default function export`); + throw new PluginError('', `Plugin provider ${pluginProvider} is missing a default function export`); + } - plugin.fields.forEach((f) => { - const value = getLiteral(f.value) ?? getLiteralArray(f.value); - if (value === undefined) { - throw new PluginError(pluginName, `Invalid option value for ${f.name}`); - } - options[f.name] = value; - }); + const dependencies = this.getPluginDependencies(pluginModule); + const pluginName = this.getPluginName(pluginModule, pluginProvider); + const options: PluginOptions = { schemaPath: context.schemaPath, name: pluginName }; - plugins.push({ - name: pluginName, - provider: pluginProvider, - run: pluginModule.default as PluginFunction, - options, - }); - - if (pluginProvider === '@core/prisma' && typeof options.output === 'string') { - // record custom prisma output path - prismaOutput = resolvePath(options.output, options); + pluginDecl.fields.forEach((f) => { + const value = getLiteral(f.value) ?? getLiteralArray(f.value); + if (value === undefined) { + throw new PluginError(pluginName, `Invalid option value for ${f.name}`); } + options[f.name] = value; + }); + + plugins.push({ + name: pluginName, + provider: pluginProvider, + dependencies, + options, + run: pluginModule.default as PluginFunction, + module: pluginModule, + }); + + if (pluginProvider === '@core/prisma' && typeof options.output === 'string') { + // record custom prisma output path + prismaOutput = resolvePath(options.output, options); + } + } + + // make sure prerequisites are included + const corePlugins = [ + '@core/prisma', + '@core/model-meta', + '@core/access-policy', + // core dependencies introduced by dependencies + ...plugins.flatMap((p) => p.dependencies).filter((dep) => dep.startsWith('@core/')), + ]; + + for (const corePlugin of corePlugins.reverse()) { + const existingIdx = plugins.findIndex((p) => p.provider === corePlugin); + if (existingIdx >= 0) { + // shift the plugin to the front + const existing = plugins[existingIdx]; + plugins.splice(existingIdx, 1); + plugins.unshift(existing); } else { - // synthesize a plugin - const pluginModule = require(this.getPluginModulePath(pluginProvider)); - const pluginName = this.getPluginName(pluginModule, pluginProvider); - plugins.push({ + // synthesize a plugin and insert front + const pluginModule = require(this.getPluginModulePath(corePlugin)); + const pluginName = this.getPluginName(pluginModule, corePlugin); + plugins.unshift({ name: pluginName, - provider: pluginProvider, - run: pluginModule.default, + provider: corePlugin, + dependencies: [], options: { schemaPath: context.schemaPath, name: pluginName }, + run: pluginModule.default, + module: pluginModule, }); } } + // check dependencies + for (const plugin of plugins) { + for (const dep of plugin.dependencies) { + if (!plugins.find((p) => p.provider === dep)) { + console.error(`Plugin ${plugin.provider} depends on "${dep}" but it's not declared`); + throw new PluginError( + plugin.name, + `Plugin ${plugin.provider} depends on "${dep}" but it's not declared` + ); + } + } + } + const warnings: string[] = []; let dmmf: DMMF.Document | undefined = undefined; @@ -117,6 +158,10 @@ export class PluginRunner { return typeof pluginModule.name === 'string' ? (pluginModule.name as string) : pluginProvider; } + private getPluginDependencies(pluginModule: any) { + return Array.isArray(pluginModule.dependencies) ? (pluginModule.dependencies as string[]) : []; + } + private getPluginProvider(plugin: Plugin) { const providerField = plugin.fields.find((f) => f.name === 'provider'); return getLiteral(providerField?.value); diff --git a/packages/schema/src/language-server/constants.ts b/packages/schema/src/language-server/constants.ts index 9c62f2882..3c1a374c2 100644 --- a/packages/schema/src/language-server/constants.ts +++ b/packages/schema/src/language-server/constants.ts @@ -24,17 +24,3 @@ export const PLUGIN_MODULE_NAME = 'plugin.zmodel'; export enum IssueCodes { MissingOppositeRelation = 'miss-opposite-relation', } - -/** - * Filter operation function names (mapped to Prisma filter operators) - */ -export const FILTER_OPERATOR_FUNCTIONS = [ - 'contains', - 'search', - 'startsWith', - 'endsWith', - 'has', - 'hasEvery', - 'hasSome', - 'isEmpty', -]; diff --git a/packages/schema/src/language-server/validator/function-decl-validator.ts b/packages/schema/src/language-server/validator/function-decl-validator.ts new file mode 100644 index 000000000..a9438a9a0 --- /dev/null +++ b/packages/schema/src/language-server/validator/function-decl-validator.ts @@ -0,0 +1,15 @@ +import { FunctionDecl } from '@zenstackhq/language/ast'; +import { ValidationAcceptor } from 'langium'; +import { AstValidator } from '../types'; +import { validateAttributeApplication } from './utils'; + +/** + * Validates function declarations. + */ +export default class FunctionDeclValidator implements AstValidator { + validate(funcDecl: FunctionDecl, accept: ValidationAcceptor) { + funcDecl.attributes.forEach((attr) => { + validateAttributeApplication(attr, accept); + }); + } +} diff --git a/packages/schema/src/language-server/validator/function-invocation-validator.ts b/packages/schema/src/language-server/validator/function-invocation-validator.ts index d02be18f4..b6c321fec 100644 --- a/packages/schema/src/language-server/validator/function-invocation-validator.ts +++ b/packages/schema/src/language-server/validator/function-invocation-validator.ts @@ -1,18 +1,23 @@ import { Argument, + DataModelAttribute, + DataModelFieldAttribute, Expression, FunctionDecl, FunctionParam, InvocationExpr, isArrayExpr, + isDataModelAttribute, + isDataModelFieldAttribute, isLiteralExpr, } from '@zenstackhq/language/ast'; -import { ValidationAcceptor } from 'langium'; -import { getDataModelFieldReference, isEnumFieldReference } from '../../utils/ast-utils'; -import { FILTER_OPERATOR_FUNCTIONS } from '../constants'; +import { AstNode, ValidationAcceptor } from 'langium'; +import { getDataModelFieldReference } from '../../utils/ast-utils'; import { AstValidator } from '../types'; import { isFromStdlib } from '../utils'; import { typeAssignable } from './utils'; +import { match, P } from 'ts-pattern'; +import { ExpressionContext, getFunctionExpressionContext, isEnumFieldReference } from '@zenstackhq/sdk'; /** * InvocationExpr validation @@ -32,8 +37,39 @@ export default class FunctionInvocationValidator implements AstValidator ExpressionContext.DefaultValue) + .with(P.union('@@allow', '@@deny'), () => ExpressionContext.AccessPolicy) + .with('@@validate', () => ExpressionContext.ValidationRule) + .otherwise(() => undefined); + + // get the context allowed for the function + const funcAllowedContext = getFunctionExpressionContext(funcDecl); + + if (exprContext && !funcAllowedContext.includes(exprContext)) { + accept('error', `function "${funcDecl.name}" is not allowed in the current context: ${exprContext}`, { + node: expr, + }); + return; + } + + if ( + funcAllowedContext.includes(ExpressionContext.AccessPolicy) || + funcAllowedContext.includes(ExpressionContext.ValidationRule) + ) { + // filter operation functions validation // first argument must refer to a model field const firstArg = expr.args?.[0]?.value; diff --git a/packages/schema/src/language-server/validator/utils.ts b/packages/schema/src/language-server/validator/utils.ts index 7b2f88b62..fa8de9664 100644 --- a/packages/schema/src/language-server/validator/utils.ts +++ b/packages/schema/src/language-server/validator/utils.ts @@ -9,6 +9,7 @@ import { DataModelFieldAttribute, Expression, ExpressionType, + InternalAttribute, isArrayExpr, isAttribute, isDataModel, @@ -123,7 +124,7 @@ export function mapBuiltinTypeToExpressionType( export function assignableToAttributeParam( arg: AttributeArg, param: AttributeParam, - attr: DataModelAttribute | DataModelFieldAttribute + attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute ): boolean { const argResolvedType = arg.$resolvedType; if (!argResolvedType) { @@ -192,7 +193,7 @@ export function assignableToAttributeParam( } export function validateAttributeApplication( - attr: DataModelAttribute | DataModelFieldAttribute, + attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute, accept: ValidationAcceptor ) { const decl = attr.decl.ref; diff --git a/packages/schema/src/language-server/validator/zmodel-validator.ts b/packages/schema/src/language-server/validator/zmodel-validator.ts index 3f4f740b7..493bc5f89 100644 --- a/packages/schema/src/language-server/validator/zmodel-validator.ts +++ b/packages/schema/src/language-server/validator/zmodel-validator.ts @@ -1,22 +1,24 @@ -import { AstNode, LangiumDocument, ValidationAcceptor, ValidationChecks, ValidationRegistry } from 'langium'; import { Attribute, DataModel, DataSource, Enum, Expression, + FunctionDecl, InvocationExpr, Model, ZModelAstType, } from '@zenstackhq/language/ast'; +import { AstNode, LangiumDocument, ValidationAcceptor, ValidationChecks, ValidationRegistry } from 'langium'; import type { ZModelServices } from '../zmodel-module'; -import SchemaValidator from './schema-validator'; -import DataSourceValidator from './datasource-validator'; -import DataModelValidator from './datamodel-validator'; import AttributeValidator from './attribute-validator'; +import DataModelValidator from './datamodel-validator'; +import DataSourceValidator from './datasource-validator'; import EnumValidator from './enum-validator'; import ExpressionValidator from './expression-validator'; +import FunctionDeclValidator from './function-decl-validator'; import FunctionInvocationValidator from './function-invocation-validator'; +import SchemaValidator from './schema-validator'; /** * Registry for validation checks. @@ -33,6 +35,7 @@ export class ZModelValidationRegistry extends ValidationRegistry { Attribute: validator.checkAttribute, Expression: validator.checkExpression, InvocationExpr: validator.checkFunctionInvocation, + FunctionDecl: validator.checkFunctionDecl, }; this.register(checks, validator); } @@ -85,4 +88,8 @@ export class ZModelValidator { checkFunctionInvocation(node: InvocationExpr, accept: ValidationAcceptor): void { this.shouldCheck(node) && new FunctionInvocationValidator().validate(node, accept); } + + checkFunctionDecl(node: FunctionDecl, accept: ValidationAcceptor): void { + this.shouldCheck(node) && new FunctionDeclValidator().validate(node, accept); + } } diff --git a/packages/schema/src/plugins/access-policy/expression-writer.ts b/packages/schema/src/plugins/access-policy/expression-writer.ts index c5d0e47d3..be0cf25a5 100644 --- a/packages/schema/src/plugins/access-policy/expression-writer.ts +++ b/packages/schema/src/plugins/access-policy/expression-writer.ts @@ -14,12 +14,20 @@ import { ReferenceExpr, UnaryExpr, } from '@zenstackhq/language/ast'; -import { getLiteral, GUARD_FIELD_NAME, PluginError } from '@zenstackhq/sdk'; +import { + ExpressionContext, + getFunctionExpressionContext, + getLiteral, + GUARD_FIELD_NAME, + PluginError, +} from '@zenstackhq/sdk'; import { CodeBlockWriter } from 'ts-morph'; import { name } from '.'; -import { FILTER_OPERATOR_FUNCTIONS } from '../../language-server/constants'; import { getIdFields, isAuthInvocation } from '../../utils/ast-utils'; -import TypeScriptExpressionTransformer from './typescript-expression-transformer'; +import { + TypeScriptExpressionTransformer, + TypeScriptExpressionTransformerError, +} from '../../utils/typescript-expression-transformer'; import { isFutureExpr } from './utils'; type ComparisonOperator = '==' | '!=' | '>' | '>=' | '<' | '<='; @@ -51,7 +59,10 @@ export class ExpressionWriter { * @param isPostGuard indicates if we're writing for post-update conditions */ constructor(private readonly writer: CodeBlockWriter, private readonly isPostGuard = false) { - this.plainExprBuilder = new TypeScriptExpressionTransformer(this.isPostGuard); + this.plainExprBuilder = new TypeScriptExpressionTransformer({ + context: ExpressionContext.AccessPolicy, + isPostGuard: this.isPostGuard, + }); } /** @@ -228,7 +239,15 @@ export class ExpressionWriter { } private plain(expr: Expression) { - this.writer.write(this.plainExprBuilder.transform(expr)); + try { + this.writer.write(this.plainExprBuilder.transform(expr)); + } catch (err) { + if (err instanceof TypeScriptExpressionTransformerError) { + throw new PluginError(name, err.message); + } else { + throw err; + } + } } private writeComparison(expr: BinaryExpr, operator: ComparisonOperator) { @@ -273,13 +292,21 @@ export class ExpressionWriter { // guard member access of `auth()` with null check if (this.isAuthOrAuthMemberAccess(operand) && !fieldAccess.$resolvedType?.nullable) { - this.writer.write( - `(${this.plainExprBuilder.transform(operand)} == null) ? { ${GUARD_FIELD_NAME}: ${ - // auth().x != user.x is true when auth().x is null and user is not nullable - // other expressions are evaluated to false when null is involved - operator === '!=' ? 'true' : 'false' - } } : ` - ); + try { + this.writer.write( + `(${this.plainExprBuilder.transform(operand)} == null) ? { ${GUARD_FIELD_NAME}: ${ + // auth().x != user.x is true when auth().x is null and user is not nullable + // other expressions are evaluated to false when null is involved + operator === '!=' ? 'true' : 'false' + } } : ` + ); + } catch (err) { + if (err instanceof TypeScriptExpressionTransformerError) { + throw new PluginError(name, err.message); + } else { + throw err; + } + } } this.block( @@ -541,7 +568,11 @@ export class ExpressionWriter { throw new PluginError(name, `Failed to resolve function declaration`); } - if (FILTER_OPERATOR_FUNCTIONS.includes(funcDecl.name)) { + const functionAllowedContext = getFunctionExpressionContext(funcDecl); + if ( + functionAllowedContext.includes(ExpressionContext.AccessPolicy) || + functionAllowedContext.includes(ExpressionContext.ValidationRule) + ) { if (!expr.args.some((arg) => this.isFieldAccess(arg.value))) { // filter functions without referencing fields this.block(() => this.guard(() => this.plain(expr))); diff --git a/packages/schema/src/plugins/access-policy/policy-guard-generator.ts b/packages/schema/src/plugins/access-policy/policy-guard-generator.ts index 00a325a3b..c022de5bc 100644 --- a/packages/schema/src/plugins/access-policy/policy-guard-generator.ts +++ b/packages/schema/src/plugins/access-policy/policy-guard-generator.ts @@ -19,10 +19,12 @@ import { analyzePolicies, createProject, emitProject, + ExpressionContext, getDataModels, getLiteral, getPrismaClientImportSpec, GUARD_FIELD_NAME, + hasAttribute, PluginError, PluginOptions, resolved, @@ -36,12 +38,14 @@ import path from 'path'; import { FunctionDeclaration, SourceFile, VariableDeclarationKind } from 'ts-morph'; import { name } from '.'; import { isFromStdlib } from '../../language-server/utils'; -import { getIdFields, isAuthInvocation } from '../../utils/ast-utils'; +import { getIdFields, isAuthInvocation, VALIDATION_ATTRIBUTES } from '../../utils/ast-utils'; +import { + TypeScriptExpressionTransformer, + TypeScriptExpressionTransformerError, +} from '../../utils/typescript-expression-transformer'; import { ALL_OPERATION_KINDS, getDefaultOutputFolder } from '../plugin-utils'; import { ExpressionWriter } from './expression-writer'; -import TypeScriptExpressionTransformer from './typescript-expression-transformer'; import { isFutureExpr } from './utils'; -import { ZodSchemaGenerator } from './zod-schema-generator'; /** * Generates source file that contains Prisma query guard objects used for injecting database queries @@ -79,10 +83,6 @@ export default class PolicyGenerator { policyMap[model.name] = await this.generateQueryGuardForModel(model, sf); } - const zodGenerator = new ZodSchemaGenerator(); - - let fieldSchemaGenerated = false; - sf.addVariableStatement({ declarationKind: VariableDeclarationKind.Const, declarations: [ @@ -106,26 +106,24 @@ export default class PolicyGenerator { writer.write(','); } }); - writer.writeLine(','); - writer.write('schema:'); - if (zodGenerator.generate(writer, models)) { - fieldSchemaGenerated = true; - } + writer.write('validation:'); + writer.inlineBlock(() => { + for (const model of models) { + writer.write(`${lowerCaseFirst(model.name)}:`); + writer.inlineBlock(() => { + writer.write(`hasValidation: ${this.hasValidationAttributes(model)}`); + }); + writer.writeLine(','); + } + }); }); }, }, ], }); - if (fieldSchemaGenerated) { - sf.addImportDeclaration({ - namedImports: [{ name: 'z' }], - moduleSpecifier: 'zod', - }); - } - sf.addStatements('export default policy'); const shouldCompile = options.compile !== false; @@ -138,6 +136,13 @@ export default class PolicyGenerator { } } + private hasValidationAttributes(model: DataModel) { + return ( + hasAttribute(model, '@@validate') || + model.fields.some((field) => VALIDATION_ATTRIBUTES.some((attr) => hasAttribute(field, attr))) + ); + } + private getPolicyExpressions(model: DataModel, kind: PolicyKind, operation: PolicyOperationKind) { const attrs = model.attributes.filter((attr) => attr.decl.ref?.name === `@@${kind}`); @@ -377,13 +382,24 @@ export default class PolicyGenerator { // none of the rules reference model fields, we can compile down to a plain boolean // function in this case (so we can skip doing SQL queries when validating) func.addStatements((writer) => { - const transformer = new TypeScriptExpressionTransformer(kind === 'postUpdate'); - denies.forEach((rule) => { - writer.write(`if (${transformer.transform(rule, false)}) { return false; }`); - }); - allows.forEach((rule) => { - writer.write(`if (${transformer.transform(rule, false)}) { return true; }`); + const transformer = new TypeScriptExpressionTransformer({ + context: ExpressionContext.AccessPolicy, + isPostGuard: kind === 'postUpdate', }); + try { + denies.forEach((rule) => { + writer.write(`if (${transformer.transform(rule, false)}) { return false; }`); + }); + allows.forEach((rule) => { + writer.write(`if (${transformer.transform(rule, false)}) { return true; }`); + }); + } catch (err) { + if (err instanceof TypeScriptExpressionTransformerError) { + throw new PluginError(name, err.message); + } else { + throw err; + } + } writer.write('return false;'); }); } else { diff --git a/packages/schema/src/plugins/access-policy/typescript-expression-transformer.ts b/packages/schema/src/plugins/access-policy/typescript-expression-transformer.ts deleted file mode 100644 index 3c70f8562..000000000 --- a/packages/schema/src/plugins/access-policy/typescript-expression-transformer.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { - ArrayExpr, - BinaryExpr, - Expression, - InvocationExpr, - isEnumField, - isThisExpr, - LiteralExpr, - MemberAccessExpr, - NullExpr, - ReferenceExpr, - ThisExpr, - UnaryExpr, -} from '@zenstackhq/language/ast'; -import { getLiteral, PluginError } from '@zenstackhq/sdk'; -import { name } from '.'; -import { FILTER_OPERATOR_FUNCTIONS } from '../../language-server/constants'; -import { isAuthInvocation } from '../../utils/ast-utils'; -import { isFutureExpr } from './utils'; -import { isFromStdlib } from '../../language-server/utils'; - -/** - * Transforms ZModel expression to plain TypeScript expression. - */ -export default class TypeScriptExpressionTransformer { - /** - * Constructs a new TypeScriptExpressionTransformer. - * - * @param isPostGuard indicates if we're writing for post-update conditions - */ - constructor(private readonly isPostGuard = false) {} - - /** - * Transforms the given expression to a TypeScript expression. - * @param normalizeUndefined if undefined values should be normalized to null - * @returns - */ - transform(expr: Expression, normalizeUndefined = true): string { - switch (expr.$type) { - case LiteralExpr: - return this.literal(expr as LiteralExpr); - - case ArrayExpr: - return this.array(expr as ArrayExpr, normalizeUndefined); - - case NullExpr: - return this.null(); - - case ThisExpr: - return this.this(expr as ThisExpr); - - case ReferenceExpr: - return this.reference(expr as ReferenceExpr); - - case InvocationExpr: - return this.invocation(expr as InvocationExpr, normalizeUndefined); - - case MemberAccessExpr: - return this.memberAccess(expr as MemberAccessExpr, normalizeUndefined); - - case UnaryExpr: - return this.unary(expr as UnaryExpr, normalizeUndefined); - - case BinaryExpr: - return this.binary(expr as BinaryExpr, normalizeUndefined); - - default: - throw new PluginError(name, `Unsupported expression type: ${expr.$type}`); - } - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - private this(expr: ThisExpr) { - // "this" is mapped to id comparison - return 'id'; - } - - private memberAccess(expr: MemberAccessExpr, normalizeUndefined: boolean) { - if (!expr.member.ref) { - throw new PluginError(name, `Unresolved MemberAccessExpr`); - } - - if (isThisExpr(expr.operand)) { - return expr.member.ref.name; - } else if (isFutureExpr(expr.operand)) { - if (!this.isPostGuard) { - throw new PluginError(name, `future() is only supported in postUpdate rules`); - } - return expr.member.ref.name; - } else { - if (normalizeUndefined) { - // normalize field access to null instead of undefined to avoid accidentally use undefined in filter - return `(${this.transform(expr.operand, normalizeUndefined)}?.${expr.member.ref.name} ?? null)`; - } else { - return `${this.transform(expr.operand, normalizeUndefined)}?.${expr.member.ref.name}`; - } - } - } - - private invocation(expr: InvocationExpr, normalizeUndefined: boolean) { - if (!expr.function.ref) { - throw new PluginError(name, `Unresolved InvocationExpr`); - } - - if (isAuthInvocation(expr)) { - return 'user'; - } - - const funcName = expr.function.ref.name; - const isStdFunc = isFromStdlib(expr.function.ref); - - if (isStdFunc && FILTER_OPERATOR_FUNCTIONS.includes(funcName)) { - // arguments are already type-checked - - const arg0 = this.transform(expr.args[0].value, false); - let result: string; - switch (funcName) { - case 'contains': { - const caseInsensitive = getLiteral(expr.args[2]?.value) === true; - if (caseInsensitive) { - result = `${arg0}?.toLowerCase().includes(${this.transform( - expr.args[1].value, - normalizeUndefined - )}?.toLowerCase())`; - } else { - result = `${arg0}?.includes(${this.transform(expr.args[1].value, normalizeUndefined)})`; - } - break; - } - - case 'search': - throw new PluginError(name, '"search" function must be used against a field'); - - case 'startsWith': - result = `${arg0}?.startsWith(${this.transform(expr.args[1].value, normalizeUndefined)})`; - break; - - case 'endsWith': - result = `${arg0}?.endsWith(${this.transform(expr.args[1].value, normalizeUndefined)})`; - break; - - case 'has': - result = `${arg0}?.includes(${this.transform(expr.args[1].value, normalizeUndefined)})`; - break; - - case 'hasEvery': - result = `${this.transform( - expr.args[1].value, - normalizeUndefined - )}?.every((item) => ${arg0}?.includes(item))`; - break; - - case 'hasSome': - result = `${this.transform( - expr.args[1].value, - normalizeUndefined - )}?.some((item) => ${arg0}?.includes(item))`; - break; - - case 'isEmpty': - result = `${arg0}?.length === 0`; - break; - - default: - throw new PluginError(name, `Function invocation is not supported: ${expr.function.ref?.name}`); - } - - return `(${result} ?? false)`; - } - - if (isStdFunc && funcName === 'now') { - return `(new Date())`; - } - - throw new PluginError(name, `Function invocation is not supported: ${expr.function.ref?.name}`); - } - - private reference(expr: ReferenceExpr) { - if (!expr.target.ref) { - throw new PluginError(name, `Unresolved ReferenceExpr`); - } - - if (isEnumField(expr.target.ref)) { - return `${expr.target.ref.$container.name}.${expr.target.ref.name}`; - } else { - if (this.isPostGuard) { - // if we're processing post-update, any direct field access should be - // treated as access to context.preValue, which is entity's value before - // the update - return `context.preValue?.${expr.target.ref.name}`; - } else { - return expr.target.ref.name; - } - } - } - - private null() { - return 'null'; - } - - private array(expr: ArrayExpr, normalizeUndefined: boolean) { - return `[${expr.items.map((item) => this.transform(item, normalizeUndefined)).join(', ')}]`; - } - - private literal(expr: LiteralExpr) { - if (typeof expr.value === 'string') { - return `'${expr.value}'`; - } else { - return expr.value.toString(); - } - } - - private unary(expr: UnaryExpr, normalizeUndefined: boolean): string { - return `(${expr.operator} ${this.transform(expr.operand, normalizeUndefined)})`; - } - - private binary(expr: BinaryExpr, normalizeUndefined: boolean): string { - if (expr.operator === 'in') { - return `(${this.transform(expr.right, false)}?.includes(${this.transform( - expr.left, - normalizeUndefined - )}) ?? false)`; - } else { - return `(${this.transform(expr.left, normalizeUndefined)} ${expr.operator} ${this.transform( - expr.right, - normalizeUndefined - )})`; - } - } -} diff --git a/packages/schema/src/plugins/access-policy/zod-schema-generator.ts b/packages/schema/src/plugins/access-policy/zod-schema-generator.ts deleted file mode 100644 index 7e136051a..000000000 --- a/packages/schema/src/plugins/access-policy/zod-schema-generator.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { DataModel, DataModelField, DataModelFieldAttribute, isDataModelField } from '@zenstackhq/language/ast'; -import { AUXILIARY_FIELDS, VALIDATION_ATTRIBUTES, getLiteral } from '@zenstackhq/sdk'; -import { lowerCaseFirst } from 'lower-case-first'; -import { CodeBlockWriter } from 'ts-morph'; - -/** - * Writes Zod schema for data models. - */ -export class ZodSchemaGenerator { - generate(writer: CodeBlockWriter, models: DataModel[]) { - let generated = false; - writer.inlineBlock(() => { - models.forEach((model) => { - const fields = model.fields.filter( - (field) => - !AUXILIARY_FIELDS.includes(field.name) && - // scalar fields only - !isDataModelField(field.type.reference?.ref) && - this.hasValidationAttributes(field) - ); - - if (fields.length === 0) { - return; - } - - generated = true; - writer.write(`${lowerCaseFirst(model.name)}: z.object(`); - writer.inlineBlock(() => { - fields.forEach((field) => { - writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`); - }); - }); - writer.writeLine(').partial(),'); - }); - }); - return generated; - } - - private hasValidationAttributes(field: DataModelField) { - return field.attributes.some((attr) => VALIDATION_ATTRIBUTES.includes(attr.decl.$refText)); - } - - private makeFieldValidator(field: DataModelField) { - let schema = this.makeZodSchema(field); - // translate field constraint attributes to zod schema - for (const attr of field.attributes) { - switch (attr.decl.ref?.name) { - case '@length': { - const min = this.getAttrLiteralArg(attr, 'min'); - if (min) { - schema += `.min(${min})`; - } - const max = this.getAttrLiteralArg(attr, 'max'); - if (max) { - schema += `.max(${max})`; - } - break; - } - case '@regex': { - const expr = this.getAttrLiteralArg(attr, 'regex'); - if (expr) { - schema += `.regex(/${expr}/)`; - } - break; - } - case '@startsWith': { - const text = this.getAttrLiteralArg(attr, 'text'); - if (text) { - schema += `.startsWith(${JSON.stringify(text)})`; - } - break; - } - case '@endsWith': { - const text = this.getAttrLiteralArg(attr, 'text'); - if (text) { - schema += `.endsWith(${JSON.stringify(text)})`; - } - break; - } - case '@email': { - schema += `.email()`; - break; - } - case '@url': { - schema += `.url()`; - break; - } - case '@datetime': { - schema += `.datetime({ offset: true })`; - break; - } - case '@gt': { - const value = this.getAttrLiteralArg(attr, 'value'); - if (value !== undefined) { - schema += `.gt(${value})`; - } - break; - } - case '@gte': { - const value = this.getAttrLiteralArg(attr, 'value'); - if (value !== undefined) { - schema += `.gte(${value})`; - } - break; - } - case '@lt': { - const value = this.getAttrLiteralArg(attr, 'value'); - if (value !== undefined) { - schema += `.lt(${value})`; - } - break; - } - case '@lte': { - const value = this.getAttrLiteralArg(attr, 'value'); - if (value !== undefined) { - schema += `.lte(${value})`; - } - break; - } - } - } - - if (field.type.optional) { - schema += '.nullable()'; - } - - return schema; - } - - private makeZodSchema(field: DataModelField) { - let schema: string; - switch (field.type.type) { - case 'Int': - case 'Float': - case 'Decimal': - schema = 'z.number()'; - break; - case 'BigInt': - schema = 'z.bigint()'; - break; - case 'String': - schema = 'z.string()'; - break; - case 'Boolean': - schema = 'z.boolean()'; - break; - case 'DateTime': - schema = 'z.date()'; - break; - default: - schema = 'z.any()'; - break; - } - - if (field.type.array) { - schema = `z.array(${schema})`; - } - - return schema; - } - - private getAttrLiteralArg(attr: DataModelFieldAttribute, paramName: string) { - const arg = attr.args.find((arg) => arg.$resolvedParam?.name === paramName); - return arg && getLiteral(arg.value); - } -} diff --git a/packages/schema/src/plugins/plugin-utils.ts b/packages/schema/src/plugins/plugin-utils.ts index 482f7a7bd..ad4b3d21a 100644 --- a/packages/schema/src/plugins/plugin-utils.ts +++ b/packages/schema/src/plugins/plugin-utils.ts @@ -21,6 +21,17 @@ export function getNodeModulesFolder(startPath?: string): string | undefined { } } +/** + * Ensure the default output folder is initialized. + */ +export function ensureDefaultOutputFolder() { + const output = getDefaultOutputFolder(); + if (output && !fs.existsSync(output)) { + fs.mkdirSync(output, { recursive: true }); + fs.writeFileSync(path.join(output, 'package.json'), JSON.stringify({ name: '.zenstack', version: '1.0.0' })); + } +} + /** * Gets the default node_modules/.zenstack output folder for plugins. * @returns @@ -28,6 +39,12 @@ export function getNodeModulesFolder(startPath?: string): string | undefined { export function getDefaultOutputFolder() { // Find the real runtime module path, it might be a symlink in pnpm let runtimeModulePath = require.resolve('@zenstackhq/runtime'); + + if (process.env.NODE_ENV === 'test') { + // handling the case when running as tests, resolve relative to CWD + runtimeModulePath = path.resolve(path.join(process.cwd(), 'node_modules', '@zenstackhq', 'runtime')); + } + if (runtimeModulePath) { // start with the parent folder of @zenstackhq, supposed to be a node_modules folder while (!runtimeModulePath.endsWith('@zenstackhq') && runtimeModulePath !== '/') { diff --git a/packages/schema/src/plugins/prisma/schema-generator.ts b/packages/schema/src/plugins/prisma/schema-generator.ts index ff97fd605..7130b0a7b 100644 --- a/packages/schema/src/plugins/prisma/schema-generator.ts +++ b/packages/schema/src/plugins/prisma/schema-generator.ts @@ -123,9 +123,15 @@ export default class PrismaSchemaGenerator { if (generateClient) { try { // run 'prisma generate' - await execSync(`npx prisma generate --schema ${outFile}`); + await execSync(`npx prisma generate --schema ${outFile}`, 'ignore'); } catch { await this.trackPrismaSchemaError(outFile); + try { + // run 'prisma generate' again with output to the console + await execSync(`npx prisma generate --schema ${outFile}`); + } catch { + // noop + } throw new PluginError(name, `Failed to run "prisma generate"`); } } diff --git a/packages/schema/src/plugins/zod/generator.ts b/packages/schema/src/plugins/zod/generator.ts index 5757317de..aeb7bdd83 100644 --- a/packages/schema/src/plugins/zod/generator.ts +++ b/packages/schema/src/plugins/zod/generator.ts @@ -1,7 +1,18 @@ import { ConnectorType, DMMF } from '@prisma/generator-helper'; import { Dictionary } from '@prisma/internals'; -import { PluginOptions, createProject, emitProject, getLiteral, resolvePath, saveProject } from '@zenstackhq/sdk'; -import { DataSource, Model, isDataSource } from '@zenstackhq/sdk/ast'; +import { + AUXILIARY_FIELDS, + PluginOptions, + createProject, + emitProject, + getDataModels, + getLiteral, + hasAttribute, + isForeignKeyField, + resolvePath, + saveProject, +} from '@zenstackhq/sdk'; +import { DataModel, DataSource, Model, isDataModel, isDataSource, isEnum } from '@zenstackhq/sdk/ast'; import { AggregateOperationSupport, addMissingInputObjectTypes, @@ -13,6 +24,8 @@ import { Project } from 'ts-morph'; import { getDefaultOutputFolder } from '../plugin-utils'; import Transformer from './transformer'; import removeDir from './utils/removeDir'; +import { upperCaseFirst } from 'upper-case-first'; +import { makeFieldSchema, makeValidationRefinements } from './utils/schema-gen'; export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.Document) { let output = options.output as string; @@ -59,7 +72,7 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF. const aggregateOperationSupport = resolveAggregateOperationSupport(inputObjectTypes); await generateObjectSchemas(inputObjectTypes, project, output, model); - await generateModelSchemas(models, modelOperations, aggregateOperationSupport, project, model); + await generateModelSchemas(models, modelOperations, aggregateOperationSupport, project, model, output); const shouldCompile = options.compile !== false; if (!shouldCompile || options.preserveTsFiles === true) { @@ -123,7 +136,8 @@ async function generateModelSchemas( modelOperations: DMMF.ModelMapping[], aggregateOperationSupport: AggregateOperationSupport, project: Project, - zmodel: Model + zmodel: Model, + output: string ) { const transformer = new Transformer({ models, @@ -132,5 +146,119 @@ async function generateModelSchemas( project, zmodel, }); - await transformer.generateModelSchemas(); + await transformer.generateInputSchemas(); + + const schemaNames: string[] = []; + for (const dm of getDataModels(zmodel)) { + schemaNames.push(await generateModelSchema(dm, project, output)); + } + + project.createSourceFile( + path.join(output, 'models', 'index.ts'), + schemaNames.map((name) => `export * from './${name}';`).join('\n'), + { overwrite: true } + ); + + project.createSourceFile( + path.join(output, 'index.ts'), + `export * as input from './input'; + export * as models from './models'; + export * as objects from './objects'; + export * as enums from './enums'; + `, + { overwrite: true } + ); +} + +async function generateModelSchema(model: DataModel, project: Project, output: string) { + const schemaName = `${upperCaseFirst(model.name)}.schema`; + const sf = project.createSourceFile(path.join(output, 'models', `${schemaName}.ts`), undefined, { + overwrite: true, + }); + sf.replaceWithText((writer) => { + writer.writeLine('/* eslint-disable */'); + + const fields = model.fields.filter( + (field) => + !AUXILIARY_FIELDS.includes(field.name) && + // scalar fields only + !isDataModel(field.type.reference?.ref) && + !isForeignKeyField(field) + ); + + writer.writeLine(`import { z } from 'zod';`); + + // import enums + for (const field of fields) { + if (field.type.reference?.ref && isEnum(field.type.reference?.ref)) { + const name = upperCaseFirst(field.type.reference?.ref.name); + writer.writeLine(`import { ${name}Schema } from '../enums/${name}.schema';`); + } + } + + // create base schema + writer.write(`const baseSchema = z.object(`); + writer.inlineBlock(() => { + fields.forEach((field) => { + writer.writeLine(`${field.name}: ${makeFieldSchema(field)},`); + }); + }); + writer.writeLine(');'); + + const refinements = makeValidationRefinements(model); + if (refinements.length > 0) { + console.log('Generated refinements:', refinements); + writer.writeLine(`function refine(schema: z.ZodType) { return schema${refinements.join('\n')}; }`); + } + + // model schema + let modelSchema = 'baseSchema'; + const fieldsToOmit = fields.filter((field) => hasAttribute(field, '@omit')); + if (fieldsToOmit.length > 0) { + modelSchema = makeOmit( + modelSchema, + fieldsToOmit.map((f) => f.name) + ); + } + if (refinements.length > 0) { + modelSchema = `refine(${modelSchema})`; + } + writer.writeLine(`export const ${upperCaseFirst(model.name)}Schema = ${modelSchema};`); + + // create schema + let createSchema = 'baseSchema'; + const fieldsWithDefault = fields.filter( + (field) => hasAttribute(field, '@default') || hasAttribute(field, '@updatedAt') || field.type.array + ); + if (fieldsWithDefault.length > 0) { + createSchema = makePartial( + createSchema, + fieldsWithDefault.map((f) => f.name) + ); + } + if (refinements.length > 0) { + createSchema = `refine(${createSchema})`; + } + writer.writeLine(`export const ${upperCaseFirst(model.name)}CreateSchema = ${createSchema};`); + + // update schema + let updateSchema = 'baseSchema.partial()'; + if (refinements.length > 0) { + updateSchema = `refine(${updateSchema})`; + } + writer.writeLine(`export const ${upperCaseFirst(model.name)}UpdateSchema = ${updateSchema};`); + }); + return schemaName; +} + +function makePartial(schema: string, fields: string[]) { + return `${schema}.partial({ + ${fields.map((f) => `${f}: true`).join(', ')}, + })`; +} + +function makeOmit(schema: string, fields: string[]) { + return `${schema}.omit({ + ${fields.map((f) => `${f}: true`).join(', ')}, + })`; } diff --git a/packages/schema/src/plugins/zod/transformer.ts b/packages/schema/src/plugins/zod/transformer.ts index 723e8b295..64bfa7049 100644 --- a/packages/schema/src/plugins/zod/transformer.ts +++ b/packages/schema/src/plugins/zod/transformer.ts @@ -299,7 +299,7 @@ export default class Transformer { .map((name) => { const { isModelQueryType, modelName } = this.checkIsModelQueryType(name); if (isModelQueryType) { - return `import { ${modelName}Schema } from '../${modelName}.schema'`; + return `import { ${modelName}InputSchema } from '../input/${modelName}Input.schema'`; } else if (Transformer.enumNames.includes(name)) { return `import { ${name}Schema } from '../enums/${name}.schema'`; } else { @@ -328,7 +328,7 @@ export default class Transformer { resolveModelQuerySchemaName(modelName: string, queryName: string) { const modelNameCapitalized = modelName.charAt(0).toUpperCase() + modelName.slice(1); - return `${modelNameCapitalized}Schema.${queryName}`; + return `${modelNameCapitalized}InputSchema.${queryName}`; } wrapWithZodUnion(zodStringFields: string[]) { @@ -357,7 +357,7 @@ export default class Transformer { return this.name; } - async generateModelSchemas() { + async generateInputSchemas() { const globalExports: string[] = []; for (const modelOperation of this.modelOperations) { @@ -382,7 +382,7 @@ export default class Transformer { // eslint-disable-next-line @typescript-eslint/no-explicit-any } = modelOperation; - globalExports.push(`export { ${modelName}Schema as ${modelName} } from './${modelName}.schema'`); + globalExports.push(`export * from './${modelName}Input.schema'`); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const model = findModelByName(this.models, modelName)!; @@ -395,17 +395,17 @@ export default class Transformer { if (findUnique) { imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'` ); codeBody += `findUnique: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema }),`; } if (findFirst) { imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from './enums/${upperCaseFirst( + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'`, + `import { ${modelName}OrderByWithRelationInputObjectSchema } from '../objects/${modelName}OrderByWithRelationInput.schema'`, + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'`, + `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from '../enums/${upperCaseFirst( modelName )}ScalarFieldEnum.schema'` ); @@ -416,10 +416,10 @@ export default class Transformer { if (findMany) { imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from './enums/${upperCaseFirst( + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'`, + `import { ${modelName}OrderByWithRelationInputObjectSchema } from '../objects/${modelName}OrderByWithRelationInput.schema'`, + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'`, + `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from '../enums/${upperCaseFirst( modelName )}ScalarFieldEnum.schema'` ); @@ -430,55 +430,60 @@ export default class Transformer { if (createOne) { imports.push( - `import { ${modelName}CreateInputObjectSchema } from './objects/${modelName}CreateInput.schema'` + `import { ${modelName}CreateInputObjectSchema } from '../objects/${modelName}CreateInput.schema'`, + `import { ${modelName}UncheckedCreateInputObjectSchema } from '../objects/${modelName}UncheckedCreateInput.schema'` ); - codeBody += `create: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: ${modelName}CreateInputObjectSchema }),`; + codeBody += `create: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: z.union([${modelName}CreateInputObjectSchema, ${modelName}UncheckedCreateInputObjectSchema]) }),`; } if (createMany) { imports.push( - `import { ${modelName}CreateManyInputObjectSchema } from './objects/${modelName}CreateManyInput.schema'` + `import { ${modelName}CreateManyInputObjectSchema } from '../objects/${modelName}CreateManyInput.schema'` ); - codeBody += `createMany: z.object({ data: ${modelName}CreateManyInputObjectSchema }),`; + codeBody += `createMany: z.object({ data: z.union([${modelName}CreateManyInputObjectSchema, z.array(${modelName}CreateManyInputObjectSchema)]) }),`; } if (deleteOne) { imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'` ); codeBody += `'delete': z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema }),`; } if (deleteMany) { imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'` + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'` ); codeBody += `deleteMany: z.object({ where: ${modelName}WhereInputObjectSchema.optional() }),`; } if (updateOne) { imports.push( - `import { ${modelName}UpdateInputObjectSchema } from './objects/${modelName}UpdateInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` + `import { ${modelName}UpdateInputObjectSchema } from '../objects/${modelName}UpdateInput.schema'`, + `import { ${modelName}UncheckedUpdateInputObjectSchema } from '../objects/${modelName}UncheckedUpdateInput.schema'`, + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'` ); - codeBody += `update: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: ${modelName}UpdateInputObjectSchema, where: ${modelName}WhereUniqueInputObjectSchema }),`; + codeBody += `update: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} data: z.union([${modelName}UpdateInputObjectSchema, ${modelName}UncheckedUpdateInputObjectSchema]), where: ${modelName}WhereUniqueInputObjectSchema }),`; } if (updateMany) { imports.push( - `import { ${modelName}UpdateManyMutationInputObjectSchema } from './objects/${modelName}UpdateManyMutationInput.schema'`, - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'` + `import { ${modelName}UpdateManyMutationInputObjectSchema } from '../objects/${modelName}UpdateManyMutationInput.schema'`, + `import { ${modelName}UncheckedUpdateManyInputObjectSchema } from '../objects/${modelName}UncheckedUpdateManyInput.schema'`, + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'` ); - codeBody += `updateMany: z.object({ data: ${modelName}UpdateManyMutationInputObjectSchema, where: ${modelName}WhereInputObjectSchema.optional() }),`; + codeBody += `updateMany: z.object({ data: z.union([${modelName}UpdateManyMutationInputObjectSchema, ${modelName}UncheckedUpdateManyInputObjectSchema]), where: ${modelName}WhereInputObjectSchema.optional() }),`; } if (upsertOne) { imports.push( - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'`, - `import { ${modelName}CreateInputObjectSchema } from './objects/${modelName}CreateInput.schema'`, - `import { ${modelName}UpdateInputObjectSchema } from './objects/${modelName}UpdateInput.schema'` + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'`, + `import { ${modelName}CreateInputObjectSchema } from '../objects/${modelName}CreateInput.schema'`, + `import { ${modelName}UncheckedCreateInputObjectSchema } from '../objects/${modelName}UncheckedCreateInput.schema'`, + `import { ${modelName}UpdateInputObjectSchema } from '../objects/${modelName}UpdateInput.schema'`, + `import { ${modelName}UncheckedUpdateInputObjectSchema } from '../objects/${modelName}UncheckedUpdateInput.schema'` ); - codeBody += `upsert: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema, create: ${modelName}CreateInputObjectSchema, update: ${modelName}UpdateInputObjectSchema }),`; + codeBody += `upsert: z.object({ ${selectZodSchemaLineLazy} ${includeZodSchemaLineLazy} where: ${modelName}WhereUniqueInputObjectSchema, create: z.union([${modelName}CreateInputObjectSchema, ${modelName}UncheckedCreateInputObjectSchema]), update: z.union([${modelName}UpdateInputObjectSchema, ${modelName}UncheckedUpdateInputObjectSchema]) }),`; } const aggregateOperations = []; @@ -486,7 +491,7 @@ export default class Transformer { const modelNameVar = upperCaseFirst(modelName); if (this.aggregateOperationSupport[modelNameVar]?.count) { imports.push( - `import { ${modelNameVar}CountAggregateInputObjectSchema } from './objects/${modelNameVar}CountAggregateInput.schema'` + `import { ${modelNameVar}CountAggregateInputObjectSchema } from '../objects/${modelNameVar}CountAggregateInput.schema'` ); aggregateOperations.push( `_count: z.union([ z.literal(true), ${modelNameVar}CountAggregateInputObjectSchema ]).optional()` @@ -494,34 +499,34 @@ export default class Transformer { } if (this.aggregateOperationSupport[modelNameVar]?.min) { imports.push( - `import { ${modelNameVar}MinAggregateInputObjectSchema } from './objects/${modelNameVar}MinAggregateInput.schema'` + `import { ${modelNameVar}MinAggregateInputObjectSchema } from '../objects/${modelNameVar}MinAggregateInput.schema'` ); aggregateOperations.push(`_min: ${modelNameVar}MinAggregateInputObjectSchema.optional()`); } if (this.aggregateOperationSupport[modelNameVar]?.max) { imports.push( - `import { ${modelNameVar}MaxAggregateInputObjectSchema } from './objects/${modelNameVar}MaxAggregateInput.schema'` + `import { ${modelNameVar}MaxAggregateInputObjectSchema } from '../objects/${modelNameVar}MaxAggregateInput.schema'` ); aggregateOperations.push(`_max: ${modelNameVar}MaxAggregateInputObjectSchema.optional()`); } if (this.aggregateOperationSupport[modelNameVar]?.avg) { imports.push( - `import { ${modelNameVar}AvgAggregateInputObjectSchema } from './objects/${modelNameVar}AvgAggregateInput.schema'` + `import { ${modelNameVar}AvgAggregateInputObjectSchema } from '../objects/${modelNameVar}AvgAggregateInput.schema'` ); aggregateOperations.push(`_avg: ${modelNameVar}AvgAggregateInputObjectSchema.optional()`); } if (this.aggregateOperationSupport[modelNameVar]?.sum) { imports.push( - `import { ${modelNameVar}SumAggregateInputObjectSchema } from './objects/${modelNameVar}SumAggregateInput.schema'` + `import { ${modelNameVar}SumAggregateInputObjectSchema } from '../objects/${modelNameVar}SumAggregateInput.schema'` ); aggregateOperations.push(`_sum: ${modelNameVar}SumAggregateInputObjectSchema.optional()`); } if (aggregate) { imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithRelationInputObjectSchema } from './objects/${modelName}OrderByWithRelationInput.schema'`, - `import { ${modelName}WhereUniqueInputObjectSchema } from './objects/${modelName}WhereUniqueInput.schema'` + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'`, + `import { ${modelName}OrderByWithRelationInputObjectSchema } from '../objects/${modelName}OrderByWithRelationInput.schema'`, + `import { ${modelName}WhereUniqueInputObjectSchema } from '../objects/${modelName}WhereUniqueInput.schema'` ); codeBody += `aggregate: z.object({ where: ${modelName}WhereInputObjectSchema.optional(), orderBy: z.union([${modelName}OrderByWithRelationInputObjectSchema, ${modelName}OrderByWithRelationInputObjectSchema.array()]).optional(), cursor: ${modelName}WhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), ${aggregateOperations.join( @@ -531,10 +536,10 @@ export default class Transformer { if (groupBy) { imports.push( - `import { ${modelName}WhereInputObjectSchema } from './objects/${modelName}WhereInput.schema'`, - `import { ${modelName}OrderByWithAggregationInputObjectSchema } from './objects/${modelName}OrderByWithAggregationInput.schema'`, - `import { ${modelName}ScalarWhereWithAggregatesInputObjectSchema } from './objects/${modelName}ScalarWhereWithAggregatesInput.schema'`, - `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from './enums/${upperCaseFirst( + `import { ${modelName}WhereInputObjectSchema } from '../objects/${modelName}WhereInput.schema'`, + `import { ${modelName}OrderByWithAggregationInputObjectSchema } from '../objects/${modelName}OrderByWithAggregationInput.schema'`, + `import { ${modelName}ScalarWhereWithAggregatesInputObjectSchema } from '../objects/${modelName}ScalarWhereWithAggregatesInput.schema'`, + `import { ${upperCaseFirst(modelName)}ScalarFieldEnumSchema } from '../enums/${upperCaseFirst( modelName )}ScalarFieldEnum.schema'` ); @@ -545,12 +550,12 @@ export default class Transformer { imports = [...new Set(imports)]; - const filePath = path.join(Transformer.outputPath, `${modelName}.schema.ts`); + const filePath = path.join(Transformer.outputPath, `input/${modelName}Input.schema.ts`); const content = ` /* eslint-disable */ ${imports.join(';\n')} - export const ${modelName}Schema = { + export const ${modelName}InputSchema = { ${indentString(codeBody, 4)} }; `; @@ -558,7 +563,7 @@ export default class Transformer { this.project.createSourceFile(filePath, content, { overwrite: true }); } - const indexFilePath = path.join(Transformer.outputPath, 'index.ts'); + const indexFilePath = path.join(Transformer.outputPath, 'input/index.ts'); const indexContent = ` /* eslint-disable */ ${globalExports.join(';\n')} @@ -578,10 +583,10 @@ ${globalExports.join(';\n')} const hasRelationToAnotherModel = checkModelHasModelRelation(model); - const selectImport = `import { ${modelName}SelectObjectSchema } from './objects/${modelName}Select.schema'`; + const selectImport = `import { ${modelName}SelectObjectSchema } from '../objects/${modelName}Select.schema'`; const includeImport = hasRelationToAnotherModel - ? `import { ${modelName}IncludeObjectSchema } from './objects/${modelName}Include.schema'` + ? `import { ${modelName}IncludeObjectSchema } from '../objects/${modelName}Include.schema'` : ''; let selectZodSchemaLine = ''; diff --git a/packages/schema/src/plugins/zod/utils/schema-gen.ts b/packages/schema/src/plugins/zod/utils/schema-gen.ts new file mode 100644 index 000000000..78a720549 --- /dev/null +++ b/packages/schema/src/plugins/zod/utils/schema-gen.ts @@ -0,0 +1,182 @@ +import { ExpressionContext, PluginError, getAttributeArg, getAttributeArgLiteral, getLiteral } from '@zenstackhq/sdk'; +import { DataModel, DataModelField, DataModelFieldAttribute, isEnum } from '@zenstackhq/sdk/ast'; +import { upperCaseFirst } from 'upper-case-first'; +import { name } from '..'; +import { + TypeScriptExpressionTransformer, + TypeScriptExpressionTransformerError, +} from '../../../utils/typescript-expression-transformer'; + +export function makeFieldSchema(field: DataModelField) { + let schema = makeZodSchema(field); + + for (const attr of field.attributes) { + const message = getAttrLiteralArg(attr, 'message'); + const messageArg = message ? `, { message: ${JSON.stringify(message)} }` : ''; + const messageArgFirst = message ? `{ message: ${JSON.stringify(message)} }` : ''; + + switch (attr.decl.ref?.name) { + case '@length': { + const min = getAttrLiteralArg(attr, 'min'); + if (min) { + schema += `.min(${min}${messageArg})`; + } + const max = getAttrLiteralArg(attr, 'max'); + if (max) { + schema += `.max(${max}${messageArg})`; + } + break; + } + case '@contains': { + const expr = getAttrLiteralArg(attr, 'text'); + if (expr) { + schema += `.includes(${JSON.stringify(expr)}${messageArg})`; + } + break; + } + case '@regex': { + const expr = getAttrLiteralArg(attr, 'regex'); + if (expr) { + schema += `.regex(new RegExp(${JSON.stringify(expr)})${messageArg})`; + } + break; + } + case '@startsWith': { + const text = getAttrLiteralArg(attr, 'text'); + if (text) { + schema += `.startsWith(${JSON.stringify(text)}${messageArg})`; + } + break; + } + case '@endsWith': { + const text = getAttrLiteralArg(attr, 'text'); + if (text) { + schema += `.endsWith(${JSON.stringify(text)}${messageArg})`; + } + break; + } + case '@email': { + schema += `.email(${messageArgFirst})`; + break; + } + case '@url': { + schema += `.url(${messageArgFirst})`; + break; + } + case '@datetime': { + schema += `.datetime({ offset: true${message ? ', message: ' + JSON.stringify(message) : ''} })`; + break; + } + case '@gt': { + const value = getAttrLiteralArg(attr, 'value'); + if (value !== undefined) { + schema += `.gt(${value}${messageArg})`; + } + break; + } + case '@gte': { + const value = getAttrLiteralArg(attr, 'value'); + if (value !== undefined) { + schema += `.gte(${value}${messageArg})`; + } + break; + } + case '@lt': { + const value = getAttrLiteralArg(attr, 'value'); + if (value !== undefined) { + schema += `.lt(${value}${messageArg})`; + } + break; + } + case '@lte': { + const value = getAttrLiteralArg(attr, 'value'); + if (value !== undefined) { + schema += `.lte(${value}${messageArg})`; + } + break; + } + } + } + + if (field.type.optional) { + schema += '.nullish()'; + } + + return schema; +} + +function makeZodSchema(field: DataModelField) { + let schema: string; + + if (field.type.reference?.ref && isEnum(field.type.reference?.ref)) { + schema = `${upperCaseFirst(field.type.reference.ref.name)}Schema`; + } else { + switch (field.type.type) { + case 'Int': + case 'Float': + case 'Decimal': + schema = 'z.number()'; + break; + case 'BigInt': + schema = 'z.bigint()'; + break; + case 'String': + schema = 'z.string()'; + break; + case 'Boolean': + schema = 'z.boolean()'; + break; + case 'DateTime': + schema = 'z.date()'; + break; + case 'Bytes': + schema = 'z.number().array()'; + break; + default: + schema = 'z.any()'; + break; + } + } + + if (field.type.array) { + schema = `z.array(${schema})`; + } + + return schema; +} + +export function makeValidationRefinements(model: DataModel) { + const attrs = model.attributes.filter((attr) => attr.decl.ref?.name === '@@validate'); + const refinements = attrs + .map((attr) => { + const valueArg = getAttributeArg(attr, 'value'); + if (!valueArg) { + return undefined; + } + + const messageArg = getAttributeArgLiteral(attr, 'message'); + const message = messageArg ? `, { message: ${JSON.stringify(messageArg)} }` : ''; + + try { + const expr = new TypeScriptExpressionTransformer({ + context: ExpressionContext.ValidationRule, + fieldReferenceContext: 'value', + }).transform(valueArg); + return `.refine((value: any) => ${expr}${message})`; + } catch (err) { + if (err instanceof TypeScriptExpressionTransformerError) { + throw new PluginError(name, err.message); + } else { + throw err; + } + } + }) + .filter((r) => !!r); + + return refinements; +} + +function getAttrLiteralArg(attr: DataModelFieldAttribute, paramName: string) { + const arg = attr.args.find((arg) => arg.$resolvedParam?.name === paramName); + return arg && getLiteral(arg.value); +} diff --git a/packages/schema/src/res/stdlib.zmodel b/packages/schema/src/res/stdlib.zmodel index 7ca1426ae..8c78707e7 100644 --- a/packages/schema/src/res/stdlib.zmodel +++ b/packages/schema/src/res/stdlib.zmodel @@ -49,6 +49,20 @@ enum AttributeTargetField { ModelField } +/** + * Indicates the expression context a function can be used. + */ +enum ExpressionContext { + // used in @default + DefaultValue + + // used in @@allow and @@deny + AccessPolicy + + // used in @@validate + ValidationRule +} + /** * Reads value from an environment variable. */ @@ -59,99 +73,104 @@ function env(name: String): String { * Gets the current login user. */ function auth(): Any { -} +} @@@expressionContext([AccessPolicy]) /** * Gets current date-time (as DateTime type). */ function now(): DateTime { -} +} @@@expressionContext([DefaultValue, AccessPolicy, ValidationRule]) /** * Generates a globally unique identifier based on the UUID specs. */ function uuid(): String { -} +} @@@expressionContext([DefaultValue]) /** * Generates a globally unique identifier based on the CUID spec. */ function cuid(): String { -} +} @@@expressionContext([DefaultValue]) /** * Creates a sequence of integers in the underlying database and assign the incremented * values to the ID values of the created records based on the sequence. */ function autoincrement(): Int { -} +} @@@expressionContext([DefaultValue]) /** * Represents default values that cannot be expressed in the Prisma schema (such as random()). */ function dbgenerated(expr: String): Any { -} +} @@@expressionContext([DefaultValue]) /** * Gets entities value before an update. Only valid when used in a "update" policy rule. */ function future(): Any { -} +} @@@expressionContext([AccessPolicy]) /** * If the field value contains the search string. By default, the search is case-sensitive, * but you can override the behavior with the "caseInSensitive" argument. */ function contains(field: String, search: String, caseInSensitive: Boolean?): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value matches the search condition with [full-text-search](https://www.prisma.io/docs/concepts/components/prisma-client/full-text-search). Need to enable "fullTextSearch" preview feature to use. */ function search(field: String, search: String): Boolean { -} +} @@@expressionContext([AccessPolicy]) /** * If the field value starts with the search string */ function startsWith(field: String, search: String): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value ends with the search string */ function endsWith(field: String, search: String): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value (a list) has the given search value */ function has(field: Any[], search: Any): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value (a list) has every element of the search list */ function hasEvery(field: Any[], search: Any[]): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value (a list) has at least one element of the search list */ function hasSome(field: Any[], search: Any[]): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * If the field value (a list) is empty */ function isEmpty(field: Any[]): Boolean { -} +} @@@expressionContext([AccessPolicy, ValidationRule]) /** * Marks an attribute to be only applicable to certain field types. */ attribute @@@targetField(targetField: AttributeTargetField[]) +/** + * Indicates the expression context a function can be used. + */ +attribute @@@expressionContext(_ context: ExpressionContext[]) + /** * Indicates an attribute is directly supported by the Prisma schema. */ @@ -351,60 +370,109 @@ attribute @password(saltLength: Int?, salt: String?) @@@targetField([StringField */ attribute @omit() +////////////////////////////////////////////// +// Begin validation attributes and functions +////////////////////////////////////////////// + /** * Validates length of a string field. */ -attribute @length(_ min: Int?, _ max: Int?) @@@targetField([StringField]) +attribute @length(_ min: Int?, _ max: Int?, _ message: String?) @@@targetField([StringField]) /** - * Validates a string field value matches a regex. + * Validates a string field value starts with the given text. */ -attribute @regex(_ regex: String) @@@targetField([StringField]) +attribute @startsWith(_ text: String, _ message: String?) @@@targetField([StringField]) /** - * Validates a string field value starts with the given text. + * Validates a string field value ends with the given text. */ -attribute @startsWith(_ text: String) @@@targetField([StringField]) +attribute @endsWith(_ text: String, _ message: String?) @@@targetField([StringField]) /** - * Validates a string field value ends with the given text. + * Validates a string field value contains the given text. */ -attribute @endsWith(_ text: String) @@@targetField([StringField]) +attribute @contains(_ text: String, _ message: String?) @@@targetField([StringField]) + +/** + * Validates a string field value matches a regex. + */ +attribute @regex(_ regex: String, _ message: String?) @@@targetField([StringField]) /** * Validates a string field value is a valid email address. */ -attribute @email() @@@targetField([StringField]) +attribute @email(_ message: String?) @@@targetField([StringField]) /** * Validates a string field value is a valid ISO datetime. */ -attribute @datetime() @@@targetField([StringField]) +attribute @datetime(_ message: String?) @@@targetField([StringField]) /** * Validates a string field value is a valid url. */ -attribute @url() @@@targetField([StringField]) +attribute @url(_ message: String?) @@@targetField([StringField]) /** * Validates a number field is greater than the given value. */ -attribute @gt(_ value: Int) @@@targetField([IntField, FloatField, DecimalField]) +attribute @gt(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) /** * Validates a number field is greater than or equal to the given value. */ -attribute @gte(_ value: Int) @@@targetField([IntField, FloatField, DecimalField]) +attribute @gte(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) /** * Validates a number field is less than the given value. */ -attribute @lt(_ value: Int) @@@targetField([IntField, FloatField, DecimalField]) +attribute @lt(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) /** * Validates a number field is less than or equal to the given value. */ -attribute @lte(_ value: Int) @@@targetField([IntField, FloatField, DecimalField]) +attribute @lte(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) + +/** + * Validates the entity with a complex condition. + */ +attribute @@validate(_ value: Boolean, _ message: String?) + +/** + * Validates length of a string field. + */ +function length(field: String, min: Int, max: Int?): Boolean { +} @@@expressionContext([ValidationRule]) + + +/** + * Validates a string field value matches a regex. + */ +function regex(field: String, regex: String): Boolean { +} @@@expressionContext([ValidationRule]) + +/** + * Validates a string field value is a valid email address. + */ +function email(field: String): Boolean { +} @@@expressionContext([ValidationRule]) + +/** + * Validates a string field value is a valid ISO datetime. + */ +function datetime(field: String): Boolean { +} @@@expressionContext([ValidationRule]) + +/** + * Validates a string field value is a valid url. + */ +function url(field: String): Boolean { +} @@@expressionContext([ValidationRule]) + +////////////////////////////////////////////// +// End validation attributes and functions +////////////////////////////////////////////// /** * A utility attribute to allow passthrough of arbitrary attribute text to the generated Prisma schema. diff --git a/packages/schema/src/utils/ast-utils.ts b/packages/schema/src/utils/ast-utils.ts index a9d50cdd3..b8e1b5a0a 100644 --- a/packages/schema/src/utils/ast-utils.ts +++ b/packages/schema/src/utils/ast-utils.ts @@ -6,7 +6,6 @@ import { isArrayExpr, isDataModel, isDataModelField, - isEnumField, isInvocationExpr, isMemberAccessExpr, isModel, @@ -165,10 +164,6 @@ export function isAuthInvocation(node: AstNode) { return isInvocationExpr(node) && node.function.ref?.name === 'auth' && isFromStdlib(node.function.ref); } -export function isEnumFieldReference(expr: Expression) { - return isReferenceExpr(expr) && isEnumField(expr.target.ref); -} - export function getDataModelFieldReference(expr: Expression): DataModelField | undefined { if (isReferenceExpr(expr) && isDataModelField(expr.target.ref)) { return expr.target.ref; diff --git a/packages/schema/src/utils/typescript-expression-transformer.ts b/packages/schema/src/utils/typescript-expression-transformer.ts new file mode 100644 index 000000000..2629f3a2f --- /dev/null +++ b/packages/schema/src/utils/typescript-expression-transformer.ts @@ -0,0 +1,313 @@ +import { + ArrayExpr, + BinaryExpr, + Expression, + InvocationExpr, + isEnumField, + isThisExpr, + LiteralExpr, + MemberAccessExpr, + NullExpr, + ReferenceExpr, + ThisExpr, + UnaryExpr, +} from '@zenstackhq/language/ast'; +import { ExpressionContext, getLiteral } from '@zenstackhq/sdk'; +import { isFromStdlib } from '../language-server/utils'; +import { isFutureExpr } from '../plugins/access-policy/utils'; + +export class TypeScriptExpressionTransformerError extends Error { + constructor(message: string) { + super(message); + } +} + +type Options = { + isPostGuard?: boolean; + fieldReferenceContext?: string; + context: ExpressionContext; +}; + +// a registry of function handlers marked with @func +const functionHandlers = new Map(); + +// function handler decorator +function func(name: string) { + return function (target: unknown, propertyKey: string, descriptor: PropertyDescriptor) { + if (!functionHandlers.get(name)) { + functionHandlers.set(name, descriptor); + } + return descriptor; + }; +} + +/** + * Transforms ZModel expression to plain TypeScript expression. + */ +export class TypeScriptExpressionTransformer { + /** + * Constructs a new TypeScriptExpressionTransformer. + * + * @param isPostGuard indicates if we're writing for post-update conditions + */ + constructor(private readonly options?: Options) {} + + /** + * Transforms the given expression to a TypeScript expression. + * @param normalizeUndefined if undefined values should be normalized to null + * @returns + */ + transform(expr: Expression, normalizeUndefined = true): string { + switch (expr.$type) { + case LiteralExpr: + return this.literal(expr as LiteralExpr); + + case ArrayExpr: + return this.array(expr as ArrayExpr, normalizeUndefined); + + case NullExpr: + return this.null(); + + case ThisExpr: + return this.this(expr as ThisExpr); + + case ReferenceExpr: + return this.reference(expr as ReferenceExpr); + + case InvocationExpr: + return this.invocation(expr as InvocationExpr, normalizeUndefined); + + case MemberAccessExpr: + return this.memberAccess(expr as MemberAccessExpr, normalizeUndefined); + + case UnaryExpr: + return this.unary(expr as UnaryExpr, normalizeUndefined); + + case BinaryExpr: + return this.binary(expr as BinaryExpr, normalizeUndefined); + + default: + throw new TypeScriptExpressionTransformerError(`Unsupported expression type: ${expr.$type}`); + } + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + private this(expr: ThisExpr) { + // "this" is mapped to id comparison + return 'id'; + } + + private memberAccess(expr: MemberAccessExpr, normalizeUndefined: boolean) { + if (!expr.member.ref) { + throw new TypeScriptExpressionTransformerError(`Unresolved MemberAccessExpr`); + } + + if (isThisExpr(expr.operand)) { + return expr.member.ref.name; + } else if (isFutureExpr(expr.operand)) { + if (this.options?.isPostGuard !== true) { + throw new TypeScriptExpressionTransformerError(`future() is only supported in postUpdate rules`); + } + return expr.member.ref.name; + } else { + if (normalizeUndefined) { + // normalize field access to null instead of undefined to avoid accidentally use undefined in filter + return `(${this.transform(expr.operand, normalizeUndefined)}?.${expr.member.ref.name} ?? null)`; + } else { + return `${this.transform(expr.operand, normalizeUndefined)}?.${expr.member.ref.name}`; + } + } + } + + private invocation(expr: InvocationExpr, normalizeUndefined: boolean) { + if (!expr.function.ref) { + throw new TypeScriptExpressionTransformerError(`Unresolved InvocationExpr`); + } + + const funcName = expr.function.ref.name; + const isStdFunc = isFromStdlib(expr.function.ref); + + if (!isStdFunc) { + throw new TypeScriptExpressionTransformerError('User-defined functions are not supported yet'); + } + + const handler = functionHandlers.get(funcName); + if (!handler) { + throw new TypeScriptExpressionTransformerError(`Unsupported function: ${funcName}`); + } + + const args = expr.args.map((arg) => arg.value); + return handler.value.call(this, args, normalizeUndefined); + } + + // #region function invocation handlers + + // arguments have been type-checked + + @func('auth') + private _auth() { + return 'user'; + } + + @func('now') + private _now() { + return `(new Date())`; + } + + @func('length') + private _length(args: Expression[]) { + const field = this.transform(args[0], false); + const min = getLiteral(args[1]); + const max = getLiteral(args[2]); + let result: string; + if (min === undefined) { + result = `(${field}?.length > 0)`; + } else if (max === undefined) { + result = `(${field}?.length >= ${min})`; + } else { + result = `(${field}?.length >= ${min} && ${field}?.length <= ${max})`; + } + return this.ensureBoolean(result); + } + + @func('contains') + private _contains(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const caseInsensitive = getLiteral(args[2]) === true; + let result: string; + if (caseInsensitive) { + result = `${field}?.toLowerCase().includes(${this.transform(args[1], normalizeUndefined)}?.toLowerCase())`; + } else { + result = `${field}?.includes(${this.transform(args[1], normalizeUndefined)})`; + } + return this.ensureBoolean(result); + } + + @func('startsWith') + private _startsWith(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const result = `${field}?.startsWith(${this.transform(args[1], normalizeUndefined)})`; + return this.ensureBoolean(result); + } + + @func('endsWith') + private _endsWith(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const result = `${field}?.endsWith(${this.transform(args[1], normalizeUndefined)})`; + return this.ensureBoolean(result); + } + + @func('regex') + private _regex(args: Expression[]) { + const field = this.transform(args[0], false); + const pattern = getLiteral(args[1]); + return `new RegExp(${JSON.stringify(pattern)}).test(${field})`; + } + + @func('email') + private _email(args: Expression[]) { + const field = this.transform(args[0], false); + return `z.string().email().safeParse(${field}).success`; + } + + @func('datetime') + private _datetime(args: Expression[]) { + const field = this.transform(args[0], false); + return `z.string().datetime({ offset: true }).safeParse(${field}).success`; + } + + @func('url') + private _url(args: Expression[]) { + const field = this.transform(args[0], false); + return `z.string().url().safeParse(${field}).success`; + } + + @func('has') + private _has(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const result = `${field}?.includes(${this.transform(args[1], normalizeUndefined)})`; + return this.ensureBoolean(result); + } + + @func('hasEvery') + private _hasEvery(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const result = `${this.transform(args[1], normalizeUndefined)}?.every((item) => ${field}?.includes(item))`; + return this.ensureBoolean(result); + } + + @func('hasSome') + private _hasSome(args: Expression[], normalizeUndefined: boolean) { + const field = this.transform(args[0], false); + const result = `${this.transform(args[1], normalizeUndefined)}?.some((item) => ${field}?.includes(item))`; + return this.ensureBoolean(result); + } + + @func('isEmpty') + private _isEmpty(args: Expression[]) { + const field = this.transform(args[0], false); + const result = `(!${field} || ${field}?.length === 0)`; + return this.ensureBoolean(result); + } + + private ensureBoolean(expr: string) { + return `(${expr} ?? false)`; + } + + // #endregion + + private reference(expr: ReferenceExpr) { + if (!expr.target.ref) { + throw new TypeScriptExpressionTransformerError(`Unresolved ReferenceExpr`); + } + + if (isEnumField(expr.target.ref)) { + return `${expr.target.ref.$container.name}.${expr.target.ref.name}`; + } else { + if (this.options?.isPostGuard) { + // if we're processing post-update, any direct field access should be + // treated as access to context.preValue, which is entity's value before + // the update + return `context.preValue?.${expr.target.ref.name}`; + } else { + return this.options?.fieldReferenceContext + ? `${this.options.fieldReferenceContext}.${expr.target.ref.name}` + : expr.target.ref.name; + } + } + } + + private null() { + return 'null'; + } + + private array(expr: ArrayExpr, normalizeUndefined: boolean) { + return `[${expr.items.map((item) => this.transform(item, normalizeUndefined)).join(', ')}]`; + } + + private literal(expr: LiteralExpr) { + if (typeof expr.value === 'string') { + return `'${expr.value}'`; + } else { + return expr.value.toString(); + } + } + + private unary(expr: UnaryExpr, normalizeUndefined: boolean): string { + return `(${expr.operator} ${this.transform(expr.operand, normalizeUndefined)})`; + } + + private binary(expr: BinaryExpr, normalizeUndefined: boolean): string { + if (expr.operator === 'in') { + return `(${this.transform(expr.right, false)}?.includes(${this.transform( + expr.left, + normalizeUndefined + )}) ?? false)`; + } else { + return `(${this.transform(expr.left, normalizeUndefined)} ${expr.operator} ${this.transform( + expr.right, + normalizeUndefined + )})`; + } + } +} diff --git a/packages/schema/tests/cli/plugins.test.ts b/packages/schema/tests/cli/plugins.test.ts index c99637f73..6bd5d54d7 100644 --- a/packages/schema/tests/cli/plugins.test.ts +++ b/packages/schema/tests/cli/plugins.test.ts @@ -72,6 +72,7 @@ describe('CLI Plugins Tests', () => { `plugin trpc { provider = '${path.join(__dirname, '../../../plugins/trpc/dist')}' output = 'lib/trpc' + zodSchemasImport = '../../../zod' }`, `plugin openapi { provider = '${path.join(__dirname, '../../../plugins/openapi/dist')}' diff --git a/packages/schema/tests/generator/expression-writer.test.ts b/packages/schema/tests/generator/expression-writer.test.ts index 0acfe4002..e307c73b8 100644 --- a/packages/schema/tests/generator/expression-writer.test.ts +++ b/packages/schema/tests/generator/expression-writer.test.ts @@ -251,7 +251,7 @@ describe('Expression Writer Tests', () => { model Test { id String @id x Int - @@allow('all', !(x > 0 && x > 1 || !x > 2)) + @@allow('all', !(x > 0 && x > 1 || !(x > 2))) } `, (model) => model.attributes[0].args[1].value, @@ -1277,7 +1277,7 @@ describe('Expression Writer Tests', () => { } `, (model) => model.attributes[0].args[1].value, - `{zenstack_guard:(user?.roles?.length===0??false)}`, + `{zenstack_guard:((!user?.roles||user?.roles?.length===0)??false)}`, userInit ); }); diff --git a/packages/schema/tests/plugins/zod.test.ts b/packages/schema/tests/plugins/zod.test.ts new file mode 100644 index 000000000..ab20bf9e6 --- /dev/null +++ b/packages/schema/tests/plugins/zod.test.ts @@ -0,0 +1,314 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/// + +import { loadSchema } from '@zenstackhq/testtools'; + +describe('Zod plugin tests', () => { + let origDir: string; + + beforeEach(() => { + origDir = process.cwd(); + }); + + afterEach(() => { + process.chdir(origDir); + }); + + it('basic generation', async () => { + const model = ` + datasource db { + provider = 'postgresql' + url = env('DATABASE_URL') + } + + generator js { + provider = 'prisma-client-js' + } + + plugin zod { + provider = '@core/zod' + } + + enum Role { + USER + ADMIN + } + + model User { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + email String @unique @email @endsWith('@zenstack.dev') + password String @omit + role Role @default(USER) + posts Post[] + } + + model Post { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String @length(5, 10) + author User? @relation(fields: [authorId], references: [id]) + authorId Int? + published Boolean @default(false) + viewCount Int @default(0) + } + `; + + const { zodSchemas } = await loadSchema(model, false, false); + const schemas = zodSchemas.models; + expect(schemas.UserSchema).toBeTruthy(); + expect(schemas.UserCreateSchema).toBeTruthy(); + expect(schemas.UserUpdateSchema).toBeTruthy(); + + // create + expect(schemas.UserCreateSchema.safeParse({ email: 'abc' }).success).toBeFalsy(); + expect(schemas.UserCreateSchema.safeParse({ role: 'Cook' }).success).toBeFalsy(); + expect(schemas.UserCreateSchema.safeParse({ email: 'abc@def.com' }).success).toBeFalsy(); + expect(schemas.UserCreateSchema.safeParse({ email: 'abc@zenstack.dev' }).success).toBeFalsy(); + expect( + schemas.UserCreateSchema.safeParse({ email: 'abc@zenstack.dev', password: 'abc123' }).success + ).toBeTruthy(); + expect( + schemas.UserCreateSchema.safeParse({ email: 'abc@zenstack.dev', role: 'ADMIN', password: 'abc123' }).success + ).toBeTruthy(); + + // update + expect(schemas.UserUpdateSchema.safeParse({}).success).toBeTruthy(); + expect(schemas.UserUpdateSchema.safeParse({ email: 'abc@def.com' }).success).toBeFalsy(); + expect(schemas.UserUpdateSchema.safeParse({ email: 'def@zenstack.dev' }).success).toBeTruthy(); + expect(schemas.UserUpdateSchema.safeParse({ password: 'password456' }).success).toBeTruthy(); + + // model schema + expect(schemas.UserSchema.safeParse({ email: 'abc@zenstack.dev', role: 'ADMIN' }).success).toBeFalsy(); + // without omitted field + expect( + schemas.UserSchema.safeParse({ + id: 1, + email: 'abc@zenstack.dev', + role: 'ADMIN', + createdAt: new Date(), + updatedAt: new Date(), + }).success + ).toBeTruthy(); + // with omitted field + const withPwd = schemas.UserSchema.safeParse({ + id: 1, + email: 'abc@zenstack.dev', + role: 'ADMIN', + createdAt: new Date(), + updatedAt: new Date(), + password: 'abc123', + }); + expect(withPwd.success).toBeTruthy(); + expect(withPwd.data.password).toBeUndefined(); + + expect(schemas.PostSchema).toBeTruthy(); + expect(schemas.PostCreateSchema).toBeTruthy(); + expect(schemas.PostUpdateSchema).toBeTruthy(); + expect(schemas.PostCreateSchema.safeParse({ title: 'abc' }).success).toBeFalsy(); + expect(schemas.PostCreateSchema.safeParse({ title: 'abcabcabcabc' }).success).toBeFalsy(); + expect(schemas.PostCreateSchema.safeParse({ title: 'abcde' }).success).toBeTruthy(); + }); + + it('attribute coverage', async () => { + const model = ` + datasource db { + provider = 'postgresql' + url = env('DATABASE_URL') + } + + generator js { + provider = 'prisma-client-js' + } + + plugin zod { + provider = '@core/zod' + } + + model M { + id Int @id @default(autoincrement()) + a String? @length(5, 10, 'must be between 5 and 10') + b String? @length(5) + c String? @length(min: 5, message: 'must be at least 5') + d String? @length(max: 10) + e String? @length(min: 5, max: 10, 'must be between 5 and 10') + f String? @startsWith('abc', 'must start with abc') + g String? @endsWith('abc', 'must end with abc') + h String? @contains('abc', 'must contain abc') + i String? @regex('^abc$', 'must match /^abc$/') + j String? @email('must be an email') + k String? @url('must be a url') + l String? @datetime('must be a datetime') + m Int? @gt(1, 'must be greater than 1') + n Int? @gte(1, 'must be greater than or equal to 1') + o Int? @lt(1, 'must be less than 1') + p Int? @lte(1, 'must be less than or equal to 1') + q Int[] + } + `; + + const { zodSchemas } = await loadSchema(model, false, false); + + const schema = zodSchemas.models.MCreateSchema; + + expect(schema.safeParse({ a: 'abc' }).error.toString()).toMatch(/must be between 5 and 10/); + expect(schema.safeParse({ a: 'abcabcabcabc' }).error.toString()).toMatch(/must be between 5 and 10/); + expect(schema.safeParse({ a: 'abcde' }).success).toBeTruthy(); + + expect(schema.safeParse({ b: 'abc' }).success).toBeFalsy(); + expect(schema.safeParse({ b: 'abcde' }).success).toBeTruthy(); + + expect(schema.safeParse({ c: 'abc' }).error.toString()).toMatch(/must be at least 5/); + expect(schema.safeParse({ c: 'abcdef' }).success).toBeTruthy(); + + expect(schema.safeParse({ d: 'abcabcabcabc' }).success).toBeFalsy(); + expect(schema.safeParse({ d: 'abcdef' }).success).toBeTruthy(); + + expect(schema.safeParse({ e: 'abc' }).error.toString()).toMatch(/must be between 5 and 10/); + expect(schema.safeParse({ e: 'abcabcabcabc' }).error.toString()).toMatch(/must be between 5 and 10/); + expect(schema.safeParse({ e: 'abcde' }).success).toBeTruthy(); + + expect(schema.safeParse({ f: 'abcde' }).success).toBeTruthy(); + expect(schema.safeParse({ f: '1abcde' }).error.toString()).toMatch(/must start with abc/); + + expect(schema.safeParse({ g: '123abc' }).success).toBeTruthy(); + expect(schema.safeParse({ g: '123abcd' }).error.toString()).toMatch(/must end with abc/); + + expect(schema.safeParse({ h: '123abcdef' }).success).toBeTruthy(); + expect(schema.safeParse({ h: '123abdef' }).error.toString()).toMatch(/must contain abc/); + + expect(schema.safeParse({ i: 'abc' }).success).toBeTruthy(); + expect(schema.safeParse({ i: '1abc' }).error.toString()).toMatch(/must match \/\^abc\$/); + + expect(schema.safeParse({ j: 'abc@zenstack.dev' }).success).toBeTruthy(); + expect(schema.safeParse({ j: 'abc@haha' }).error.toString()).toMatch(/must be an email/); + + expect(schema.safeParse({ k: 'https://zenstack.dev' }).success).toBeTruthy(); + expect(schema.safeParse({ k: 'abc123' }).error.toString()).toMatch(/must be a url/); + + expect(schema.safeParse({ l: '2020-01-01T00:00:00Z' }).success).toBeTruthy(); + expect(schema.safeParse({ l: '2020-01-01T00:00:00+02:00' }).success).toBeTruthy(); + expect(schema.safeParse({ l: '2022-01' }).error.toString()).toMatch(/must be a datetime/); + + expect(schema.safeParse({ m: 2 }).success).toBeTruthy(); + expect(schema.safeParse({ m: 1 }).error.toString()).toMatch(/must be greater than 1/); + + expect(schema.safeParse({ n: 1 }).success).toBeTruthy(); + expect(schema.safeParse({ n: 0 }).error.toString()).toMatch(/must be greater than or equal to 1/); + + expect(schema.safeParse({ o: 0 }).success).toBeTruthy(); + expect(schema.safeParse({ o: 1 }).error.toString()).toMatch(/must be less than 1/); + + expect(schema.safeParse({ p: 1 }).success).toBeTruthy(); + expect(schema.safeParse({ p: 2 }).error.toString()).toMatch(/must be less than or equal to 1/); + + expect(schema.safeParse({ q: [1] }).success).toBeTruthy(); + expect(schema.safeParse({ q: ['abc'] }).success).toBeFalsy(); + }); + + it('refinement scalar fields', async () => { + const model = ` + datasource db { + provider = 'postgresql' + url = env('DATABASE_URL') + } + + generator js { + provider = 'prisma-client-js' + } + + plugin zod { + provider = '@core/zod' + } + + model M { + id Int @id @default(autoincrement()) + email String? + x Int? + dtStr String? + url String? + dt DateTime? + s1 String? + s2 String? + s3 String? + + @@validate(email(email) && x > 0, 'condition1') + @@validate(length(email, 5, 10), 'condition2') + @@validate(regex(email, 'a[b|c]d'), 'condition3') + @@validate(dtStr == null || datetime(dtStr), 'condition4') + @@validate(!url || url(url), 'condition5') + @@validate(!dt || dt < now(), 'condition6') + @@validate(!s1 || contains(s1, 'abc'), 'condition7') + @@validate(!s2 || startsWith(s2, 'abc'), 'condition8') + @@validate(!s3 || endsWith(s3, 'abc'), 'condition9') + } + `; + + const { zodSchemas } = await loadSchema(model, false, false); + + const schema = zodSchemas.models.MCreateSchema; + expect(schema.safeParse({ email: 'abd@x.com', x: 0 }).error.toString()).toMatch(/condition1/); + expect(schema.safeParse({ email: 'abd@x.com', x: 1 }).success).toBeTruthy(); + expect(schema.safeParse({ email: 'someone@microsoft.com', x: 1 }).error.toString()).toMatch(/condition2/); + expect(schema.safeParse({ email: 'xyz@x.com', x: 1 }).error.toString()).toMatch(/condition3/); + + expect(schema.safeParse({ dtStr: '2020-01' }).error.toString()).toMatch(/condition4/); + expect(schema.safeParse({ email: 'abd@x.com', x: 1, dtStr: '2020-01-01T00:00:00+02:00' }).success).toBeTruthy(); + + expect(schema.safeParse({ url: 'xyz.com' }).error.toString()).toMatch(/condition5/); + expect(schema.safeParse({ email: 'abd@x.com', x: 1, url: 'https://zenstack.dev' }).success).toBeTruthy(); + + expect(schema.safeParse({ email: 'abd@x.com', x: 1, dt: new Date('2030-01-01') }).error.toString()).toMatch( + /condition6/ + ); + expect(schema.safeParse({ email: 'abd@x.com', x: 1, dt: new Date('2020-01-01') }).success).toBeTruthy(); + + expect(schema.safeParse({ email: 'abd@x.com', x: 1, s1: '1abc2' }).success).toBeTruthy(); + expect(schema.safeParse({ s1: 'abd' }).error.toString()).toMatch(/condition7/); + + expect(schema.safeParse({ email: 'abd@x.com', x: 1, s2: 'abc1' }).success).toBeTruthy(); + expect(schema.safeParse({ s2: '1abc' }).error.toString()).toMatch(/condition8/); + + expect(schema.safeParse({ email: 'abd@x.com', x: 1, s3: '1abc' }).success).toBeTruthy(); + expect(schema.safeParse({ s3: 'abc1' }).error.toString()).toMatch(/condition9/); + }); + + it('refinement collection fields', async () => { + const model = ` + datasource db { + provider = 'postgresql' + url = env('DATABASE_URL') + } + + generator js { + provider = 'prisma-client-js' + } + + plugin zod { + provider = '@core/zod' + } + + model M { + id Int @id @default(autoincrement()) + arr Int[] + + @@validate(!isEmpty(arr), 'condition1') + @@validate(has(arr, 1), 'condition2') + @@validate(hasEvery(arr, [1, 2]), 'condition3') + @@validate(hasSome(arr, [1, 2]), 'condition4') + } + `; + + const { zodSchemas } = await loadSchema(model, false, false); + + const schema = zodSchemas.models.MCreateSchema; + expect(schema.safeParse({}).error.toString()).toMatch(/condition1/); + expect(schema.safeParse({ arr: [] }).error.toString()).toMatch(/condition1/); + expect(schema.safeParse({ arr: [3] }).error.toString()).toMatch(/condition2/); + expect(schema.safeParse({ arr: [1] }).error.toString()).toMatch(/condition3/); + expect(schema.safeParse({ arr: [4] }).error.toString()).toMatch(/condition4/); + expect(schema.safeParse({ arr: [1, 2, 3] }).success).toBeTruthy(); + }); +}); diff --git a/packages/schema/tests/schema/parser.test.ts b/packages/schema/tests/schema/parser.test.ts index cdf81de57..92240c255 100644 --- a/packages/schema/tests/schema/parser.test.ts +++ b/packages/schema/tests/schema/parser.test.ts @@ -11,6 +11,7 @@ import { LiteralExpr, ReferenceExpr, UnaryExpr, + MemberAccessExpr, } from '@zenstackhq/language/ast'; import { loadModel } from '../utils'; @@ -248,26 +249,75 @@ describe('Parsing Tests', () => { // ); }); - it('policy expression precedence', async () => { + it('expression precedence and associativity', async () => { const content = ` model Model { id String @id a Int b Int + c Boolean + foo Foo? // @@deny(a + b * 2 > 0) // @@deny((a + b) * 2 > 0) @@deny('all', a > 0 && b < 0) @@deny('all', a >= 0 && b <= 0) @@deny('all', a == 0 || b != 0) + @@deny('all', !c || a > 0) + @@deny('all', !(c || a > 0)) + @@deny('all', !foo.x) + } + + model Foo { + id String @id + x Boolean + modelId String + model Model @relation(references: [id], fields: [modelId]) } `; await loadModel(content, false); - // const doc = await loadModel(content, false); - // const attrs = (doc.declarations[0] as DataModel).attributes; - - // expect(attrs[0].args[0].value.$type).toBe(BinaryExpr); + const doc = await loadModel(content, false); + const attrs = (doc.declarations[0] as DataModel).attributes; + + // a > 0 && b < 0 + let arg = attrs[0].args[1].value; + expect(arg.$type).toBe(BinaryExpr); + expect((arg as BinaryExpr).operator).toBe('&&'); + expect((arg as BinaryExpr).left.$type).toBe(BinaryExpr); + expect(((arg as BinaryExpr).left as BinaryExpr).operator).toBe('>'); + + // a >= 0 && b <= 0 + arg = attrs[1].args[1].value; + expect(arg.$type).toBe(BinaryExpr); + expect((arg as BinaryExpr).operator).toBe('&&'); + expect((arg as BinaryExpr).left.$type).toBe(BinaryExpr); + expect(((arg as BinaryExpr).left as BinaryExpr).operator).toBe('>='); + + // a == 0 || b != 0 + arg = attrs[2].args[1].value; + expect(arg.$type).toBe(BinaryExpr); + expect((arg as BinaryExpr).operator).toBe('||'); + expect((arg as BinaryExpr).left.$type).toBe(BinaryExpr); + expect(((arg as BinaryExpr).left as BinaryExpr).operator).toBe('=='); + + // !c || a > 0 + arg = attrs[3].args[1].value; + expect(arg.$type).toBe(BinaryExpr); + expect((arg as BinaryExpr).operator).toBe('||'); + expect((arg as BinaryExpr).left.$type).toBe(UnaryExpr); + expect(((arg as BinaryExpr).left as UnaryExpr).operator).toBe('!'); + + // !(c || a > 0) + arg = attrs[4].args[1].value; + expect(arg.$type).toBe(UnaryExpr); + expect((arg as UnaryExpr).operator).toBe('!'); + + // !foo.x + arg = attrs[5].args[1].value; + expect(arg.$type).toBe(UnaryExpr); + expect((arg as UnaryExpr).operator).toBe('!'); + expect((arg as UnaryExpr).operand.$type).toBe(MemberAccessExpr); // // 1: a + b * 2 > 0 diff --git a/packages/schema/tests/schema/validation/attribute-validation.test.ts b/packages/schema/tests/schema/validation/attribute-validation.test.ts index f80aa1cd9..d5c5f488c 100644 --- a/packages/schema/tests/schema/validation/attribute-validation.test.ts +++ b/packages/schema/tests/schema/validation/attribute-validation.test.ts @@ -388,7 +388,7 @@ describe('Attribute tests', () => { ).toContain(`Value is not assignable to parameter`); }); - it('filter function check', async () => { + it('policy filter function check', async () => { await loadModel(` ${prelude} enum E { @@ -533,6 +533,149 @@ describe('Attribute tests', () => { ).toContain('argument is not assignable to parameter'); }); + it('validator filter function check', async () => { + await loadModel(` + ${prelude} + enum E { + E1 + E2 + } + + model N { + id String @id + e E + es E[] + s String + i Int + m M @relation(fields: [mId], references: [id]) + mId String @unique + } + + model M { + id String @id + s String + e E + es E[] + n N? + + @@validate(e in [E1, E2]) + @@validate(contains(s, 'a')) + @@validate(contains(s, 'a', true)) + @@validate(startsWith(s, 'a')) + @@validate(endsWith(s, 'a')) + @@validate(has(es, E1)) + @@validate(hasSome(es, [E1])) + @@validate(hasEvery(es, [E1])) + @@validate(isEmpty(es)) + + @@validate(n.e in [E1, E2]) + @@validate(n.i in [1, 2]) + @@validate(contains(n.s, 'a')) + @@validate(contains(n.s, 'a', true)) + @@validate(startsWith(n.s, 'a')) + @@validate(endsWith(n.s, 'a')) + @@validate(has(n.es, E1)) + @@validate(hasSome(n.es, [E1])) + @@validate(hasEvery(n.es, [E1])) + @@validate(isEmpty(n.es)) + } + `); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + s String + @@validate(contains(s)) + } + `) + ).toContain('missing argument for parameter "search"'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + s String + @@validate(contains('a', s)) + } + `) + ).toContain('first argument must be a field reference'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + s String + s1 String + @@validate(contains(s, s1)) + } + `) + ).toContain('second argument must be a literal, an enum, or an array of them'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + i Int + @@validate(contains(i, 1)) + } + `) + ).toContain('argument is not assignable to parameter'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + i Int + @@validate(i in 1) + } + `) + ).toContain('right operand of "in" must be an array'); + + expect( + await loadModelWithError(` + ${prelude} + model N { + id String @id + m M @relation(fields: [mId], references: [id]) + mId String + } + model M { + id String @id + n N? + @@validate(n in [1]) + } + `) + ).toContain('left operand of "in" must be of scalar type'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + x Int + @@validate(has(x, 1)) + } + `) + ).toContain('argument is not assignable to parameter'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + x Int[] + @@validate(hasSome(x, 1)) + } + `) + ).toContain('argument is not assignable to parameter'); + }); + it('auth function check', async () => { expect( await loadModelWithError(` @@ -647,4 +790,46 @@ describe('Attribute tests', () => { } `); }); + + it('incorrect function expression context', async () => { + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id @default(auth()) + } + `) + ).toContain('function "auth" is not allowed in the current context: DefaultValue'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + @@allow('all', autoincrement() > 0) + } + `) + ).toContain('function "autoincrement" is not allowed in the current context: AccessPolicy'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + @@deny('all', uuid() == null) + } + `) + ).toContain('function "uuid" is not allowed in the current context: AccessPolicy'); + + expect( + await loadModelWithError(` + ${prelude} + model M { + id String @id + x String + @@validate(search(x, 'abc')) + } + `) + ).toContain('function "search" is not allowed in the current context: ValidationRule'); + }); }); diff --git a/packages/schema/tsconfig.json b/packages/schema/tsconfig.json index a4b536651..ede818c7f 100644 --- a/packages/schema/tsconfig.json +++ b/packages/schema/tsconfig.json @@ -6,7 +6,7 @@ "sourceMap": true, "outDir": "dist", "strict": true, - "noUnusedLocals": true, + "noUnusedLocals": false, "noImplicitReturns": true, "moduleResolution": "node", "esModuleInterop": true, @@ -14,7 +14,8 @@ "forceConsistentCasingInFileNames": true, "baseUrl": ".", "resolveJsonModule": true, - "declaration": true + "declaration": true, + "experimentalDecorators": true }, "include": ["src/**/*.ts"], "exclude": ["dist", "bundle", "node_modules", "src/extension.ts"] diff --git a/packages/sdk/package.json b/packages/sdk/package.json index f52ab5fe6..d14a7a46e 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -19,7 +19,7 @@ "author": "", "license": "MIT", "dependencies": { - "@prisma/generator-helper": "^4.7.1", + "@prisma/generator-helper": "4.10.0", "@zenstackhq/language": "workspace:*", "@zenstackhq/runtime": "workspace:*", "prettier": "^2.8.3", diff --git a/packages/sdk/src/constants.ts b/packages/sdk/src/constants.ts index c3ab474e5..b1d8d7693 100644 --- a/packages/sdk/src/constants.ts +++ b/packages/sdk/src/constants.ts @@ -9,3 +9,12 @@ export { TRANSACTION_FIELD_NAME, CrudFailureReason, } from '@zenstackhq/runtime/constants'; + +/** + * Expression context + */ +export enum ExpressionContext { + DefaultValue = 'DefaultValue', + AccessPolicy = 'AccessPolicy', + ValidationRule = 'ValidationRule', +} diff --git a/packages/sdk/src/utils.ts b/packages/sdk/src/utils.ts index 31bb2aa10..3a1cdb72d 100644 --- a/packages/sdk/src/utils.ts +++ b/packages/sdk/src/utils.ts @@ -7,8 +7,11 @@ import { Enum, EnumField, Expression, + FunctionDecl, + InternalAttribute, isArrayExpr, isDataModel, + isEnumField, isLiteralExpr, isObjectExpr, isReferenceExpr, @@ -18,6 +21,7 @@ import { } from '@zenstackhq/language/ast'; import path from 'path'; import { PluginOptions } from './types'; +import { ExpressionContext } from './constants'; /** * Gets data models that are not ignored @@ -50,12 +54,12 @@ export function getArray(expr: Expression | undefined): Expression[] | undefined export function getLiteralArray< // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends string | number | boolean | any = any ->(expr: Expression | undefined): (T | undefined)[] | undefined { +>(expr: Expression | undefined): T[] | undefined { const arr = getArray(expr); if (!arr) { return undefined; } - return arr.map((item) => getLiteral(item)); + return arr.map((item) => getLiteral(item)).filter((v): v is T => v !== undefined); } export function getObjectLiteral(expr: Expression | undefined): T | undefined { @@ -92,7 +96,9 @@ export function hasAttribute(decl: DataModel | DataModelField | Enum | EnumField ); } -export function getAttributeArgs(attr: DataModelAttribute | DataModelFieldAttribute): Record { +export function getAttributeArgs( + attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute +): Record { const result: Record = {}; for (const arg of attr.args) { if (!arg.$resolvedParam) { @@ -104,7 +110,7 @@ export function getAttributeArgs(attr: DataModelAttribute | DataModelFieldAttrib } export function getAttributeArg( - attr: DataModelAttribute | DataModelFieldAttribute, + attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute, name: string ): Expression | undefined { for (const arg of attr.args) { @@ -127,6 +133,10 @@ export function getAttributeArgLiteral( return undefined; } +export function isEnumFieldReference(expr: Expression): expr is ReferenceExpr { + return isReferenceExpr(expr) && isEnumField(expr.target.ref); +} + /** * Gets id fields declared at the data model level */ @@ -212,3 +222,19 @@ export function requireOption(options: PluginOptions, name: string): T { } return value as T; } + +export function getFunctionExpressionContext(funcDecl: FunctionDecl) { + const funcAllowedContext: ExpressionContext[] = []; + const funcAttr = funcDecl.attributes.find((attr) => attr.decl.$refText === '@@@expressionContext'); + if (funcAttr) { + const contextArg = getAttributeArg(funcAttr, 'context'); + if (isArrayExpr(contextArg)) { + contextArg.items.forEach((item) => { + if (isEnumFieldReference(item)) { + funcAllowedContext.push(item.target.$refText as ExpressionContext); + } + }); + } + } + return funcAllowedContext; +} diff --git a/packages/server/src/api/utils.ts b/packages/server/src/api/utils.ts index 74079364d..b3cd138f8 100644 --- a/packages/server/src/api/utils.ts +++ b/packages/server/src/api/utils.ts @@ -1,22 +1,17 @@ import { DbOperations } from '@zenstackhq/runtime'; import { AUXILIARY_FIELDS } from '@zenstackhq/runtime/constants'; -import type { ModelZodSchema } from '@zenstackhq/runtime/zod'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; import { upperCaseFirst } from 'upper-case-first'; import { fromZodError } from 'zod-validation-error'; import { LoggerConfig } from '../types'; -export function getZodSchema(zodSchemas: ModelZodSchema, model: string, operation: keyof DbOperations) { - if (zodSchemas[model]) { - return zodSchemas[model][operation]; - } else if (zodSchemas[upperCaseFirst(model)]) { - return zodSchemas[upperCaseFirst(model)][operation]; - } else { - return undefined; - } +export function getZodSchema(zodSchemas: ZodSchemas, model: string, operation: keyof DbOperations) { + // e.g.: UserInputSchema { findUnique: [schema] } + return zodSchemas.input?.[`${upperCaseFirst(model)}InputSchema`]?.[operation]; } export function zodValidate( - zodSchemas: ModelZodSchema | undefined, + zodSchemas: ZodSchemas | undefined, model: string, operation: keyof DbOperations, args: unknown diff --git a/packages/server/src/express/middleware.ts b/packages/server/src/express/middleware.ts index 4056cb0c0..71a1c6ea0 100644 --- a/packages/server/src/express/middleware.ts +++ b/packages/server/src/express/middleware.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { DbClientContract } from '@zenstackhq/runtime'; -import { getModelZodSchemas, ModelZodSchema } from '@zenstackhq/runtime/zod'; import type { Handler, Request, Response } from 'express'; import RPCAPIHandler from '../api/rpc'; import { AdapterBaseOptions } from '../types'; import { buildUrlQuery, marshalToObject, unmarshalFromObject } from '../utils'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; /** * Express middleware options @@ -20,11 +20,14 @@ export interface MiddlewareOptions extends AdapterBaseOptions { * Creates an Express middleware for handling CRUD requests. */ const factory = (options: MiddlewareOptions): Handler => { - let zodSchemas: ModelZodSchema | undefined; + let zodSchemas: ZodSchemas | undefined; if (typeof options.zodSchemas === 'object') { zodSchemas = options.zodSchemas; } else if (options.zodSchemas === true) { - zodSchemas = getModelZodSchemas(); + zodSchemas = require('@zenstackhq/runtime/zod'); + if (!zodSchemas) { + throw new Error('Unable to load zod schemas from default location'); + } } const requestHandler = options.handler || RPCAPIHandler(); diff --git a/packages/server/src/fastify/plugin.ts b/packages/server/src/fastify/plugin.ts index 023a510cc..7406bf944 100644 --- a/packages/server/src/fastify/plugin.ts +++ b/packages/server/src/fastify/plugin.ts @@ -1,12 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { DbClientContract } from '@zenstackhq/runtime'; -import { getModelZodSchemas, ModelZodSchema } from '@zenstackhq/runtime/zod'; import { FastifyPluginCallback, FastifyReply, FastifyRequest } from 'fastify'; import fp from 'fastify-plugin'; import RPCApiHandler from '../api/rpc'; import { logInfo } from '../api/utils'; import { AdapterBaseOptions } from '../types'; import { buildUrlQuery, marshalToObject, unmarshalFromObject } from '../utils'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; /** * Fastify plugin options @@ -30,11 +30,14 @@ const pluginHandler: FastifyPluginCallback = (fastify, options, d const prefix = options.prefix ?? ''; logInfo(options.logger, `ZenStackPlugin installing routes at prefix: ${prefix}`); - let schemas: ModelZodSchema | undefined; + let zodSchemas: ZodSchemas | undefined; if (typeof options.zodSchemas === 'object') { - schemas = options.zodSchemas; + zodSchemas = options.zodSchemas; } else if (options.zodSchemas === true) { - schemas = getModelZodSchemas(); + zodSchemas = require('@zenstackhq/runtime/zod'); + if (!zodSchemas) { + throw new Error('Unable to load zod schemas from default location'); + } } const requestHanler = options.handler ?? RPCApiHandler(); @@ -65,7 +68,7 @@ const pluginHandler: FastifyPluginCallback = (fastify, options, d requestBody: unmarshalFromObject(request.body, useSuperJson), prisma, modelMeta: options.modelMeta, - zodSchemas: schemas, + zodSchemas, logger: options.logger, }); reply.status(response.status).send(marshalToObject(response.body, useSuperJson)); diff --git a/packages/server/src/next/app-route-handler.ts b/packages/server/src/next/app-route-handler.ts index e642ac476..f40cae80e 100644 --- a/packages/server/src/next/app-route-handler.ts +++ b/packages/server/src/next/app-route-handler.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { DbClientContract } from '@zenstackhq/runtime'; -import { ModelZodSchema, getModelZodSchemas } from '@zenstackhq/runtime/zod'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; import { NextRequest, NextResponse } from 'next/server'; import { AppRouteRequestHandlerOptions } from '.'; import RPCAPIHandler from '../api/rpc'; @@ -18,11 +18,14 @@ type Context = { params: { path: string[] } }; export default function factory( options: AppRouteRequestHandlerOptions ): (req: NextRequest, context: Context) => Promise { - let zodSchemas: ModelZodSchema | undefined; + let zodSchemas: ZodSchemas | undefined; if (typeof options.zodSchemas === 'object') { zodSchemas = options.zodSchemas; } else if (options.zodSchemas === true) { - zodSchemas = getModelZodSchemas(); + zodSchemas = require('@zenstackhq/runtime/zod'); + if (!zodSchemas) { + throw new Error('Unable to load zod schemas from default location'); + } } const requestHandler = options.handler || RPCAPIHandler(); diff --git a/packages/server/src/next/pages-route-handler.ts b/packages/server/src/next/pages-route-handler.ts index d1c2043ab..4b980ff72 100644 --- a/packages/server/src/next/pages-route-handler.ts +++ b/packages/server/src/next/pages-route-handler.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { DbClientContract } from '@zenstackhq/runtime'; -import { ModelZodSchema, getModelZodSchemas } from '@zenstackhq/runtime/zod'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; import { NextApiRequest, NextApiResponse } from 'next'; import { PagesRouteRequestHandlerOptions } from '.'; import RPCAPIHandler from '../api/rpc'; @@ -16,11 +16,14 @@ import { buildUrlQuery, marshalToObject, unmarshalFromObject } from '../utils'; export default function factory( options: PagesRouteRequestHandlerOptions ): (req: NextApiRequest, res: NextApiResponse) => Promise { - let zodSchemas: ModelZodSchema | undefined; + let zodSchemas: ZodSchemas | undefined; if (typeof options.zodSchemas === 'object') { zodSchemas = options.zodSchemas; } else if (options.zodSchemas === true) { - zodSchemas = getModelZodSchemas(); + zodSchemas = require('@zenstackhq/runtime/zod'); + if (!zodSchemas) { + throw new Error('Unable to load zod schemas from default location'); + } } const requestHandler = options.handler || RPCAPIHandler(); diff --git a/packages/server/src/sveltekit/handler.ts b/packages/server/src/sveltekit/handler.ts index c48d0a711..b4224c46a 100644 --- a/packages/server/src/sveltekit/handler.ts +++ b/packages/server/src/sveltekit/handler.ts @@ -1,10 +1,10 @@ import type { Handle, RequestEvent } from '@sveltejs/kit'; import { DbClientContract } from '@zenstackhq/runtime'; -import { ModelZodSchema, getModelZodSchemas } from '@zenstackhq/runtime/zod'; import RPCApiHandler from '../api/rpc'; import { logInfo } from '../api/utils'; import { AdapterBaseOptions } from '../types'; import { buildUrlQuery, marshalToString, unmarshalFromString } from '../utils'; +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; /** * SvelteKit request handler options @@ -27,11 +27,14 @@ export interface HandlerOptions extends AdapterBaseOptions { export default function createHandler(options: HandlerOptions): Handle { logInfo(options.logger, `ZenStackHandler installing routes at prefix: ${options.prefix}`); - let schemas: ModelZodSchema | undefined; + let zodSchemas: ZodSchemas | undefined; if (typeof options.zodSchemas === 'object') { - schemas = options.zodSchemas; + zodSchemas = options.zodSchemas; } else if (options.zodSchemas === true) { - schemas = getModelZodSchemas(); + zodSchemas = require('@zenstackhq/runtime/zod'); + if (!zodSchemas) { + throw new Error('Unable to load zod schemas from default location'); + } } const requestHanler = options.handler ?? RPCApiHandler(); @@ -87,7 +90,7 @@ export default function createHandler(options: HandlerOptions): Handle { query, requestBody, prisma, - zodSchemas: schemas, + zodSchemas, modelMeta: options.modelMeta, }); diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index ae3f926c3..58de799a9 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -1,6 +1,5 @@ import { DbClientContract } from '@zenstackhq/runtime'; -import { ModelMeta } from '@zenstackhq/runtime/enhancements/types'; -import { ModelZodSchema } from '@zenstackhq/runtime/zod'; +import type { ModelMeta, ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; type LoggerMethod = (message: string, code?: string) => void; @@ -56,7 +55,7 @@ export type RequestContext = { * plugin. You can pass it in explicitly if you configured the plugin * to output to a different location. */ - zodSchemas?: ModelZodSchema; + zodSchemas?: ZodSchemas; /** * Logging configuration. Set to `null` to disable logging. @@ -98,7 +97,7 @@ export interface AdapterBaseOptions { * Zod schemas for validating request input. Pass `true` to load from standard location * (need to enable `@core/zod` plugin in schema.zmodel) or omit to disable input validation. */ - zodSchemas?: ModelZodSchema | boolean; + zodSchemas?: ZodSchemas | boolean; /** * Api request handler function. Can be created using `@zenstackhq/server/api/rest` or `@zenstackhq/server/api/rpc` factory functions. diff --git a/packages/server/tests/api/rpc.test.ts b/packages/server/tests/api/rpc.test.ts index 1358b8390..dfdc98f4f 100644 --- a/packages/server/tests/api/rpc.test.ts +++ b/packages/server/tests/api/rpc.test.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /// +import type { ZodSchemas } from '@zenstackhq/runtime/enhancements/types'; import { loadSchema } from '@zenstackhq/testtools'; import RPCAPIHandler from '../../src/api/rpc'; import { schema } from '../utils'; -import { ModelZodSchema } from '@zenstackhq/runtime/zod'; describe('OpenAPI server tests', () => { let prisma: any; @@ -163,7 +163,7 @@ describe('OpenAPI server tests', () => { }); expect(r.status).toBe(400); expect((r.body as any).message).toContain('Validation error'); - expect((r.body as any).message).toContain('data.title'); + expect((r.body as any).message).toContain('data'); }); it('invalid path or args', async () => { @@ -204,7 +204,7 @@ describe('OpenAPI server tests', () => { }); }); -function makeHandler(zodSchemas?: ModelZodSchema) { +function makeHandler(zodSchemas?: ZodSchemas) { const _handler = RPCAPIHandler(); return async (args: any) => { return _handler({ ...args, url: new URL(`http://localhost/${args.path}`), zodSchemas }); diff --git a/packages/testtools/package.json b/packages/testtools/package.json index f63a6b014..8cc86cf22 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -19,10 +19,11 @@ "license": "MIT", "dependencies": { "@prisma/client": "^4.7.0", - "@prisma/generator-helper": "^4.7.1", - "@prisma/internals": "^4.7.1", + "@prisma/generator-helper": "4.10.0", + "@prisma/internals": "4.10.0", "@zenstackhq/language": "workspace:*", "@zenstackhq/runtime": "workspace:*", + "json5": "^2.2.3", "prisma": "~4.7.0", "tmp": "^0.2.1", "zenstack": "workspace:*" diff --git a/packages/testtools/src/schema.ts b/packages/testtools/src/schema.ts index 05e1c9f6d..1dbf52434 100644 --- a/packages/testtools/src/schema.ts +++ b/packages/testtools/src/schema.ts @@ -10,6 +10,7 @@ import * as path from 'path'; import tmp from 'tmp'; import { loadDocument } from 'zenstack/cli/cli-util'; import prismaPlugin from 'zenstack/plugins/prisma'; +import json from 'json5'; /** * Use it to represent multiple files in a single string like this @@ -78,19 +79,8 @@ generator js { previewFeatures = ['clientExtensions'] } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin zod { provider = '@core/zod' - output = '.zenstack/zod' } `; @@ -186,22 +176,48 @@ export async function loadSchema( if (compile) { console.log('Compiling...'); run('npx tsc --init'); + + // add genetated '.zenstack/zod' folder to typescript's search path, + // so that it can be resolved from symbolic-linked files + const tsconfig = json.parse(fs.readFileSync(path.join(projectRoot, './tsconfig.json'), 'utf-8')); + tsconfig.compilerOptions.paths = { + '.zenstack/zod/input': ['./node_modules/.zenstack/zod/input/index.d.ts'], + }; + fs.writeFileSync(path.join(projectRoot, './tsconfig.json'), JSON.stringify(tsconfig, null, 2)); run('npx tsc --project tsconfig.json'); } - const policy = require(path.join(path.dirname(zmodelPath), '.zenstack/policy')).default; - const modelMeta = require(path.join(path.dirname(zmodelPath), '.zenstack/model-meta')).default; - const zodSchemas = require(path.join(path.dirname(zmodelPath), '.zenstack/zod')); + let policy: any; + let modelMeta: any; + let zodSchemas: any; + + const outputPath = path.join(projectRoot, 'node_modules'); + + try { + policy = require(path.join(outputPath, '.zenstack/policy')).default; + } catch { + /* noop */ + } + try { + modelMeta = require(path.join(outputPath, '.zenstack/model-meta')).default; + } catch { + /* noop */ + } + try { + zodSchemas = require(path.join(outputPath, '.zenstack/zod')); + } catch { + /* noop */ + } return { projectDir: projectRoot, prisma, withPolicy: (user?: AuthUser) => - withPolicy(prisma, { user }, { policy, modelMeta, logPrismaQuery }), + withPolicy(prisma, { user }, { policy, modelMeta, zodSchemas, logPrismaQuery }), withOmit: () => withOmit(prisma, { modelMeta }), withPassword: () => withPassword(prisma, { modelMeta }), withPresets: (user?: AuthUser) => - withPresets(prisma, { user }, { policy, modelMeta, logPrismaQuery }), + withPresets(prisma, { user }, { policy, modelMeta, zodSchemas, logPrismaQuery }), policy, modelMeta, zodSchemas, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 478d78972..52f284622 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,7 @@ importers: version: link:../runtime/dist next: specifier: ^12.3.1 || ^13 - version: 12.3.1(@babel/core@7.20.5)(react-dom@18.2.0)(react@18.2.0) + version: 12.3.1(@babel/core@7.22.5)(react-dom@18.2.0)(react@17.0.2) tmp: specifier: ^0.2.1 version: 0.2.1 @@ -67,7 +67,7 @@ importers: version: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) react: specifier: ^17.0.2 || ^18 - version: 18.2.0 + version: 17.0.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -79,7 +79,7 @@ importers: version: 6.3.3 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -88,8 +88,8 @@ importers: packages/plugins/openapi: dependencies: '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/runtime': specifier: workspace:* version: link:../../runtime/dist @@ -119,8 +119,8 @@ importers: version: 0.2.1(zod@3.21.1) devDependencies: '@prisma/internals': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@readme/openapi-parser': specifier: ^2.4.0 version: 2.4.0(openapi-types@12.1.0) @@ -165,7 +165,7 @@ importers: version: 0.2.1 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -177,8 +177,8 @@ importers: packages/plugins/swr: dependencies: '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist @@ -193,7 +193,7 @@ importers: version: 2.0.2 superjson: specifier: ^1.11.0 - version: 1.12.1 + version: 1.11.0 ts-morph: specifier: ^16.0.0 version: 16.0.0 @@ -203,7 +203,7 @@ importers: devDependencies: '@tanstack/react-query': specifier: ^4.28.0 - version: 4.29.7(react-dom@18.2.0)(react@18.2.0) + version: 4.28.0(react-dom@17.0.2)(react@17.0.2) '@types/jest': specifier: ^29.5.0 version: 29.5.0 @@ -230,29 +230,29 @@ importers: version: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) react: specifier: ^17.0.2 || ^18 - version: 18.2.0 + version: 17.0.2 react-dom: specifier: ^17.0.2 || ^18 - version: 18.2.0(react@18.2.0) + version: 17.0.2(react@17.0.2) rimraf: specifier: ^3.0.2 version: 3.0.2 swr: specifier: ^2.0.3 - version: 2.0.3(react@18.2.0) + version: 2.0.3(react@17.0.2) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 - version: 4.9.5 + version: 4.9.4 publishDirectory: dist packages/plugins/tanstack-query: dependencies: '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist @@ -267,7 +267,7 @@ importers: version: 2.0.2 superjson: specifier: ^1.11.0 - version: 1.12.1 + version: 1.11.0 ts-morph: specifier: ^16.0.0 version: 16.0.0 @@ -277,10 +277,10 @@ importers: devDependencies: '@tanstack/react-query': specifier: ^4.29.7 - version: 4.29.7(react-dom@18.2.0)(react@18.2.0) + version: 4.29.7(react-dom@17.0.2)(react@17.0.2) '@tanstack/svelte-query': specifier: ^4.29.7 - version: 4.29.7(svelte@3.59.1) + version: 4.29.7(svelte@3.59.2) '@types/jest': specifier: ^29.5.0 version: 29.5.0 @@ -307,32 +307,32 @@ importers: version: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) react: specifier: ^17.0.2 || ^18 - version: 18.2.0 + version: 17.0.2 react-dom: specifier: ^17.0.2 || ^18 - version: 18.2.0(react@18.2.0) + version: 17.0.2(react@17.0.2) rimraf: specifier: ^3.0.2 version: 3.0.2 swr: specifier: ^2.0.3 - version: 2.0.3(react@18.2.0) + version: 2.0.3(react@17.0.2) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 - version: 4.9.5 + version: 4.9.4 publishDirectory: dist packages/plugins/trpc: dependencies: '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@prisma/internals': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist @@ -360,10 +360,10 @@ importers: devDependencies: '@trpc/next': specifier: ^10.32.0 - version: 10.32.0(@tanstack/react-query@4.29.7)(@trpc/client@10.32.0)(@trpc/react-query@10.32.0)(@trpc/server@10.32.0)(next@13.4.7)(react-dom@18.2.0)(react@18.2.0) + version: 10.32.0(@tanstack/react-query@4.29.19)(@trpc/client@10.32.0)(@trpc/react-query@10.32.0)(@trpc/server@10.32.0)(next@13.4.7)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': specifier: ^10.32.0 - version: 10.32.0(@tanstack/react-query@4.29.7)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0) + version: 10.32.0(@tanstack/react-query@4.29.19)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': specifier: ^10.32.0 version: 10.32.0 @@ -387,13 +387,13 @@ importers: version: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) next: specifier: ^13.4.7 - version: 13.4.7(@babel/core@7.20.5)(@opentelemetry/api@1.3.0)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.7(@babel/core@7.22.5)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) rimraf: specifier: ^3.0.2 version: 3.0.2 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.4) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -406,7 +406,7 @@ importers: version: 2.2.0 '@prisma/client': specifier: ^4.0.0 - version: 4.7.1(prisma@4.7.0) + version: 4.0.0 '@types/bcryptjs': specifier: ^2.4.2 version: 2.4.2 @@ -437,6 +437,9 @@ importers: tslib: specifier: ^2.4.1 version: 2.4.1 + upper-case-first: + specifier: ^2.0.2 + version: 2.0.2 zod: specifier: 3.21.1 version: 3.21.1 @@ -452,7 +455,7 @@ importers: version: 1.0.1 '@types/node': specifier: ^14.18.29 - version: 14.18.32 + version: 14.18.29 '@types/pluralize': specifier: ^0.0.29 version: 0.0.29 @@ -473,11 +476,11 @@ importers: specifier: ^2.2.0 version: 2.2.0 '@prisma/generator-helper': - specifier: ^4.0.0 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@prisma/internals': - specifier: ^4.0.0 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/language': specifier: workspace:* version: link:../language/dist @@ -532,6 +535,9 @@ importers: ts-morph: specifier: ^16.0.0 version: 16.0.0 + ts-pattern: + specifier: ^4.3.0 + version: 4.3.0 upper-case-first: specifier: ^2.0.2 version: 2.0.2 @@ -592,7 +598,7 @@ importers: version: 8.3.4 '@types/vscode': specifier: ^1.56.0 - version: 1.72.0 + version: 1.56.0 '@typescript-eslint/eslint-plugin': specifier: ^5.42.0 version: 5.42.0(@typescript-eslint/parser@5.42.0)(eslint@8.27.0)(typescript@4.8.4) @@ -631,7 +637,7 @@ importers: version: 29.5.0(@types/node@14.18.32)(ts-node@10.9.1) prisma: specifier: ^4.0.0 - version: 4.7.0 + version: 4.0.0 renamer: specifier: ^4.0.0 version: 4.0.0 @@ -643,7 +649,7 @@ importers: version: 0.2.1 ts-jest: specifier: ^29.0.3 - version: 29.0.3(@babel/core@7.20.5)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4) + version: 29.0.3(@babel/core@7.22.5)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@14.18.32)(typescript@4.8.4) @@ -661,8 +667,8 @@ importers: packages/sdk: dependencies: '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/language': specifier: workspace:* version: link:../language/dist @@ -703,7 +709,7 @@ importers: version: 2.0.2 superjson: specifier: ^1.11.0 - version: 1.12.1 + version: 1.11.0 tiny-invariant: specifier: ^1.3.1 version: 1.3.1 @@ -725,7 +731,7 @@ importers: devDependencies: '@sveltejs/kit': specifier: ^1.16.3 - version: 1.16.3(svelte@3.59.1)(vite@4.2.1) + version: 1.16.3(svelte@4.0.0-next.3)(vite@4.3.9) '@types/body-parser': specifier: ^1.19.2 version: 1.19.2 @@ -770,7 +776,7 @@ importers: version: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) next: specifier: ^13.4.5 - version: 13.4.5(@babel/core@7.20.5)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.5(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0) rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -779,29 +785,32 @@ importers: version: 6.3.3 ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.5) + version: 29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4) typescript: specifier: ^4.9.4 - version: 4.9.5 + version: 4.9.4 publishDirectory: dist packages/testtools: dependencies: '@prisma/client': specifier: ^4.7.0 - version: 4.7.1(prisma@4.7.0) + version: 4.7.0(prisma@4.7.0) '@prisma/generator-helper': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@prisma/internals': - specifier: ^4.7.1 - version: 4.7.1 + specifier: 4.10.0 + version: 4.10.0 '@zenstackhq/language': specifier: workspace:* version: link:../language/dist '@zenstackhq/runtime': specifier: workspace:* version: link:../runtime/dist + json5: + specifier: ^2.2.3 + version: 2.2.3 prisma: specifier: ~4.7.0 version: 4.7.0 @@ -833,7 +842,7 @@ importers: dependencies: '@prisma/client': specifier: ^4.7.0 - version: 4.7.1(prisma@4.7.0) + version: 4.7.0(prisma@4.7.0) '@types/node': specifier: ^14.18.29 version: 14.18.29 @@ -900,7 +909,7 @@ importers: version: 3.0.3 next: specifier: ^12.3.1 - version: 12.3.1(@babel/core@7.20.5)(react-dom@18.2.0)(react@18.2.0) + version: 12.3.1(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0) prisma: specifier: ~4.7.0 version: 4.7.0 @@ -909,13 +918,13 @@ importers: version: 0.2.1 ts-jest: specifier: ^29.0.1 - version: 29.0.1(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.8.3) + version: 29.0.1(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.6.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@14.18.29)(typescript@4.8.3) + version: 10.9.1(@types/node@14.18.29)(typescript@4.6.2) typescript: specifier: ^4.6.2 - version: 4.8.3 + version: 4.6.2 uuid: specifier: ^9.0.0 version: 9.0.0 @@ -925,12 +934,17 @@ importers: packages: - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 /@apidevtools/openapi-schemas@2.1.0: resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} @@ -941,30 +955,30 @@ packages: resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} dev: true - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 - /@babel/compat-data@7.20.5: - resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==} + /@babel/compat-data@7.22.5: + resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} - /@babel/core@7.20.5: - resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} + /@babel/core@7.22.5: + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.5) - '@babel/helper-module-transforms': 7.20.2 - '@babel/helpers': 7.20.6 - '@babel/parser': 7.20.5 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.5 + '@babel/helpers': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -973,301 +987,298 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.20.5: - resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} + /@babel/generator@7.22.5: + resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 - '@jridgewell/gen-mapping': 0.3.2 + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.20.0(@babel/core@7.20.5): - resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.5 - '@babel/core': 7.20.5 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 + '@babel/compat-data': 7.22.5 + '@babel/core': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 + lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 - /@babel/helper-module-transforms@7.20.2: - resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} + /@babel/helper-module-transforms@7.22.5: + resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - /@babel/helper-plugin-utils@7.19.0: - resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/helper-split-export-declaration@7.22.5: + resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.20.6: - resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} + /@babel/helpers@7.22.5: + resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.20.5: - resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} + /@babel/parser@7.22.5: + resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.5): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.5): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.5): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.5): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.5): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.5): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.5): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.5): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.5): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.5): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.5): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/runtime@7.20.7: - resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} + /@babel/runtime@7.22.5: + resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template@7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 - /@babel/traverse@7.20.5: - resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} + /@babel/traverse@7.22.5: + resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.20.5: - resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@changesets/apply-release-plan@6.1.3: - resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==} + /@changesets/apply-release-plan@6.1.4: + resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} dependencies: - '@babel/runtime': 7.20.7 - '@changesets/config': 2.3.0 + '@babel/runtime': 7.22.5 + '@changesets/config': 2.3.1 '@changesets/get-version-range-type': 0.3.2 '@changesets/git': 2.0.0 '@changesets/types': 5.2.1 @@ -1276,20 +1287,20 @@ packages: fs-extra: 7.0.1 lodash.startcase: 4.4.0 outdent: 0.5.0 - prettier: 2.8.3 + prettier: 2.8.8 resolve-from: 5.0.0 - semver: 5.7.1 + semver: 7.5.3 dev: true - /@changesets/assemble-release-plan@5.2.3: - resolution: {integrity: sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==} + /@changesets/assemble-release-plan@5.2.4: + resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.5 + '@changesets/get-dependents-graph': 1.3.6 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 - semver: 5.7.1 + semver: 7.5.3 dev: true /@changesets/changelog-git@0.1.14: @@ -1302,14 +1313,14 @@ packages: resolution: {integrity: sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q==} hasBin: true dependencies: - '@babel/runtime': 7.20.7 - '@changesets/apply-release-plan': 6.1.3 - '@changesets/assemble-release-plan': 5.2.3 + '@babel/runtime': 7.22.5 + '@changesets/apply-release-plan': 6.1.4 + '@changesets/assemble-release-plan': 5.2.4 '@changesets/changelog-git': 0.1.14 - '@changesets/config': 2.3.0 + '@changesets/config': 2.3.1 '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.5 - '@changesets/get-release-plan': 3.0.16 + '@changesets/get-dependents-graph': 1.3.6 + '@changesets/get-release-plan': 3.0.17 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/pre': 1.0.14 @@ -1334,14 +1345,14 @@ packages: semver: 5.7.1 spawndamnit: 2.0.0 term-size: 2.2.1 - tty-table: 4.1.6 + tty-table: 4.2.1 dev: true - /@changesets/config@2.3.0: - resolution: {integrity: sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==} + /@changesets/config@2.3.1: + resolution: {integrity: sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==} dependencies: '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.5 + '@changesets/get-dependents-graph': 1.3.6 '@changesets/logger': 0.0.5 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -1355,22 +1366,22 @@ packages: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph@1.3.5: - resolution: {integrity: sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==} + /@changesets/get-dependents-graph@1.3.6: + resolution: {integrity: sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==} dependencies: '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 - semver: 5.7.1 + semver: 7.5.3 dev: true - /@changesets/get-release-plan@3.0.16: - resolution: {integrity: sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==} + /@changesets/get-release-plan@3.0.17: + resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} dependencies: - '@babel/runtime': 7.20.7 - '@changesets/assemble-release-plan': 5.2.3 - '@changesets/config': 2.3.0 + '@babel/runtime': 7.22.5 + '@changesets/assemble-release-plan': 5.2.4 + '@changesets/config': 2.3.1 '@changesets/pre': 1.0.14 '@changesets/read': 0.5.9 '@changesets/types': 5.2.1 @@ -1384,7 +1395,7 @@ packages: /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -1409,7 +1420,7 @@ packages: /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -1419,7 +1430,7 @@ packages: /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/parse': 0.3.16 @@ -1440,11 +1451,11 @@ packages: /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 - prettier: 2.8.3 + prettier: 2.8.8 dev: true /@chevrotain/cst-dts-gen@10.4.2: @@ -1473,8 +1484,8 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm64@0.17.14: - resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1491,8 +1502,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.14: - resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1500,8 +1511,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.14: - resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1509,8 +1520,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.14: - resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1518,8 +1529,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.14: - resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1527,8 +1538,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.14: - resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1536,8 +1547,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.14: - resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1545,8 +1556,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.14: - resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1554,8 +1565,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.14: - resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1563,8 +1574,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.14: - resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1581,8 +1592,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.14: - resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1590,8 +1601,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.14: - resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1599,8 +1610,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.14: - resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1608,8 +1619,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.14: - resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1617,8 +1628,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.14: - resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1626,8 +1637,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.14: - resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1635,8 +1646,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.14: - resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1644,8 +1655,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.14: - resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1653,8 +1664,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.14: - resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1662,8 +1673,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.14: - resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1671,8 +1682,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.14: - resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1680,8 +1691,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.14: - resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1689,32 +1700,25 @@ packages: dev: true optional: true - /@eslint/eslintrc@1.3.3: - resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + /@eslint-community/eslint-utils@4.4.0(eslint@8.27.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.4.1 - globals: 13.17.0 - ignore: 5.2.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + eslint: 8.27.0 + eslint-visitor-keys: 3.4.1 dev: true - /@eslint/eslintrc@1.4.0: - resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.1 - globals: 13.19.0 - ignore: 5.2.0 + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1723,14 +1727,14 @@ packages: - supports-color dev: true - /@eslint/eslintrc@2.0.0: - resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} + /@eslint/eslintrc@2.0.3: + resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.1 - globals: 13.19.0 + espree: 9.5.2 + globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -1757,29 +1761,18 @@ packages: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} dev: true - /@fastify/error@3.2.0: - resolution: {integrity: sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==} + /@fastify/error@3.3.0: + resolution: {integrity: sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==} dev: true - /@fastify/fast-json-stringify-compiler@4.2.0: - resolution: {integrity: sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==} + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} dependencies: - fast-json-stringify: 5.6.2 + fast-json-stringify: 5.7.0 dev: true - /@humanwhocodes/config-array@0.11.7: - resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1824,7 +1817,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -1845,14 +1838,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.29 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.7.1 + ci-info: 3.8.0 exit: 0.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.14.2)(ts-node@10.9.1) + jest-config: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -1879,7 +1872,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 jest-mock: 29.5.0 dev: true @@ -1905,8 +1898,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.14.2 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 14.18.32 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -1938,13 +1931,13 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.14.2 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 14.18.32 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 5.2.1 istanbul-lib-report: 3.0.0 @@ -1956,18 +1949,11 @@ packages: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.0.1 + v8-to-istanbul: 9.1.0 transitivePeerDependencies: - supports-color dev: true - /@jest/schemas@29.0.0: - resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.24.47 - dev: true - /@jest/schemas@29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1979,9 +1965,9 @@ packages: resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 callsites: 3.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /@jest/test-result@29.5.0: @@ -1999,7 +1985,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.5.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-haste-map: 29.5.0 slash: 3.0.0 dev: true @@ -2008,49 +1994,25 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-haste-map: 29.5.0 jest-regex-util: 29.4.3 jest-util: 29.5.0 micromatch: 4.0.5 - pirates: 4.0.5 + pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color dev: true - /@jest/types@29.0.3: - resolution: {integrity: sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.0.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.14.2 - '@types/yargs': 17.0.12 - chalk: 4.1.2 - dev: true - - /@jest/types@29.2.1: - resolution: {integrity: sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.0.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.14.2 - '@types/yargs': 17.0.13 - chalk: 4.1.2 - dev: true - /@jest/types@29.5.0: resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2058,30 +2020,28 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.14.2 - '@types/yargs': 17.0.13 + '@types/node': 20.3.2 + '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} @@ -2089,8 +2049,11 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -2098,8 +2061,8 @@ packages: /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@jsdevtools/ono@7.1.3: @@ -2109,7 +2072,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -2118,7 +2081,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.20.7 + '@babel/runtime': 7.22.5 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -2403,8 +2366,9 @@ packages: dev: true optional: true - /@noble/hashes@1.3.0: - resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} dev: false /@nodelib/fs.scandir@2.1.5: @@ -2425,52 +2389,52 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@opentelemetry/api@1.3.0: - resolution: {integrity: sha512-YveTnGNsFFixTKJz09Oi4zYkiLT5af3WpZDu4aIUM7xX+2bHAkOJayFTVQd6zB8kkWPpbua4Ha6Ql00grdLlJQ==} + /@opentelemetry/api@1.4.1: + resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} engines: {node: '>=8.0.0'} - /@opentelemetry/core@1.8.0(@opentelemetry/api@1.3.0): - resolution: {integrity: sha512-6SDjwBML4Am0AQmy7z1j6HGrWDgeK8awBRUvl1PGw6HayViMk4QpnUXvv4HTHisecgVBy43NE/cstWprm8tIfw==} + /@opentelemetry/core@1.14.0(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.4.0' + '@opentelemetry/api': '>=1.0.0 <1.5.0' dependencies: - '@opentelemetry/api': 1.3.0 - '@opentelemetry/semantic-conventions': 1.8.0 + '@opentelemetry/api': 1.4.1 + '@opentelemetry/semantic-conventions': 1.14.0 - /@opentelemetry/resources@1.8.0(@opentelemetry/api@1.3.0): - resolution: {integrity: sha512-KSyMH6Jvss/PFDy16z5qkCK0ERlpyqixb1xwb73wLMvVq+j7i89lobDjw3JkpCcd1Ws0J6jAI4fw28Zufj2ssg==} + /@opentelemetry/resources@1.14.0(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.4.0' + '@opentelemetry/api': '>=1.0.0 <1.5.0' dependencies: - '@opentelemetry/api': 1.3.0 - '@opentelemetry/core': 1.8.0(@opentelemetry/api@1.3.0) - '@opentelemetry/semantic-conventions': 1.8.0 + '@opentelemetry/api': 1.4.1 + '@opentelemetry/core': 1.14.0(@opentelemetry/api@1.4.1) + '@opentelemetry/semantic-conventions': 1.14.0 - /@opentelemetry/sdk-trace-base@1.8.0(@opentelemetry/api@1.3.0): - resolution: {integrity: sha512-iH41m0UTddnCKJzZx3M85vlhKzRcmT48pUeBbnzsGrq4nIay1oWVHKM5nhB5r8qRDGvd/n7f/YLCXClxwM0tvA==} + /@opentelemetry/sdk-trace-base@1.14.0(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.4.0' + '@opentelemetry/api': '>=1.0.0 <1.5.0' dependencies: - '@opentelemetry/api': 1.3.0 - '@opentelemetry/core': 1.8.0(@opentelemetry/api@1.3.0) - '@opentelemetry/resources': 1.8.0(@opentelemetry/api@1.3.0) - '@opentelemetry/semantic-conventions': 1.8.0 + '@opentelemetry/api': 1.4.1 + '@opentelemetry/core': 1.14.0(@opentelemetry/api@1.4.1) + '@opentelemetry/resources': 1.14.0(@opentelemetry/api@1.4.1) + '@opentelemetry/semantic-conventions': 1.14.0 - /@opentelemetry/semantic-conventions@1.8.0: - resolution: {integrity: sha512-TYh1MRcm4JnvpqtqOwT9WYaBYY4KERHdToxs/suDTLviGRsQkIjS5yYROTYTSJQUnYLOn/TuOh5GoMwfLSU+Ew==} + /@opentelemetry/semantic-conventions@1.14.0: + resolution: {integrity: sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==} engines: {node: '>=14'} /@paralleldrive/cuid2@2.2.0: resolution: {integrity: sha512-CVQDpPIUHrUGGLdrMGz1NmqZvqmsB2j2rCIQEu1EvxWjlFh4fhvEGmgR409cY20/67/WlJsggenq0no3p3kYsw==} dependencies: - '@noble/hashes': 1.3.0 + '@noble/hashes': 1.3.1 dev: false - /@pnpm/config.env-replace@1.0.0: - resolution: {integrity: sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==} + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} dev: false @@ -2481,11 +2445,11 @@ packages: graceful-fs: 4.2.10 dev: false - /@pnpm/npm-conf@2.1.0: - resolution: {integrity: sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==} + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} dependencies: - '@pnpm/config.env-replace': 1.0.0 + '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 dev: false @@ -2494,8 +2458,8 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@prisma/client@4.7.1(prisma@4.7.0): - resolution: {integrity: sha512-/GbnOwIPtjiveZNUzGXOdp7RxTEkHL4DZP3vBaFNadfr6Sf0RshU5EULFzVaSi9i9PIK9PYd+1Rn7z2B2npb9w==} + /@prisma/client@4.0.0: + resolution: {integrity: sha512-g1h2OGoRo7anBVQ9Cw3gsbjwPtvf7i0pkGxKeZICtwkvE5CZXW+xZF4FZdmrViYkKaAShbISL0teNpu9ecpf4g==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -2504,12 +2468,25 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c + '@prisma/engines-version': 3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11 + dev: false + + /@prisma/client@4.7.0(prisma@4.7.0): + resolution: {integrity: sha512-keXMa0oJWJGOzMEFKp+CEgzJPwnOtGSrnTWw6qMYxnypYrRFdNxqyA06EzELZexBhgM4oLooZ1jDJ3iy46wExA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.7.0-74.39190b250ebc338586e25e6da45e5e783bc8a635 prisma: 4.7.0 dev: false - /@prisma/debug@4.7.1: - resolution: {integrity: sha512-oppjBRcTakJuAn0rANxWT9caxLKypSBT4Ajh7t+uPcO06CJOoN2Gt4VpFdw2i79U+klGAjTe/1yh8SCsTmxAhA==} + /@prisma/debug@4.10.0: + resolution: {integrity: sha512-rxVOZKsEyjlQCwN/pkkJO7wEdARt1yRyukSjLa+BF2QTvy2+VgtBmrfys4WDQSnj3jVWeHMpi5GeAoJjKkSKyA==} dependencies: '@types/debug': 4.1.7 debug: 4.3.4 @@ -2517,15 +2494,15 @@ packages: transitivePeerDependencies: - supports-color - /@prisma/engine-core@4.7.1: - resolution: {integrity: sha512-8NwCQcdB4OqOjpehChtKdVn6UVuDTwZewnRG13aeK+KmZurPqGO1LhwB3dTjlfLRlbYsLGb3Xzsai7Jl5QckBA==} + /@prisma/engine-core@4.10.0: + resolution: {integrity: sha512-uKkUXcpqGX4LbTwnvLsEBhl0gfcfSE5jYWQqastFqoO+lVIEiVZ9aoDrDDy7ZUhjtCLmejsgVb7mXmCzA3nhMg==} dependencies: - '@opentelemetry/api': 1.3.0 - '@opentelemetry/sdk-trace-base': 1.8.0(@opentelemetry/api@1.3.0) - '@prisma/debug': 4.7.1 - '@prisma/engines': 4.7.1 - '@prisma/generator-helper': 4.7.1 - '@prisma/get-platform': 4.7.1 + '@opentelemetry/api': 1.4.1 + '@opentelemetry/sdk-trace-base': 1.14.0(@opentelemetry/api@1.4.1) + '@prisma/debug': 4.10.0 + '@prisma/engines': 4.10.0 + '@prisma/generator-helper': 4.10.0 + '@prisma/get-platform': 4.10.0 chalk: 4.1.2 execa: 5.1.1 get-stream: 6.0.1 @@ -2533,35 +2510,45 @@ packages: new-github-issue-url: 0.2.1 p-retry: 4.6.2 strip-ansi: 6.0.1 - undici: 5.11.0 + ts-pattern: 4.1.3 + undici: 5.16.0 transitivePeerDependencies: - supports-color - /@prisma/engines-version@4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c: - resolution: {integrity: sha512-Bd4LZ+WAnUHOq31e9X/ihi5zPlr4SzTRwUZZYxvWOxlerIZ7HJlVa9zXpuKTKLpI9O1l8Ec4OYCKsivWCs5a3Q==} + /@prisma/engines-version@3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11: + resolution: {integrity: sha512-PiZhdD624SrYEjyLboI0X7OugNbxUzDJx9v/6ldTKuqNDVUCmRH/Z00XwDi/dgM4FlqOSO+YiUsSiSKjxxG8cw==} dev: false - /@prisma/engines@4.7.0: - resolution: {integrity: sha512-afKrVFktaZ1pOK12/uFl2hRsBWIJZuC5FdDtacuKk5x/mR+rC5AbA+PlN3ZCZbmYTaeiBMHjcU5wbT5z2N3nSQ==} + /@prisma/engines-version@4.7.0-74.39190b250ebc338586e25e6da45e5e783bc8a635: + resolution: {integrity: sha512-ImczGEQ8NS1OUApEeyAGxC4uLTtQp0wI1+2wM4MeQLVwIQbyMHk1vOhWWE8Pwbi3rnzLcPvsIrd9sm6oNXhERw==} + dev: false + + /@prisma/engines@3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11: + resolution: {integrity: sha512-u/rG4lDHALolWBLr3yebZ+N2qImp3SDMcu7bHNJuRDaYvYEXy/MqfNRNEgd9GoPsXL3gofYf0VzJf2AmCG3YVw==} + requiresBuild: true + dev: true + + /@prisma/engines@4.10.0: + resolution: {integrity: sha512-ZPPo7q+nQZdTlPFedS7mFXPE3oZ2kWtTh3GO4sku0XQ8ikLqEyinuTPJbQCw/8qel2xglIEQicsK6yI4Jgh20A==} requiresBuild: true - /@prisma/engines@4.7.1: - resolution: {integrity: sha512-zWabHosTdLpXXlMefHmnouhXMoTB1+SCbUU3t4FCmdrtIOZcarPKU3Alto7gm/pZ9vHlGOXHCfVZ1G7OIrSbog==} + /@prisma/engines@4.7.0: + resolution: {integrity: sha512-afKrVFktaZ1pOK12/uFl2hRsBWIJZuC5FdDtacuKk5x/mR+rC5AbA+PlN3ZCZbmYTaeiBMHjcU5wbT5z2N3nSQ==} requiresBuild: true - /@prisma/fetch-engine@4.7.1: - resolution: {integrity: sha512-pZ3SiUV02FTMBJOwzoqGR4YcZ2jTo43Xw1QC/5YwmRkYa5NPydUnap5rvB84DgVNq5OnOrQxhWSsakOUPqcc6g==} + /@prisma/fetch-engine@4.10.0: + resolution: {integrity: sha512-DZaBIstNiubIuZHX3ul2piltE98MkPHelsCKub9NWqprdgTAd/1TBJQT2CVuVP1V5d+0JT0Nd+FmQY+oCWb5rw==} dependencies: - '@prisma/debug': 4.7.1 - '@prisma/get-platform': 4.7.1 + '@prisma/debug': 4.10.0 + '@prisma/get-platform': 4.10.0 chalk: 4.1.2 execa: 5.1.1 find-cache-dir: 3.3.2 + fs-extra: 11.1.0 hasha: 5.2.2 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.6.7 + node-fetch: 2.6.9 p-filter: 2.1.0 p-map: 4.0.0 p-retry: 4.6.2 @@ -2573,53 +2560,61 @@ packages: - encoding - supports-color - /@prisma/generator-helper@4.7.1: - resolution: {integrity: sha512-q9mjYOyLxkLWhqjvPB5sx5J1VRegWA2eC9mwrGgA0CSMo6SzZ7xwIe4rMJKnh4a7QMUO03+HQFdv/Nz7BOWCcg==} + /@prisma/generator-helper@4.10.0: + resolution: {integrity: sha512-NkQOfZpHUjVjqJ7NN2FymHSLkGd/E0fz5c3RkyESKvQqBy2sFBxt+aFxGsUbUy3FfwvkckC04HdQOXpisAko0A==} dependencies: - '@prisma/debug': 4.7.1 + '@prisma/debug': 4.10.0 '@types/cross-spawn': 6.0.2 chalk: 4.1.2 cross-spawn: 7.0.3 transitivePeerDependencies: - supports-color - /@prisma/get-platform@4.7.1: - resolution: {integrity: sha512-p160ToD9j53TgSrg0O0q3GkGZTGwB30UqIu3B0bu/NIvhnhHOwuEo4tyDXYKblLOE2TL0e1t0PWOSQAvH3nKYw==} + /@prisma/get-platform@4.10.0: + resolution: {integrity: sha512-QBgHnMe1CtFoioyH9C9cniC4TENFlhQuxWWxJQwWw8fkxvz/WgDwxJ+Xu3Jk8JrfP5iUVzqv+7VbZVKfMObakg==} dependencies: - '@prisma/debug': 4.7.1 + '@prisma/debug': 4.10.0 + chalk: 4.1.2 + escape-string-regexp: 4.0.0 + execa: 5.1.1 + fs-jetpack: 5.1.0 + replace-string: 3.1.0 + strip-ansi: 6.0.1 + tempy: 1.0.1 + terminal-link: 2.1.1 + ts-pattern: 4.1.3 transitivePeerDependencies: - supports-color - /@prisma/internals@4.7.1: - resolution: {integrity: sha512-YgG+5zLZuKdVUPnNdw9XA0XGfW1vZaOqrcGgRnla0mSIIIB3Gg3noRuHv9ZQAXeHLWh2v7MHxal6fxKElMN0ug==} + /@prisma/internals@4.10.0: + resolution: {integrity: sha512-Inex2YHZ0oaIxoGGjBX0N2w3TAVx7m7SXF0ru1kbvB05wqum1yyquBnsyca5A4DBANf3uSa3ZyQvx+Ksl4gIgw==} dependencies: - '@prisma/debug': 4.7.1 - '@prisma/engine-core': 4.7.1 - '@prisma/engines': 4.7.1 - '@prisma/fetch-engine': 4.7.1 - '@prisma/generator-helper': 4.7.1 - '@prisma/get-platform': 4.7.1 - '@prisma/prisma-fmt-wasm': 4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c + '@prisma/debug': 4.10.0 + '@prisma/engine-core': 4.10.0 + '@prisma/engines': 4.10.0 + '@prisma/fetch-engine': 4.10.0 + '@prisma/generator-helper': 4.10.0 + '@prisma/get-platform': 4.10.0 + '@prisma/prisma-fmt-wasm': 4.10.0-84.ca7fcef713137fa11029d519a9780db130cca91d archiver: 5.3.1 arg: 5.0.2 chalk: 4.1.2 - checkpoint-client: 1.1.21 + checkpoint-client: 1.1.23 cli-truncate: 2.1.0 dotenv: 16.0.3 escape-string-regexp: 4.0.0 execa: 5.1.1 find-up: 5.0.0 fp-ts: 2.13.1 - fs-extra: 10.1.0 + fs-extra: 11.1.0 fs-jetpack: 5.1.0 - global-dirs: 3.0.0 + global-dirs: 3.0.1 globby: 11.1.0 has-yarn: 2.1.0 is-windows: 1.0.2 is-wsl: 2.2.0 - make-dir: 3.1.0 new-github-issue-url: 0.2.1 - node-fetch: 2.6.7 + node-fetch: 2.6.9 open: 7.4.2 ora: 5.4.1 p-map: 4.0.0 @@ -2627,7 +2622,6 @@ packages: read-pkg-up: 7.0.1 replace-string: 3.1.0 resolve: 1.22.1 - rimraf: 3.0.2 string-width: 4.2.3 strip-ansi: 6.0.1 strip-indent: 3.0.0 @@ -2636,22 +2630,22 @@ packages: tempy: 1.0.1 terminal-link: 2.1.1 tmp: 0.2.1 - ts-pattern: 4.0.6 + ts-pattern: 4.3.0 transitivePeerDependencies: - encoding - supports-color - /@prisma/prisma-fmt-wasm@4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c: - resolution: {integrity: sha512-o9oSp2c5yDWHn9TT2Ntv3cb6LuJKPBy32gTtipYH1D166KfKBy+1RkPySobWZCKV/TrkUGlcBn5vcQgRBHPvVA==} + /@prisma/prisma-fmt-wasm@4.10.0-84.ca7fcef713137fa11029d519a9780db130cca91d: + resolution: {integrity: sha512-AkNNfsOnbfmGYFWAk6mFckuznyi4FvQDrK8NKQKC2DV068K//eAdr149upmypS90uOM3y74KS+b32ZyQwThzyA==} - /@readme/better-ajv-errors@1.5.0(ajv@8.12.0): - resolution: {integrity: sha512-dJLAlfN5ahAb6J5t+zCv0YeJsf4mrRHllwBb6pIYZa4yfFKs3lOSAN+i+ChebbpnqCkw7IrwzPz9vzk8p5mCEw==} + /@readme/better-ajv-errors@1.6.0(ajv@8.12.0): + resolution: {integrity: sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==} engines: {node: '>=14'} peerDependencies: ajv: 4.11.8 - 8 dependencies: - '@babel/code-frame': 7.18.6 - '@babel/runtime': 7.20.7 + '@babel/code-frame': 7.22.5 + '@babel/runtime': 7.22.5 '@humanwhocodes/momoa': 2.0.4 ajv: 8.12.0 chalk: 4.1.2 @@ -2664,7 +2658,7 @@ packages: resolution: {integrity: sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==} dependencies: '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 call-me-maybe: 1.0.2 js-yaml: 4.1.0 dev: true @@ -2678,7 +2672,7 @@ packages: '@apidevtools/openapi-schemas': 2.1.0 '@apidevtools/swagger-methods': 3.0.2 '@jsdevtools/ono': 7.1.3 - '@readme/better-ajv-errors': 1.5.0(ajv@8.12.0) + '@readme/better-ajv-errors': 1.6.0(ajv@8.12.0) '@readme/json-schema-ref-parser': 1.2.0 ajv: 8.12.0 ajv-draft-04: 1.0.0(ajv@8.12.0) @@ -2686,27 +2680,23 @@ packages: openapi-types: 12.1.0 dev: true - /@sinclair/typebox@0.24.47: - resolution: {integrity: sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A==} - dev: true - /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 2.0.0 + '@sinonjs/commons': 3.0.0 dev: true - /@sveltejs/kit@1.16.3(svelte@3.59.1)(vite@4.2.1): + /@sveltejs/kit@1.16.3(svelte@4.0.0-next.3)(vite@4.3.9): resolution: {integrity: sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==} engines: {node: ^16.14 || >=18} hasBin: true @@ -2715,10 +2705,10 @@ packages: svelte: ^3.54.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.2.0(svelte@3.59.1)(vite@4.2.1) + '@sveltejs/vite-plugin-svelte': 2.4.2(svelte@4.0.0-next.3)(vite@4.3.9) '@types/cookie': 0.5.1 cookie: 0.5.0 - devalue: 4.3.1 + devalue: 4.3.2 esm-env: 1.0.0 kleur: 4.1.5 magic-string: 0.30.0 @@ -2726,29 +2716,46 @@ packages: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.3 - svelte: 3.59.1 + svelte: 4.0.0-next.3 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 4.2.1(@types/node@18.14.2) + vite: 4.3.9(@types/node@14.18.32) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@2.2.0(svelte@3.59.1)(vite@4.2.1): - resolution: {integrity: sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==} + /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.0-next.3)(vite@4.3.9): + resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: - svelte: ^3.54.0 + '@sveltejs/vite-plugin-svelte': ^2.2.0 + svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: + '@sveltejs/vite-plugin-svelte': 2.4.2(svelte@4.0.0-next.3)(vite@4.3.9) + debug: 4.3.4 + svelte: 4.0.0-next.3 + vite: 4.3.9(@types/node@14.18.32) + transitivePeerDependencies: + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte@2.4.2(svelte@4.0.0-next.3)(vite@4.3.9): + resolution: {integrity: sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.0-next.3)(vite@4.3.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.0 - svelte: 3.59.1 - svelte-hmr: 0.15.1(svelte@3.59.1) - vite: 4.2.1(@types/node@18.14.2) - vitefu: 0.2.4(vite@4.2.1) + svelte: 4.0.0-next.3 + svelte-hmr: 0.15.2(svelte@4.0.0-next.3) + vite: 4.3.9(@types/node@14.18.32) + vitefu: 0.2.4(vite@4.3.9) transitivePeerDependencies: - supports-color dev: true @@ -2756,7 +2763,13 @@ packages: /@swc/helpers@0.4.11: resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 + + /@swc/helpers@0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.6.0 + dev: false /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} @@ -2764,12 +2777,20 @@ packages: tslib: 2.4.1 dev: true + /@tanstack/query-core@4.27.0: + resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} + dev: true + + /@tanstack/query-core@4.29.19: + resolution: {integrity: sha512-uPe1DukeIpIHpQi6UzIgBcXsjjsDaLnc7hF+zLBKnaUlh7jFE/A+P8t4cU4VzKPMFB/C970n/9SxtpO5hmIRgw==} + dev: true + /@tanstack/query-core@4.29.7: resolution: {integrity: sha512-GXG4b5hV2Loir+h2G+RXhJdoZhJLnrBWsuLB2r0qBRyhWuXq9w/dWxzvpP89H0UARlH6Mr9DiVj4SMtpkF/aUA==} dev: true - /@tanstack/react-query@4.29.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ijBWEzAIo09fB1yd22slRZzprrZ5zMdWYzBnCg5qiXuFbH78uGN1qtGz8+Ed4MuhaPaYSD+hykn+QEKtQviEtg==} + /@tanstack/react-query@4.28.0(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-8cGBV5300RHlvYdS4ea+G1JcZIt5CIuprXYFnsWggkmGoC0b5JaqG0fIX3qwDL9PTNkKvG76NGThIWbpXivMrQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2780,19 +2801,55 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.29.7 + '@tanstack/query-core': 4.27.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + use-sync-external-store: 1.2.0(react@17.0.2) + dev: true + + /@tanstack/react-query@4.29.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XiTIOHHQ5Cw1WUlHaD4fmVUMhoWjuNJlAeJGq7eM4BraI5z7y8WkZO+NR8PSuRnQGblpuVdjClQbDFtwxTtTUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.29.19 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) dev: true - /@tanstack/svelte-query@4.29.7(svelte@3.59.1): + /@tanstack/react-query@4.29.7(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-ijBWEzAIo09fB1yd22slRZzprrZ5zMdWYzBnCg5qiXuFbH78uGN1qtGz8+Ed4MuhaPaYSD+hykn+QEKtQviEtg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.29.7 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + use-sync-external-store: 1.2.0(react@17.0.2) + dev: true + + /@tanstack/svelte-query@4.29.7(svelte@3.59.2): resolution: {integrity: sha512-+GvOcGEiFZYj91luPcIIVakmDqXkS5tyWlBLf/zg9E9hohq7SiGug9C9DUWwvSBk80JefAOCioja5jrumrPp6Q==} peerDependencies: svelte: ^3.54.0 dependencies: '@tanstack/query-core': 4.29.7 - svelte: 3.59.1 + svelte: 3.59.2 dev: true /@tootallnate/once@2.0.0: @@ -2807,7 +2864,7 @@ packages: '@trpc/server': 10.32.0 dev: true - /@trpc/next@10.32.0(@tanstack/react-query@4.29.7)(@trpc/client@10.32.0)(@trpc/react-query@10.32.0)(@trpc/server@10.32.0)(next@13.4.7)(react-dom@18.2.0)(react@18.2.0): + /@trpc/next@10.32.0(@tanstack/react-query@4.29.19)(@trpc/client@10.32.0)(@trpc/react-query@10.32.0)(@trpc/server@10.32.0)(next@13.4.7)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qJ3yvJDTVmiOOPW1x/FCpmOvtcMJXnP2t3EbcUFrqwgH+D1KdbU2Kk1iSa89Gwy/BBEmXUxaKkWoM3e4Id80gw==} peerDependencies: '@tanstack/react-query': ^4.18.0 @@ -2818,17 +2875,17 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@tanstack/react-query': 4.29.7(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.29.19(react-dom@18.2.0)(react@18.2.0) '@trpc/client': 10.32.0(@trpc/server@10.32.0) - '@trpc/react-query': 10.32.0(@tanstack/react-query@4.29.7)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0) + '@trpc/react-query': 10.32.0(@tanstack/react-query@4.29.19)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': 10.32.0 - next: 13.4.7(@babel/core@7.20.5)(@opentelemetry/api@1.3.0)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.7(@babel/core@7.22.5)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-ssr-prepass: 1.5.0(react@18.2.0) dev: true - /@trpc/react-query@10.32.0(@tanstack/react-query@4.29.7)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0): + /@trpc/react-query@10.32.0(@tanstack/react-query@4.29.19)(@trpc/client@10.32.0)(@trpc/server@10.32.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-M4W1aGm3VAfQ9u4FJyK8M+pkcAV4lp32ZHxKnkRydxcsladhsqveZC9oqZqwklprEcYHtWU8v3R+jRGUjfCxpw==} peerDependencies: '@tanstack/react-query': ^4.18.0 @@ -2837,7 +2894,7 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@tanstack/react-query': 4.29.7(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.29.19(react-dom@18.2.0)(react@18.2.0) '@trpc/client': 10.32.0(@trpc/server@10.32.0) '@trpc/server': 10.32.0 react: 18.2.0 @@ -2852,7 +2909,7 @@ packages: resolution: {integrity: sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==} dependencies: fast-glob: 3.2.12 - minimatch: 5.1.0 + minimatch: 5.1.6 mkdirp: 1.0.4 path-browserify: 1.0.1 dev: false @@ -2869,41 +2926,41 @@ packages: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true /@types/async-exit-hook@2.0.0: resolution: {integrity: sha512-RNjIyjnVZdcP5a1zeIPb5c0hq2nbJc/NOCLNKUAqeCw+J5z2zMcINISn9wybCWhczHnUu3VSUFy7ZCO6ir4ZRw==} dev: true - /@types/babel__core@7.1.19: - resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.2 + '@types/babel__traverse': 7.20.1 dev: true /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 dev: true - /@types/babel__traverse@7.18.2: - resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.22.5 dev: true /@types/bcryptjs@2.4.2: @@ -2913,23 +2970,23 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.14.2 + '@types/node': 20.3.2 dev: true /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: - '@types/chai': 4.3.4 + '@types/chai': 4.3.5 dev: true - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.14.2 + '@types/node': 20.3.2 dev: true /@types/cookie@0.5.1: @@ -2943,47 +3000,56 @@ packages: /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 18.14.2 + '@types/node': 14.18.32 /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 - /@types/express-serve-static-core@4.17.33: - resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/express-serve-static-core@4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 18.14.2 + '@types/node': 20.3.2 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 dev: true /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.33 + '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@types/serve-static': 1.15.2 dev: true /@types/fs-extra@11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: '@types/jsonfile': 6.1.1 - '@types/node': 18.14.2 + '@types/node': 14.18.29 dev: true - /@types/graceful-fs@4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.14.2 + '@types/node': 14.18.32 + dev: true + + /@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true /@types/is-ci@3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: - ci-info: 3.7.1 + ci-info: 3.8.0 dev: true /@types/istanbul-lib-coverage@2.0.4: @@ -3009,14 +3075,14 @@ packages: pretty-format: 29.5.0 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true /@types/jsonfile@6.1.1: resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} dependencies: - '@types/node': 18.14.2 + '@types/node': 14.18.29 dev: true /@types/lower-case-first@1.0.1: @@ -3026,6 +3092,10 @@ packages: lower-case-first: 2.0.2 dev: true + /@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: true + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true @@ -3046,10 +3116,14 @@ packages: /@types/node@14.18.32: resolution: {integrity: sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==} - dev: true /@types/node@18.14.2: resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} + dev: true + + /@types/node@20.3.2: + resolution: {integrity: sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==} + dev: true /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3062,6 +3136,10 @@ packages: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true @@ -3078,15 +3156,15 @@ packages: resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} dependencies: '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 dev: true /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - /@types/scheduler@0.16.2: - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: true /@types/semver@6.2.3: @@ -3097,11 +3175,23 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 20.3.2 + dev: true + + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: + '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 18.14.2 + '@types/node': 20.3.2 dev: true /@types/stack-utils@2.0.1: @@ -3112,17 +3202,17 @@ packages: resolution: {integrity: sha512-nx4pG5q035VogbYZC+D7KVbSko6h6t5ha8hKh11EF1SOCiFG+77n0kmcGF9Rfrn9QeZbmrhohrA/g40UGb60aA==} dev: true - /@types/superagent@4.1.15: - resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} + /@types/superagent@4.1.18: + resolution: {integrity: sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==} dependencies: '@types/cookiejar': 2.1.2 - '@types/node': 18.14.2 + '@types/node': 20.3.2 dev: true /@types/supertest@2.0.12: resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} dependencies: - '@types/superagent': 4.1.15 + '@types/superagent': 4.1.18 dev: true /@types/tmp@0.2.3: @@ -3140,22 +3230,16 @@ packages: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/vscode@1.72.0: - resolution: {integrity: sha512-WvHluhUo+lQvE3I4wUagRpnkHuysB4qSyOQUyIAS9n9PYMJjepzTUD8Jyks0YeXoPD0UGctjqp2u84/b3v6Ydw==} + /@types/vscode@1.56.0: + resolution: {integrity: sha512-Q5VmQxOx+L1Y6lIJiGcJzwcyV3pQo/eiW8P+7sNLhFI16tJCwtua2DLjHRcpjbCLNVYpQM73kzfFo1Z0HyP9eQ==} dev: true /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs@17.0.12: - resolution: {integrity: sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@types/yargs@17.0.13: - resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true @@ -3177,7 +3261,7 @@ packages: '@typescript-eslint/utils': 5.42.0(eslint@8.27.0)(typescript@4.8.4) debug: 4.3.4 eslint: 8.27.0 - ignore: 5.2.0 + ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 @@ -3208,7 +3292,7 @@ packages: ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.5.3 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -3271,6 +3355,14 @@ packages: '@typescript-eslint/visitor-keys': 5.54.0 dev: true + /@typescript-eslint/scope-manager@5.60.1: + resolution: {integrity: sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/visitor-keys': 5.60.1 + dev: true + /@typescript-eslint/type-utils@5.42.0(eslint@8.27.0)(typescript@4.8.4): resolution: {integrity: sha512-HW14TXC45dFVZxnVW8rnUGnvYyRC0E/vxXShFCthcC9VhVTmjqOmtqj6H5rm9Zxv+ORxKA/1aLGD7vmlLsdlOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3321,6 +3413,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@5.60.1: + resolution: {integrity: sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.42.0(typescript@4.8.4): resolution: {integrity: sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3356,20 +3453,41 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.5.3 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/typescript-estree@5.60.1(typescript@4.8.4): + resolution: {integrity: sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/visitor-keys': 5.60.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0(typescript@4.8.4) + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.42.0(eslint@8.27.0)(typescript@4.8.4): resolution: {integrity: sha512-JZ++3+h1vbeG1NUECXQZE3hg0kias9kOtcQr3+JVQ3whnjvKuMyktJAAIj6743OeNPnGBmjj7KEmiDL7qsdnCQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.42.0 '@typescript-eslint/types': 5.42.0 @@ -3389,14 +3507,34 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.54.0 '@typescript-eslint/types': 5.54.0 '@typescript-eslint/typescript-estree': 5.54.0(typescript@4.9.5) eslint: 8.35.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.35.0) + semver: 7.5.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.60.1(eslint@8.27.0)(typescript@4.8.4): + resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.27.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.60.1 + '@typescript-eslint/types': 5.60.1 + '@typescript-eslint/typescript-estree': 5.60.1(typescript@4.8.4) + eslint: 8.27.0 + eslint-scope: 5.1.1 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3408,7 +3546,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.42.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.1 dev: true /@typescript-eslint/visitor-keys@5.54.0: @@ -3416,7 +3554,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.54.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@typescript-eslint/visitor-keys@5.60.1: + resolution: {integrity: sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.1 + eslint-visitor-keys: 3.4.1 dev: true /@vitest/expect@0.29.7: @@ -3432,7 +3578,7 @@ packages: dependencies: '@vitest/utils': 0.29.7 p-limit: 4.0.0 - pathe: 1.1.0 + pathe: 1.1.1 dev: true /@vitest/spy@0.29.7: @@ -3470,7 +3616,7 @@ packages: read: 1.0.7 semver: 5.7.1 tmp: 0.2.1 - typed-rest-client: 1.8.9 + typed-rest-client: 1.8.10 url-join: 4.0.1 xml2js: 0.5.0 yauzl: 2.10.0 @@ -3498,12 +3644,12 @@ packages: negotiator: 0.6.3 dev: true - /acorn-jsx@5.3.2(acorn@8.8.0): + /acorn-jsx@5.3.2(acorn@8.9.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.0 + acorn: 8.9.0 dev: true /acorn-walk@8.2.0: @@ -3511,14 +3657,8 @@ packages: engines: {node: '>=0.4.0'} dev: true - /acorn@8.8.0: - resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -3620,8 +3760,8 @@ packages: engines: {node: '>=12'} dev: true - /anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 @@ -3633,7 +3773,7 @@ packages: engines: {node: '>= 6'} dependencies: glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 lazystream: 1.0.1 lodash.defaults: 4.2.0 lodash.difference: 4.5.0 @@ -3641,7 +3781,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.union: 4.6.0 normalize-path: 3.0.0 - readable-stream: 2.3.7 + readable-stream: 2.3.8 /archiver@5.3.1: resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} @@ -3650,8 +3790,8 @@ packages: archiver-utils: 2.1.0 async: 3.2.4 buffer-crc32: 0.2.13 - readable-stream: 3.6.0 - readdir-glob: 1.1.2 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 tar-stream: 2.2.0 zip-stream: 4.1.0 @@ -3676,6 +3816,12 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} @@ -3691,6 +3837,13 @@ packages: engines: {node: '>=12.17'} dev: true + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -3704,8 +3857,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 dev: true @@ -3758,26 +3911,32 @@ packages: - supports-color dev: true + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + /azure-devops-node-api@11.2.0: resolution: {integrity: sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==} dependencies: tunnel: 0.0.6 - typed-rest-client: 1.8.9 + typed-rest-client: 1.8.10 dev: true - /babel-jest@29.5.0(@babel/core@7.20.5): + /babel-jest@29.5.0(@babel/core@7.22.5): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 '@jest/transform': 29.5.0 - '@types/babel__core': 7.1.19 + '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.20.5) + babel-preset-jest: 29.5.0(@babel/core@7.22.5) chalk: 4.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -3787,7 +3946,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -3800,41 +3959,41 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.18.2 + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.5): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.5): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.5) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.20.5): + '@babel/core': 7.22.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) + dev: true + + /babel-preset-jest@29.5.0(@babel/core@7.22.5): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.5) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.5) dev: true /balanced-match@1.0.2: @@ -3864,7 +4023,7 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -3927,21 +4086,21 @@ packages: dependencies: fill-range: 7.0.1 - /breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} dependencies: wcwidth: 1.0.1 dev: true - /browserslist@4.21.4: - resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001439 - electron-to-chromium: 1.4.284 - node-releases: 2.0.6 - update-browserslist-db: 1.0.10(browserslist@4.21.4) + caniuse-lite: 1.0.30001509 + electron-to-chromium: 1.4.442 + node-releases: 2.0.12 + update-browserslist-db: 1.0.11(browserslist@4.21.9) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -3996,7 +4155,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /call-me-maybe@1.0.2: @@ -4012,7 +4171,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /camelcase-keys@6.2.2: @@ -4034,14 +4193,14 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001439: - resolution: {integrity: sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==} + /caniuse-lite@1.0.30001509: + resolution: {integrity: sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 upper-case-first: 2.0.2 dev: false @@ -4087,7 +4246,7 @@ packages: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /char-regex@1.0.2: @@ -4103,8 +4262,8 @@ packages: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true - /checkpoint-client@1.1.21: - resolution: {integrity: sha512-bcrcnJncn6uGhj06IIsWvUBPyJWK1ZezDbLCJ//IQEYXkUobhGvOOBlHe9K5x0ZMkAZGinPB4T+lTUmFz/acWQ==} + /checkpoint-client@1.1.23: + resolution: {integrity: sha512-NrGvMiH1fUcZwrYc0Z+YTn7q9ysV0kPgVyDKZ5jrfIerFJuSllvyGsY7bHeQSEiljaIaUP1Q/xutZ8q1s7PGzg==} dependencies: ci-info: 3.3.0 env-paths: 2.2.1 @@ -4124,7 +4283,7 @@ packages: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.0.1 + domutils: 3.1.0 dev: true /cheerio@1.0.0-rc.12: @@ -4134,14 +4293,16 @@ packages: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.0.1 - htmlparser2: 8.0.1 + domutils: 3.1.0 + htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 dev: true - /chevrotain-allstar@0.1.4: - resolution: {integrity: sha512-gr5PNT8keiOTt19r+XkRY19unZw7rUE/erXgfFMEJnk1ZTuiVGWREfzVPSlz9u6DxbR0zJ9NQzdQS0a/3SVKFw==} + /chevrotain-allstar@0.1.7(chevrotain@10.4.2): + resolution: {integrity: sha512-oMSHkXVCDQxnj3tDCqcEoMnNIEiYlAYT0FVja1PaLrT3njXGvg5JXTXs/tk2NI42SR3LMJyqTNgjR4VyDIf19w==} + peerDependencies: + chevrotain: ~10.4.1 dependencies: chevrotain: 10.4.2 lodash: 4.17.21 @@ -4160,7 +4321,7 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.2 + anymatch: 3.1.3 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -4179,21 +4340,13 @@ packages: /ci-info@3.3.0: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} - /ci-info@3.4.0: - resolution: {integrity: sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==} - dev: true - - /ci-info@3.5.0: - resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==} - dev: true - - /ci-info@3.7.1: - resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true /clean-stack@2.2.0: @@ -4206,8 +4359,8 @@ packages: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} engines: {node: '>=6'} /cli-truncate@2.1.0: @@ -4272,6 +4425,16 @@ packages: engines: {node: '>= 4'} dev: true + /code-red@1.0.3: + resolution: {integrity: sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.1 + acorn: 8.9.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + dev: true + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true @@ -4325,8 +4488,8 @@ packages: typical: 5.2.0 dev: true - /commander@10.0.0: - resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} dev: true @@ -4340,8 +4503,8 @@ packages: engines: {node: '>= 12'} dev: false - /commander@9.4.1: - resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true @@ -4359,7 +4522,7 @@ packages: buffer-crc32: 0.2.13 crc32-stream: 4.0.2 normalize-path: 3.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -4370,14 +4533,14 @@ packages: hasBin: true dependencies: chalk: 4.1.2 - date-fns: 2.29.3 + date-fns: 2.30.0 lodash: 4.17.21 - rxjs: 7.5.7 - shell-quote: 1.7.4 + rxjs: 7.8.1 + shell-quote: 1.8.1 spawn-command: 0.0.2-1 supports-color: 8.1.1 tree-kill: 1.2.2 - yargs: 17.6.0 + yargs: 17.7.2 dev: true /config-chain@1.1.13: @@ -4391,7 +4554,7 @@ packages: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 upper-case: 2.0.2 dev: false @@ -4427,11 +4590,11 @@ packages: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true - /copy-anything@3.0.3: - resolution: {integrity: sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw==} + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} dependencies: - is-what: 4.1.8 + is-what: 4.1.15 /copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} @@ -4459,16 +4622,16 @@ packages: engines: {node: '>= 10'} dependencies: crc-32: 1.2.2 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + /cross-fetch@3.1.6: + resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.11 transitivePeerDependencies: - encoding dev: true @@ -4499,17 +4662,25 @@ packages: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.0.1 + domutils: 3.1.0 nth-check: 2.1.1 dev: true + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} dev: true - /csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true /csv-generate@3.4.3: @@ -4534,14 +4705,16 @@ packages: stream-transform: 2.1.3 dev: true - /current-module-paths@1.1.0: - resolution: {integrity: sha512-HGhLUszcgprjKmzvQoCQda8iEWsQn3sWVzPdttyJVR5cjfVDYcoyozQA5D1YXgab9v84SPMpSuD+YrPX6i1IMQ==} + /current-module-paths@1.1.1: + resolution: {integrity: sha512-8Ga5T8oMXBaSsHq9Gj+bddX7kHSaJKsl2vaAd3ep51eQLkr4W18eFEmEZM5bLo1zrz8tt3jE1U8QK9QGhaLR4g==} engines: {node: '>=12.17'} dev: true - /date-fns@2.29.3: - resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.5 dev: true /debug@2.6.9: @@ -4633,8 +4806,8 @@ packages: dependencies: clone: 1.0.4 - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 @@ -4646,7 +4819,7 @@ packages: engines: {node: '>=10'} dependencies: globby: 11.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 is-path-inside: 3.0.3 @@ -4664,6 +4837,11 @@ packages: engines: {node: '>= 0.8'} dev: true + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4685,8 +4863,8 @@ packages: engines: {node: '>=8'} dev: true - /devalue@4.3.1: - resolution: {integrity: sha512-Kc0TSP9IUU9eg55au5Q3YtqaYI2cgntVpunJV9Exbm9nvlBeTE5p2NqYHfpuXK6+VF2hF5PI+BPFPUti7e2N1g==} + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true /dezalgo@1.0.4: @@ -4729,7 +4907,7 @@ packages: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - entities: 4.4.0 + entities: 4.5.0 dev: true /domelementtype@2.3.0: @@ -4743,8 +4921,8 @@ packages: domelementtype: 2.3.0 dev: true - /domutils@3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -4755,7 +4933,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /dotenv@16.0.3: @@ -4770,8 +4948,8 @@ packages: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: true - /electron-to-chromium@1.4.284: - resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + /electron-to-chromium@1.4.442: + resolution: {integrity: sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -4806,8 +4984,8 @@ packages: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} dev: true - /entities@4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} dev: true @@ -4820,17 +4998,17 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: + array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 @@ -4838,8 +5016,8 @@ packages: has-property-descriptors: 1.0.0 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.4 - is-array-buffer: 3.0.1 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 @@ -4850,8 +5028,9 @@ packages: object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.0 safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 @@ -4863,7 +5042,7 @@ packages: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 dev: true @@ -5093,34 +5272,34 @@ packages: esbuild-windows-arm64: 0.15.12 dev: true - /esbuild@0.17.14: - resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.14 - '@esbuild/android-arm64': 0.17.14 - '@esbuild/android-x64': 0.17.14 - '@esbuild/darwin-arm64': 0.17.14 - '@esbuild/darwin-x64': 0.17.14 - '@esbuild/freebsd-arm64': 0.17.14 - '@esbuild/freebsd-x64': 0.17.14 - '@esbuild/linux-arm': 0.17.14 - '@esbuild/linux-arm64': 0.17.14 - '@esbuild/linux-ia32': 0.17.14 - '@esbuild/linux-loong64': 0.17.14 - '@esbuild/linux-mips64el': 0.17.14 - '@esbuild/linux-ppc64': 0.17.14 - '@esbuild/linux-riscv64': 0.17.14 - '@esbuild/linux-s390x': 0.17.14 - '@esbuild/linux-x64': 0.17.14 - '@esbuild/netbsd-x64': 0.17.14 - '@esbuild/openbsd-x64': 0.17.14 - '@esbuild/sunos-x64': 0.17.14 - '@esbuild/win32-arm64': 0.17.14 - '@esbuild/win32-ia32': 0.17.14 - '@esbuild/win32-x64': 0.17.14 + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 dev: true /escalade@3.1.1: @@ -5158,7 +5337,7 @@ packages: optional: true dependencies: '@typescript-eslint/eslint-plugin': 5.42.0(@typescript-eslint/parser@5.42.0)(eslint@8.27.0)(typescript@4.8.4) - '@typescript-eslint/utils': 5.42.0(eslint@8.27.0)(typescript@4.8.4) + '@typescript-eslint/utils': 5.60.1(eslint@8.27.0)(typescript@4.8.4) eslint: 8.27.0 jest: 29.5.0(@types/node@14.18.32)(ts-node@10.9.1) transitivePeerDependencies: @@ -5174,8 +5353,8 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -5217,8 +5396,8 @@ packages: engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -5227,8 +5406,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.11.7 + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -5237,31 +5416,31 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.0 eslint-utils: 3.0.0(eslint@8.27.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.17.0 + globals: 13.20.0 grapheme-splitter: 1.0.4 - ignore: 5.2.0 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.1.5 + js-sdsl: 4.4.1 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 @@ -5275,8 +5454,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.0 - '@humanwhocodes/config-array': 0.11.8 + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -5285,31 +5464,31 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.0 eslint-utils: 3.0.0(eslint@8.30.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.19.0 + globals: 13.20.0 grapheme-splitter: 1.0.4 - ignore: 5.2.0 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.1.5 + js-sdsl: 4.4.1 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 @@ -5323,9 +5502,9 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 2.0.0 + '@eslint/eslintrc': 2.0.3 '@eslint/js': 8.35.0 - '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -5334,31 +5513,31 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.0 eslint-utils: 3.0.0(eslint@8.35.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.19.0 + globals: 13.20.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.1.5 + js-sdsl: 4.4.1 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 @@ -5371,13 +5550,13 @@ packages: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} dev: true - /espree@9.4.1: - resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + /espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2(acorn@8.8.0) - eslint-visitor-keys: 3.3.0 + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) + eslint-visitor-keys: 3.4.1 dev: true /esprima@4.0.1: @@ -5386,13 +5565,6 @@ packages: hasBin: true dev: true - /esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -5417,6 +5589,12 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -5537,8 +5715,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true /fast-glob@3.2.12: @@ -5555,8 +5733,8 @@ packages: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-json-stringify@5.6.2: - resolution: {integrity: sha512-F6xkRrXvtGbAiDSEI5Rk7qk2P63Y9kc8bO6Dnsd3Rt6sBNr2QxNFWs0JbKftgiyOfGxnJaRoHe4SizCTqeAyrA==} + /fast-json-stringify@5.7.0: + resolution: {integrity: sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==} dependencies: '@fastify/deepmerge': 1.3.0 ajv: 8.12.0 @@ -5570,14 +5748,14 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-querystring@1.1.1: - resolution: {integrity: sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==} + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 dev: true - /fast-redact@3.1.2: - resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + /fast-redact@3.2.0: + resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} engines: {node: '>=6'} dev: true @@ -5600,20 +5778,20 @@ packages: resolution: {integrity: sha512-yjrDeXe77j9gRlSV2UJry8mcFWbD0NQ5JYjnPi4tkFjHZVaG3/BD5wxOmRzGnHPC0YvaBJ0XWrIfFPl2IHRa1w==} dependencies: '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.2.0 - '@fastify/fast-json-stringify-compiler': 4.2.0 + '@fastify/error': 3.3.0 + '@fastify/fast-json-stringify-compiler': 4.3.0 abstract-logging: 2.0.1 avvio: 8.2.1 fast-content-type-parse: 1.0.0 - find-my-way: 7.5.0 - light-my-request: 5.9.1 - pino: 8.11.0 - process-warning: 2.1.0 + find-my-way: 7.6.2 + light-my-request: 5.10.0 + pino: 8.14.1 + process-warning: 2.2.0 proxy-addr: 2.0.7 rfdc: 1.3.0 secure-json-parse: 2.7.0 - semver: 7.3.8 - tiny-lru: 10.0.1 + semver: 7.5.3 + tiny-lru: 10.4.1 transitivePeerDependencies: - supports-color dev: true @@ -5679,12 +5857,12 @@ packages: make-dir: 3.1.0 pkg-dir: 4.2.0 - /find-my-way@7.5.0: - resolution: {integrity: sha512-3ehydSBhGcS0TtMA/BYEyMAKi9Sv0MqF8aqiMO5oGBXyCcSlyEJyfGWsbNxAx7BekTNWUwD1ttLJLURni2vmJg==} + /find-my-way@7.6.2: + resolution: {integrity: sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==} engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 - fast-querystring: 1.1.1 + fast-querystring: 1.1.2 safe-regex2: 2.0.0 dev: true @@ -5761,7 +5939,7 @@ packages: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.0 + qs: 6.11.2 dev: true /forwarded@0.2.0: @@ -5781,25 +5959,25 @@ packages: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: false /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -5808,7 +5986,7 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -5817,7 +5995,7 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -5825,7 +6003,7 @@ packages: /fs-jetpack@5.1.0: resolution: {integrity: sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==} dependencies: - minimatch: 5.1.0 + minimatch: 5.1.6 /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5846,8 +6024,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 functions-have-names: 1.2.3 dev: true @@ -5868,16 +6046,17 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic@1.1.3: - resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 dev: true - /get-it@8.1.1: - resolution: {integrity: sha512-83P2+3V/3E+KSdlHnGlOr4vCrlV8wDsT580AyJkMtkK/8LtZc0TOCI9bjQXH1sgYnmQTzCoPoPaOAE+a8JZqLQ==} + /get-it@8.1.4: + resolution: {integrity: sha512-CMwl72THBpbR15OsrLXpSFsreiT1zPPXalxYiCg8zXaksfGhks0A633iOMn8qc7xkvv6bbiI18Hh7AmTxhV6nQ==} engines: {node: '>=14.0.0'} dependencies: debug: 4.3.4 @@ -5898,7 +6077,7 @@ packages: resolution: {integrity: sha512-oonDx2gj9GzP+b1dxrd4KJwnTEFPjugNVALey5ze7cBkwjI/2BQ6X93hzE5cTVHV3DOPTB8U9HlbpEZVLjI1MQ==} engines: {node: '>=14.18'} dependencies: - get-it: 8.1.1 + get-it: 8.1.4 registry-auth-token: 5.0.2 registry-url: 5.1.0 semver: 7.3.8 @@ -5920,7 +6099,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /github-from-package@0.0.0: @@ -5955,8 +6134,8 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-dirs@3.0.0: - resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} dependencies: ini: 2.0.0 @@ -5965,15 +6144,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.17.0: - resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globals@13.19.0: - resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -5983,7 +6155,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.1.4 + define-properties: 1.2.0 dev: true /globalyzer@0.1.0: @@ -6008,11 +6180,15 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -6038,7 +6214,7 @@ packages: /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /has-proto@1.0.1: @@ -6079,7 +6255,7 @@ packages: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: capital-case: 1.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /hexoid@1.0.0: @@ -6101,13 +6277,13 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /htmlparser2@8.0.1: - resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.0.1 - entities: 4.4.0 + domutils: 3.1.0 + entities: 4.5.0 dev: true /http-errors@2.0.0: @@ -6168,11 +6344,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -6219,11 +6390,11 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - /internal-slot@1.0.4: - resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -6241,11 +6412,11 @@ packages: engines: {node: '>= 0.10'} dev: true - /is-array-buffer@3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 is-typed-array: 1.1.10 dev: true @@ -6282,11 +6453,11 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: - ci-info: 3.7.1 + ci-info: 3.8.0 dev: true - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: has: 1.0.3 @@ -6364,6 +6535,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: true + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -6429,8 +6606,8 @@ packages: call-bind: 1.0.2 dev: true - /is-what@4.1.8: - resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} + /is-what@4.1.15: + resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} engines: {node: '>=12.13'} /is-windows@1.0.2: @@ -6456,7 +6633,7 @@ packages: /isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.11 whatwg-fetch: 3.6.2 transitivePeerDependencies: - encoding @@ -6471,8 +6648,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.20.5 - '@babel/parser': 7.20.5 + '@babel/core': 7.22.5 + '@babel/parser': 7.22.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -6524,7 +6701,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -6537,9 +6714,9 @@ packages: jest-util: 29.5.0 p-limit: 3.1.0 pretty-format: 29.5.0 - pure-rand: 6.0.1 + pure-rand: 6.0.2 slash: 3.0.0 - stack-utils: 2.0.5 + stack-utils: 2.0.6 transitivePeerDependencies: - supports-color dev: true @@ -6559,13 +6736,13 @@ packages: '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 import-local: 3.1.0 jest-config: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 - yargs: 17.6.2 + yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - supports-color @@ -6587,13 +6764,13 @@ packages: '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 import-local: 3.1.0 jest-config: 29.5.0(@types/node@14.18.32)(ts-node@10.9.1) jest-util: 29.5.0 jest-validate: 29.5.0 prompts: 2.4.2 - yargs: 17.6.2 + yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - supports-color @@ -6612,56 +6789,16 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 14.18.29 - babel-jest: 29.5.0(@babel/core@7.20.5) - chalk: 4.1.2 - ci-info: 3.7.1 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.5.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@14.18.29)(typescript@4.8.3) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-config@29.5.0(@types/node@14.18.32)(ts-node@10.9.1): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.20.5 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 14.18.32 - babel-jest: 29.5.0(@babel/core@7.20.5) + '@types/node': 14.18.29 + babel-jest: 29.5.0(@babel/core@7.22.5) chalk: 4.1.2 - ci-info: 3.7.1 + ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-circus: 29.5.0 jest-environment-node: 29.5.0 jest-get-type: 29.4.3 @@ -6680,7 +6817,7 @@ packages: - supports-color dev: true - /jest-config@29.5.0(@types/node@18.14.2)(ts-node@10.9.1): + /jest-config@29.5.0(@types/node@14.18.32)(ts-node@10.9.1): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6692,16 +6829,16 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 - babel-jest: 29.5.0(@babel/core@7.20.5) + '@types/node': 14.18.32 + babel-jest: 29.5.0(@babel/core@7.22.5) chalk: 4.1.2 - ci-info: 3.7.1 + ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-circus: 29.5.0 jest-environment-node: 29.5.0 jest-get-type: 29.4.3 @@ -6755,7 +6892,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -6763,8 +6900,8 @@ packages: /jest-fetch-mock@3.0.3: resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} dependencies: - cross-fetch: 3.1.5 - promise-polyfill: 8.2.3 + cross-fetch: 3.1.6 + promise-polyfill: 8.3.0 transitivePeerDependencies: - encoding dev: true @@ -6779,11 +6916,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/graceful-fs': 4.1.5 - '@types/node': 18.14.2 - anymatch: 3.1.2 + '@types/graceful-fs': 4.1.6 + '@types/node': 14.18.32 + anymatch: 3.1.3 fb-watchman: 2.0.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-regex-util: 29.4.3 jest-util: 29.5.0 jest-worker: 29.5.0 @@ -6815,15 +6952,15 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.5 '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 micromatch: 4.0.5 pretty-format: 29.5.0 slash: 3.0.0 - stack-utils: 2.0.5 + stack-utils: 2.0.6 dev: true /jest-mock@29.5.0: @@ -6831,12 +6968,12 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 jest-util: 29.5.0 dev: true - /jest-pnp-resolver@1.2.2(jest-resolve@29.5.0): - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: jest-resolve: '*' @@ -6867,13 +7004,13 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.2(jest-resolve@29.5.0) + jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) jest-util: 29.5.0 jest-validate: 29.5.0 - resolve: 1.22.1 - resolve.exports: 2.0.0 + resolve: 1.22.2 + resolve.exports: 2.0.2 slash: 3.0.0 dev: true @@ -6886,10 +7023,10 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 chalk: 4.1.2 emittery: 0.13.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-docblock: 29.4.3 jest-environment-node: 29.5.0 jest-haste-map: 29.5.0 @@ -6917,12 +7054,12 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 + cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.1 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-mock: 29.5.0 @@ -6940,21 +7077,21 @@ packages: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.5) - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.5) - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.5) + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 '@jest/expect-utils': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/babel__traverse': 7.18.2 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.5) + '@types/babel__traverse': 7.20.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.5) chalk: 4.1.2 expect: 29.5.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-diff: 29.5.0 jest-get-type: 29.4.3 jest-matcher-utils: 29.5.0 @@ -6962,56 +7099,20 @@ packages: jest-util: 29.5.0 natural-compare: 1.4.0 pretty-format: 29.5.0 - semver: 7.3.8 + semver: 7.5.3 transitivePeerDependencies: - supports-color dev: true - /jest-util@29.0.3: - resolution: {integrity: sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.0.3 - '@types/node': 18.14.2 - chalk: 4.1.2 - ci-info: 3.4.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - - /jest-util@29.2.1: - resolution: {integrity: sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.2.1 - '@types/node': 18.14.2 - chalk: 4.1.2 - ci-info: 3.5.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - - /jest-util@29.4.3: - resolution: {integrity: sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 18.14.2 - chalk: 4.1.2 - ci-info: 3.7.1 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 20.3.2 chalk: 4.1.2 - ci-info: 3.7.1 - graceful-fs: 4.2.10 + ci-info: 3.8.0 + graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true @@ -7033,7 +7134,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.14.2 + '@types/node': 14.18.32 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -7045,7 +7146,7 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.14.2 + '@types/node': 14.18.32 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7091,8 +7192,8 @@ packages: - ts-node dev: true - /js-sdsl@4.1.5: - resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} + /js-sdsl@4.4.1: + resolution: {integrity: sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==} dev: true /js-tokens@4.0.0: @@ -7141,12 +7242,6 @@ packages: grapheme-splitter: 1.0.4 dev: true - /json5@2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -7159,7 +7254,7 @@ packages: /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: @@ -7167,7 +7262,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} @@ -7207,8 +7302,8 @@ packages: hasBin: true dependencies: chalk: 4.1.2 - commander: 10.0.0 - fs-extra: 11.1.0 + commander: 10.0.1 + fs-extra: 11.1.1 jsonschema: 1.4.1 langium: 1.2.0 lodash: 4.17.21 @@ -7219,7 +7314,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: chevrotain: 10.4.2 - chevrotain-allstar: 0.1.4 + chevrotain-allstar: 0.1.7(chevrotain@10.4.2) vscode-languageserver: 8.0.2 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 @@ -7228,7 +7323,7 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -7243,11 +7338,11 @@ packages: type-check: 0.4.0 dev: true - /light-my-request@5.9.1: - resolution: {integrity: sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==} + /light-my-request@5.10.0: + resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==} dependencies: cookie: 0.5.0 - process-warning: 2.1.0 + process-warning: 2.2.0 set-cookie-parser: 2.6.0 dev: true @@ -7271,7 +7366,7 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 @@ -7282,6 +7377,10 @@ packages: engines: {node: '>=14'} dev: true + /locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -7350,12 +7449,12 @@ packages: /lower-case-first@2.0.2: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 dev: false /lru-cache@4.1.5: @@ -7365,6 +7464,11 @@ packages: yallist: 2.1.2 dev: true + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -7375,7 +7479,7 @@ packages: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /make-dir@3.1.0: @@ -7415,6 +7519,10 @@ packages: uc.micro: 1.0.6 dev: true + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true @@ -7511,8 +7619,8 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -7529,8 +7637,8 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mixme@0.5.4: - resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} + /mixme@0.5.9: + resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} engines: {node: '>= 8.0.0'} dev: true @@ -7553,13 +7661,13 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 + acorn: 8.9.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 dev: true /mri@1.2.0: @@ -7591,8 +7699,8 @@ packages: engines: {node: '>=12.0.0'} dev: true - /nanoid@3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -7618,7 +7726,52 @@ packages: resolution: {integrity: sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==} engines: {node: '>=10'} - /next@12.3.1(@babel/core@7.20.5)(react-dom@18.2.0)(react@18.2.0): + /next@12.3.1(@babel/core@7.22.5)(react-dom@18.2.0)(react@17.0.2): + resolution: {integrity: sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==} + engines: {node: '>=12.22.0'} + hasBin: true + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^17.0.2 || ^18.0.0-0 + react-dom: ^17.0.2 || ^18.0.0-0 + sass: ^1.3.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 12.3.1 + '@swc/helpers': 0.4.11 + caniuse-lite: 1.0.30001509 + postcss: 8.4.14 + react: 17.0.2 + react-dom: 18.2.0(react@17.0.2) + styled-jsx: 5.0.7(@babel/core@7.22.5)(react@17.0.2) + use-sync-external-store: 1.2.0(react@17.0.2) + optionalDependencies: + '@next/swc-android-arm-eabi': 12.3.1 + '@next/swc-android-arm64': 12.3.1 + '@next/swc-darwin-arm64': 12.3.1 + '@next/swc-darwin-x64': 12.3.1 + '@next/swc-freebsd-x64': 12.3.1 + '@next/swc-linux-arm-gnueabihf': 12.3.1 + '@next/swc-linux-arm64-gnu': 12.3.1 + '@next/swc-linux-arm64-musl': 12.3.1 + '@next/swc-linux-x64-gnu': 12.3.1 + '@next/swc-linux-x64-musl': 12.3.1 + '@next/swc-win32-arm64-msvc': 12.3.1 + '@next/swc-win32-ia32-msvc': 12.3.1 + '@next/swc-win32-x64-msvc': 12.3.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /next@12.3.1(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==} engines: {node: '>=12.22.0'} hasBin: true @@ -7638,11 +7791,11 @@ packages: dependencies: '@next/env': 12.3.1 '@swc/helpers': 0.4.11 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001509 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.0.7(@babel/core@7.20.5)(react@18.2.0) + styled-jsx: 5.0.7(@babel/core@7.22.5)(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: '@next/swc-android-arm-eabi': 12.3.1 @@ -7661,8 +7814,9 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: true - /next@13.4.5(@babel/core@7.20.5)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.5(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-pfNsRLVM9e5Y1/z02VakJRfD6hMQkr24FaN2xc9GbcZDBxoOgiNAViSg5cXwlWCoMhtm4U315D7XYhgOr96Q3Q==} engines: {node: '>=16.8.0'} hasBin: true @@ -7683,11 +7837,11 @@ packages: '@next/env': 13.4.5 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001509 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.20.5)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.22.5)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -7705,7 +7859,7 @@ packages: - babel-plugin-macros dev: true - /next@13.4.7(@babel/core@7.20.5)(@opentelemetry/api@1.3.0)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.7(@babel/core@7.22.5)(@opentelemetry/api@1.4.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} engines: {node: '>=16.8.0'} hasBin: true @@ -7724,14 +7878,14 @@ packages: optional: true dependencies: '@next/env': 13.4.7 - '@opentelemetry/api': 1.3.0 + '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001509 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.20.5)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.22.5)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -7753,11 +7907,11 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.1 + tslib: 2.6.0 dev: false - /node-abi@3.33.0: - resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + /node-abi@3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} engines: {node: '>=10'} dependencies: semver: 7.3.8 @@ -7769,6 +7923,18 @@ packages: dev: true optional: true + /node-fetch@2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -7780,6 +7946,17 @@ packages: dependencies: whatwg-url: 5.0.0 + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true @@ -7788,8 +7965,8 @@ packages: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} dev: false - /node-releases@2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + /node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} /noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} @@ -7802,7 +7979,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.2 semver: 5.7.1 validate-npm-package-license: 3.0.4 @@ -7822,6 +7999,10 @@ packages: boolbase: 1.0.0 dev: true + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -7836,7 +8017,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -7873,16 +8054,16 @@ packages: /openapi-types@12.1.0: resolution: {integrity: sha512-XpeCy01X6L5EpP+6Hc3jWN7rMZJ+/k1lwki/kTmWzbVhdPie3jd5O2ZtedEx8Yp58icJ0osVldLMrTB/zslQXA==} - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /ora@5.4.1: @@ -7892,7 +8073,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.7.0 + cli-spinners: 2.9.0 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -7975,7 +8156,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /parent-module@1.0.1: @@ -7993,7 +8174,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -8014,7 +8195,7 @@ packages: /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: - entities: 4.4.0 + entities: 4.5.0 dev: true /parseurl@1.3.3: @@ -8026,7 +8207,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /path-browserify@1.0.1: @@ -8037,7 +8218,7 @@ packages: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: dot-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false /path-exists@4.0.0: @@ -8063,8 +8244,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true /pathval@1.1.1: @@ -8075,6 +8256,14 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -8090,33 +8279,33 @@ packages: /pino-abstract-transport@1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: - readable-stream: 4.3.0 - split2: 4.1.0 + readable-stream: 4.4.0 + split2: 4.2.0 dev: true - /pino-std-serializers@6.1.0: - resolution: {integrity: sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==} + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: true - /pino@8.11.0: - resolution: {integrity: sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==} + /pino@8.14.1: + resolution: {integrity: sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==} hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.1.2 + fast-redact: 3.2.0 on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.0.0 - pino-std-serializers: 6.1.0 - process-warning: 2.1.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 - safe-stable-stringify: 2.4.2 - sonic-boom: 3.2.1 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.3.0 thread-stream: 2.3.0 dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true @@ -8126,18 +8315,18 @@ packages: dependencies: find-up: 4.1.0 - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 + mlly: 1.4.0 + pathe: 1.1.1 dev: true - /plimit-lit@1.4.1: - resolution: {integrity: sha512-bK14ePAod0XWhXwjT6XvYfjcQ9PbCUkZXnDCAKRMZTJCaDIV9VFya1S/I+3WSbpdR8uBhCDh8TS4lQ/JQvhNFA==} + /plimit-lit@1.5.0: + resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} dependencies: - queue-lit: 1.4.0 + queue-lit: 1.5.0 dev: true /pluralize@8.0.0: @@ -8148,15 +8337,15 @@ packages: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.4 + nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + /postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.4 + nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true @@ -8172,7 +8361,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.33.0 + node-abi: 3.45.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -8200,6 +8389,13 @@ packages: resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} engines: {node: '>=10.13.0'} hasBin: true + dev: false + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} @@ -8225,6 +8421,15 @@ packages: hasBin: true dev: true + /prisma@4.0.0: + resolution: {integrity: sha512-Dtsar03XpCBkcEb2ooGWO/WcgblDTLzGhPcustbehwlFXuTMliMDRzXsfygsgYwQoZnAUKRd1rhpvBNEUziOVw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11 + dev: true + /prisma@4.7.0: resolution: {integrity: sha512-VsecNo0Ca3+bDTzSpJqIpdupKVhhQ8aOYeWc09JlUM89knqvhSrlMrg0U8BiOD4tFrY1OPaCcraK8leDBxKMBg==} engines: {node: '>=14.17'} @@ -8236,8 +8441,8 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - /process-warning@2.1.0: - resolution: {integrity: sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==} + /process-warning@2.2.0: + resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} dev: true /process@0.11.10: @@ -8256,8 +8461,8 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - /promise-polyfill@8.2.3: - resolution: {integrity: sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==} + /promise-polyfill@8.3.0: + resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} dev: true /promisify@0.0.3: @@ -8297,13 +8502,13 @@ packages: dev: true optional: true - /punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand@6.0.1: - resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + /pure-rand@6.0.2: + resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} dev: true /qs@6.11.0: @@ -8313,8 +8518,15 @@ packages: side-channel: 1.0.4 dev: true - /queue-lit@1.4.0: - resolution: {integrity: sha512-l1+4YHm4vHWpCnvTg8JMsnPETmPvLGWhqjvNOc8TSbqscGplHVSWXOxybA3vYeMNNIR9Z1PQt85U+S3wFJX2uQ==} + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /queue-lit@1.5.0: + resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} dev: true /queue-microtask@1.2.3: @@ -8363,6 +8575,27 @@ packages: minimist: 1.2.8 strip-json-comments: 2.0.1 + /react-dom@17.0.2(react@17.0.2): + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + dev: true + + /react-dom@18.2.0(react@17.0.2): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 17.0.2 + scheduler: 0.23.0 + dev: false + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -8371,6 +8604,7 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: true /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -8388,11 +8622,19 @@ packages: react: 18.2.0 dev: true + /react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -8415,7 +8657,7 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 @@ -8437,8 +8679,8 @@ packages: string_decoder: 0.10.31 dev: true - /readable-stream@2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -8448,16 +8690,16 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.3.0: - resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==} + /readable-stream@4.4.0: + resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 @@ -8466,10 +8708,10 @@ packages: process: 0.11.10 dev: true - /readdir-glob@1.1.2: - resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} + /readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: - minimatch: 5.1.0 + minimatch: 5.1.6 /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -8503,12 +8745,12 @@ packages: /regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 functions-have-names: 1.2.3 dev: true @@ -8521,7 +8763,7 @@ packages: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} dependencies: - '@pnpm/npm-conf': 2.1.0 + '@pnpm/npm-conf': 2.2.2 dev: false /registry-url@5.1.0: @@ -8540,10 +8782,10 @@ packages: chalk: 4.1.2 command-line-args: 5.2.1 command-line-usage: 6.1.3 - current-module-paths: 1.1.0 - fast-diff: 1.2.0 + current-module-paths: 1.1.1 + fast-diff: 1.3.0 file-set: 5.1.3 - global-dirs: 3.0.0 + global-dirs: 3.0.1 load-module: 4.2.1 printj: 1.3.1 stream-read-all: 3.0.1 @@ -8585,8 +8827,8 @@ packages: engines: {node: '>=8'} dev: true - /resolve.exports@2.0.0: - resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==} + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} dev: true @@ -8594,7 +8836,15 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -8628,8 +8878,8 @@ packages: dependencies: glob: 7.2.3 - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + /rollup@3.25.3: + resolution: {integrity: sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -8641,10 +8891,10 @@ packages: dependencies: queue-microtask: 1.2.3 - /rxjs@7.5.7: - resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 dev: true /sade@1.8.1: @@ -8664,7 +8914,7 @@ packages: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 is-regex: 1.1.4 dev: true @@ -8674,8 +8924,8 @@ packages: ret: 0.2.2 dev: true - /safe-stable-stringify@2.4.2: - resolution: {integrity: sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==} + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: true @@ -8687,6 +8937,13 @@ packages: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: true + /scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -8711,6 +8968,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -8736,7 +9001,7 @@ packages: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: no-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 upper-case-first: 2.0.2 dev: false @@ -8786,15 +9051,15 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote@1.7.4: - resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 object-inspect: 1.12.3 dev: true @@ -8861,7 +9126,7 @@ packages: hasBin: true dependencies: array.prototype.flat: 1.3.1 - breakword: 1.0.5 + breakword: 1.0.6 grapheme-splitter: 1.0.4 strip-ansi: 6.0.1 wcwidth: 1.0.1 @@ -8872,11 +9137,11 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.4.1 + tslib: 2.6.0 dev: false - /sonic-boom@3.2.1: - resolution: {integrity: sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==} + /sonic-boom@3.3.0: + resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} dependencies: atomic-sleep: 1.0.0 dev: true @@ -8908,11 +9173,11 @@ packages: signal-exit: 3.0.7 dev: true - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} @@ -8921,17 +9186,17 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 - /spdx-license-ids@3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} /speedometer@1.0.0: resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==} dev: false - /split2@4.1.0: - resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: true @@ -8939,8 +9204,8 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils@2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 @@ -8955,8 +9220,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} dev: true /stream-read-all@3.0.1: @@ -8967,7 +9232,7 @@ packages: /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: - mixme: 0.5.4 + mixme: 0.5.9 dev: true /streamsearch@1.1.0: @@ -8999,20 +9264,29 @@ packages: strip-ansi: 7.1.0 dev: true + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 dev: true /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 dev: true /string_decoder@0.10.31: @@ -9079,10 +9353,27 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 dev: true - /styled-jsx@5.0.7(@babel/core@7.20.5)(react@18.2.0): + /styled-jsx@5.0.7(@babel/core@7.22.5)(react@17.0.2): + resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.22.5 + react: 17.0.2 + dev: false + + /styled-jsx@5.0.7(@babel/core@7.22.5)(react@18.2.0): resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -9095,10 +9386,11 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 react: 18.2.0 + dev: true - /styled-jsx@5.1.1(@babel/core@7.20.5)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.22.5)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -9111,7 +9403,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 client-only: 0.0.1 react: 18.2.0 dev: true @@ -9128,8 +9420,8 @@ packages: formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.0 - semver: 7.3.8 + qs: 6.11.2 + semver: 7.5.3 transitivePeerDependencies: - supports-color dev: true @@ -9138,14 +9430,7 @@ packages: resolution: {integrity: sha512-6PfAg1FKhqkwWvPb2uXhH4MkMttdc17eJ91+Aoz4s1XUEDZFmLfFx/xVA3wgkPxAGy5dpozgGdK6V/n20Wj9yg==} engines: {node: '>=10'} dependencies: - copy-anything: 3.0.3 - - /superjson@1.12.1: - resolution: {integrity: sha512-HMTj43zvwW5bD+JCZCvFf4DkZQCmiLTen4C+W1Xogj0SPOpnhxsriogM04QmBVGH5b3kcIIOr6FqQ/aoIDx7TQ==} - engines: {node: '>=10'} - dependencies: - copy-anything: 3.0.3 - dev: false + copy-anything: 3.0.5 /supertest@6.3.3: resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} @@ -9187,28 +9472,47 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-hmr@0.15.1(svelte@3.59.1): - resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} + /svelte-hmr@0.15.2(svelte@4.0.0-next.3): + resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: - svelte: '>=3.19.0' + svelte: ^3.19.0 || ^4.0.0-next.0 dependencies: - svelte: 3.59.1 + svelte: 4.0.0-next.3 dev: true - /svelte@3.59.1: - resolution: {integrity: sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==} + /svelte@3.59.2: + resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} engines: {node: '>= 8'} dev: true - /swr@2.0.3(react@18.2.0): + /svelte@4.0.0-next.3: + resolution: {integrity: sha512-NogP/EuGk+xCzqye8hoj/Wz1OoTCTp1yQpsfAIkATlYct2xqoQADB1UjPLm/plQjhGQrZcODW2MHCiYsDTQWtA==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + acorn: 8.9.0 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.3 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + locate-character: 3.0.0 + magic-string: 0.30.0 + periscopic: 3.1.0 + dev: true + + /swr@2.0.3(react@17.0.2): resolution: {integrity: sha512-sGvQDok/AHEWTPfhUWXEHBVEXmgGnuahyhmRQbjl9XBYxT/MSlAzvXEKQpyM++bMPaI52vcWS2HiKNaW7+9OFw==} engines: {pnpm: '7'} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + react: 17.0.2 + use-sync-external-store: 1.2.0(react@17.0.2) dev: true /table-layout@1.0.2: @@ -9239,7 +9543,7 @@ packages: end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} @@ -9253,7 +9557,7 @@ packages: resolution: {integrity: sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==} engines: {node: '>=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-stream: 2.0.1 make-dir: 3.1.0 temp-dir: 1.0.0 @@ -9303,7 +9607,7 @@ packages: /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 /tiny-glob@0.2.9: @@ -9317,13 +9621,13 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false - /tiny-lru@10.0.1: - resolution: {integrity: sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA==} - engines: {node: '>=6'} + /tiny-lru@10.4.1: + resolution: {integrity: sha512-buLIzw7ppqymuO3pt10jHk/6QMeZLbidihMQU+N6sogF6EnBzG0qtDWIHuhw1x3dyNgVL/KTGIZsTK81+yCzLg==} + engines: {node: '>=12'} dev: true - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true /tinypool@0.4.0: @@ -9391,7 +9695,7 @@ packages: engines: {node: '>=10'} dev: false - /ts-jest@29.0.1(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.8.3): + /ts-jest@29.0.1(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.6.2): resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9412,20 +9716,20 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) - jest-util: 29.0.3 - json5: 2.2.1 + jest-util: 29.5.0 + json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.8 - typescript: 4.8.3 + semver: 7.5.3 + typescript: 4.6.2 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.3(@babel/core@7.20.5)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4): + /ts-jest@29.0.3(@babel/core@7.22.5)(esbuild@0.15.12)(jest@29.5.0)(typescript@4.8.4): resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9446,13 +9750,13 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 bs-logger: 0.2.6 esbuild: 0.15.12 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@14.18.32)(ts-node@10.9.1) - jest-util: 29.2.1 - json5: 2.2.1 + jest-util: 29.5.0 + json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 @@ -9460,7 +9764,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.4): + /ts-jest@29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.4): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9481,20 +9785,20 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) - jest-util: 29.4.3 + jest-util: 29.5.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.8 + semver: 7.5.3 typescript: 4.9.4 yargs-parser: 21.1.1 dev: true - /ts-jest@29.0.5(@babel/core@7.20.5)(jest@29.5.0)(typescript@4.9.5): + /ts-jest@29.0.5(@babel/core@7.22.5)(jest@29.5.0)(typescript@4.9.5): resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9515,7 +9819,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.22.5 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.5.0(@types/node@14.18.29)(ts-node@10.9.1) @@ -9523,7 +9827,7 @@ packages: json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.8 + semver: 7.5.3 typescript: 4.9.5 yargs-parser: 21.1.1 dev: true @@ -9535,7 +9839,7 @@ packages: code-block-writer: 11.0.3 dev: false - /ts-node@10.9.1(@types/node@14.18.29)(typescript@4.8.3): + /ts-node@10.9.1(@types/node@14.18.29)(typescript@4.6.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -9553,15 +9857,15 @@ packages: '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 + '@tsconfig/node16': 1.0.4 '@types/node': 14.18.29 - acorn: 8.8.0 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.8.3 + typescript: 4.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -9584,9 +9888,9 @@ packages: '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 + '@tsconfig/node16': 1.0.4 '@types/node': 14.18.32 - acorn: 8.8.0 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -9597,19 +9901,22 @@ packages: yn: 3.1.1 dev: true - /ts-pattern@4.0.6: - resolution: {integrity: sha512-sFHQYD4KoysBi7e7a2mzDPvRBeqA4w+vEyRE+P5MU9VLq8eEYxgKCgD9RNEAT+itGRWUTYN+hry94GDPLb1/Yw==} + /ts-pattern@4.1.3: + resolution: {integrity: sha512-8beXMWTGEv1JfDjSxfNhe4uT5jKYdhmEUKzt4gZW9dmHlquq3b+IbEyA7vX9LjBfzHmvKnM4HiomAUCyaW2Pew==} + + /ts-pattern@4.3.0: + resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} /tsc-alias@1.7.0: resolution: {integrity: sha512-n/K6g8S7Ec7Y/A2Z77Ikp2Uv1S1ERtT63ni69XV4W1YPT4rnNmz8ItgIiJYvKfFnKfqcZQ81UPjoKpMTxaC/rg==} hasBin: true dependencies: chokidar: 3.5.3 - commander: 9.4.1 + commander: 9.5.0 globby: 11.1.0 mylas: 2.1.13 normalize-path: 3.0.0 - plimit-lit: 1.4.1 + plimit-lit: 1.5.0 dev: true /tslib@1.14.1: @@ -9619,6 +9926,9 @@ packages: /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + /tsutils@3.21.0(typescript@4.8.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -9639,8 +9949,8 @@ packages: typescript: 4.9.5 dev: true - /tty-table@4.1.6: - resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} + /tty-table@4.2.1: + resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} engines: {node: '>=8.0.0'} hasBin: true dependencies: @@ -9650,7 +9960,7 @@ packages: smartwrap: 2.0.2 strip-ansi: 6.0.1 wcwidth: 1.0.1 - yargs: 17.6.2 + yargs: 17.7.2 dev: true /tunnel-agent@0.6.0: @@ -9716,16 +10026,16 @@ packages: is-typed-array: 1.1.10 dev: true - /typed-rest-client@1.8.9: - resolution: {integrity: sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==} + /typed-rest-client@1.8.10: + resolution: {integrity: sha512-32LDnqtreD3LMO/vdV2NSXUrTcaerRM7JRrI/e+4TI/AmvLXDPuw7COdWQPALkc10hxRQOFnUUKmS9FlInIu9A==} dependencies: - qs: 6.11.0 + qs: 6.11.2 tunnel: 0.0.6 underscore: 1.13.6 dev: true - /typescript@4.8.3: - resolution: {integrity: sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==} + /typescript@4.6.2: + resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -9773,8 +10083,8 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: true - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} dev: true /unbox-primitive@1.0.2: @@ -9790,8 +10100,8 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true - /undici@5.11.0: - resolution: {integrity: sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==} + /undici@5.16.0: + resolution: {integrity: sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 @@ -9828,31 +10138,31 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.4): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.4 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 /upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: - tslib: 2.4.1 + tslib: 2.6.0 dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.1.1 + punycode: 2.3.0 dev: true /url-join@4.0.1: @@ -9864,12 +10174,20 @@ packages: engines: {node: '>=0.12.0'} dev: false + /use-sync-external-store@1.2.0(react@17.0.2): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.2 + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 + dev: true /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9896,11 +10214,11 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.0.1: - resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.9.0 dev: true @@ -9908,7 +10226,7 @@ packages: /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 /vary@1.1.2: @@ -9916,17 +10234,17 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node@0.29.7(@types/node@18.14.2): + /vite-node@0.29.7(@types/node@14.18.32): resolution: {integrity: sha512-PakCZLvz37yFfUPWBnLa1OYHPCGm5v4pmRrTcFN4V/N/T3I6tyP3z07S//9w+DdeL7vVd0VSeyMZuAh+449ZWw==} engines: {node: '>=v14.16.0'} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 + mlly: 1.4.0 + pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.14.2) + vite: 4.3.9(@types/node@14.18.32) transitivePeerDependencies: - '@types/node' - less @@ -9937,8 +10255,8 @@ packages: - terser dev: true - /vite@4.2.1(@types/node@18.14.2): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + /vite@4.3.9(@types/node@14.18.32): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -9962,16 +10280,15 @@ packages: terser: optional: true dependencies: - '@types/node': 18.14.2 - esbuild: 0.17.14 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.20.2 + '@types/node': 14.18.32 + esbuild: 0.17.19 + postcss: 8.4.24 + rollup: 3.25.3 optionalDependencies: fsevents: 2.3.2 dev: true - /vitefu@0.2.4(vite@4.2.1): + /vitefu@0.2.4(vite@4.3.9): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: vite: ^3.0.0 || ^4.0.0 @@ -9979,7 +10296,7 @@ packages: vite: optional: true dependencies: - vite: 4.2.1(@types/node@18.14.2) + vite: 4.3.9(@types/node@14.18.32) dev: true /vitest@0.29.7: @@ -10010,29 +10327,29 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.4 + '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 18.14.2 + '@types/node': 14.18.32 '@vitest/expect': 0.29.7 '@vitest/runner': 0.29.7 '@vitest/spy': 0.29.7 '@vitest/utils': 0.29.7 - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 cac: 6.7.14 chai: 4.3.7 debug: 4.3.4 local-pkg: 0.4.3 - pathe: 1.1.0 + pathe: 1.1.1 picocolors: 1.0.0 source-map: 0.6.1 - std-env: 3.3.2 + std-env: 3.3.3 strip-literal: 1.0.1 - tinybench: 2.4.0 + tinybench: 2.5.0 tinypool: 0.4.0 tinyspy: 1.1.1 - vite: 4.2.1(@types/node@18.14.2) - vite-node: 0.29.7(@types/node@18.14.2) + vite: 4.3.9(@types/node@14.18.32) + vite-node: 0.29.7(@types/node@14.18.32) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -10096,7 +10413,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /wcwidth@1.0.1: @@ -10131,8 +10448,8 @@ packages: is-symbol: 1.0.4 dev: true - /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: true /which-pm@2.0.0: @@ -10178,11 +10495,6 @@ packages: stackback: 0.0.2 dev: true - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - /wordwrapjs@4.0.1: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} @@ -10250,6 +10562,9 @@ packages: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -10288,7 +10603,7 @@ packages: require-main-filename: 2.0.0 set-blocking: 2.0.0 string-width: 4.2.3 - which-module: 2.0.0 + which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 dev: true @@ -10306,21 +10621,8 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs@17.6.0: - resolution: {integrity: sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yargs@17.6.2: - resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} dependencies: cliui: 8.0.1 @@ -10365,7 +10667,7 @@ packages: dependencies: archiver-utils: 2.1.0 compress-commons: 4.1.1 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /zod-validation-error@0.2.1(zod@3.21.1): resolution: {integrity: sha512-zGg6P5EHi5V0dvyEeC8HBZd2pzp7QDKTngkSWgWunljrY+0SHkHyjI519D+u8/37BHkGHAFseWgnZ2Uq8LNFKg==} @@ -10373,7 +10675,7 @@ packages: peerDependencies: zod: ^3.18.0 dependencies: - '@swc/helpers': 0.4.11 + '@swc/helpers': 0.4.14 zod: 3.21.1 dev: false diff --git a/tests/integration/package-lock.json b/tests/integration/package-lock.json index 8db8dfef8..49e7fdbac 100644 --- a/tests/integration/package-lock.json +++ b/tests/integration/package-lock.json @@ -116,7 +116,7 @@ "@babel/runtime": "7.15.4", "@babel/traverse": "7.18.0", "@babel/types": "7.18.0", - "@edge-runtime/primitives": "1.1.0-beta.31", + "@edge-runtime/primitives": "1.1.0-beta.21", "@hapi/accept": "5.0.2", "@napi-rs/cli": "2.7.0", "@napi-rs/triples": "1.1.0", @@ -194,7 +194,7 @@ "debug": "4.1.1", "devalue": "2.0.1", "domain-browser": "4.19.0", - "edge-runtime": "1.1.0-beta.31", + "edge-runtime": "1.1.0-beta.21", "events": "3.3.0", "find-cache-dir": "3.3.1", "find-up": "4.1.0", @@ -695,7 +695,7 @@ "@babel/runtime": "7.15.4", "@babel/traverse": "7.18.0", "@babel/types": "7.18.0", - "@edge-runtime/primitives": "1.1.0-beta.31", + "@edge-runtime/primitives": "1.1.0-beta.21", "@hapi/accept": "5.0.2", "@napi-rs/cli": "2.7.0", "@napi-rs/triples": "1.1.0", @@ -789,7 +789,7 @@ "debug": "4.1.1", "devalue": "2.0.1", "domain-browser": "4.19.0", - "edge-runtime": "1.1.0-beta.31", + "edge-runtime": "1.1.0-beta.21", "events": "3.3.0", "find-cache-dir": "3.3.1", "find-up": "4.1.0", diff --git a/tests/integration/test-run/package-lock.json b/tests/integration/test-run/package-lock.json index cb5f183b5..6d00296df 100644 --- a/tests/integration/test-run/package-lock.json +++ b/tests/integration/test-run/package-lock.json @@ -140,6 +140,7 @@ "pluralize": "^8.0.0", "superjson": "^1.11.0", "tslib": "^2.4.1", + "upper-case-first": "^2.0.2", "zod": "3.21.1", "zod-validation-error": "^0.2.1" }, @@ -164,8 +165,8 @@ "license": "MIT", "dependencies": { "@paralleldrive/cuid2": "^2.2.0", - "@prisma/generator-helper": "^4.0.0", - "@prisma/internals": "^4.0.0", + "@prisma/generator-helper": "4.10.0", + "@prisma/internals": "4.10.0", "@zenstackhq/language": "workspace:*", "@zenstackhq/sdk": "workspace:*", "async-exit-hook": "^2.0.1", @@ -184,6 +185,7 @@ "sleep-promise": "^9.1.0", "strip-color": "^0.1.0", "ts-morph": "^16.0.0", + "ts-pattern": "^4.3.0", "upper-case-first": "^2.0.2", "uuid": "^9.0.0", "vscode-jsonrpc": "^8.0.2", @@ -374,6 +376,7 @@ "superjson": "^1.11.0", "tslib": "^2.4.1", "typescript": "^4.9.3", + "upper-case-first": "^2.0.2", "zod": "3.21.1", "zod-validation-error": "^0.2.1" } @@ -410,8 +413,8 @@ "version": "file:../../../packages/schema/dist", "requires": { "@paralleldrive/cuid2": "^2.2.0", - "@prisma/generator-helper": "^4.0.0", - "@prisma/internals": "^4.0.0", + "@prisma/generator-helper": "4.10.0", + "@prisma/internals": "4.10.0", "@types/async-exit-hook": "^2.0.0", "@types/jest": "^29.5.0", "@types/lower-case-first": "^1.0.1", @@ -459,6 +462,7 @@ "ts-jest": "^29.0.3", "ts-morph": "^16.0.0", "ts-node": "^10.9.1", + "ts-pattern": "^4.3.0", "tsc-alias": "^1.7.0", "typescript": "^4.8.4", "upper-case-first": "^2.0.2", diff --git a/tests/integration/tests/e2e/mist-function-coverage.test.ts b/tests/integration/tests/e2e/misc-function-coverage.test.ts similarity index 93% rename from tests/integration/tests/e2e/mist-function-coverage.test.ts rename to tests/integration/tests/e2e/misc-function-coverage.test.ts index 2bf9dd08f..44f16d1a6 100644 --- a/tests/integration/tests/e2e/mist-function-coverage.test.ts +++ b/tests/integration/tests/e2e/misc-function-coverage.test.ts @@ -26,8 +26,8 @@ describe('Misc Function Coverage Tests', () => { // success await expect( - db.foo.update({ where: { id: '2' }, data: { dt: new Date(now.getTime() + 1000) } }) + db.foo.update({ where: { id: '2' }, data: { dt: new Date(now.getTime() + 10000) } }) ).toResolveTruthy(); - expect(await db.foo.findUnique({ where: { id: '2' } })).toMatchObject({ dt: new Date(now.getTime() + 1000) }); + expect(await db.foo.findUnique({ where: { id: '2' } })).toMatchObject({ dt: new Date(now.getTime() + 10000) }); }); }); diff --git a/tests/integration/tests/nextjs/generation.test.ts b/tests/integration/tests/nextjs/generation.test.ts index 4ba155ff0..846634d94 100644 --- a/tests/integration/tests/nextjs/generation.test.ts +++ b/tests/integration/tests/nextjs/generation.test.ts @@ -22,9 +22,8 @@ describe('SWR Hooks Generation Tests', () => { fs.mkdirSync(testDir, { recursive: true }); fse.copySync(path.join(__dirname, './test-project'), testDir); - const nodePath = path.resolve(path.join(__dirname, '../../node_modules')); - process.chdir(testDir); + const nodePath = path.join(testDir, 'node_modules'); run('npm install'); run('npx zenstack generate --schema ./sqlite.zmodel', { NODE_PATH: nodePath }); run('npm run build', { NODE_PATH: nodePath }); @@ -38,9 +37,8 @@ describe('SWR Hooks Generation Tests', () => { fs.mkdirSync(testDir, { recursive: true }); fse.copySync(path.join(__dirname, './test-project'), testDir); - const nodePath = path.resolve(path.join(__dirname, '../../node_modules')); - process.chdir(testDir); + const nodePath = path.join(testDir, 'node_modules'); run('npm install'); run('npx zenstack generate --schema ./postgres.zmodel', { NODE_PATH: nodePath }); run('npm run build', { NODE_PATH: nodePath }); diff --git a/tests/integration/tests/nextjs/test-project/package-lock.json b/tests/integration/tests/nextjs/test-project/package-lock.json index 5300d2e62..b516b8b4f 100644 --- a/tests/integration/tests/nextjs/test-project/package-lock.json +++ b/tests/integration/tests/nextjs/test-project/package-lock.json @@ -13,16 +13,19 @@ "@types/react": "18.0.27", "@types/react-dom": "18.0.10", "@zenstackhq/runtime": "../../../../../../packages/runtime/dist", + "@zenstackhq/swr": "../../../../../../packages/plugins/swr/dist", "next": "13.1.4", "react": "18.2.0", "react-dom": "18.2.0", "swr": "^2.2.0", - "typescript": "4.9.4" + "typescript": "4.9.4", + "zod": "^3.21.1" }, "devDependencies": { "prisma": "^4.7.0" } }, + "../../../../../../packages/plugins/swr/dist": {}, "../../../../../../packages/runtime/dist": {}, "node_modules/@next/env": { "version": "13.1.4", @@ -301,6 +304,10 @@ "resolved": "../../../../../../packages/runtime/dist", "link": true }, + "node_modules/@zenstackhq/swr": { + "resolved": "../../../../../../packages/plugins/swr/dist", + "link": true + }, "node_modules/caniuse-lite": { "version": "1.0.30001446", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", @@ -545,6 +552,14 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } + }, + "node_modules/zod": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.1.tgz", + "integrity": "sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -694,6 +709,9 @@ "@zenstackhq/runtime": { "version": "file:../../../../../../packages/runtime/dist" }, + "@zenstackhq/swr": { + "version": "file:../../../../../../packages/plugins/swr/dist" + }, "caniuse-lite": { "version": "1.0.30001446", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", @@ -837,6 +855,11 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", "requires": {} + }, + "zod": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.1.tgz", + "integrity": "sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==" } } } diff --git a/tests/integration/tests/nextjs/test-project/package.json b/tests/integration/tests/nextjs/test-project/package.json index b0f618b2f..81332055d 100644 --- a/tests/integration/tests/nextjs/test-project/package.json +++ b/tests/integration/tests/nextjs/test-project/package.json @@ -14,11 +14,13 @@ "@types/react": "18.0.27", "@types/react-dom": "18.0.10", "@zenstackhq/runtime": "../../../../../../packages/runtime/dist", + "@zenstackhq/swr": "../../../../../../packages/plugins/swr/dist", "next": "13.1.4", "react": "18.2.0", "react-dom": "18.2.0", "swr": "^2.2.0", - "typescript": "4.9.4" + "typescript": "4.9.4", + "zod": "^3.21.1" }, "devDependencies": { "prisma": "^4.7.0" diff --git a/tests/integration/tests/nextjs/test-project/postgres.zmodel b/tests/integration/tests/nextjs/test-project/postgres.zmodel index 2f50ae204..c194ec561 100644 --- a/tests/integration/tests/nextjs/test-project/postgres.zmodel +++ b/tests/integration/tests/nextjs/test-project/postgres.zmodel @@ -7,16 +7,6 @@ generator js { provider = 'prisma-client-js' } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin swr { provider = '@zenstackhq/swr' output = 'lib/hooks' diff --git a/tests/integration/tests/nextjs/test-project/sqlite.zmodel b/tests/integration/tests/nextjs/test-project/sqlite.zmodel index f36be48cb..690f7c557 100644 --- a/tests/integration/tests/nextjs/test-project/sqlite.zmodel +++ b/tests/integration/tests/nextjs/test-project/sqlite.zmodel @@ -7,16 +7,6 @@ generator js { provider = 'prisma-client-js' } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin swr { provider = '@zenstackhq/swr' output = 'lib/hooks' diff --git a/tests/integration/tests/schema/cal-com.zmodel b/tests/integration/tests/schema/cal-com.zmodel index 583fd14ab..672c01b07 100644 --- a/tests/integration/tests/schema/cal-com.zmodel +++ b/tests/integration/tests/schema/cal-com.zmodel @@ -11,19 +11,8 @@ generator client { previewFeatures = [] } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin zod { provider = '@core/zod' - output = '.zenstack/zod' } enum SchedulingType { diff --git a/tests/integration/tests/schema/petstore.zmodel b/tests/integration/tests/schema/petstore.zmodel index fee5521a2..77ec1e643 100644 --- a/tests/integration/tests/schema/petstore.zmodel +++ b/tests/integration/tests/schema/petstore.zmodel @@ -8,19 +8,8 @@ generator js { previewFeatures = ['clientExtensions'] } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin zod { provider = '@core/zod' - output = '.zenstack/zod' } model User { diff --git a/tests/integration/tests/schema/todo.zmodel b/tests/integration/tests/schema/todo.zmodel index eac571be3..f107bf0fa 100644 --- a/tests/integration/tests/schema/todo.zmodel +++ b/tests/integration/tests/schema/todo.zmodel @@ -12,19 +12,8 @@ generator js { previewFeatures = ['clientExtensions'] } -plugin meta { - provider = '@core/model-meta' - output = '.zenstack' -} - -plugin policy { - provider = '@core/access-policy' - output = '.zenstack' -} - plugin zod { provider = '@core/zod' - output = '.zenstack/zod' } /* diff --git a/tests/integration/tests/trpc/test-project/tsconfig.json b/tests/integration/tests/trpc/test-project/tsconfig.json index 99710e857..a020f8b91 100644 --- a/tests/integration/tests/trpc/test-project/tsconfig.json +++ b/tests/integration/tests/trpc/test-project/tsconfig.json @@ -1,20 +1,23 @@ { - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + ".zenstack/zod/input": ["./node_modules/.zenstack/zod/input/index.d.ts"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] }