mirror of
https://github.com/github/codeql.git
synced 2026-04-28 18:25:24 +02:00
Merge branch 'main' into codeql-ci/atm/release-0.4.3
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
# [Internal only] Adaptive Threat Modeling for JavaScript
|
||||
# Adaptive Threat Modeling for JavaScript
|
||||
|
||||
This directory contains CodeQL libraries and queries that power adaptive threat modeling for JavaScript.
|
||||
All APIs are experimental and may change in the future.
|
||||
|
||||
These queries can only be run by internal users; for external users they will return no results.
|
||||
Only internal users can run these queries directly. External users can run these queries when performing
|
||||
JavaScript analysis on Code Scanning. For more information, see
|
||||
[Code scanning finds more vulnerabilities using machine learning](https://github.blog/2022-02-17-code-scanning-finds-vulnerabilities-using-machine-learning/).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Configures boosting for adaptive threat modeling (ATM).
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
private import javascript as JS
|
||||
import EndpointTypes
|
||||
import EndpointCharacteristics
|
||||
import EndpointCharacteristics as EndpointCharacteristics
|
||||
import AdaptiveThreatModeling::ATM::ResultsInfo as AtmResultsInfo
|
||||
|
||||
/**
|
||||
* EXPERIMENTAL. This API may change in the future.
|
||||
@@ -29,10 +30,23 @@ import EndpointCharacteristics
|
||||
* `isAdditionalFlowStep` with a more generalised definition of additional edges. See
|
||||
* `NosqlInjectionATM.qll` for an example of doing this.
|
||||
*/
|
||||
abstract class AtmConfig extends string {
|
||||
abstract class AtmConfig extends JS::TaintTracking::Configuration {
|
||||
bindingset[this]
|
||||
AtmConfig() { any() }
|
||||
|
||||
/**
|
||||
* Holds if `source` is a relevant taint source. When sources are not boosted, `isSource` is equivalent to
|
||||
* `isKnownSource` (i.e there are no "effective" sources to be classified by an ML model).
|
||||
*/
|
||||
override predicate isSource(JS::DataFlow::Node source) { this.isKnownSource(source) }
|
||||
|
||||
/**
|
||||
* Holds if `sink` is a known taint sink or an "effective" sink (a candidate to be classified by an ML model).
|
||||
*/
|
||||
override predicate isSink(JS::DataFlow::Node sink) {
|
||||
this.isKnownSink(sink) or this.isEffectiveSink(sink)
|
||||
}
|
||||
|
||||
/**
|
||||
* EXPERIMENTAL. This API may change in the future.
|
||||
*
|
||||
@@ -48,9 +62,10 @@ abstract class AtmConfig extends string {
|
||||
final predicate isKnownSink(JS::DataFlow::Node sink) {
|
||||
// If the list of characteristics includes positive indicators with maximal confidence for this class, then it's a
|
||||
// known sink for the class.
|
||||
exists(EndpointCharacteristic characteristic |
|
||||
characteristic.getEndpoints(sink) and
|
||||
characteristic.getImplications(this.getASinkEndpointType(), true, 1.0)
|
||||
exists(EndpointCharacteristics::EndpointCharacteristic characteristic |
|
||||
characteristic.appliesToEndpoint(sink) and
|
||||
characteristic
|
||||
.hasImplications(this.getASinkEndpointType(), true, characteristic.maximalConfidence())
|
||||
)
|
||||
}
|
||||
|
||||
@@ -68,7 +83,38 @@ abstract class AtmConfig extends string {
|
||||
* Holds if the candidate sink `candidateSink` predicted by the machine learning model should be
|
||||
* an effective sink, i.e. one considered as a possible sink of flow in the boosted query.
|
||||
*/
|
||||
predicate isEffectiveSink(JS::DataFlow::Node candidateSink) { none() }
|
||||
predicate isEffectiveSink(JS::DataFlow::Node candidateSink) {
|
||||
not exists(this.getAReasonSinkExcluded(candidateSink))
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the list of characteristics that cause `candidateSink` to be excluded as an effective sink.
|
||||
*/
|
||||
final EndpointCharacteristics::EndpointCharacteristic getAReasonSinkExcluded(
|
||||
JS::DataFlow::Node candidateSink
|
||||
) {
|
||||
// An endpoint is an effective sink (sink candidate) if none of its characteristics give much indication whether or
|
||||
// not it is a sink. Historically, we used endpoint filters, and scored endpoints that are filtered out neither by
|
||||
// a standard endpoint filter nor by an endpoint filter specific to this sink type. To replicate this behavior, we
|
||||
// have given the endpoint filter characteristics medium confidence, and we exclude endpoints that have a
|
||||
// medium-confidence characteristic that indicates that they are not sinks, either in general or for this sink type.
|
||||
exists(EndpointCharacteristics::EndpointCharacteristic filter, float confidence |
|
||||
filter.appliesToEndpoint(candidateSink) and
|
||||
confidence >= filter.mediumConfidence() and
|
||||
// TODO: Experiment with excluding all endpoints that have a medium- or high-confidence characteristic that
|
||||
// implies they're not sinks, rather than using only medium-confidence characteristics, by deleting the following
|
||||
// line.
|
||||
confidence < filter.highConfidence() and
|
||||
(
|
||||
// Exclude endpoints that have a characteristic that implies they're not sinks for _any_ sink type.
|
||||
filter.hasImplications(any(NegativeType negative), true, confidence)
|
||||
or
|
||||
// Exclude endpoints that have a characteristic that implies they're not sinks for _this particular_ sink type.
|
||||
filter.hasImplications(this.getASinkEndpointType(), false, confidence)
|
||||
) and
|
||||
result = filter
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* EXPERIMENTAL. This API may change in the future.
|
||||
@@ -84,7 +130,7 @@ abstract class AtmConfig extends string {
|
||||
* Get an endpoint type for the sinks of this query. A query may have multiple applicable
|
||||
* endpoint types for its sinks.
|
||||
*/
|
||||
EndpointType getASinkEndpointType() { none() }
|
||||
abstract EndpointType getASinkEndpointType();
|
||||
|
||||
/**
|
||||
* EXPERIMENTAL. This API may change in the future.
|
||||
@@ -95,6 +141,30 @@ abstract class AtmConfig extends string {
|
||||
* A cut-off value of 1 produces all alerts including those that are likely false-positives.
|
||||
*/
|
||||
float getScoreCutoff() { result = 0.0 }
|
||||
|
||||
/**
|
||||
* Holds if there's an ATM alert (a flow path from `source` to `sink` with ML-determined likelihood `score`) according
|
||||
* to this ML-boosted configuration, whereas the unboosted base query does not contain this source and sink
|
||||
* combination.
|
||||
*/
|
||||
predicate hasBoostedFlowPath(
|
||||
JS::DataFlow::PathNode source, JS::DataFlow::PathNode sink, float score
|
||||
) {
|
||||
this.hasFlowPath(source, sink) and
|
||||
not AtmResultsInfo::isFlowLikelyInBaseQuery(source.getNode(), sink.getNode()) and
|
||||
score = AtmResultsInfo::getScoreForFlow(source.getNode(), sink.getNode())
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if if `sink` is an effective sink with flow from `source` which gets used as a sink candidate for scoring
|
||||
* with the ML model.
|
||||
*/
|
||||
predicate isSinkCandidateWithFlow(JS::DataFlow::PathNode sink) {
|
||||
exists(JS::DataFlow::PathNode source |
|
||||
this.hasFlowPath(source, sink) and
|
||||
not AtmResultsInfo::isFlowLikelyInBaseQuery(source.getNode(), sink.getNode())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for AtmConfig */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Provides information about the results of boosted queries for use in adaptive threat modeling (ATM).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Provides shared scoring functionality for use in adaptive threat modeling (ATM).
|
||||
|
||||
@@ -1,225 +0,0 @@
|
||||
/*
|
||||
* For internal use only.
|
||||
*
|
||||
* Provides predicates that expose the knowledge of models
|
||||
* in the core CodeQL JavaScript libraries.
|
||||
*/
|
||||
|
||||
private import javascript
|
||||
private import semmle.javascript.security.dataflow.XxeCustomizations
|
||||
private import semmle.javascript.security.dataflow.RemotePropertyInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.TypeConfusionThroughParameterTamperingCustomizations
|
||||
private import semmle.javascript.security.dataflow.ZipSlipCustomizations
|
||||
private import semmle.javascript.security.dataflow.TaintedPathCustomizations
|
||||
private import semmle.javascript.security.dataflow.CleartextLoggingCustomizations
|
||||
private import semmle.javascript.security.dataflow.XpathInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.Xss::Shared as Xss
|
||||
private import semmle.javascript.security.dataflow.StackTraceExposureCustomizations
|
||||
private import semmle.javascript.security.dataflow.ClientSideUrlRedirectCustomizations
|
||||
private import semmle.javascript.security.dataflow.CodeInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.RequestForgeryCustomizations
|
||||
private import semmle.javascript.security.dataflow.CorsMisconfigurationForCredentialsCustomizations
|
||||
private import semmle.javascript.security.dataflow.ShellCommandInjectionFromEnvironmentCustomizations
|
||||
private import semmle.javascript.security.dataflow.DifferentKindsComparisonBypassCustomizations
|
||||
private import semmle.javascript.security.dataflow.CommandInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.PrototypePollutionCustomizations
|
||||
private import semmle.javascript.security.dataflow.UnvalidatedDynamicMethodCallCustomizations
|
||||
private import semmle.javascript.security.dataflow.TaintedFormatStringCustomizations
|
||||
private import semmle.javascript.security.dataflow.NosqlInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.PostMessageStarCustomizations
|
||||
private import semmle.javascript.security.dataflow.RegExpInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.SqlInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.InsecureRandomnessCustomizations
|
||||
private import semmle.javascript.security.dataflow.XmlBombCustomizations
|
||||
private import semmle.javascript.security.dataflow.InsufficientPasswordHashCustomizations
|
||||
private import semmle.javascript.security.dataflow.HardcodedCredentialsCustomizations
|
||||
private import semmle.javascript.security.dataflow.FileAccessToHttpCustomizations
|
||||
private import semmle.javascript.security.dataflow.UnsafeDynamicMethodAccessCustomizations
|
||||
private import semmle.javascript.security.dataflow.UnsafeDeserializationCustomizations
|
||||
private import semmle.javascript.security.dataflow.HardcodedDataInterpretedAsCodeCustomizations
|
||||
private import semmle.javascript.security.dataflow.ServerSideUrlRedirectCustomizations
|
||||
private import semmle.javascript.security.dataflow.IndirectCommandInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.ConditionalBypassCustomizations
|
||||
private import semmle.javascript.security.dataflow.HttpToFileAccessCustomizations
|
||||
private import semmle.javascript.security.dataflow.BrokenCryptoAlgorithmCustomizations
|
||||
private import semmle.javascript.security.dataflow.LoopBoundInjectionCustomizations
|
||||
private import semmle.javascript.security.dataflow.CleartextStorageCustomizations
|
||||
import FilteringReasons
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is a known sink in a modeled library, or a sibling-argument of such a sink.
|
||||
*/
|
||||
predicate isArgumentToKnownLibrarySinkFunction(DataFlow::Node n) {
|
||||
exists(DataFlow::InvokeNode invk, DataFlow::Node known |
|
||||
invk.getAnArgument() = n and invk.getAnArgument() = known and isKnownLibrarySink(known)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is a known sink for the external API security query.
|
||||
*
|
||||
* This corresponds to known sinks from security queries whose sources include remote flow and
|
||||
* DOM-based sources.
|
||||
*/
|
||||
predicate isKnownExternalApiQuerySink(DataFlow::Node n) {
|
||||
n instanceof Xxe::Sink or
|
||||
n instanceof TaintedPath::Sink or
|
||||
n instanceof XpathInjection::Sink or
|
||||
n instanceof Xss::Sink or
|
||||
n instanceof ClientSideUrlRedirect::Sink or
|
||||
n instanceof CodeInjection::Sink or
|
||||
n instanceof RequestForgery::Sink or
|
||||
n instanceof CorsMisconfigurationForCredentials::Sink or
|
||||
n instanceof CommandInjection::Sink or
|
||||
n instanceof PrototypePollution::Sink or
|
||||
n instanceof UnvalidatedDynamicMethodCall::Sink or
|
||||
n instanceof TaintedFormatString::Sink or
|
||||
n instanceof NosqlInjection::Sink or
|
||||
n instanceof PostMessageStar::Sink or
|
||||
n instanceof RegExpInjection::Sink or
|
||||
n instanceof SqlInjection::Sink or
|
||||
n instanceof XmlBomb::Sink or
|
||||
n instanceof ZipSlip::Sink or
|
||||
n instanceof UnsafeDeserialization::Sink or
|
||||
n instanceof ServerSideUrlRedirect::Sink or
|
||||
n instanceof CleartextStorage::Sink or
|
||||
n instanceof HttpToFileAccess::Sink
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for isKnownExternalApiQuerySink */
|
||||
deprecated predicate isKnownExternalAPIQuerySink = isKnownExternalApiQuerySink/1;
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is a known sink in a modeled library.
|
||||
*/
|
||||
predicate isKnownLibrarySink(DataFlow::Node n) {
|
||||
isKnownExternalApiQuerySink(n) or
|
||||
n instanceof CleartextLogging::Sink or
|
||||
n instanceof StackTraceExposure::Sink or
|
||||
n instanceof ShellCommandInjectionFromEnvironment::Sink or
|
||||
n instanceof InsecureRandomness::Sink or
|
||||
n instanceof FileAccessToHttp::Sink or
|
||||
n instanceof IndirectCommandInjection::Sink
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is known as the predecessor in a modeled flow step.
|
||||
*/
|
||||
predicate isKnownStepSrc(DataFlow::Node n) {
|
||||
TaintTracking::sharedTaintStep(n, _) or
|
||||
DataFlow::SharedFlowStep::step(n, _) or
|
||||
DataFlow::SharedFlowStep::step(n, _, _, _)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `n` is an argument to a function of a builtin object.
|
||||
*/
|
||||
private predicate isArgumentToBuiltinFunction(DataFlow::Node n, FilteringReason reason) {
|
||||
exists(DataFlow::SourceNode builtin, DataFlow::SourceNode receiver, DataFlow::InvokeNode invk |
|
||||
(
|
||||
builtin instanceof DataFlow::ArrayCreationNode and
|
||||
reason instanceof ArgumentToArrayReason
|
||||
or
|
||||
builtin =
|
||||
DataFlow::globalVarRef([
|
||||
"Map", "Set", "WeakMap", "WeakSet", "Number", "Object", "String", "Array", "Error",
|
||||
"Math", "Boolean"
|
||||
]) and
|
||||
reason instanceof ArgumentToBuiltinGlobalVarRefReason
|
||||
)
|
||||
|
|
||||
receiver = [builtin.getAnInvocation(), builtin] and
|
||||
invk = [receiver, receiver.getAPropertyRead()].getAnInvocation() and
|
||||
invk.getAnArgument() = n
|
||||
)
|
||||
or
|
||||
exists(Expr primitive, MethodCallExpr c |
|
||||
primitive instanceof ConstantString or
|
||||
primitive instanceof NumberLiteral or
|
||||
primitive instanceof BooleanLiteral
|
||||
|
|
||||
c.calls(primitive, _) and
|
||||
c.getAnArgument() = n.asExpr() and
|
||||
reason instanceof ConstantReceiverReason
|
||||
)
|
||||
or
|
||||
exists(DataFlow::CallNode call |
|
||||
call.getAnArgument() = n and
|
||||
call.getCalleeName() =
|
||||
[
|
||||
"indexOf", "hasOwnProperty", "substring", "isDecimal", "decode", "encode", "keys", "shift",
|
||||
"values", "forEach", "toString", "slice", "splice", "push", "isArray", "sort"
|
||||
] and
|
||||
reason instanceof BuiltinCallNameReason
|
||||
)
|
||||
}
|
||||
|
||||
predicate isOtherModeledArgument(DataFlow::Node n, FilteringReason reason) {
|
||||
isArgumentToBuiltinFunction(n, reason)
|
||||
or
|
||||
any(LodashUnderscore::Member m).getACall().getAnArgument() = n and
|
||||
reason instanceof LodashUnderscoreArgumentReason
|
||||
or
|
||||
any(JQuery::MethodCall m).getAnArgument() = n and
|
||||
reason instanceof JQueryArgumentReason
|
||||
or
|
||||
exists(ClientRequest r |
|
||||
r.getAnArgument() = n or n = r.getUrl() or n = r.getHost() or n = r.getADataNode()
|
||||
) and
|
||||
reason instanceof ClientRequestReason
|
||||
or
|
||||
exists(PromiseDefinition p |
|
||||
n = [p.getResolveParameter(), p.getRejectParameter()].getACall().getAnArgument()
|
||||
) and
|
||||
reason instanceof PromiseDefinitionReason
|
||||
or
|
||||
n instanceof CryptographicKey and reason instanceof CryptographicKeyReason
|
||||
or
|
||||
any(CryptographicOperation op).getInput() = n and
|
||||
reason instanceof CryptographicOperationFlowReason
|
||||
or
|
||||
exists(DataFlow::CallNode call | n = call.getAnArgument() |
|
||||
call.getCalleeName() = getAStandardLoggerMethodName() and
|
||||
reason instanceof LoggerMethodReason
|
||||
or
|
||||
call.getCalleeName() = ["setTimeout", "clearTimeout"] and
|
||||
reason instanceof TimeoutReason
|
||||
or
|
||||
call.getReceiver() = DataFlow::globalVarRef(["localStorage", "sessionStorage"]) and
|
||||
reason instanceof ReceiverStorageReason
|
||||
or
|
||||
call instanceof StringOps::StartsWith and reason instanceof StringStartsWithReason
|
||||
or
|
||||
call instanceof StringOps::EndsWith and reason instanceof StringEndsWithReason
|
||||
or
|
||||
call instanceof StringOps::RegExpTest and reason instanceof StringRegExpTestReason
|
||||
or
|
||||
call instanceof EventRegistration and reason instanceof EventRegistrationReason
|
||||
or
|
||||
call instanceof EventDispatch and reason instanceof EventDispatchReason
|
||||
or
|
||||
call = any(MembershipCandidate c).getTest() and
|
||||
reason instanceof MembershipCandidateTestReason
|
||||
or
|
||||
call instanceof FileSystemAccess and reason instanceof FileSystemAccessReason
|
||||
or
|
||||
// TODO database accesses are less well defined than database query sinks, so this may cover unmodeled sinks on existing database models
|
||||
[
|
||||
call, call.getAMethodCall()
|
||||
/* command pattern where the query is built, and then exec'ed later */ ] instanceof
|
||||
DatabaseAccess and
|
||||
reason instanceof DatabaseAccessReason
|
||||
or
|
||||
call = DOM::domValueRef() and reason instanceof DomReason
|
||||
or
|
||||
call.getCalleeName() = "next" and
|
||||
exists(DataFlow::FunctionNode f | call = f.getLastParameter().getACall()) and
|
||||
reason instanceof NextFunctionCallReason
|
||||
or
|
||||
call = DataFlow::globalVarRef("dojo").getAPropertyRead("require").getACall() and
|
||||
reason instanceof DojoRequireReason
|
||||
)
|
||||
or
|
||||
(exists(Base64::Decode d | n = d.getInput()) or exists(Base64::Encode d | n = d.getInput())) and
|
||||
reason instanceof Base64ManipulationReason
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Extracts data about the database for use in adaptive threat modeling (ATM).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Provides an implementation of scoring alerts for use in adaptive threat modeling (ATM).
|
||||
|
||||
@@ -16,6 +16,11 @@ newtype TEndpointType =
|
||||
abstract class EndpointType extends TEndpointType {
|
||||
abstract string getDescription();
|
||||
|
||||
/**
|
||||
* Gets the integer representation of this endpoint type. This integer representation specifies the class number
|
||||
* used by the endpoint scoring model (the classifier) to represent this endpoint type. Class 0 is the negative
|
||||
* class (non-sink). Each positive int corresponds to a single sink type.
|
||||
*/
|
||||
abstract int getEncoding();
|
||||
|
||||
string toString() { result = getDescription() }
|
||||
|
||||
@@ -1,220 +0,0 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Defines a set of reasons why a particular endpoint was filtered out. This set of reasons
|
||||
* contains both reasons why an endpoint could be `NotASink` and reasons why an endpoint could be
|
||||
* `LikelyNotASink`. The `NotASinkReason`s defined here are exhaustive, but the
|
||||
* `LikelyNotASinkReason`s are not exhaustive.
|
||||
*/
|
||||
newtype TFilteringReason =
|
||||
TIsArgumentToBuiltinFunctionReason() or
|
||||
TLodashUnderscoreArgumentReason() or
|
||||
TClientRequestReason() or
|
||||
TPromiseDefinitionReason() or
|
||||
TCryptographicKeyReason() or
|
||||
TCryptographicOperationFlowReason() or
|
||||
TLoggerMethodReason() or
|
||||
TTimeoutReason() or
|
||||
TReceiverStorageReason() or
|
||||
TStringStartsWithReason() or
|
||||
TStringEndsWithReason() or
|
||||
TStringRegExpTestReason() or
|
||||
TEventRegistrationReason() or
|
||||
TEventDispatchReason() or
|
||||
TMembershipCandidateTestReason() or
|
||||
TFileSystemAccessReason() or
|
||||
TDatabaseAccessReason() or
|
||||
TDomReason() or
|
||||
TNextFunctionCallReason() or
|
||||
TArgumentToArrayReason() or
|
||||
TArgumentToBuiltinGlobalVarRefReason() or
|
||||
TConstantReceiverReason() or
|
||||
TBuiltinCallNameReason() or
|
||||
TBase64ManipulationReason() or
|
||||
TJQueryArgumentReason() or
|
||||
TDojoRequireReason()
|
||||
|
||||
/** A reason why a particular endpoint was filtered out by the endpoint filters. */
|
||||
abstract class FilteringReason extends TFilteringReason {
|
||||
abstract string getDescription();
|
||||
|
||||
abstract int getEncoding();
|
||||
|
||||
string toString() { result = getDescription() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A reason why a particular endpoint might be considered to be `NotASink`.
|
||||
*
|
||||
* An endpoint is `NotASink` if it has at least one `NotASinkReason`, it does not have any
|
||||
* `LikelyNotASinkReason`s, and it is not a known sink.
|
||||
*/
|
||||
abstract class NotASinkReason extends FilteringReason { }
|
||||
|
||||
/**
|
||||
* A reason why a particular endpoint might be considered to be `LikelyNotASink`.
|
||||
*
|
||||
* An endpoint is `LikelyNotASink` if it has at least one `LikelyNotASinkReason` and it is not a
|
||||
* known sink.
|
||||
*/
|
||||
abstract class LikelyNotASinkReason extends FilteringReason { }
|
||||
|
||||
class IsArgumentToBuiltinFunctionReason extends NotASinkReason, TIsArgumentToBuiltinFunctionReason {
|
||||
override string getDescription() { result = "IsArgumentToBuiltinFunction" }
|
||||
|
||||
override int getEncoding() { result = 5 }
|
||||
}
|
||||
|
||||
class LodashUnderscoreArgumentReason extends NotASinkReason, TLodashUnderscoreArgumentReason {
|
||||
override string getDescription() { result = "LodashUnderscoreArgument" }
|
||||
|
||||
override int getEncoding() { result = 6 }
|
||||
}
|
||||
|
||||
class ClientRequestReason extends NotASinkReason, TClientRequestReason {
|
||||
override string getDescription() { result = "ClientRequest" }
|
||||
|
||||
override int getEncoding() { result = 7 }
|
||||
}
|
||||
|
||||
class PromiseDefinitionReason extends NotASinkReason, TPromiseDefinitionReason {
|
||||
override string getDescription() { result = "PromiseDefinition" }
|
||||
|
||||
override int getEncoding() { result = 8 }
|
||||
}
|
||||
|
||||
class CryptographicKeyReason extends NotASinkReason, TCryptographicKeyReason {
|
||||
override string getDescription() { result = "CryptographicKey" }
|
||||
|
||||
override int getEncoding() { result = 9 }
|
||||
}
|
||||
|
||||
class CryptographicOperationFlowReason extends NotASinkReason, TCryptographicOperationFlowReason {
|
||||
override string getDescription() { result = "CryptographicOperationFlow" }
|
||||
|
||||
override int getEncoding() { result = 10 }
|
||||
}
|
||||
|
||||
class LoggerMethodReason extends NotASinkReason, TLoggerMethodReason {
|
||||
override string getDescription() { result = "LoggerMethod" }
|
||||
|
||||
override int getEncoding() { result = 11 }
|
||||
}
|
||||
|
||||
class TimeoutReason extends NotASinkReason, TTimeoutReason {
|
||||
override string getDescription() { result = "Timeout" }
|
||||
|
||||
override int getEncoding() { result = 12 }
|
||||
}
|
||||
|
||||
class ReceiverStorageReason extends NotASinkReason, TReceiverStorageReason {
|
||||
override string getDescription() { result = "ReceiverStorage" }
|
||||
|
||||
override int getEncoding() { result = 13 }
|
||||
}
|
||||
|
||||
class StringStartsWithReason extends NotASinkReason, TStringStartsWithReason {
|
||||
override string getDescription() { result = "StringStartsWith" }
|
||||
|
||||
override int getEncoding() { result = 14 }
|
||||
}
|
||||
|
||||
class StringEndsWithReason extends NotASinkReason, TStringEndsWithReason {
|
||||
override string getDescription() { result = "StringEndsWith" }
|
||||
|
||||
override int getEncoding() { result = 15 }
|
||||
}
|
||||
|
||||
class StringRegExpTestReason extends NotASinkReason, TStringRegExpTestReason {
|
||||
override string getDescription() { result = "StringRegExpTest" }
|
||||
|
||||
override int getEncoding() { result = 16 }
|
||||
}
|
||||
|
||||
class EventRegistrationReason extends NotASinkReason, TEventRegistrationReason {
|
||||
override string getDescription() { result = "EventRegistration" }
|
||||
|
||||
override int getEncoding() { result = 17 }
|
||||
}
|
||||
|
||||
class EventDispatchReason extends NotASinkReason, TEventDispatchReason {
|
||||
override string getDescription() { result = "EventDispatch" }
|
||||
|
||||
override int getEncoding() { result = 18 }
|
||||
}
|
||||
|
||||
class MembershipCandidateTestReason extends NotASinkReason, TMembershipCandidateTestReason {
|
||||
override string getDescription() { result = "MembershipCandidateTest" }
|
||||
|
||||
override int getEncoding() { result = 19 }
|
||||
}
|
||||
|
||||
class FileSystemAccessReason extends NotASinkReason, TFileSystemAccessReason {
|
||||
override string getDescription() { result = "FileSystemAccess" }
|
||||
|
||||
override int getEncoding() { result = 20 }
|
||||
}
|
||||
|
||||
class DatabaseAccessReason extends NotASinkReason, TDatabaseAccessReason {
|
||||
override string getDescription() { result = "DatabaseAccess" }
|
||||
|
||||
override int getEncoding() { result = 21 }
|
||||
}
|
||||
|
||||
class DomReason extends NotASinkReason, TDomReason {
|
||||
override string getDescription() { result = "DOM" }
|
||||
|
||||
override int getEncoding() { result = 22 }
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for DomReason */
|
||||
deprecated class DOMReason = DomReason;
|
||||
|
||||
class NextFunctionCallReason extends NotASinkReason, TNextFunctionCallReason {
|
||||
override string getDescription() { result = "NextFunctionCall" }
|
||||
|
||||
override int getEncoding() { result = 23 }
|
||||
}
|
||||
|
||||
class ArgumentToArrayReason extends LikelyNotASinkReason, TArgumentToArrayReason {
|
||||
override string getDescription() { result = "ArgumentToArray" }
|
||||
|
||||
override int getEncoding() { result = 24 }
|
||||
}
|
||||
|
||||
class ArgumentToBuiltinGlobalVarRefReason extends LikelyNotASinkReason,
|
||||
TArgumentToBuiltinGlobalVarRefReason {
|
||||
override string getDescription() { result = "ArgumentToBuiltinGlobalVarRef" }
|
||||
|
||||
override int getEncoding() { result = 25 }
|
||||
}
|
||||
|
||||
class ConstantReceiverReason extends NotASinkReason, TConstantReceiverReason {
|
||||
override string getDescription() { result = "ConstantReceiver" }
|
||||
|
||||
override int getEncoding() { result = 26 }
|
||||
}
|
||||
|
||||
class BuiltinCallNameReason extends NotASinkReason, TBuiltinCallNameReason {
|
||||
override string getDescription() { result = "BuiltinCallName" }
|
||||
|
||||
override int getEncoding() { result = 27 }
|
||||
}
|
||||
|
||||
class Base64ManipulationReason extends NotASinkReason, TBase64ManipulationReason {
|
||||
override string getDescription() { result = "Base64Manipulation" }
|
||||
|
||||
override int getEncoding() { result = 28 }
|
||||
}
|
||||
|
||||
class JQueryArgumentReason extends NotASinkReason, TJQueryArgumentReason {
|
||||
override string getDescription() { result = "JQueryArgument" }
|
||||
|
||||
override int getEncoding() { result = 29 }
|
||||
}
|
||||
|
||||
class DojoRequireReason extends NotASinkReason, TDojoRequireReason {
|
||||
override string getDescription() { result = "DojoRequire" }
|
||||
|
||||
override int getEncoding() { result = 30 }
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* FunctionBodyFeatures.qll
|
||||
*
|
||||
* Contains logic relating to the `enclosingFunctionBody` and `enclosingFunctionName` features.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* A taint-tracking configuration for reasoning about NoSQL injection vulnerabilities.
|
||||
* Defines shared code used by the NoSQL injection boosted query.
|
||||
*/
|
||||
|
||||
@@ -8,145 +9,21 @@ import javascript
|
||||
private import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
private import semmle.javascript.security.dataflow.NosqlInjectionCustomizations
|
||||
import AdaptiveThreatModeling
|
||||
private import CoreKnowledge as CoreKnowledge
|
||||
private import StandardEndpointFilters as StandardEndpointFilters
|
||||
|
||||
module SinkEndpointFilter {
|
||||
/**
|
||||
* Provides a set of reasons why a given data flow node should be excluded as a sink candidate.
|
||||
*
|
||||
* If this predicate has no results for a sink candidate `n`, then we should treat `n` as an
|
||||
* effective sink.
|
||||
*/
|
||||
string getAReasonSinkExcluded(DataFlow::Node sinkCandidate) {
|
||||
result = StandardEndpointFilters::getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
exists(DataFlow::CallNode call | sinkCandidate = call.getAnArgument() |
|
||||
// additional databases accesses that aren't modeled yet
|
||||
call.(DataFlow::MethodCallNode).getMethodName() =
|
||||
["create", "createCollection", "createIndexes"] and
|
||||
result = "matches database access call heuristic"
|
||||
or
|
||||
// Remove modeled sinks
|
||||
CoreKnowledge::isArgumentToKnownLibrarySinkFunction(sinkCandidate) and
|
||||
result = "modeled sink"
|
||||
or
|
||||
// Remove common kinds of unlikely sinks
|
||||
CoreKnowledge::isKnownStepSrc(sinkCandidate) and
|
||||
result = "predecessor in a modeled flow step"
|
||||
or
|
||||
// Remove modeled database calls. Arguments to modeled calls are very likely to be modeled
|
||||
// as sinks if they are true positives. Therefore arguments that are not modeled as sinks
|
||||
// are unlikely to be true positives.
|
||||
call instanceof DatabaseAccess and
|
||||
result = "modeled database access"
|
||||
or
|
||||
// Remove calls to APIs that aren't relevant to NoSQL injection
|
||||
call.getReceiver() instanceof Http::RequestNode and
|
||||
result = "receiver is a HTTP request expression"
|
||||
or
|
||||
call.getReceiver() instanceof Http::ResponseNode and
|
||||
result = "receiver is a HTTP response expression"
|
||||
)
|
||||
or
|
||||
// Require NoSQL injection sink candidates to be (a) direct arguments to external library calls
|
||||
// or (b) heuristic sinks for NoSQL injection.
|
||||
//
|
||||
// ## Direct arguments to external library calls
|
||||
//
|
||||
// The `StandardEndpointFilters::flowsToArgumentOfLikelyExternalLibraryCall` endpoint filter
|
||||
// allows sink candidates which are within object literals or array literals, for example
|
||||
// `req.sendFile(_, { path: ENDPOINT })`.
|
||||
//
|
||||
// However, the NoSQL injection query deals differently with these types of sinks compared to
|
||||
// other security queries. Other security queries such as SQL injection tend to treat
|
||||
// `ENDPOINT` as the ground truth sink, but the NoSQL injection query instead treats
|
||||
// `{ path: ENDPOINT }` as the ground truth sink and defines an additional flow step to ensure
|
||||
// data flows from `ENDPOINT` to the ground truth sink `{ path: ENDPOINT }`.
|
||||
//
|
||||
// Therefore for the NoSQL injection boosted query, we must ignore sink candidates within object
|
||||
// literals or array literals, to avoid having multiple alerts for the same security
|
||||
// vulnerability (one FP where the sink is `ENDPOINT` and one TP where the sink is
|
||||
// `{ path: ENDPOINT }`). We accomplish this by directly testing that the sink candidate is an
|
||||
// argument of a likely external library call.
|
||||
//
|
||||
// ## Heuristic sinks
|
||||
//
|
||||
// We also allow heuristic sinks in addition to direct arguments to external library calls.
|
||||
// These are copied from the `HeuristicNosqlInjectionSink` class defined within
|
||||
// `codeql/javascript/ql/src/semmle/javascript/heuristics/AdditionalSinks.qll`.
|
||||
// We can't reuse the class because importing that file would cause us to treat these
|
||||
// heuristic sinks as known sinks.
|
||||
not sinkCandidate = StandardEndpointFilters::getALikelyExternalLibraryCall().getAnArgument() and
|
||||
not (
|
||||
isAssignedToOrConcatenatedWith(sinkCandidate, "(?i)(nosql|query)") or
|
||||
isArgTo(sinkCandidate, "(?i)(query)")
|
||||
) and
|
||||
result = "not a direct argument to a likely external library call or a heuristic sink"
|
||||
}
|
||||
}
|
||||
|
||||
class NosqlInjectionAtmConfig extends AtmConfig {
|
||||
NosqlInjectionAtmConfig() { this = "NosqlInjectionATMConfig" }
|
||||
NosqlInjectionAtmConfig() { this = "NosqlInjectionAtmConfig" }
|
||||
|
||||
override predicate isKnownSource(DataFlow::Node source) {
|
||||
source instanceof NosqlInjection::Source or TaintedObject::isSource(source, _)
|
||||
}
|
||||
|
||||
override predicate isEffectiveSink(DataFlow::Node sinkCandidate) {
|
||||
not exists(SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate))
|
||||
}
|
||||
|
||||
override EndpointType getASinkEndpointType() { result instanceof NosqlInjectionSinkType }
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for NosqlInjectionAtmConfig */
|
||||
deprecated class NosqlInjectionATMConfig = NosqlInjectionAtmConfig;
|
||||
|
||||
/** Holds if src -> trg is an additional flow step in the non-boosted NoSql injection security query. */
|
||||
predicate isBaseAdditionalFlowStep(
|
||||
DataFlow::Node src, DataFlow::Node trg, DataFlow::FlowLabel inlbl, DataFlow::FlowLabel outlbl
|
||||
) {
|
||||
TaintedObject::step(src, trg, inlbl, outlbl)
|
||||
or
|
||||
// additional flow step to track taint through NoSQL query objects
|
||||
inlbl = TaintedObject::label() and
|
||||
outlbl = TaintedObject::label() and
|
||||
exists(NoSql::Query query, DataFlow::SourceNode queryObj |
|
||||
queryObj.flowsTo(query) and
|
||||
queryObj.flowsTo(trg) and
|
||||
src = queryObj.getAPropertyWrite().getRhs()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value that is (transitively) written to `query`, where `query` is a NoSQL sink.
|
||||
*
|
||||
* This predicate allows us to propagate data flow through property writes and array constructors
|
||||
* within a query object, enabling the security query to pick up NoSQL injection vulnerabilities
|
||||
* involving more complex queries.
|
||||
*/
|
||||
DataFlow::Node getASubexpressionWithinQuery(DataFlow::Node query) {
|
||||
any(NosqlInjectionAtmConfig cfg).isEffectiveSink(query) and
|
||||
exists(DataFlow::SourceNode receiver |
|
||||
receiver = [getASubexpressionWithinQuery(query), query].getALocalSource()
|
||||
|
|
||||
result =
|
||||
[receiver.getAPropertyWrite().getRhs(), receiver.(DataFlow::ArrayCreationNode).getAnElement()]
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* A taint-tracking configuration for reasoning about NoSQL injection vulnerabilities.
|
||||
*
|
||||
* This is largely a copy of the taint tracking configuration for the standard NoSQL injection
|
||||
* query, except additional ATM sinks have been added and the additional flow step has been
|
||||
* generalised to cover the sinks predicted by ATM.
|
||||
*/
|
||||
class Configuration extends TaintTracking::Configuration {
|
||||
Configuration() { this = "NosqlInjectionATM" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof NosqlInjection::Source }
|
||||
/*
|
||||
* This is largely a copy of the taint tracking configuration for the standard NoSQL injection
|
||||
* query, except additional ATM sinks have been added and the additional flow step has been
|
||||
* generalised to cover the sinks predicted by ATM.
|
||||
*/
|
||||
|
||||
override predicate isSource(DataFlow::Node source, DataFlow::FlowLabel label) {
|
||||
TaintedObject::isSource(source, label)
|
||||
@@ -156,7 +33,7 @@ class Configuration extends TaintTracking::Configuration {
|
||||
sink.(NosqlInjection::Sink).getAFlowLabel() = label
|
||||
or
|
||||
// Allow effective sinks to have any taint label
|
||||
any(NosqlInjectionAtmConfig cfg).isEffectiveSink(sink)
|
||||
isEffectiveSink(sink)
|
||||
}
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) {
|
||||
@@ -175,7 +52,43 @@ class Configuration extends TaintTracking::Configuration {
|
||||
isBaseAdditionalFlowStep(src, trg, inlbl, outlbl)
|
||||
or
|
||||
// relaxed version of previous step to track taint through unmodeled NoSQL query objects
|
||||
any(NosqlInjectionAtmConfig cfg).isEffectiveSink(trg) and
|
||||
isEffectiveSink(trg) and
|
||||
src = getASubexpressionWithinQuery(trg)
|
||||
}
|
||||
|
||||
/** Holds if src -> trg is an additional flow step in the non-boosted NoSql injection security query. */
|
||||
private predicate isBaseAdditionalFlowStep(
|
||||
DataFlow::Node src, DataFlow::Node trg, DataFlow::FlowLabel inlbl, DataFlow::FlowLabel outlbl
|
||||
) {
|
||||
TaintedObject::step(src, trg, inlbl, outlbl)
|
||||
or
|
||||
// additional flow step to track taint through NoSQL query objects
|
||||
inlbl = TaintedObject::label() and
|
||||
outlbl = TaintedObject::label() and
|
||||
exists(NoSql::Query query, DataFlow::SourceNode queryObj |
|
||||
queryObj.flowsTo(query) and
|
||||
queryObj.flowsTo(trg) and
|
||||
src = queryObj.getAPropertyWrite().getRhs()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value that is (transitively) written to `query`, where `query` is a NoSQL sink.
|
||||
*
|
||||
* This predicate allows us to propagate data flow through property writes and array constructors
|
||||
* within a query object, enabling the security query to pick up NoSQL injection vulnerabilities
|
||||
* involving more complex queries.
|
||||
*/
|
||||
private DataFlow::Node getASubexpressionWithinQuery(DataFlow::Node query) {
|
||||
isEffectiveSink(query) and
|
||||
exists(DataFlow::SourceNode receiver |
|
||||
receiver = [getASubexpressionWithinQuery(query), query].getALocalSource()
|
||||
|
|
||||
result =
|
||||
[
|
||||
receiver.getAPropertyWrite().getRhs(),
|
||||
receiver.(DataFlow::ArrayCreationNode).getAnElement()
|
||||
]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,94 +1,25 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* A taint-tracking configuration for reasoning about SQL injection vulnerabilities.
|
||||
* Defines shared code used by the SQL injection boosted query.
|
||||
*/
|
||||
|
||||
import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
import semmle.javascript.security.dataflow.SqlInjectionCustomizations
|
||||
import AdaptiveThreatModeling
|
||||
import CoreKnowledge as CoreKnowledge
|
||||
import StandardEndpointFilters as StandardEndpointFilters
|
||||
|
||||
/**
|
||||
* This module provides logic to filter candidate sinks to those which are likely SQL injection
|
||||
* sinks.
|
||||
*/
|
||||
module SinkEndpointFilter {
|
||||
private import javascript
|
||||
private import SQL
|
||||
|
||||
/**
|
||||
* Provides a set of reasons why a given data flow node should be excluded as a sink candidate.
|
||||
*
|
||||
* If this predicate has no results for a sink candidate `n`, then we should treat `n` as an
|
||||
* effective sink.
|
||||
*/
|
||||
string getAReasonSinkExcluded(DataFlow::Node sinkCandidate) {
|
||||
result = StandardEndpointFilters::getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
exists(DataFlow::CallNode call | sinkCandidate = call.getAnArgument() |
|
||||
// prepared statements for SQL
|
||||
any(DataFlow::CallNode cn | cn.getCalleeName() = "prepare")
|
||||
.getAMethodCall("run")
|
||||
.getAnArgument() = sinkCandidate and
|
||||
result = "prepared SQL statement"
|
||||
or
|
||||
sinkCandidate instanceof DataFlow::ArrayCreationNode and
|
||||
result = "array creation"
|
||||
or
|
||||
// UI is unrelated to SQL
|
||||
call.getCalleeName().regexpMatch("(?i).*(render|html).*") and
|
||||
result = "HTML / rendering"
|
||||
)
|
||||
or
|
||||
// Require SQL injection sink candidates to be (a) arguments to external library calls
|
||||
// (possibly indirectly), or (b) heuristic sinks.
|
||||
//
|
||||
// Heuristic sinks are copied from the `HeuristicSqlInjectionSink` class defined within
|
||||
// `codeql/javascript/ql/src/semmle/javascript/heuristics/AdditionalSinks.qll`.
|
||||
// We can't reuse the class because importing that file would cause us to treat these
|
||||
// heuristic sinks as known sinks.
|
||||
not StandardEndpointFilters::flowsToArgumentOfLikelyExternalLibraryCall(sinkCandidate) and
|
||||
not (
|
||||
isAssignedToOrConcatenatedWith(sinkCandidate, "(?i)(sql|query)") or
|
||||
isArgTo(sinkCandidate, "(?i)(query)") or
|
||||
isConcatenatedWithString(sinkCandidate,
|
||||
"(?s).*(ALTER|COUNT|CREATE|DATABASE|DELETE|DISTINCT|DROP|FROM|GROUP|INSERT|INTO|LIMIT|ORDER|SELECT|TABLE|UPDATE|WHERE).*")
|
||||
) and
|
||||
result = "not an argument to a likely external library call or a heuristic sink"
|
||||
}
|
||||
}
|
||||
|
||||
class SqlInjectionAtmConfig extends AtmConfig {
|
||||
SqlInjectionAtmConfig() { this = "SqlInjectionATMConfig" }
|
||||
SqlInjectionAtmConfig() { this = "SqlInjectionAtmConfig" }
|
||||
|
||||
override predicate isKnownSource(DataFlow::Node source) { source instanceof SqlInjection::Source }
|
||||
|
||||
override predicate isEffectiveSink(DataFlow::Node sinkCandidate) {
|
||||
not exists(SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate))
|
||||
}
|
||||
|
||||
override EndpointType getASinkEndpointType() { result instanceof SqlInjectionSinkType }
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for SqlInjectionAtmConfig */
|
||||
deprecated class SqlInjectionATMConfig = SqlInjectionAtmConfig;
|
||||
|
||||
/**
|
||||
* A taint-tracking configuration for reasoning about SQL injection vulnerabilities.
|
||||
*
|
||||
* This is largely a copy of the taint tracking configuration for the standard SQL injection
|
||||
* query, except additional sinks have been added using the sink endpoint filter.
|
||||
*/
|
||||
class Configuration extends TaintTracking::Configuration {
|
||||
Configuration() { this = "SqlInjectionATM" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof SqlInjection::Source }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
sink instanceof SqlInjection::Sink or any(SqlInjectionAtmConfig cfg).isEffectiveSink(sink)
|
||||
}
|
||||
/*
|
||||
* This is largely a copy of the taint tracking configuration for the standard SQL injection
|
||||
* query, except additional sinks have been added using the sink endpoint filter.
|
||||
*/
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) {
|
||||
super.isSanitizer(node) or
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Provides classes and predicates that are useful for endpoint filters.
|
||||
*
|
||||
* The standard use of this library is to make use of `isPotentialEffectiveSink/1`
|
||||
*/
|
||||
|
||||
private import javascript
|
||||
private import semmle.javascript.filters.ClassifyFiles as ClassifyFiles
|
||||
private import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
private import CoreKnowledge as CoreKnowledge
|
||||
|
||||
/** Provides a set of reasons why a given data flow node should be excluded as a sink candidate. */
|
||||
string getAReasonSinkExcluded(DataFlow::Node n) {
|
||||
isArgumentToModeledFunction(n) and result = "argument to modeled function"
|
||||
or
|
||||
isArgumentToSinklessLibrary(n) and result = "argument to sinkless library"
|
||||
or
|
||||
isSanitizer(n) and result = "sanitizer"
|
||||
or
|
||||
isPredicate(n) and result = "predicate"
|
||||
or
|
||||
isHash(n) and result = "hash"
|
||||
or
|
||||
isNumeric(n) and result = "numeric"
|
||||
or
|
||||
// Ignore candidate sinks within externs, generated, library, and test code
|
||||
exists(string category | category = ["externs", "generated", "library", "test"] |
|
||||
ClassifyFiles::classify(n.getFile(), category) and
|
||||
result = "in " + category + " file"
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is an argument to a function that has a manual model.
|
||||
*/
|
||||
predicate isArgumentToModeledFunction(DataFlow::Node n) {
|
||||
exists(DataFlow::InvokeNode invk, DataFlow::Node known |
|
||||
invk.getAnArgument() = n and invk.getAnArgument() = known and isSomeModeledArgument(known)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the node `n` is an argument that has a manual model.
|
||||
*/
|
||||
predicate isSomeModeledArgument(DataFlow::Node n) {
|
||||
CoreKnowledge::isKnownLibrarySink(n) or
|
||||
CoreKnowledge::isKnownStepSrc(n) or
|
||||
CoreKnowledge::isOtherModeledArgument(n, _)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `n` appears to be a numeric value.
|
||||
*/
|
||||
predicate isNumeric(DataFlow::Node n) { isReadFrom(n, ".*index.*") }
|
||||
|
||||
/**
|
||||
* Holds if `n` is an argument to a library without sinks.
|
||||
*/
|
||||
predicate isArgumentToSinklessLibrary(DataFlow::Node n) {
|
||||
exists(DataFlow::InvokeNode invk, DataFlow::SourceNode commonSafeLibrary, string libraryName |
|
||||
libraryName = ["slugify", "striptags", "marked"]
|
||||
|
|
||||
commonSafeLibrary = DataFlow::moduleImport(libraryName) and
|
||||
invk = [commonSafeLibrary, commonSafeLibrary.getAPropertyRead()].getAnInvocation() and
|
||||
n = invk.getAnArgument()
|
||||
)
|
||||
}
|
||||
|
||||
predicate isSanitizer(DataFlow::Node n) {
|
||||
exists(DataFlow::CallNode call | n = call.getAnArgument() |
|
||||
call.getCalleeName().regexpMatch("(?i).*(escape|valid(ate)?|sanitize|purify).*")
|
||||
)
|
||||
}
|
||||
|
||||
predicate isPredicate(DataFlow::Node n) {
|
||||
exists(DataFlow::CallNode call | n = call.getAnArgument() |
|
||||
call.getCalleeName().regexpMatch("(equals|(|is|has|can)(_|[A-Z])).*")
|
||||
)
|
||||
}
|
||||
|
||||
predicate isHash(DataFlow::Node n) {
|
||||
exists(DataFlow::CallNode call | n = call.getAnArgument() |
|
||||
call.getCalleeName().regexpMatch("(?i)^(sha\\d*|md5|hash)$")
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the data flow node is a (possibly indirect) argument of a likely external library call.
|
||||
*
|
||||
* This includes direct arguments of likely external library calls as well as nested object
|
||||
* literals within those calls.
|
||||
*/
|
||||
predicate flowsToArgumentOfLikelyExternalLibraryCall(DataFlow::Node n) {
|
||||
n = getACallWithoutCallee().getAnArgument()
|
||||
or
|
||||
exists(DataFlow::SourceNode src | flowsToArgumentOfLikelyExternalLibraryCall(src) |
|
||||
n = src.getAPropertyWrite().getRhs()
|
||||
)
|
||||
or
|
||||
exists(DataFlow::ArrayCreationNode arr | flowsToArgumentOfLikelyExternalLibraryCall(arr) |
|
||||
n = arr.getAnElement()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get calls which are likely to be to external non-built-in libraries.
|
||||
*/
|
||||
DataFlow::CallNode getALikelyExternalLibraryCall() { result = getACallWithoutCallee() }
|
||||
|
||||
/**
|
||||
* Gets a node that flows to callback-parameter `p`.
|
||||
*/
|
||||
private DataFlow::SourceNode getACallback(DataFlow::ParameterNode p, DataFlow::TypeBackTracker t) {
|
||||
t.start() and
|
||||
result = p and
|
||||
any(DataFlow::FunctionNode f).getLastParameter() = p and
|
||||
exists(p.getACall())
|
||||
or
|
||||
exists(DataFlow::TypeBackTracker t2 | result = getACallback(p, t2).backtrack(t2, t))
|
||||
}
|
||||
|
||||
/**
|
||||
* Get calls for which we do not have the callee (i.e. the definition of the called function). This
|
||||
* acts as a heuristic for identifying calls to external library functions.
|
||||
*/
|
||||
private DataFlow::CallNode getACallWithoutCallee() {
|
||||
forall(Function callee | callee = result.getACallee() | callee.getTopLevel().isExterns()) and
|
||||
not exists(DataFlow::ParameterNode param, DataFlow::FunctionNode callback |
|
||||
param.flowsTo(result.getCalleeNode()) and
|
||||
callback = getACallback(param, DataFlow::TypeBackTracker::end())
|
||||
)
|
||||
}
|
||||
@@ -1,95 +1,31 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* A taint-tracking configuration for reasoning about path injection vulnerabilities.
|
||||
* Defines shared code used by the path injection boosted query.
|
||||
*/
|
||||
|
||||
import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
import semmle.javascript.security.dataflow.TaintedPathCustomizations
|
||||
import AdaptiveThreatModeling
|
||||
import CoreKnowledge as CoreKnowledge
|
||||
import StandardEndpointFilters as StandardEndpointFilters
|
||||
|
||||
/**
|
||||
* This module provides logic to filter candidate sinks to those which are likely path injection
|
||||
* sinks.
|
||||
*/
|
||||
module SinkEndpointFilter {
|
||||
private import javascript
|
||||
private import TaintedPath
|
||||
|
||||
/**
|
||||
* Provides a set of reasons why a given data flow node should be excluded as a sink candidate.
|
||||
*
|
||||
* If this predicate has no results for a sink candidate `n`, then we should treat `n` as an
|
||||
* effective sink.
|
||||
*/
|
||||
string getAReasonSinkExcluded(DataFlow::Node sinkCandidate) {
|
||||
result = StandardEndpointFilters::getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
// Require path injection sink candidates to be (a) arguments to external library calls
|
||||
// (possibly indirectly), or (b) heuristic sinks.
|
||||
//
|
||||
// Heuristic sinks are mostly copied from the `HeuristicTaintedPathSink` class defined within
|
||||
// `codeql/javascript/ql/src/semmle/javascript/heuristics/AdditionalSinks.qll`.
|
||||
// We can't reuse the class because importing that file would cause us to treat these
|
||||
// heuristic sinks as known sinks.
|
||||
not StandardEndpointFilters::flowsToArgumentOfLikelyExternalLibraryCall(sinkCandidate) and
|
||||
not (
|
||||
isAssignedToOrConcatenatedWith(sinkCandidate, "(?i)(file|folder|dir|absolute)")
|
||||
or
|
||||
isArgTo(sinkCandidate, "(?i)(get|read)file")
|
||||
or
|
||||
exists(string pathPattern |
|
||||
// paths with at least two parts, and either a trailing or leading slash
|
||||
pathPattern = "(?i)([a-z0-9_.-]+/){2,}" or
|
||||
pathPattern = "(?i)(/[a-z0-9_.-]+){2,}"
|
||||
|
|
||||
isConcatenatedWithString(sinkCandidate, pathPattern)
|
||||
)
|
||||
or
|
||||
isConcatenatedWithStrings(".*/", sinkCandidate, "/.*")
|
||||
or
|
||||
// In addition to the names from `HeuristicTaintedPathSink` in the
|
||||
// `isAssignedToOrConcatenatedWith` predicate call above, we also allow the noisier "path"
|
||||
// name.
|
||||
isAssignedToOrConcatenatedWith(sinkCandidate, "(?i)path")
|
||||
) and
|
||||
result = "not a direct argument to a likely external library call or a heuristic sink"
|
||||
}
|
||||
}
|
||||
|
||||
class TaintedPathAtmConfig extends AtmConfig {
|
||||
TaintedPathAtmConfig() { this = "TaintedPathATMConfig" }
|
||||
TaintedPathAtmConfig() { this = "TaintedPathAtmConfig" }
|
||||
|
||||
override predicate isKnownSource(DataFlow::Node source) { source instanceof TaintedPath::Source }
|
||||
|
||||
override predicate isEffectiveSink(DataFlow::Node sinkCandidate) {
|
||||
not exists(SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate))
|
||||
}
|
||||
|
||||
override EndpointType getASinkEndpointType() { result instanceof TaintedPathSinkType }
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for TaintedPathAtmConfig */
|
||||
deprecated class TaintedPathATMConfig = TaintedPathAtmConfig;
|
||||
|
||||
/**
|
||||
* A taint-tracking configuration for reasoning about path injection vulnerabilities.
|
||||
*
|
||||
* This is largely a copy of the taint tracking configuration for the standard path injection
|
||||
* query, except additional ATM sinks have been added to the `isSink` predicate.
|
||||
*/
|
||||
class Configuration extends TaintTracking::Configuration {
|
||||
Configuration() { this = "TaintedPathATM" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof TaintedPath::Source }
|
||||
/*
|
||||
* This is largely a copy of the taint tracking configuration for the standard path injection
|
||||
* query, except additional ATM sinks have been added to the `isSink` predicate.
|
||||
*/
|
||||
|
||||
override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel label) {
|
||||
label = sink.(TaintedPath::Sink).getAFlowLabel()
|
||||
or
|
||||
// Allow effective sinks to have any taint label
|
||||
any(TaintedPathAtmConfig cfg).isEffectiveSink(sink)
|
||||
isEffectiveSink(sink)
|
||||
}
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) { node instanceof TaintedPath::Sanitizer }
|
||||
@@ -115,7 +51,7 @@ class Configuration extends TaintTracking::Configuration {
|
||||
* of barrier guards, we port the barrier guards for the boosted query from the standard library to
|
||||
* sanitizer guards here.
|
||||
*/
|
||||
class BarrierGuardNodeAsSanitizerGuardNode extends TaintTracking::LabeledSanitizerGuardNode {
|
||||
private class BarrierGuardNodeAsSanitizerGuardNode extends TaintTracking::LabeledSanitizerGuardNode {
|
||||
BarrierGuardNodeAsSanitizerGuardNode() { this instanceof TaintedPath::BarrierGuardNode }
|
||||
|
||||
override predicate sanitizes(boolean outcome, Expr e) {
|
||||
|
||||
@@ -1,95 +1,25 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* A taint-tracking configuration for reasoning about XSS vulnerabilities.
|
||||
* Defines shared code used by the XSS boosted query.
|
||||
*/
|
||||
|
||||
private import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
private import semmle.javascript.security.dataflow.DomBasedXssCustomizations
|
||||
import AdaptiveThreatModeling
|
||||
import CoreKnowledge as CoreKnowledge
|
||||
import StandardEndpointFilters as StandardEndpointFilters
|
||||
|
||||
/**
|
||||
* This module provides logic to filter candidate sinks to those which are likely XSS sinks.
|
||||
*/
|
||||
module SinkEndpointFilter {
|
||||
private import javascript
|
||||
private import DomBasedXss
|
||||
|
||||
/**
|
||||
* Provides a set of reasons why a given data flow node should be excluded as a sink candidate.
|
||||
*
|
||||
* If this predicate has no results for a sink candidate `n`, then we should treat `n` as an
|
||||
* effective sink.
|
||||
*/
|
||||
string getAReasonSinkExcluded(DataFlow::Node sinkCandidate) {
|
||||
result = StandardEndpointFilters::getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
exists(DataFlow::CallNode call | sinkCandidate = call.getAnArgument() |
|
||||
call.getCalleeName() = "setState"
|
||||
) and
|
||||
result = "setState calls ought to be safe in react applications"
|
||||
or
|
||||
// Require XSS sink candidates to be (a) arguments to external library calls (possibly
|
||||
// indirectly), or (b) heuristic sinks.
|
||||
//
|
||||
// Heuristic sinks are copied from the `HeuristicDomBasedXssSink` class defined within
|
||||
// `codeql/javascript/ql/src/semmle/javascript/heuristics/AdditionalSinks.qll`.
|
||||
// We can't reuse the class because importing that file would cause us to treat these
|
||||
// heuristic sinks as known sinks.
|
||||
not StandardEndpointFilters::flowsToArgumentOfLikelyExternalLibraryCall(sinkCandidate) and
|
||||
not (
|
||||
isAssignedToOrConcatenatedWith(sinkCandidate, "(?i)(html|innerhtml)")
|
||||
or
|
||||
isArgTo(sinkCandidate, "(?i)(html|render)")
|
||||
or
|
||||
sinkCandidate instanceof StringOps::HtmlConcatenationLeaf
|
||||
or
|
||||
isConcatenatedWithStrings("(?is).*<[a-z ]+.*", sinkCandidate, "(?s).*>.*")
|
||||
or
|
||||
// In addition to the heuristic sinks from `HeuristicDomBasedXssSink`, explicitly allow
|
||||
// property writes like `elem.innerHTML = <TAINT>` that may not be picked up as HTML
|
||||
// concatenation leaves.
|
||||
exists(DataFlow::PropWrite pw |
|
||||
pw.getPropertyName().regexpMatch("(?i).*html*") and
|
||||
pw.getRhs() = sinkCandidate
|
||||
)
|
||||
) and
|
||||
result = "not a direct argument to a likely external library call or a heuristic sink"
|
||||
}
|
||||
}
|
||||
|
||||
class DomBasedXssAtmConfig extends AtmConfig {
|
||||
DomBasedXssAtmConfig() { this = "DomBasedXssATMConfig" }
|
||||
DomBasedXssAtmConfig() { this = "DomBasedXssAtmConfig" }
|
||||
|
||||
override predicate isKnownSource(DataFlow::Node source) { source instanceof DomBasedXss::Source }
|
||||
|
||||
override predicate isEffectiveSink(DataFlow::Node sinkCandidate) {
|
||||
not exists(SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate))
|
||||
}
|
||||
|
||||
override EndpointType getASinkEndpointType() { result instanceof XssSinkType }
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for DomBasedXssAtmConfig */
|
||||
deprecated class DomBasedXssATMConfig = DomBasedXssAtmConfig;
|
||||
|
||||
/**
|
||||
* A taint-tracking configuration for reasoning about XSS vulnerabilities.
|
||||
*
|
||||
* This is largely a copy of the taint tracking configuration for the standard XSSThroughDom query,
|
||||
* except additional ATM sinks have been added to the `isSink` predicate.
|
||||
*/
|
||||
class Configuration extends TaintTracking::Configuration {
|
||||
Configuration() { this = "DomBasedXssATMConfiguration" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof DomBasedXss::Source }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
sink instanceof DomBasedXss::Sink or
|
||||
any(DomBasedXssAtmConfig cfg).isEffectiveSink(sink)
|
||||
}
|
||||
/*
|
||||
* This is largely a copy of the taint tracking configuration for the standard XSSThroughDom query,
|
||||
* except additional ATM sinks have been added to the `isSink` predicate.
|
||||
*/
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) {
|
||||
super.isSanitizer(node) or
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* A taint-tracking configuration for reasoning about XSS through the DOM.
|
||||
* Defines shared code used by the XSS Through DOM boosted query.
|
||||
*/
|
||||
|
||||
private import semmle.javascript.heuristics.SyntacticHeuristics
|
||||
private import semmle.javascript.security.dataflow.DomBasedXssCustomizations
|
||||
private import semmle.javascript.dataflow.InferredTypes
|
||||
private import semmle.javascript.security.dataflow.XssThroughDomCustomizations::XssThroughDom as XssThroughDom
|
||||
private import semmle.javascript.security.dataflow.UnsafeJQueryPluginCustomizations::UnsafeJQueryPlugin as UnsafeJQuery
|
||||
import AdaptiveThreatModeling
|
||||
|
||||
class XssThroughDomAtmConfig extends AtmConfig {
|
||||
XssThroughDomAtmConfig() { this = "XssThroughDomAtmConfig" }
|
||||
|
||||
override predicate isKnownSource(DataFlow::Node source) {
|
||||
source instanceof XssThroughDom::Source
|
||||
}
|
||||
|
||||
override EndpointType getASinkEndpointType() { result instanceof XssSinkType }
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) {
|
||||
super.isSanitizer(node) or
|
||||
node instanceof DomBasedXss::Sanitizer
|
||||
}
|
||||
|
||||
override predicate isSanitizerGuard(TaintTracking::SanitizerGuardNode guard) {
|
||||
guard instanceof TypeTestGuard or
|
||||
guard instanceof UnsafeJQuery::PropertyPresenceSanitizer or
|
||||
guard instanceof UnsafeJQuery::NumberGuard or
|
||||
guard instanceof PrefixStringSanitizer or
|
||||
guard instanceof QuoteGuard or
|
||||
guard instanceof ContainsHtmlGuard
|
||||
}
|
||||
|
||||
override predicate isSanitizerEdge(DataFlow::Node pred, DataFlow::Node succ) {
|
||||
DomBasedXss::isOptionallySanitizedEdge(pred, succ)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A test of form `typeof x === "something"`, preventing `x` from being a string in some cases.
|
||||
*
|
||||
* This sanitizer helps prune infeasible paths in type-overloaded functions.
|
||||
*/
|
||||
class TypeTestGuard extends TaintTracking::SanitizerGuardNode, DataFlow::ValueNode {
|
||||
override EqualityTest astNode;
|
||||
Expr operand;
|
||||
boolean polarity;
|
||||
|
||||
TypeTestGuard() {
|
||||
exists(TypeofTag tag | TaintTracking::isTypeofGuard(astNode, operand, tag) |
|
||||
// typeof x === "string" sanitizes `x` when it evaluates to false
|
||||
tag = "string" and
|
||||
polarity = astNode.getPolarity().booleanNot()
|
||||
or
|
||||
// typeof x === "object" sanitizes `x` when it evaluates to true
|
||||
tag != "string" and
|
||||
polarity = astNode.getPolarity()
|
||||
)
|
||||
}
|
||||
|
||||
override predicate sanitizes(boolean outcome, Expr e) {
|
||||
polarity = outcome and
|
||||
e = operand
|
||||
}
|
||||
}
|
||||
|
||||
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
||||
|
||||
private class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode,
|
||||
DomBasedXss::PrefixStringSanitizer {
|
||||
PrefixStringSanitizer() { this = this }
|
||||
}
|
||||
|
||||
private class PrefixString extends DataFlow::FlowLabel, DomBasedXss::PrefixString {
|
||||
PrefixString() { this = this }
|
||||
}
|
||||
|
||||
private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::QuoteGuard {
|
||||
QuoteGuard() { this = this }
|
||||
}
|
||||
|
||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
||||
ContainsHtmlGuard() { this = this }
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
name: codeql/javascript-experimental-atm-lib
|
||||
description: CodeQL libraries for the experimental ML-powered queries
|
||||
version: 0.4.4
|
||||
extractor: javascript
|
||||
library: true
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
name: codeql/javascript-experimental-atm-model
|
||||
description: Machine learning model supporting the experimental ML-powered queries
|
||||
version: 0.3.1
|
||||
groups:
|
||||
- javascript
|
||||
|
||||
@@ -11,20 +11,28 @@
|
||||
|
||||
import javascript
|
||||
import experimental.adaptivethreatmodeling.ATMConfig
|
||||
import extraction.ExtractEndpointData
|
||||
import extraction.ExtractEndpointDataTraining
|
||||
private import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
private import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
private import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
|
||||
string getAReasonSinkExcluded(DataFlow::Node sinkCandidate, Query query) {
|
||||
query instanceof NosqlInjectionQuery and
|
||||
result = NosqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate)
|
||||
result = any(NosqlInjectionAtm::NosqlInjectionAtmConfig cfg).getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
query instanceof SqlInjectionQuery and
|
||||
result = SqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate)
|
||||
result = any(SqlInjectionAtm::SqlInjectionAtmConfig cfg).getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
query instanceof TaintedPathQuery and
|
||||
result = TaintedPathAtm::SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate)
|
||||
result = any(TaintedPathAtm::TaintedPathAtmConfig cfg).getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
query instanceof XssQuery and
|
||||
result = XssAtm::SinkEndpointFilter::getAReasonSinkExcluded(sinkCandidate)
|
||||
result = any(XssAtm::DomBasedXssAtmConfig cfg).getAReasonSinkExcluded(sinkCandidate)
|
||||
or
|
||||
query instanceof XssThroughDomQuery and
|
||||
result = any(XssThroughDomAtm::XssThroughDomAtmConfig cfg).getAReasonSinkExcluded(sinkCandidate)
|
||||
}
|
||||
|
||||
pragma[inline]
|
||||
@@ -33,7 +41,7 @@ string getDescriptionForAlertCandidate(
|
||||
) {
|
||||
result = "excluded[reason=" + getAReasonSinkExcluded(sinkCandidate, query) + "]"
|
||||
or
|
||||
getAtmCfg(query).isKnownSink(sinkCandidate) and
|
||||
getDataFlowCfg(query).(AtmConfig).isKnownSink(sinkCandidate) and
|
||||
result = "excluded[reason=known-sink]"
|
||||
or
|
||||
not exists(getAReasonSinkExcluded(sinkCandidate, query)) and
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
*
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Defines files that should be excluded from the evaluation of ML models.
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
/*
|
||||
* For internal use only.
|
||||
*
|
||||
* Extracts training and evaluation data we can use to train ML models for ML-powered queries.
|
||||
*/
|
||||
|
||||
import ExtractEndpointData as ExtractEndpointData
|
||||
|
||||
query predicate endpoints = ExtractEndpointData::endpoints/5;
|
||||
|
||||
query predicate tokenFeatures = ExtractEndpointData::tokenFeatures/3;
|
||||
@@ -1,215 +0,0 @@
|
||||
/*
|
||||
* For internal use only.
|
||||
*
|
||||
* Library code for training and evaluation data we can use to train ML models for ML-powered
|
||||
* queries.
|
||||
*/
|
||||
|
||||
import javascript
|
||||
import Exclusions as Exclusions
|
||||
import evaluation.EndToEndEvaluation as EndToEndEvaluation
|
||||
import experimental.adaptivethreatmodeling.ATMConfig
|
||||
import experimental.adaptivethreatmodeling.CoreKnowledge as CoreKnowledge
|
||||
import experimental.adaptivethreatmodeling.EndpointFeatures as EndpointFeatures
|
||||
import experimental.adaptivethreatmodeling.EndpointScoring as EndpointScoring
|
||||
import experimental.adaptivethreatmodeling.EndpointTypes
|
||||
import experimental.adaptivethreatmodeling.FilteringReasons
|
||||
import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
|
||||
/** DEPRECATED: Alias for NosqlInjectionAtm */
|
||||
deprecated module NosqlInjectionATM = NosqlInjectionAtm;
|
||||
|
||||
import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
|
||||
/** DEPRECATED: Alias for SqlInjectionAtm */
|
||||
deprecated module SqlInjectionATM = SqlInjectionAtm;
|
||||
|
||||
import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
|
||||
/** DEPRECATED: Alias for TaintedPathAtm */
|
||||
deprecated module TaintedPathATM = TaintedPathAtm;
|
||||
|
||||
import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
|
||||
/** DEPRECATED: Alias for XssAtm */
|
||||
deprecated module XssATM = XssAtm;
|
||||
|
||||
import Labels
|
||||
import NoFeaturizationRestrictionsConfig
|
||||
import Queries
|
||||
|
||||
/** Gets the ATM configuration object for the specified query. */
|
||||
AtmConfig getAtmCfg(Query query) {
|
||||
query instanceof NosqlInjectionQuery and
|
||||
result instanceof NosqlInjectionAtm::NosqlInjectionAtmConfig
|
||||
or
|
||||
query instanceof SqlInjectionQuery and result instanceof SqlInjectionAtm::SqlInjectionAtmConfig
|
||||
or
|
||||
query instanceof TaintedPathQuery and result instanceof TaintedPathAtm::TaintedPathAtmConfig
|
||||
or
|
||||
query instanceof XssQuery and result instanceof XssAtm::DomBasedXssAtmConfig
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for getAtmCfg */
|
||||
deprecated ATMConfig getATMCfg(Query query) { result = getAtmCfg(query) }
|
||||
|
||||
/** Gets the ATM data flow configuration for the specified query. */
|
||||
DataFlow::Configuration getDataFlowCfg(Query query) {
|
||||
query instanceof NosqlInjectionQuery and result instanceof NosqlInjectionAtm::Configuration
|
||||
or
|
||||
query instanceof SqlInjectionQuery and result instanceof SqlInjectionAtm::Configuration
|
||||
or
|
||||
query instanceof TaintedPathQuery and result instanceof TaintedPathAtm::Configuration
|
||||
or
|
||||
query instanceof XssQuery and result instanceof XssAtm::Configuration
|
||||
}
|
||||
|
||||
/** Gets a known sink for the specified query. */
|
||||
private DataFlow::Node getASink(Query query) {
|
||||
getAtmCfg(query).isKnownSink(result) and
|
||||
// Only consider the source code for the project being analyzed.
|
||||
exists(result.getFile().getRelativePath())
|
||||
}
|
||||
|
||||
/** Gets a data flow node that is known not to be a sink for the specified query. */
|
||||
private DataFlow::Node getANotASink(NotASinkReason reason) {
|
||||
CoreKnowledge::isOtherModeledArgument(result, reason) and
|
||||
// Some endpoints can be assigned both a `NotASinkReason` and a `LikelyNotASinkReason`. We
|
||||
// consider these endpoints to be `LikelyNotASink`, therefore this line excludes them from the
|
||||
// definition of `NotASink`.
|
||||
not CoreKnowledge::isOtherModeledArgument(result, any(LikelyNotASinkReason t)) and
|
||||
not result = getASink(_) and
|
||||
// Only consider the source code for the project being analyzed.
|
||||
exists(result.getFile().getRelativePath())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a data flow node whose label is unknown for the specified query.
|
||||
*
|
||||
* In other words, this is an endpoint that is not `Sink`, `NotASink`, or `LikelyNotASink` for the
|
||||
* specified query.
|
||||
*/
|
||||
private DataFlow::Node getAnUnknown(Query query) {
|
||||
getAtmCfg(query).isEffectiveSink(result) and
|
||||
// Effective sinks should exclude sinks but this is a defensive requirement
|
||||
not result = getASink(query) and
|
||||
// Effective sinks should exclude NotASink but for some queries (e.g. Xss) this is currently not always the case and
|
||||
// so this is a defensive requirement
|
||||
not result = getANotASink(_) and
|
||||
// Only consider the source code for the project being analyzed.
|
||||
exists(result.getFile().getRelativePath())
|
||||
}
|
||||
|
||||
/** Gets the query-specific sink label for the given endpoint, if such a label exists. */
|
||||
private EndpointLabel getSinkLabelForEndpoint(DataFlow::Node endpoint, Query query) {
|
||||
endpoint = getASink(query) and result instanceof SinkLabel
|
||||
or
|
||||
endpoint = getANotASink(_) and result instanceof NotASinkLabel
|
||||
or
|
||||
endpoint = getAnUnknown(query) and result instanceof UnknownLabel
|
||||
}
|
||||
|
||||
/** Gets an endpoint that should be extracted. */
|
||||
DataFlow::Node getAnEndpoint(Query query) { exists(getSinkLabelForEndpoint(result, query)) }
|
||||
|
||||
/**
|
||||
* Endpoints and associated metadata.
|
||||
*
|
||||
* Note that we draw a distinction between _features_, that are provided to the model at training
|
||||
* and query time, and _metadata_, that is only provided to the model at training time.
|
||||
*
|
||||
* Internal: See the design document for
|
||||
* [extensible extraction queries](https://docs.google.com/document/d/1g3ci2Nf1hGMG6ZUP0Y4PqCy_8elcoC_dhBvgTxdAWpg)
|
||||
* for technical information about the design of this predicate.
|
||||
*/
|
||||
predicate endpoints(
|
||||
DataFlow::Node endpoint, string queryName, string key, string value, string valueType
|
||||
) {
|
||||
exists(Query query |
|
||||
// Only provide metadata for labelled endpoints, since we do not extract all endpoints.
|
||||
endpoint = getAnEndpoint(query) and
|
||||
queryName = query.getName() and
|
||||
(
|
||||
// Holds if there is a taint flow path from a known source to the endpoint
|
||||
key = "hasFlowFromSource" and
|
||||
(
|
||||
if FlowFromSource::hasFlowFromSource(endpoint, query)
|
||||
then value = "true"
|
||||
else value = "false"
|
||||
) and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// Constant expressions always evaluate to a constant primitive value. Therefore they can't ever
|
||||
// appear in an alert, making them less interesting training examples.
|
||||
key = "isConstantExpression" and
|
||||
(if endpoint.asExpr() instanceof ConstantExpr then value = "true" else value = "false") and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// Holds if alerts involving the endpoint are excluded from the end-to-end evaluation.
|
||||
key = "isExcludedFromEndToEndEvaluation" and
|
||||
(if Exclusions::isFileExcluded(endpoint.getFile()) then value = "true" else value = "false") and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// The label for this query, considering the endpoint as a sink.
|
||||
key = "sinkLabel" and
|
||||
value = getSinkLabelForEndpoint(endpoint, query).getEncoding() and
|
||||
valueType = "string"
|
||||
or
|
||||
// The reason, or reasons, why the endpoint was labeled NotASink for this query.
|
||||
key = "notASinkReason" and
|
||||
exists(FilteringReason reason |
|
||||
endpoint = getANotASink(reason) and
|
||||
value = reason.getDescription()
|
||||
) and
|
||||
valueType = "string"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* `EndpointFeatures::tokenFeatures` has no results when `featureName` is absent for the endpoint
|
||||
* `endpoint`. To preserve compatibility with the data pipeline, this relation will instead set
|
||||
* `featureValue` to the empty string in this case.
|
||||
*/
|
||||
predicate tokenFeatures(DataFlow::Node endpoint, string featureName, string featureValue) {
|
||||
endpoints(endpoint, _, _, _, _) and
|
||||
(
|
||||
EndpointFeatures::tokenFeatures(endpoint, featureName, featureValue)
|
||||
or
|
||||
// Performance note: this creates a Cartesian product between `endpoint` and `featureName`.
|
||||
featureName = EndpointFeatures::getASupportedFeatureName() and
|
||||
not exists(string value | EndpointFeatures::tokenFeatures(endpoint, featureName, value)) and
|
||||
featureValue = ""
|
||||
)
|
||||
}
|
||||
|
||||
module FlowFromSource {
|
||||
predicate hasFlowFromSource(DataFlow::Node endpoint, Query q) {
|
||||
exists(Configuration cfg | cfg.getQuery() = q | cfg.hasFlow(_, endpoint))
|
||||
}
|
||||
|
||||
/**
|
||||
* A data flow configuration that replicates the data flow configuration for a specific query, but
|
||||
* replaces the set of sinks with the set of endpoints we're extracting.
|
||||
*
|
||||
* We use this to find out when there is flow to a particular endpoint from a known source.
|
||||
*
|
||||
* This configuration behaves in a very similar way to the `ForwardExploringConfiguration` class
|
||||
* from the CodeQL standard libraries for JavaScript.
|
||||
*/
|
||||
private class Configuration extends DataFlow::Configuration {
|
||||
Query q;
|
||||
|
||||
Configuration() { this = getDataFlowCfg(q) }
|
||||
|
||||
Query getQuery() { result = q }
|
||||
|
||||
/** Holds if `sink` is an endpoint we're extracting. */
|
||||
override predicate isSink(DataFlow::Node sink) { sink = getAnEndpoint(q) }
|
||||
|
||||
/** Holds if `sink` is an endpoint we're extracting. */
|
||||
override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel lbl) {
|
||||
sink = getAnEndpoint(q) and exists(lbl)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,23 +4,8 @@
|
||||
* Extracts training data we can use to train ML models for ML-powered queries.
|
||||
*/
|
||||
|
||||
import javascript
|
||||
import ExtractEndpointData as ExtractEndpointData
|
||||
private import ExtractEndpointDataTraining as ExtractEndpointDataTraining
|
||||
|
||||
query predicate endpoints(
|
||||
DataFlow::Node endpoint, string queryName, string key, string value, string valueType
|
||||
) {
|
||||
ExtractEndpointData::endpoints(endpoint, queryName, key, value, valueType) and
|
||||
// only select endpoints that are either Sink or NotASink
|
||||
ExtractEndpointData::endpoints(endpoint, queryName, "sinkLabel", ["Sink", "NotASink"], "string") and
|
||||
// do not select endpoints filtered out by end-to-end evaluation
|
||||
ExtractEndpointData::endpoints(endpoint, queryName, "isExcludedFromEndToEndEvaluation", "false",
|
||||
"boolean") and
|
||||
// only select endpoints that can be part of a tainted flow
|
||||
ExtractEndpointData::endpoints(endpoint, queryName, "isConstantExpression", "false", "boolean")
|
||||
}
|
||||
query predicate endpoints = ExtractEndpointDataTraining::reformattedTrainingEndpoints/5;
|
||||
|
||||
query predicate tokenFeatures(DataFlow::Node endpoint, string featureName, string featureValue) {
|
||||
endpoints(endpoint, _, _, _, _) and
|
||||
ExtractEndpointData::tokenFeatures(endpoint, featureName, featureValue)
|
||||
}
|
||||
query predicate tokenFeatures = ExtractEndpointDataTraining::tokenFeatures/3;
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* Extracts training data we can use to train ML models for ML-powered queries.
|
||||
*/
|
||||
|
||||
import javascript
|
||||
import experimental.adaptivethreatmodeling.EndpointCharacteristics
|
||||
import experimental.adaptivethreatmodeling.EndpointFeatures as EndpointFeatures
|
||||
import NoFeaturizationRestrictionsConfig
|
||||
private import Exclusions as Exclusions
|
||||
import Queries
|
||||
private import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
private import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
private import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
|
||||
/**
|
||||
* Gets the set of featureName-featureValue pairs for each endpoint in the training set.
|
||||
*
|
||||
* `EndpointFeatures::tokenFeatures` has no results when `featureName` is absent for the endpoint
|
||||
* `endpoint`. To preserve compatibility with the data pipeline, this relation will instead set
|
||||
* `featureValue` to the empty string in this case.
|
||||
*/
|
||||
predicate tokenFeatures(DataFlow::Node endpoint, string featureName, string featureValue) {
|
||||
trainingEndpoints(endpoint, _, _) and
|
||||
(
|
||||
EndpointFeatures::tokenFeatures(endpoint, featureName, featureValue)
|
||||
or
|
||||
// Performance note: this creates a Cartesian product between `endpoint` and `featureName`.
|
||||
featureName = EndpointFeatures::getASupportedFeatureName() and
|
||||
not exists(string value | EndpointFeatures::tokenFeatures(endpoint, featureName, value)) and
|
||||
featureValue = ""
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the given endpoint should be included in the training set as a sample belonging to endpointClass, and has
|
||||
* the given characteristic. This query uses the endpoint characteristics to select and label endpoints for the training
|
||||
* set, and provides a list of characteristics for each endpoint in the training set, which is used in the modeling
|
||||
* code.
|
||||
*
|
||||
* Params:
|
||||
* endpoint: The endpoint to include / exclude.
|
||||
* endpointClass: The sink type. See the documentation of EndpointType.getEncoding for details about the relationship
|
||||
* between an EndpointType and a class in the classifier.
|
||||
* characteristic: Provides the list of characteristics that apply to the endpoint, which the modeling code currently
|
||||
* uses for type balancing.
|
||||
*
|
||||
* Note: This predicate will produce multiple tuples for endpoints that have multiple characteristics, which we must
|
||||
* then group together into a list of characteristics.
|
||||
*/
|
||||
query predicate trainingEndpoints(
|
||||
DataFlow::Node endpoint, EndpointType endpointClass, EndpointCharacteristic characteristic
|
||||
) {
|
||||
characteristic.appliesToEndpoint(endpoint) and
|
||||
// Only consider the source code for the project being analyzed.
|
||||
exists(endpoint.getFile().getRelativePath()) and
|
||||
// Only select endpoints that can be part of a tainted flow: Constant expressions always evaluate to a constant
|
||||
// primitive value. Therefore they can't ever appear in an alert, making them less interesting training examples.
|
||||
// TODO: Experiment with removing this requirement.
|
||||
not endpoint.asExpr() instanceof ConstantExpr and
|
||||
// Do not select endpoints filtered out by end-to-end evaluation.
|
||||
// TODO: Experiment with removing this requirement.
|
||||
not Exclusions::isFileExcluded(endpoint.getFile()) and
|
||||
// Filter out negative examples that also have a LikelyNotASinkReason, because this is currently done here
|
||||
// https://github.com/github/codeql/blob/387e57546bf7352f7c1cfe781daa1a3799b7063e/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/ExtractEndpointData.qll#L77
|
||||
// TODO: Experiment with removing this requirement.
|
||||
not (
|
||||
endpointClass instanceof NegativeType and
|
||||
exists(EndpointCharacteristic c |
|
||||
c.appliesToEndpoint(endpoint) and
|
||||
c instanceof LikelyNotASinkCharacteristic
|
||||
)
|
||||
) and
|
||||
// Don't surface endpoint filters as characteristics, because they were previously not surfaced.
|
||||
// TODO: Experiment with surfacing these to the modeling code by removing the following line (and then make
|
||||
// EndpointFilterCharacteristic private).
|
||||
not characteristic instanceof EndpointFilterCharacteristic and
|
||||
(
|
||||
// If the list of characteristics includes positive indicators with high confidence for this class, select this as a
|
||||
// training sample belonging to the class.
|
||||
exists(EndpointCharacteristic characteristic2, float confidence |
|
||||
characteristic2.appliesToEndpoint(endpoint) and
|
||||
characteristic2.hasImplications(endpointClass, true, confidence) and
|
||||
confidence >= characteristic2.getHighConfidenceThreshold()
|
||||
) and
|
||||
(
|
||||
// Temporarily limit this only to positive classes. For negative classes, additionally select only endpoints that
|
||||
// have no high confidence indicators that they are sinks, because this is what was previously done.
|
||||
// TODO: Experiment with removing this requirement, and instead ensuring that an endpoint never has both a high
|
||||
// confidence indicator that it _is_ a sink and a high confidence indicator that it is _not_ a sink.
|
||||
not endpointClass instanceof NegativeType
|
||||
or
|
||||
not exists(EndpointCharacteristic characteristic3, float confidence3, EndpointType posClass |
|
||||
characteristic3.appliesToEndpoint(endpoint) and
|
||||
characteristic3.hasImplications(posClass, true, confidence3) and
|
||||
confidence3 >= characteristic3.getHighConfidenceThreshold() and
|
||||
not posClass instanceof NegativeType
|
||||
)
|
||||
)
|
||||
or
|
||||
// If the list of characteristics includes negative indicators with high confidence for all classes other than 0,
|
||||
// select this as a training sample of class 0 (this means we had query-specific characteristics to decide this
|
||||
// endpoint isn't a sink for each of our sink types).
|
||||
endpointClass instanceof NegativeType and
|
||||
forall(EndpointType otherClass | not otherClass instanceof NegativeType |
|
||||
exists(EndpointCharacteristic characteristic2, float confidence |
|
||||
characteristic2.appliesToEndpoint(endpoint) and
|
||||
characteristic2.hasImplications(otherClass, false, confidence) and
|
||||
confidence >= characteristic2.getHighConfidenceThreshold()
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary:
|
||||
* Reformat the training data that was extracted with the new logic to match the format produced by the old predicate.
|
||||
* This is the format expected by the endpoint pipeline.
|
||||
*/
|
||||
query predicate reformattedTrainingEndpoints(
|
||||
DataFlow::Node endpoint, string queryName, string key, string value, string valueType
|
||||
) {
|
||||
trainingEndpoints(endpoint, _, _) and
|
||||
exists(Query query |
|
||||
queryName = query.getName() and
|
||||
// For sinks, only list that sink type, but for non-sinks, list all sink types.
|
||||
(
|
||||
exists(EndpointType endpointClass |
|
||||
endpointClass.getDescription().matches(queryName + "%") and
|
||||
not endpointClass instanceof NegativeType and
|
||||
trainingEndpoints(endpoint, endpointClass, _)
|
||||
)
|
||||
or
|
||||
exists(EndpointType endpointClass |
|
||||
endpointClass instanceof NegativeType and
|
||||
trainingEndpoints(endpoint, endpointClass, _)
|
||||
)
|
||||
) and
|
||||
(
|
||||
// NOTE: We don't use hasFlowFromSource in training, so we could just hardcode it to be false.
|
||||
key = "hasFlowFromSource" and
|
||||
(
|
||||
if FlowFromSource::hasFlowFromSource(endpoint, query)
|
||||
then value = "true"
|
||||
else value = "false"
|
||||
) and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// Constant expressions always evaluate to a constant primitive value. Therefore they can't ever
|
||||
// appear in an alert, making them less interesting training examples.
|
||||
key = "isConstantExpression" and
|
||||
(if endpoint.asExpr() instanceof ConstantExpr then value = "true" else value = "false") and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// Holds if alerts involving the endpoint are excluded from the end-to-end evaluation.
|
||||
key = "isExcludedFromEndToEndEvaluation" and
|
||||
(if Exclusions::isFileExcluded(endpoint.getFile()) then value = "true" else value = "false") and
|
||||
valueType = "boolean"
|
||||
or
|
||||
// The label for this query, considering the endpoint as a sink.
|
||||
key = "sinkLabel" and
|
||||
valueType = "string" and
|
||||
value = "Sink" and
|
||||
exists(EndpointType endpointClass |
|
||||
endpointClass.getDescription().matches(queryName + "%") and
|
||||
not endpointClass instanceof NegativeType and
|
||||
trainingEndpoints(endpoint, endpointClass, _)
|
||||
)
|
||||
or
|
||||
key = "sinkLabel" and
|
||||
valueType = "string" and
|
||||
value = "NotASink" and
|
||||
exists(EndpointType endpointClass |
|
||||
endpointClass instanceof NegativeType and
|
||||
trainingEndpoints(endpoint, endpointClass, _)
|
||||
)
|
||||
or
|
||||
// The reason, or reasons, why the endpoint was labeled NotASink for this query, only for negative examples.
|
||||
key = "notASinkReason" and
|
||||
exists(EndpointCharacteristic characteristic, EndpointType endpointClass |
|
||||
characteristic.appliesToEndpoint(endpoint) and
|
||||
characteristic.hasImplications(endpointClass, true, _) and
|
||||
endpointClass instanceof NegativeType and
|
||||
value = characteristic
|
||||
) and
|
||||
// Don't include a notASinkReason for endpoints that are also known sinks.
|
||||
not exists(EndpointCharacteristic characteristic3, float confidence3, EndpointType posClass |
|
||||
characteristic3.appliesToEndpoint(endpoint) and
|
||||
characteristic3.hasImplications(posClass, true, confidence3) and
|
||||
confidence3 >= characteristic3.getHighConfidenceThreshold() and
|
||||
not posClass instanceof NegativeType
|
||||
) and
|
||||
// Don't surface endpoint filters as notASinkReasons, because they were previously not surfaced.
|
||||
// TODO: Experiment with surfacing these to the modeling code by removing the following line (and then make
|
||||
// EndpointFilterCharacteristic private).
|
||||
not value instanceof EndpointFilterCharacteristic and
|
||||
valueType = "string"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the ATM data flow configuration for the specified query.
|
||||
* TODO: Delete this once we are no longer surfacing `hasFlowFromSource`.
|
||||
*/
|
||||
DataFlow::Configuration getDataFlowCfg(Query query) {
|
||||
query instanceof NosqlInjectionQuery and
|
||||
result instanceof NosqlInjectionAtm::NosqlInjectionAtmConfig
|
||||
or
|
||||
query instanceof SqlInjectionQuery and result instanceof SqlInjectionAtm::SqlInjectionAtmConfig
|
||||
or
|
||||
query instanceof TaintedPathQuery and result instanceof TaintedPathAtm::TaintedPathAtmConfig
|
||||
or
|
||||
query instanceof XssQuery and result instanceof XssAtm::DomBasedXssAtmConfig
|
||||
or
|
||||
query instanceof XssThroughDomQuery and result instanceof XssThroughDomAtm::XssThroughDomAtmConfig
|
||||
}
|
||||
|
||||
// TODO: Delete this once we are no longer surfacing `hasFlowFromSource`.
|
||||
private module FlowFromSource {
|
||||
predicate hasFlowFromSource(DataFlow::Node endpoint, Query q) {
|
||||
exists(Configuration cfg | cfg.getQuery() = q | cfg.hasFlow(_, endpoint))
|
||||
}
|
||||
|
||||
/**
|
||||
* A data flow configuration that replicates the data flow configuration for a specific query, but
|
||||
* replaces the set of sinks with the set of endpoints we're extracting.
|
||||
*
|
||||
* We use this to find out when there is flow to a particular endpoint from a known source.
|
||||
*
|
||||
* This configuration behaves in a very similar way to the `ForwardExploringConfiguration` class
|
||||
* from the CodeQL standard libraries for JavaScript.
|
||||
*/
|
||||
private class Configuration extends DataFlow::Configuration {
|
||||
Query q;
|
||||
|
||||
Configuration() { this = getDataFlowCfg(q) }
|
||||
|
||||
Query getQuery() { result = q }
|
||||
|
||||
/** Holds if `sink` is an endpoint we're extracting. */
|
||||
override predicate isSink(DataFlow::Node sink) { any() }
|
||||
|
||||
/** Holds if `sink` is an endpoint we're extracting. */
|
||||
override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel lbl) { exists(lbl) }
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
import experimental.adaptivethreatmodeling.AdaptiveThreatModeling
|
||||
|
||||
from string queryName, AtmConfig c, EndpointType e
|
||||
@@ -23,6 +24,8 @@ where
|
||||
c instanceof TaintedPathAtm::TaintedPathAtmConfig
|
||||
or
|
||||
queryName = "Xss" and c instanceof XssAtm::DomBasedXssAtmConfig
|
||||
or
|
||||
queryName = "XssThroughDom" and c instanceof XssThroughDomAtm::XssThroughDomAtmConfig
|
||||
) and
|
||||
e = c.getASinkEndpointType()
|
||||
select queryName, e.getEncoding() as label
|
||||
|
||||
@@ -8,7 +8,8 @@ newtype TQuery =
|
||||
TNosqlInjectionQuery() or
|
||||
TSqlInjectionQuery() or
|
||||
TTaintedPathQuery() or
|
||||
TXssQuery()
|
||||
TXssQuery() or
|
||||
TXssThroughDomQuery()
|
||||
|
||||
abstract class Query extends TQuery {
|
||||
abstract string getName();
|
||||
@@ -31,3 +32,7 @@ class TaintedPathQuery extends Query, TTaintedPathQuery {
|
||||
class XssQuery extends Query, TXssQuery {
|
||||
override string getName() { result = "Xss" }
|
||||
}
|
||||
|
||||
class XssThroughDomQuery extends Query, TXssThroughDomQuery {
|
||||
override string getName() { result = "XssThroughDom" }
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
name: codeql/javascript-experimental-atm-model-building
|
||||
description: CodeQL libraries for building machine learning models for the experimental ML-powered queries
|
||||
extractor: javascript
|
||||
library: false
|
||||
groups:
|
||||
|
||||
@@ -17,11 +17,8 @@ import ATM::ResultsInfo
|
||||
import DataFlow::PathGraph
|
||||
import experimental.adaptivethreatmodeling.NosqlInjectionATM
|
||||
|
||||
from DataFlow::Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where
|
||||
cfg.hasFlowPath(source, sink) and
|
||||
not isFlowLikelyInBaseQuery(source.getNode(), sink.getNode()) and
|
||||
score = getScoreForFlow(source.getNode(), sink.getNode())
|
||||
from AtmConfig cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where cfg.hasBoostedFlowPath(source, sink, score)
|
||||
select sink.getNode(), source, sink,
|
||||
"(Experimental) This may be a database query that depends on $@. Identified using machine learning.",
|
||||
source.getNode(), "a user-provided value", score
|
||||
|
||||
@@ -17,11 +17,8 @@ import experimental.adaptivethreatmodeling.SqlInjectionATM
|
||||
import ATM::ResultsInfo
|
||||
import DataFlow::PathGraph
|
||||
|
||||
from DataFlow::Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where
|
||||
cfg.hasFlowPath(source, sink) and
|
||||
not isFlowLikelyInBaseQuery(source.getNode(), sink.getNode()) and
|
||||
score = getScoreForFlow(source.getNode(), sink.getNode())
|
||||
from AtmConfig cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where cfg.hasBoostedFlowPath(source, sink, score)
|
||||
select sink.getNode(), source, sink,
|
||||
"(Experimental) This may be a database query that depends on $@. Identified using machine learning.",
|
||||
source.getNode(), "a user-provided value", score
|
||||
|
||||
@@ -21,11 +21,8 @@ import ATM::ResultsInfo
|
||||
import DataFlow::PathGraph
|
||||
import experimental.adaptivethreatmodeling.TaintedPathATM
|
||||
|
||||
from DataFlow::Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where
|
||||
cfg.hasFlowPath(source, sink) and
|
||||
not isFlowLikelyInBaseQuery(source.getNode(), sink.getNode()) and
|
||||
score = getScoreForFlow(source.getNode(), sink.getNode())
|
||||
from AtmConfig cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where cfg.hasBoostedFlowPath(source, sink, score)
|
||||
select sink.getNode(), source, sink,
|
||||
"(Experimental) This may be a path that depends on $@. Identified using machine learning.",
|
||||
source.getNode(), "a user-provided value", score
|
||||
|
||||
@@ -18,11 +18,8 @@ import ATM::ResultsInfo
|
||||
import DataFlow::PathGraph
|
||||
import experimental.adaptivethreatmodeling.XssATM
|
||||
|
||||
from DataFlow::Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where
|
||||
cfg.hasFlowPath(source, sink) and
|
||||
not isFlowLikelyInBaseQuery(source.getNode(), sink.getNode()) and
|
||||
score = getScoreForFlow(source.getNode(), sink.getNode())
|
||||
from AtmConfig cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where cfg.hasBoostedFlowPath(source, sink, score)
|
||||
select sink.getNode(), source, sink,
|
||||
"(Experimental) This may be a cross-site scripting vulnerability due to $@. Identified using machine learning.",
|
||||
source.getNode(), "a user-provided value", score
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* For internal use only.
|
||||
*
|
||||
* @name DOM text reinterpreted as HTML (experimental)
|
||||
* @description Reinterpreting text from the DOM as HTML can lead
|
||||
* to a cross-site scripting vulnerability.
|
||||
* @kind path-problem
|
||||
* @scored
|
||||
* @problem.severity error
|
||||
* @security-severity 6.1
|
||||
* @id js/ml-powered/xss-through-dom
|
||||
* @tags experimental security
|
||||
* external/cwe/cwe-079 external/cwe/cwe-116
|
||||
*/
|
||||
|
||||
import javascript
|
||||
import ATM::ResultsInfo
|
||||
import DataFlow::PathGraph
|
||||
import experimental.adaptivethreatmodeling.XssThroughDomATM
|
||||
|
||||
from AtmConfig cfg, DataFlow::PathNode source, DataFlow::PathNode sink, float score
|
||||
where cfg.hasBoostedFlowPath(source, sink, score)
|
||||
select sink.getNode(), source, sink,
|
||||
"(Experimental) $@ may be reinterpreted as HTML without escaping meta-characters. Identified using machine learning.",
|
||||
source.getNode(), "DOM text", score
|
||||
@@ -1,4 +1,5 @@
|
||||
name: codeql/javascript-experimental-atm-queries
|
||||
description: Experimental ML-powered queries for JavaScript
|
||||
language: javascript
|
||||
version: 0.4.4
|
||||
suites: codeql-suites
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
erroneousEndpoints
|
||||
erroneousConfidences
|
||||
@@ -0,0 +1,90 @@
|
||||
/**
|
||||
* ContradictoryEndpointCharacteristics.ql
|
||||
*
|
||||
* This tests surfaces endpoints that have a set of characteristics are logically incompatible with one another (e.g one
|
||||
* high-confidence characteristic that implies a non-sink and another that implies a sink). If the test surfaces any
|
||||
* such endpoints, this is a hint that some of our endpoint characteristics may be need to be adjusted.
|
||||
*/
|
||||
|
||||
import javascript
|
||||
private import experimental.adaptivethreatmodeling.EndpointCharacteristics as EndpointCharacteristics
|
||||
private import experimental.adaptivethreatmodeling.EndpointTypes as EndpointTypes
|
||||
|
||||
/**
|
||||
* Holds if `characteristic1` and `characteristic2` are among the several pairs of currently known high-confidence
|
||||
* negative characteristics that apply to some known sinks.
|
||||
*
|
||||
* TODO: Experiment with lowering the confidence of `"FileSystemAccess"`, `"DOM"`, `"DatabaseAccess"`, and
|
||||
* `"JQueryArgument"`.
|
||||
*/
|
||||
private predicate knownContradictoryCharacteristics(
|
||||
EndpointCharacteristics::EndpointCharacteristic characteristic1,
|
||||
EndpointCharacteristics::EndpointCharacteristic characteristic2
|
||||
) {
|
||||
characteristic1 != characteristic2 and
|
||||
(
|
||||
characteristic1 = ["TaintedPathSink", "FileSystemAccess"] and
|
||||
characteristic2 = ["TaintedPathSink", "FileSystemAccess"]
|
||||
or
|
||||
characteristic1 = ["DomBasedXssSink", "DOM"] and
|
||||
characteristic2 = ["DomBasedXssSink", "DOM"]
|
||||
or
|
||||
characteristic1 = ["DomBasedXssSink", "JQueryArgument"] and
|
||||
characteristic2 = ["DomBasedXssSink", "JQueryArgument"]
|
||||
or
|
||||
characteristic1 = ["NosqlInjectionSink", "DatabaseAccess"] and
|
||||
characteristic2 = ["NosqlInjectionSink", "DatabaseAccess"]
|
||||
or
|
||||
characteristic1 = ["SqlInjectionSink", "DatabaseAccess"] and
|
||||
characteristic2 = ["SqlInjectionSink", "DatabaseAccess"]
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the given endpoint has a self-contradictory combination of characteristics. Detects errors in our endpoint
|
||||
* characteristics. Lists the problematic characterisitics and their implications for all such endpoints, together with
|
||||
* an error message indicating why this combination is problematic.
|
||||
*/
|
||||
query predicate erroneousEndpoints(
|
||||
DataFlow::Node endpoint, EndpointCharacteristics::EndpointCharacteristic characteristic,
|
||||
EndpointTypes::EndpointType endpointClass, float confidence, string errorMessage
|
||||
) {
|
||||
// An endpoint's characteristics should not include positive indicators with medium/high confidence for more than one
|
||||
// class.
|
||||
exists(
|
||||
EndpointCharacteristics::EndpointCharacteristic characteristic2,
|
||||
EndpointTypes::EndpointType endpointClass2, float confidence2
|
||||
|
|
||||
endpointClass.getEncoding() != endpointClass2.getEncoding() and
|
||||
characteristic.appliesToEndpoint(endpoint) and
|
||||
characteristic2.appliesToEndpoint(endpoint) and
|
||||
characteristic.hasImplications(endpointClass, true, confidence) and
|
||||
characteristic2.hasImplications(endpointClass2, true, confidence2) and
|
||||
confidence > characteristic.mediumConfidence() and
|
||||
confidence2 > characteristic2.mediumConfidence() and
|
||||
// We currently know of several high-confidence negative characteristics that apply to some known sinks.
|
||||
not knownContradictoryCharacteristics(characteristic, characteristic2)
|
||||
) and
|
||||
errorMessage = "Endpoint has high-confidence positive indicators for multiple classes"
|
||||
or
|
||||
// An enpoint's characteristics should not include positive indicators with medium/high confidence for some class and
|
||||
// also include negative indicators with medium/high confidence for this same class.
|
||||
exists(EndpointCharacteristics::EndpointCharacteristic characteristic2, float confidence2 |
|
||||
characteristic.appliesToEndpoint(endpoint) and
|
||||
characteristic2.appliesToEndpoint(endpoint) and
|
||||
characteristic.hasImplications(endpointClass, true, confidence) and
|
||||
characteristic2.hasImplications(endpointClass, false, confidence2) and
|
||||
confidence > characteristic.mediumConfidence() and
|
||||
confidence2 > characteristic2.mediumConfidence()
|
||||
) and
|
||||
errorMessage = "Endpoint has high-confidence positive and negative indicators for the same class"
|
||||
}
|
||||
|
||||
query predicate erroneousConfidences(
|
||||
EndpointCharacteristics::EndpointCharacteristic characteristic, float confidence,
|
||||
string errorMessage
|
||||
) {
|
||||
characteristic.hasImplications(_, _, confidence) and
|
||||
(confidence < 0 or confidence > 1) and
|
||||
errorMessage = "Characteristic has an indicator with confidence outside of [0, 1]"
|
||||
}
|
||||
@@ -11,17 +11,20 @@ import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAt
|
||||
import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
import experimental.adaptivethreatmodeling.EndpointFeatures as EndpointFeatures
|
||||
import experimental.adaptivethreatmodeling.StandardEndpointFilters as StandardEndpointFilters
|
||||
import extraction.NoFeaturizationRestrictionsConfig
|
||||
private import experimental.adaptivethreatmodeling.EndpointCharacteristics as EndpointCharacteristics
|
||||
|
||||
query predicate tokenFeatures(DataFlow::Node endpoint, string featureName, string featureValue) {
|
||||
(
|
||||
not exists(NosqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(SqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(TaintedPathAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(XssAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint)) or
|
||||
StandardEndpointFilters::isArgumentToModeledFunction(endpoint)
|
||||
not exists(any(NosqlInjectionAtm::NosqlInjectionAtmConfig cfg).getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(any(SqlInjectionAtm::SqlInjectionAtmConfig cfg).getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(any(TaintedPathAtm::TaintedPathAtmConfig cfg).getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(any(XssAtm::DomBasedXssAtmConfig cfg).getAReasonSinkExcluded(endpoint)) or
|
||||
not exists(any(XssThroughDomAtm::XssThroughDomAtmConfig cfg).getAReasonSinkExcluded(endpoint)) or
|
||||
any(EndpointCharacteristics::IsArgumentToModeledFunctionCharacteristic characteristic)
|
||||
.appliesToEndpoint(endpoint)
|
||||
) and
|
||||
EndpointFeatures::tokenFeatures(endpoint, featureName, featureValue)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
extraction/ExtractEndpointData.ql
|
||||
@@ -0,0 +1,278 @@
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:14:30:14:30 | v |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:22:33:22:33 | v |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:23:33:23:33 | v |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:26:25:26:29 | query |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:77:22:77:24 | tag |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:85:20:85:22 | tag |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:130:23:130:24 | id |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:131:30:131:31 | id |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:11:22:11:22 | v |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:12:22:12:32 | req.body.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:13:22:13:37 | `${req.body.id}` |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:26:13:26:25 | req.params.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:41:7:41:20 | req.params.foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:48:13:48:27 | req.params.name |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:55:13:55:27 | req.params.name |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:63:23:63:27 | query |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/redis.js:52:28:52:30 | key |
|
||||
| DomBasedXssAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst3.js:16:23:16:41 | req.params.category |
|
||||
| DomBasedXssAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:312:19:312:22 | path |
|
||||
| DomBasedXssAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:321:19:321:32 | normalizedPath |
|
||||
| DomBasedXssAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:328:19:328:32 | normalizedPath |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:7:47:7:69 | classNa ... w.name) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:8:47:8:70 | classNa ... w.name) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:9:47:9:70 | classNa ... w.name) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:10:45:10:55 | window.name |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:11:47:11:64 | unsafeStyle('foo') |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:13:47:13:68 | safeSty ... w.name) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:15:47:15:63 | clsx(window.name) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:15:65:15:69 | taint |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:17:49:17:53 | taint |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/event-handler-receiver.js:2:49:2:61 | location.href |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/jquery.js:7:20:7:26 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/jquery.js:10:13:10:31 | location.toString() |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:10:30:10:47 | req.query.receiver |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:12:11:12:69 | `Hi, yo ... sage}.` |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/sanitiser.js:23:29:23:35 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/sanitiser.js:30:29:30:35 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/sanitiser.js:33:29:33:35 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/sanitiser.js:38:29:38:35 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/sanitiser.js:45:29:45:35 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/stored-xss.js:12:35:12:38 | href |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:6:27:6:32 | data.w |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:11:36:11:41 | data.w |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:15:23:15:29 | data[p] |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:8:37:8:114 | documen ... t=")+8) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:12:28:12:33 | target |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:15:37:15:42 | target |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:43:20:43:20 | s |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:83:29:83:52 | documen ... .search |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:86:31:86:54 | documen ... .search |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:87:28:87:51 | documen ... .search |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:357:20:357:25 | target |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:361:14:361:19 | target |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:4:14:4:20 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:5:12:5:18 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:7:14:7:20 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:9:19:9:25 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:10:16:10:22 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:12:19:12:25 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/DomBasedXss/various-concat-obfuscations.js:15:27:15:55 | (attrs. ... 'left') |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:5:11:5:11 | x |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:9:11:9:13 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:21:11:21:21 | foo + "bar" |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:27:19:27:21 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:33:11:33:22 | ["bar", foo] |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:33:19:33:21 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:68:19:68:21 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:89:11:89:26 | foo.match(/foo/) |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:95:11:95:22 | [foo, "bar"] |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:95:12:95:14 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:102:12:102:14 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:117:11:117:23 | req.params.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:128:11:128:52 | session ... ssion') |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:136:10:136:22 | req.params.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:148:33:148:35 | foo |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:171:11:171:17 | tainted |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:180:10:180:22 | req.params.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:5:32:22 | ['body', req.body] |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:14:32:21 | req.body |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:70:47:70:54 | req.body |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:99:31:99:38 | req.body |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:102:68:102:75 | req.body |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXssGood.js:19:45:19:57 | req.params.id |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:13:42:13:48 | req.url |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:42:40:50 | [req.url] |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:43:40:49 | req.url |
|
||||
| DomBasedXssAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:49:38:49:44 | req.url |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:14:24:14:32 | { id: v } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:22:27:22:35 | { id: v } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:23:27:23:35 | { id: v } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:25:23:25:48 | JSON.pa ... y.data) |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:26:25:26:29 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/marsdb-flow-to.js:10:17:10:18 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/marsdb.js:12:17:12:18 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/minimongo.js:14:17:14:18 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:12:19:12:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:48:19:48:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:59:16:59:17 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:106:17:106:18 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb_bodySafe.js:12:19:12:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb_bodySafe.js:23:19:23:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:20:19:20:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:76:12:76:16 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:81:37:81:41 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:86:46:86:50 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:88:51:88:55 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:90:49:90:53 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:93:43:93:47 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:95:48:95:52 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:97:46:97:50 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:99:44:99:48 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseJsonParse.js:19:19:19:20 | {} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:6:15:7:55 | "SELECT ... PRICE" |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:63:23:63:27 | query |
|
||||
| NosqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/redis.js:52:28:52:30 | key |
|
||||
| NosqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:312:19:312:22 | path |
|
||||
| NosqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:321:19:321:32 | normalizedPath |
|
||||
| NosqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:328:19:328:32 | normalizedPath |
|
||||
| NosqlInjectionAtmConfig | autogenerated/TaintedPath/pupeteer.js:9:20:9:50 | { path: ... 'a4' } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/TaintedPath/pupeteer.js:13:29:13:45 | { path: tainted } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:15:65:15:69 | taint |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:17:49:17:53 | taint |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:8:22:14:3 | {\\n f ... OK\\n } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:10:30:10:47 | req.query.receiver |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:6:27:6:32 | data.w |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:11:36:11:41 | data.w |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:15:23:15:29 | data[p] |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:15:37:15:42 | target |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:83:29:83:52 | documen ... .search |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:86:31:86:54 | documen ... .search |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:87:28:87:51 | documen ... .search |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:199:32:199:75 | {danger ... inted}} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:200:32:200:75 | {danger ... inted}} |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:361:14:361:19 | target |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:5:11:5:11 | x |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:9:11:9:13 | foo |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:21:11:21:21 | foo + "bar" |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:27:11:27:23 | { prop: foo } |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:33:11:33:22 | ["bar", foo] |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:68:19:68:21 | foo |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:89:11:89:26 | foo.match(/foo/) |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:95:11:95:22 | [foo, "bar"] |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:102:12:102:14 | foo |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:117:11:117:23 | req.params.id |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:128:11:128:52 | session ... ssion') |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:136:10:136:22 | req.params.id |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:148:33:148:35 | foo |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:171:11:171:17 | tainted |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:180:10:180:22 | req.params.id |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:70:47:70:54 | req.body |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:99:31:99:38 | req.body |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:102:68:102:75 | req.body |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:13:42:13:48 | req.url |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:42:40:50 | [req.url] |
|
||||
| NosqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:49:38:49:44 | req.url |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:14:30:14:30 | v |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:22:33:22:33 | v |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:23:33:23:33 | v |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:25:23:25:48 | JSON.pa ... y.data) |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:26:25:26:29 | query |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:77:22:77:24 | tag |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:85:20:85:22 | tag |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:130:23:130:24 | id |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:131:30:131:31 | id |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:11:22:11:22 | v |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:12:22:12:32 | req.body.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:13:22:13:37 | `${req.body.id}` |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:6:15:7:34 | "SELECT ... ategory |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:6:15:7:55 | "SELECT ... PRICE" |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:26:13:26:25 | req.params.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:41:7:41:20 | req.params.foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:48:13:48:27 | req.params.name |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:55:13:55:27 | req.params.name |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:63:23:63:27 | query |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/redis.js:52:28:52:30 | key |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst3.js:7:16:8:34 | "SELECT ... ategory |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst3.js:7:16:8:55 | "SELECT ... PRICE" |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst3.js:16:23:16:41 | req.params.category |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst4.js:8:10:8:60 | 'SELECT ... rams.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst.js:10:10:10:58 | 'SELECT ... rams.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:312:19:312:22 | path |
|
||||
| SqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:321:19:321:32 | normalizedPath |
|
||||
| SqlInjectionAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:328:19:328:32 | normalizedPath |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/classnames.js:10:45:10:55 | window.name |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:15:65:15:69 | taint |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/dates.js:17:49:17:53 | taint |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:10:30:10:47 | req.query.receiver |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:12:11:12:69 | `Hi, yo ... sage}.` |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:6:27:6:32 | data.w |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:11:36:11:41 | data.w |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst3.js:15:23:15:29 | data[p] |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:15:37:15:42 | target |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:83:29:83:52 | documen ... .search |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/DomBasedXss/tst.js:86:31:86:54 | documen ... .search |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:5:11:5:11 | x |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:9:11:9:13 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:21:11:21:21 | foo + "bar" |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:27:19:27:21 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:33:19:33:21 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:68:19:68:21 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:89:11:89:26 | foo.match(/foo/) |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:95:12:95:14 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:102:12:102:14 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:117:11:117:23 | req.params.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:128:11:128:52 | session ... ssion') |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:136:10:136:22 | req.params.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:148:33:148:35 | foo |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:171:11:171:17 | tainted |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:180:10:180:22 | req.params.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:5:32:22 | ['body', req.body] |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:14:32:21 | req.body |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:70:47:70:54 | req.body |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXssGood.js:19:45:19:57 | req.params.id |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXssGood.js:49:34:49:43 | msg.length |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:13:42:13:48 | req.url |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:43:40:49 | req.url |
|
||||
| SqlInjectionAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:49:38:49:44 | req.url |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:14:30:14:30 | v |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:22:33:22:33 | v |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/typed/typedClient.ts:23:33:23:33 | v |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/json-schema-validator.js:26:25:26:29 | query |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:21:25:21:45 | '' + qu ... y.title |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:24:25:24:50 | query.b ... bstr(1) |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:77:22:77:24 | tag |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongodb.js:85:20:85:22 | tag |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:130:23:130:24 | id |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:131:30:131:31 | id |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:11:22:11:22 | v |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:12:22:12:32 | req.body.id |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/mongooseModelClient.js:13:22:13:37 | `${req.body.id}` |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:26:13:26:25 | req.params.id |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:41:7:41:20 | req.params.foo |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:48:13:48:27 | req.params.name |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:55:13:55:27 | req.params.name |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/pg-promise.js:63:23:63:27 | query |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/redis.js:52:28:52:30 | key |
|
||||
| TaintedPathAtmConfig | autogenerated/NosqlAndSqlInjection/untyped/tst3.js:16:23:16:41 | req.params.category |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/TaintedPath.js:115:12:115:51 | path.re ... /g, '') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/TaintedPath.js:116:12:116:36 | path.re ... /g, '') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/TaintedPath.js:128:11:128:50 | path.re ... /g, '') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/TaintedPath.js:129:12:129:36 | path.re ... /g, '') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:21:14:21:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:31:14:31:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:54:14:54:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:73:14:73:56 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:94:14:94:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:106:14:106:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:117:14:117:44 | fs.real ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:130:14:130:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:139:14:139:62 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:148:14:148:58 | 'foo/' ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:160:14:160:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:214:14:214:49 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:219:10:219:33 | decodeU ... t(path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:226:14:226:70 | pathMod ... g, ' ') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:230:12:230:36 | path.re ... /g, '') |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:236:14:236:47 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:254:14:254:47 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:312:19:312:22 | path |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:321:19:321:32 | normalizedPath |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:328:19:328:32 | normalizedPath |
|
||||
| TaintedPathAtmConfig | autogenerated/TaintedPath/normalizedPaths.js:339:13:339:46 | pathMod ... y.path) |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:10:30:10:47 | req.query.receiver |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/DomBasedXss/nodemailer.js:12:11:12:69 | `Hi, yo ... sage}.` |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:117:11:117:23 | req.params.id |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:136:10:136:22 | req.params.id |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ExceptionXss/exception-xss.js:180:10:180:22 | req.params.id |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:5:32:22 | ['body', req.body] |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:32:14:32:21 | req.body |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:70:47:70:54 | req.body |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:99:31:99:38 | req.body |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXss.js:102:68:102:75 | req.body |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXssGood.js:19:45:19:57 | req.params.id |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/ReflectedXssGood.js:49:34:49:43 | msg.length |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:13:42:13:48 | req.url |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:42:40:50 | [req.url] |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:40:43:40:49 | req.url |
|
||||
| TaintedPathAtmConfig | autogenerated/Xss/ReflectedXss/partial.js:49:38:49:44 | req.url |
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* ExtractEndpointDataInference.ql
|
||||
*
|
||||
* This test surfaces the endpoints that pass the endpoint filters and have flow from a source for each query config,
|
||||
* and are therefore used as candidates for scoring at inference time.
|
||||
*
|
||||
* This is equivalent to ExtractEndpointDataTraining.qlref, but testing the inference endpoints rather than the training
|
||||
* endpoints. It detects CodeQL changes that impact the endpoints that get scored at inference time.
|
||||
*
|
||||
* This test does not actually score the endpoints and test for changes in the model predictions: that gets done in the
|
||||
* integration tests.
|
||||
*/
|
||||
|
||||
private import javascript as JS
|
||||
import extraction.NoFeaturizationRestrictionsConfig
|
||||
private import experimental.adaptivethreatmodeling.ATMConfig as AtmConfig
|
||||
private import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
private import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
private import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
private import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
|
||||
query predicate isSinkCandidateForQuery(
|
||||
AtmConfig::AtmConfig queryConfig, JS::DataFlow::PathNode sink
|
||||
) {
|
||||
queryConfig.isSinkCandidateWithFlow(sink)
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,24 @@
|
||||
nosqlFilteredTruePositives
|
||||
| autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:111:14:111:18 | query | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/NosqlAndSqlInjection/untyped/mongoose.js:111:14:111:18 | query | not a direct argument to a likely external library call or a heuristic sink (nosql) |
|
||||
sqlFilteredTruePositives
|
||||
| autogenerated/NosqlAndSqlInjection/untyped/tst2.js:7:13:7:45 | select ... e id = | not an argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/NosqlAndSqlInjection/untyped/tst2.js:7:48:7:60 | req.params.id | not an argument to a likely external library call or a heuristic sink |
|
||||
taintedPathFilteredTruePositives
|
||||
| autogenerated/TaintedPath/TaintedPath.js:66:26:66:31 | "SAFE" | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/TaintedPath/TaintedPath.js:71:26:71:45 | Cookie.get("unsafe") | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/TaintedPath/TaintedPath.js:66:26:66:31 | "SAFE" | not a direct argument to a likely external library call or a heuristic sink (tainted path) |
|
||||
| autogenerated/TaintedPath/TaintedPath.js:71:26:71:45 | Cookie.get("unsafe") | not a direct argument to a likely external library call or a heuristic sink (tainted path) |
|
||||
xssFilteredTruePositives
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:12:20:12:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:14:20:14:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/express.js:7:15:7:33 | req.param("wobble") | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/jwt-server.js:11:19:11:29 | decoded.foo | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/tst.js:316:35:316:42 | location | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:10:16:10:18 | loc | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:25:18:25:20 | val | not a direct argument to a likely external library call or a heuristic sink |
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:12:20:12:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:14:20:14:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/express.js:7:15:7:33 | req.param("wobble") | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/jwt-server.js:11:19:11:29 | decoded.foo | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/tst.js:316:35:316:42 | location | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:10:16:10:18 | loc | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:25:18:25:20 | val | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
xssThroughDomFilteredTruePositives
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:12:20:12:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/d3.js:14:20:14:29 | getTaint() | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/express.js:7:15:7:33 | req.param("wobble") | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/jwt-server.js:11:19:11:29 | decoded.foo | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/tst.js:316:35:316:42 | location | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:10:16:10:18 | loc | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
| autogenerated/Xss/DomBasedXss/typeahead.js:25:18:25:20 | val | not a direct argument to a likely external library call or a heuristic sink (xss) |
|
||||
|
||||
@@ -16,32 +16,38 @@ import semmle.javascript.security.dataflow.NosqlInjectionCustomizations
|
||||
import semmle.javascript.security.dataflow.SqlInjectionCustomizations
|
||||
import semmle.javascript.security.dataflow.TaintedPathCustomizations
|
||||
import semmle.javascript.security.dataflow.DomBasedXssCustomizations
|
||||
import experimental.adaptivethreatmodeling.StandardEndpointFilters as StandardEndpointFilters
|
||||
import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
import experimental.adaptivethreatmodeling.SqlInjectionATM as SqlInjectionAtm
|
||||
import experimental.adaptivethreatmodeling.TaintedPathATM as TaintedPathAtm
|
||||
import experimental.adaptivethreatmodeling.XssATM as XssAtm
|
||||
import experimental.adaptivethreatmodeling.XssThroughDomATM as XssThroughDomAtm
|
||||
|
||||
query predicate nosqlFilteredTruePositives(DataFlow::Node endpoint, string reason) {
|
||||
endpoint instanceof NosqlInjection::Sink and
|
||||
reason = NosqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint) and
|
||||
reason = any(NosqlInjectionAtm::NosqlInjectionAtmConfig cfg).getAReasonSinkExcluded(endpoint) and
|
||||
not reason = ["argument to modeled function", "modeled sink", "modeled database access"]
|
||||
}
|
||||
|
||||
query predicate sqlFilteredTruePositives(DataFlow::Node endpoint, string reason) {
|
||||
endpoint instanceof SqlInjection::Sink and
|
||||
reason = SqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint) and
|
||||
reason = any(SqlInjectionAtm::SqlInjectionAtmConfig cfg).getAReasonSinkExcluded(endpoint) and
|
||||
reason != "argument to modeled function"
|
||||
}
|
||||
|
||||
query predicate taintedPathFilteredTruePositives(DataFlow::Node endpoint, string reason) {
|
||||
endpoint instanceof TaintedPath::Sink and
|
||||
reason = TaintedPathAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint) and
|
||||
reason = any(TaintedPathAtm::TaintedPathAtmConfig cfg).getAReasonSinkExcluded(endpoint) and
|
||||
reason != "argument to modeled function"
|
||||
}
|
||||
|
||||
query predicate xssFilteredTruePositives(DataFlow::Node endpoint, string reason) {
|
||||
endpoint instanceof DomBasedXss::Sink and
|
||||
reason = XssAtm::SinkEndpointFilter::getAReasonSinkExcluded(endpoint) and
|
||||
reason = any(XssAtm::DomBasedXssAtmConfig cfg).getAReasonSinkExcluded(endpoint) and
|
||||
reason != "argument to modeled function"
|
||||
}
|
||||
|
||||
query predicate xssThroughDomFilteredTruePositives(DataFlow::Node endpoint, string reason) {
|
||||
endpoint instanceof DomBasedXss::Sink and
|
||||
reason = any(XssThroughDomAtm::XssThroughDomAtmConfig cfg).getAReasonSinkExcluded(endpoint) and
|
||||
reason != "argument to modeled function"
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import experimental.adaptivethreatmodeling.StandardEndpointFilters
|
||||
import experimental.adaptivethreatmodeling.EndpointCharacteristics as EndpointCharacteristics
|
||||
|
||||
select getALikelyExternalLibraryCall()
|
||||
select EndpointCharacteristics::getALikelyExternalLibraryCall()
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
extraction/ExtractEndpointData.ql
|
||||
@@ -23,6 +23,11 @@ endpoints
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | Xss | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | Xss | notASinkReason | LoggerMethod | string |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | Xss | sinkLabel | NotASink | string |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | XssThroughDom | hasFlowFromSource | false | boolean |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | XssThroughDom | isConstantExpression | false | boolean |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | XssThroughDom | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | XssThroughDom | notASinkReason | LoggerMethod | string |
|
||||
| index.js:15:17:15:32 | req.body.isAdmin | XssThroughDom | sinkLabel | NotASink | string |
|
||||
| index.js:20:13:20:31 | { 'isAdmin': true } | NosqlInjection | hasFlowFromSource | false | boolean |
|
||||
| index.js:20:13:20:31 | { 'isAdmin': true } | NosqlInjection | isConstantExpression | false | boolean |
|
||||
| index.js:20:13:20:31 | { 'isAdmin': true } | NosqlInjection | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
@@ -55,6 +60,12 @@ endpoints
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | Xss | notASinkReason | ClientRequest | string |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | Xss | notASinkReason | JQueryArgument | string |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | Xss | sinkLabel | NotASink | string |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | hasFlowFromSource | false | boolean |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | isConstantExpression | false | boolean |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | notASinkReason | ClientRequest | string |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | notASinkReason | JQueryArgument | string |
|
||||
| index.js:83:10:85:3 | {\\n " ... ar,\\n } | XssThroughDom | sinkLabel | NotASink | string |
|
||||
| index.js:84:12:84:18 | foo.bar | NosqlInjection | hasFlowFromSource | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | NosqlInjection | isConstantExpression | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | NosqlInjection | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
@@ -75,6 +86,11 @@ endpoints
|
||||
| index.js:84:12:84:18 | foo.bar | Xss | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | Xss | notASinkReason | ClientRequest | string |
|
||||
| index.js:84:12:84:18 | foo.bar | Xss | sinkLabel | NotASink | string |
|
||||
| index.js:84:12:84:18 | foo.bar | XssThroughDom | hasFlowFromSource | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | XssThroughDom | isConstantExpression | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | XssThroughDom | isExcludedFromEndToEndEvaluation | false | boolean |
|
||||
| index.js:84:12:84:18 | foo.bar | XssThroughDom | notASinkReason | ClientRequest | string |
|
||||
| index.js:84:12:84:18 | foo.bar | XssThroughDom | sinkLabel | NotASink | string |
|
||||
tokenFeatures
|
||||
| index.js:9:15:9:45 | { 'isAd ... Admin } | CalleeFlexibleAccessPath | User.find |
|
||||
| index.js:9:15:9:45 | { 'isAd ... Admin } | InputAccessPathFromCallee | |
|
||||
|
||||
@@ -2,5 +2,5 @@ import javascript
|
||||
import experimental.adaptivethreatmodeling.NosqlInjectionATM as NosqlInjectionAtm
|
||||
|
||||
query predicate effectiveSinks(DataFlow::Node node) {
|
||||
not exists(NosqlInjectionAtm::SinkEndpointFilter::getAReasonSinkExcluded(node))
|
||||
not exists(any(NosqlInjectionAtm::NosqlInjectionAtmConfig cfg).getAReasonSinkExcluded(node))
|
||||
}
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
## 0.3.4
|
||||
|
||||
### Major Analysis Improvements
|
||||
|
||||
* Added support for TypeScript 4.9.
|
||||
|
||||
## 0.3.3
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The ReDoS libraries in `semmle.code.javascript.security.regexp` has been moved to a shared pack inside the `shared/` folder, and the previous location has been deprecated.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Deleted the deprecated `Instance` class from the `Vue` module.
|
||||
* Deleted the deprecated `VHtmlSourceWrite` class from `DomBasedXssQuery.qll`.
|
||||
* Deleted all the deprecated `[QueryName].qll` files from the `javascript/ql/lib/semmle/javascript/security/dataflow` folder, use the corresponding `[QueryName]Query.qll` files instead.
|
||||
5
javascript/ql/lib/change-notes/released/0.3.4.md
Normal file
5
javascript/ql/lib/change-notes/released/0.3.4.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## 0.3.4
|
||||
|
||||
### Major Analysis Improvements
|
||||
|
||||
* Added support for TypeScript 4.9.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.3.3
|
||||
lastReleaseVersion: 0.3.4
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
name: codeql/javascript-all
|
||||
version: 0.3.4-dev
|
||||
version: 0.3.5-dev
|
||||
groups: javascript
|
||||
dbscheme: semmlecode.javascript.dbscheme
|
||||
extractor: javascript
|
||||
library: true
|
||||
upgrades: upgrades
|
||||
dependencies:
|
||||
codeql/regex: ${workspace}
|
||||
|
||||
@@ -460,7 +460,6 @@ module API {
|
||||
this = Impl::MkClassInstance(result) or
|
||||
this = Impl::MkUse(result) or
|
||||
this = Impl::MkDef(result) or
|
||||
this = Impl::MkAsyncFuncResult(result) or
|
||||
this = Impl::MkSyntheticCallbackArg(_, _, result)
|
||||
}
|
||||
|
||||
@@ -562,6 +561,9 @@ module API {
|
||||
/** Gets a node whose type has the given qualified name, not including types from models. */
|
||||
Node getANodeOfTypeRaw(string moduleName, string exportedName) {
|
||||
result = Impl::MkTypeUse(moduleName, exportedName).(Node).getInstance()
|
||||
or
|
||||
exportedName = "" and
|
||||
result = getAModuleImportRaw(moduleName)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -671,9 +673,6 @@ module API {
|
||||
cls.getAnInstanceReference() = trackDefNode(_)
|
||||
)
|
||||
} or
|
||||
MkAsyncFuncResult(DataFlow::FunctionNode f) {
|
||||
f = trackDefNode(_) and f.getFunction().isAsync() and hasSemantics(f)
|
||||
} or
|
||||
MkDef(DataFlow::Node nd) { rhs(_, _, nd) } or
|
||||
MkUse(DataFlow::Node nd) { use(_, _, nd) } or
|
||||
/** A use of a TypeScript type. */
|
||||
@@ -688,8 +687,7 @@ module API {
|
||||
|
||||
class TDef = MkModuleDef or TNonModuleDef;
|
||||
|
||||
class TNonModuleDef =
|
||||
MkModuleExport or MkClassInstance or MkAsyncFuncResult or MkDef or MkSyntheticCallbackArg;
|
||||
class TNonModuleDef = MkModuleExport or MkClassInstance or MkDef or MkSyntheticCallbackArg;
|
||||
|
||||
class TUse = MkModuleUse or MkModuleImport or MkUse or MkTypeUse;
|
||||
|
||||
@@ -740,10 +738,11 @@ module API {
|
||||
rhs = m.getAnExportedValue(prop)
|
||||
)
|
||||
or
|
||||
exists(DataFlow::FunctionNode fn | fn = pred |
|
||||
not fn.getFunction().isAsync() and
|
||||
lbl = Label::return() and
|
||||
rhs = fn.getAReturn()
|
||||
exists(DataFlow::FunctionNode fn |
|
||||
fn = pred and
|
||||
lbl = Label::return()
|
||||
|
|
||||
if fn.getFunction().isAsync() then rhs = fn.getReturnNode() else rhs = fn.getAReturn()
|
||||
)
|
||||
or
|
||||
lbl = Label::promised() and
|
||||
@@ -774,13 +773,12 @@ module API {
|
||||
)
|
||||
or
|
||||
exists(DataFlow::FunctionNode f |
|
||||
base = MkAsyncFuncResult(f) and
|
||||
f.getFunction().isAsync() and
|
||||
base = MkDef(f.getReturnNode())
|
||||
|
|
||||
lbl = Label::promised() and
|
||||
rhs = f.getAReturn()
|
||||
)
|
||||
or
|
||||
exists(DataFlow::FunctionNode f |
|
||||
base = MkAsyncFuncResult(f) and
|
||||
or
|
||||
lbl = Label::promisedError() and
|
||||
rhs = f.getExceptionalReturn()
|
||||
)
|
||||
@@ -1272,10 +1270,11 @@ module API {
|
||||
)
|
||||
or
|
||||
exists(DataFlow::Node nd, DataFlow::FunctionNode f |
|
||||
f.getFunction().isAsync() and
|
||||
pred = MkDef(nd) and
|
||||
f = trackDefNode(nd) and
|
||||
lbl = Label::return() and
|
||||
succ = MkAsyncFuncResult(f)
|
||||
succ = MkDef(f.getReturnNode())
|
||||
)
|
||||
or
|
||||
exists(int bound, DataFlow::InvokeNode call |
|
||||
|
||||
@@ -233,6 +233,8 @@ module AccessPath {
|
||||
baseName = fromReference(write.getBase(), root)
|
||||
or
|
||||
baseName = fromRhs(write.getBase(), root)
|
||||
or
|
||||
baseName = fromRhs(GetLaterAccess::getLaterBaseAccess(write), root)
|
||||
)
|
||||
or
|
||||
exists(GlobalVariable var |
|
||||
@@ -266,6 +268,100 @@ module AccessPath {
|
||||
)
|
||||
}
|
||||
|
||||
/** A module for computing an access to a variable that happens after a property has been written onto it */
|
||||
private module GetLaterAccess {
|
||||
/**
|
||||
* Gets an access to a variable that is written to in `write`, where the access is after the write.
|
||||
*
|
||||
* This allows `fromRhs` to compute an access path for e.g. the below example:
|
||||
* ```JavaScript
|
||||
* function foo(x) {
|
||||
* var obj = {
|
||||
* bar: x // `x` has the access path "foo.bar" starting from the root `this`.
|
||||
* };
|
||||
* this.foo = obj;
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
pragma[noopt]
|
||||
DataFlow::Node getLaterBaseAccess(DataFlow::PropWrite write) {
|
||||
exists(
|
||||
ControlFlowNode writeNode, BindingPattern access, VarRef otherAccess, Variable variable,
|
||||
StmtContainer container
|
||||
|
|
||||
access = getBaseVar(write) and
|
||||
writeNode = write.getWriteNode() and
|
||||
access = getAnAccessInContainer(variable, container, true) and
|
||||
variable = getARelevantVariable() and // manual magic
|
||||
otherAccess = getAnAccessInContainer(variable, container, false) and
|
||||
access != otherAccess and
|
||||
result.asExpr() = otherAccess
|
||||
|
|
||||
exists(BasicBlock bb, int i, int j |
|
||||
bb.getNode(i) = writeNode and
|
||||
bb.getNode(j) = otherAccess and
|
||||
i < j
|
||||
)
|
||||
or
|
||||
otherAccess.getBasicBlock() = getASuccessorBBThatReadsVar(write) // more manual magic - outlined into a helper predicate.
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a variable ref that `write` writes a property to. */
|
||||
VarRef getBaseVar(DataFlow::PropWrite write) {
|
||||
result = write.getBase().asExpr()
|
||||
or
|
||||
exists(Assignment assign |
|
||||
write.getBase().asExpr() = assign.getRhs() and
|
||||
result = assign.getLhs()
|
||||
)
|
||||
or
|
||||
exists(VariableDeclarator decl |
|
||||
write.getBase().asExpr() = decl.getInit() and
|
||||
result = decl.getBindingPattern()
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets an access to `var` inside `container` where `usedInWrite` indicates whether the access is the base of a property write. */
|
||||
private VarRef getAnAccessInContainer(Variable var, StmtContainer container, boolean usedInWrite) {
|
||||
result.getVariable() = var and
|
||||
result.getContainer() = container and
|
||||
var.isLocal() and
|
||||
if result = getBaseVar(_) then usedInWrite = true else usedInWrite = false
|
||||
}
|
||||
|
||||
/** Gets a variable that is relevant for the computations in the `GetLaterAccess` module. */
|
||||
private Variable getARelevantVariable() {
|
||||
// The variable might be used where `getLaterBaseAccess()` is called.
|
||||
exists(DataFlow::Node node |
|
||||
exists(fromRhs(node, _)) and
|
||||
node.asExpr().(VarAccess).getVariable() = result
|
||||
) and
|
||||
// There is a write that writes to the variable.
|
||||
getBaseVar(_).getVariable() = result and
|
||||
// It's local.
|
||||
result.isLocal() and // we skip global variables, because that turns messy quick.
|
||||
// There is both a "write" and "read" in the same container of the variable.
|
||||
exists(StmtContainer container |
|
||||
exists(getAnAccessInContainer(result, container, true)) and // a "write", an access to the variable that is the base of a property reference.
|
||||
exists(getAnAccessInContainer(result, container, false)) // a "read", an access to the variable that is not the base of a property reference.
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a basic-block that has a read of the variable that is written to by `write`, where the basicblock occurs after `start`. */
|
||||
private ReachableBasicBlock getASuccessorBBThatReadsVar(DataFlow::PropWrite write) {
|
||||
exists(VarAccess baseExpr, Variable var, ControlFlowNode writeNode |
|
||||
baseExpr = getBaseVar(write) and
|
||||
var = baseExpr.getVariable() and
|
||||
var = getARelevantVariable() and
|
||||
writeNode = write.getWriteNode() and
|
||||
writeNode.getBasicBlock().(ReachableBasicBlock).strictlyDominates(result) and
|
||||
// manual magic.
|
||||
result = getAnAccessInContainer(getARelevantVariable(), _, false).getBasicBlock()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a node that refers to the given access path relative to the given `root` node,
|
||||
* or `root` itself if the access path is empty.
|
||||
|
||||
@@ -75,6 +75,16 @@ private DataFlow::Node getAValueExportedByPackage() {
|
||||
result = getAnExportFromModule(mod)
|
||||
)
|
||||
or
|
||||
// re-export of a value from another module
|
||||
// `module.exports.foo = require("./other").bar;`
|
||||
// other.js:
|
||||
// `module.exports.bar = function () { ... };`
|
||||
exists(DataFlow::PropRead read, Import imp |
|
||||
read = getAValueExportedByPackage() and
|
||||
read.getBase().getALocalSource() = imp.getImportedModuleNode() and
|
||||
result = imp.getImportedModule().getAnExportedValue(read.getPropertyName())
|
||||
)
|
||||
or
|
||||
// require("./other-module.js"); inside an AMD module.
|
||||
exists(Module mod, CallExpr call |
|
||||
call = getAValueExportedByPackage().asExpr() and
|
||||
|
||||
@@ -176,6 +176,13 @@ class RegExpTerm extends Locatable, @regexpterm {
|
||||
* Gets a string that is matched by this regular-expression term.
|
||||
*/
|
||||
string getAMatchedString() { result = this.getConstantValue() }
|
||||
|
||||
/** Holds if this term has the specified location. */
|
||||
predicate hasLocationInfo(
|
||||
string filepath, int startline, int startcolumn, int endline, int endcolumn
|
||||
) {
|
||||
this.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1375,6 +1375,27 @@ class AsTypeAssertion extends TypeAssertion, @as_type_assertion { }
|
||||
*/
|
||||
class PrefixTypeAssertion extends TypeAssertion, @prefix_type_assertion { }
|
||||
|
||||
/**
|
||||
* A satisfies type asserion of the form `E satisfies T` where `E` is an expression and `T` is a type.
|
||||
*/
|
||||
class SatisfiesExpr extends Expr, @satisfies_expr {
|
||||
/** Gets the expression whose type to assert, that is, the `E` in `E as T` or `<T> E`. */
|
||||
Expr getExpression() { result = this.getChildExpr(0) }
|
||||
|
||||
/** Gets the type to cast to, that is, the `T` in `E as T` or `<T> E`. */
|
||||
TypeExpr getTypeAnnotation() { result = this.getChildTypeExpr(1) }
|
||||
|
||||
override ControlFlowNode getFirstControlFlowNode() {
|
||||
result = this.getExpression().getFirstControlFlowNode()
|
||||
}
|
||||
|
||||
override Expr getUnderlyingValue() { result = this.getExpression().getUnderlyingValue() }
|
||||
|
||||
override Expr getUnderlyingReference() { result = this.getExpression().getUnderlyingReference() }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "SatisfiesExpr" }
|
||||
}
|
||||
|
||||
/**
|
||||
* A TypeScript expression of form `E!`, asserting that `E` is not null.
|
||||
*/
|
||||
|
||||
@@ -1580,6 +1580,8 @@ module DataFlow {
|
||||
or
|
||||
predExpr = succExpr.(TypeAssertion).getExpression()
|
||||
or
|
||||
predExpr = succExpr.(SatisfiesExpr).getExpression()
|
||||
or
|
||||
predExpr = succExpr.(NonNullAssertion).getExpression()
|
||||
or
|
||||
predExpr = succExpr.(ExpressionWithTypeArguments).getExpression()
|
||||
@@ -1692,10 +1694,10 @@ module DataFlow {
|
||||
*/
|
||||
predicate localFieldStep(DataFlow::Node pred, DataFlow::Node succ) {
|
||||
exists(ClassNode cls, string prop |
|
||||
pred = cls.getADirectSuperClass*().getAReceiverNode().getAPropertyWrite(prop).getRhs() or
|
||||
pred = AccessPath::getAnAssignmentTo(cls.getADirectSuperClass*().getAReceiverNode(), prop) or
|
||||
pred = cls.getInstanceMethod(prop)
|
||||
|
|
||||
succ = cls.getAReceiverNode().getAPropertyRead(prop)
|
||||
succ = AccessPath::getAReferenceTo(cls.getAReceiverNode(), prop)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -45,6 +45,8 @@ private PropAccess namedPropAccess(AccessPath base, PropertyName name, BasicBloc
|
||||
|
||||
private SsaVariable getRefinedVariable(SsaVariable variable) {
|
||||
result = variable.getDefinition().(SsaRefinementNode).getAnInput()
|
||||
or
|
||||
result = variable.getDefinition().(SsaPhiNode).getRephinedVariable()
|
||||
}
|
||||
|
||||
private SsaVariable getARefinementOf(SsaVariable variable) { variable = getRefinedVariable(result) }
|
||||
|
||||
@@ -9,10 +9,28 @@ module Hapi {
|
||||
/**
|
||||
* An expression that creates a new Hapi server.
|
||||
*/
|
||||
class ServerDefinition extends Http::Servers::StandardServerDefinition, DataFlow::NewNode {
|
||||
class ServerDefinition extends Http::Servers::StandardServerDefinition, DataFlow::Node {
|
||||
ServerDefinition() {
|
||||
// `server = new Hapi.Server()`
|
||||
this = DataFlow::moduleMember("hapi", "Server").getAnInstantiation()
|
||||
or
|
||||
// `server = Glue.compose(manifest, composeOptions)`
|
||||
this = DataFlow::moduleMember("@hapi/glue", "compose").getAnInvocation()
|
||||
or
|
||||
// `register (server, options)`
|
||||
// `module.exports.plugin = {register, pkg};`
|
||||
this =
|
||||
any(Module m)
|
||||
.getAnExportedValue("plugin")
|
||||
.getALocalSource()
|
||||
.getAPropertySource("register")
|
||||
.getAFunctionValue()
|
||||
.getParameter(0)
|
||||
or
|
||||
// `const after = function (server) {...};`
|
||||
// `server.dependency('name', after);`
|
||||
this =
|
||||
any(ServerDefinition s).ref().getAMethodCall("dependency").getABoundCallbackParameter(1, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +141,7 @@ module Hapi {
|
||||
kind = "parameter" and
|
||||
exists(DataFlow::PropRead query |
|
||||
// `request.query.name`
|
||||
query.accesses(request, "query") and
|
||||
query.accesses(request, ["query", "params"]) and
|
||||
this.(DataFlow::PropRead).accesses(query, _)
|
||||
)
|
||||
or
|
||||
@@ -131,7 +149,7 @@ module Hapi {
|
||||
// `request.url.path`
|
||||
kind = "url" and
|
||||
url.accesses(request, "url") and
|
||||
this.(DataFlow::PropRead).accesses(url, "path")
|
||||
this.(DataFlow::PropRead).accesses(url, ["path", "origin"])
|
||||
)
|
||||
or
|
||||
exists(DataFlow::PropRead state |
|
||||
@@ -209,6 +227,17 @@ module Hapi {
|
||||
// server.ext('/', fun)
|
||||
this.getMethodName() = "ext" and
|
||||
handler = this.getArgument(1)
|
||||
or
|
||||
// server.route([{ handler(request){}])
|
||||
this.getMethodName() = "route" and
|
||||
handler =
|
||||
this.getArgument(0)
|
||||
.getALocalSource()
|
||||
.(DataFlow::ArrayCreationNode)
|
||||
.getAnElement()
|
||||
.getALocalSource()
|
||||
.getAPropertySource("handler")
|
||||
.getAFunctionValue()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -240,7 +269,7 @@ module Hapi {
|
||||
RouteHandlerCandidate() {
|
||||
exists(string request, string responseToolkit |
|
||||
(request = "request" or request = "req") and
|
||||
responseToolkit = "h" and
|
||||
responseToolkit = ["h", "hapi"] and
|
||||
// heuristic: parameter names match the Hapi documentation
|
||||
astNode.getNumParameter() = 2 and
|
||||
astNode.getParameter(0).getName() = request and
|
||||
|
||||
@@ -24,7 +24,7 @@ private module MongoDB {
|
||||
override predicate row(string row) {
|
||||
// In Mongo version 2.x, a client and a database handle were the same concept, but in 3.x
|
||||
// they were separated. To handle everything with a single model, we treat them as the same here.
|
||||
row = "mongodb;Db;mongodb;MongoClient;"
|
||||
row = "mongodb.Db;mongodb.MongoClient;"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,11 +42,11 @@ private module MongoDB {
|
||||
/** A call to a MongoDB query method. */
|
||||
private class QueryCall extends DatabaseAccess, API::CallNode {
|
||||
QueryCall() {
|
||||
this = ModelOutput::getATypeNode("mongodb", "Collection").getAMember().getACall() and
|
||||
this = ModelOutput::getATypeNode("mongodb.Collection").getAMember().getACall() and
|
||||
not this.getCalleeName() = ["toString", "valueOf", "getLogger"]
|
||||
or
|
||||
this =
|
||||
ModelOutput::getATypeNode("mongodb", ["Db", "MongoClient"])
|
||||
ModelOutput::getATypeNode(["mongodb.Db", "mongodb.MongoClient"])
|
||||
.getMember(["watch", "aggregate"])
|
||||
.getACall()
|
||||
}
|
||||
@@ -63,7 +63,7 @@ private module MongoDB {
|
||||
|
||||
private class Insertion extends DatabaseAccess, API::CallNode {
|
||||
Insertion() {
|
||||
this = ModelOutput::getATypeNode("mongodb", "Collection").getAMember().getACall() and
|
||||
this = ModelOutput::getATypeNode("mongodb.Collection").getAMember().getACall() and
|
||||
this.getCalleeName().matches("insert%")
|
||||
}
|
||||
|
||||
@@ -105,9 +105,7 @@ private module Mongoose {
|
||||
private class QueryCall extends DatabaseAccess, API::CallNode {
|
||||
QueryCall() {
|
||||
this =
|
||||
ModelOutput::getATypeNode("mongoose", "Query")
|
||||
.getMember(["exec", "then", "catch"])
|
||||
.getACall()
|
||||
ModelOutput::getATypeNode("mongoose.Query").getMember(["exec", "then", "catch"]).getACall()
|
||||
}
|
||||
|
||||
override DataFlow::Node getAQueryArgument() { result = this.getReceiver() }
|
||||
@@ -132,10 +130,10 @@ private module Mongoose {
|
||||
private class QueryWithCallback extends DatabaseAccess, API::CallNode {
|
||||
QueryWithCallback() {
|
||||
this =
|
||||
ModelOutput::getATypeNode("mongoose", ["Document", "Model", "Query"])
|
||||
ModelOutput::getATypeNode(["mongoose.Document", "mongoose.Model", "mongoose.Query"])
|
||||
.getAMember()
|
||||
.getACall() and
|
||||
this.getReturn() = ModelOutput::getATypeNode("mongoose", "Query") and
|
||||
this.getReturn() = ModelOutput::getATypeNode("mongoose.Query") and
|
||||
exists(this.getLastArgument().getABoundFunctionValue(_))
|
||||
}
|
||||
|
||||
@@ -152,7 +150,7 @@ private module Mongoose {
|
||||
|
||||
QueryAwait() {
|
||||
astNode.getOperand().flow() =
|
||||
ModelOutput::getATypeNode("mongoose", "Query").getAValueReachableFromSource()
|
||||
ModelOutput::getATypeNode("mongoose.Query").getAValueReachableFromSource()
|
||||
}
|
||||
|
||||
override DataFlow::Node getAQueryArgument() { result = astNode.getOperand().flow() }
|
||||
@@ -162,7 +160,7 @@ private module Mongoose {
|
||||
|
||||
class Insertion extends DatabaseAccess, API::CallNode {
|
||||
Insertion() {
|
||||
this = ModelOutput::getATypeNode("mongoose", "Model").getAMember().getACall() and
|
||||
this = ModelOutput::getATypeNode("mongoose.Model").getAMember().getACall() and
|
||||
this.getCalleeName().matches("insert%")
|
||||
}
|
||||
|
||||
@@ -180,9 +178,9 @@ private module MarsDB {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"mongoose;Query;marsdb;;Member[Collection].Instance",
|
||||
"mongoose;Model;marsdb;;Member[Collection].Instance",
|
||||
"mongoose;Query;mongoose;Query;Member[sortFunc].ReturnValue",
|
||||
"mongoose.Query;marsdb;Member[Collection].Instance",
|
||||
"mongoose.Model;marsdb;Member[Collection].Instance",
|
||||
"mongoose.Query;mongoose.Query;Member[sortFunc].ReturnValue",
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -251,7 +249,7 @@ private module Redis {
|
||||
"set", "publish", "append", "bitfield", "decrby", "getset", "hincrby", "hincrbyfloat",
|
||||
"hset", "hsetnx", "incrby", "incrbyfloat", "linsert", "lpush", "lpushx", "lset", "ltrim",
|
||||
"rename", "renamenx", "rpushx", "setbit", "setex", "smove", "zincrby", "zinterstore",
|
||||
"hdel", "lpush", "pfadd", "rpush", "sadd", "sdiffstore", "srem"
|
||||
"hdel", "pfadd", "rpush", "sadd", "sdiffstore", "srem"
|
||||
] and
|
||||
argIndex = 0
|
||||
or
|
||||
|
||||
@@ -357,7 +357,7 @@ private module Sequelize {
|
||||
// Note: the sinks are specified directly in the MaD model
|
||||
class SequelizeSource extends ModelInput::SourceModelCsv {
|
||||
override predicate row(string row) {
|
||||
row = "sequelize;Sequelize;Member[query].ReturnValue.Awaited;database-access-result"
|
||||
row = "sequelize.Sequelize;Member[query].ReturnValue.Awaited;database-access-result"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -365,13 +365,13 @@ private module Sequelize {
|
||||
private module SpannerCsv {
|
||||
class SpannerSinks extends ModelInput::SinkModelCsv {
|
||||
override predicate row(string row) {
|
||||
// package; type; path; kind
|
||||
// type; path; kind
|
||||
row =
|
||||
[
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;Argument[0];sql-injection",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;Argument[0].Member[sql];sql-injection",
|
||||
"@google-cloud/spanner;Transaction;Member[batchUpdate].Argument[0];sql-injection",
|
||||
"@google-cloud/spanner;Transaction;Member[batchUpdate].Argument[0].ArrayElement.Member[sql];sql-injection",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;Argument[0];sql-injection",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;Argument[0].Member[sql];sql-injection",
|
||||
"@google-cloud/spanner.Transaction;Member[batchUpdate].Argument[0];sql-injection",
|
||||
"@google-cloud/spanner.Transaction;Member[batchUpdate].Argument[0].ArrayElement.Member[sql];sql-injection",
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -380,10 +380,10 @@ private module SpannerCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"@google-cloud/spanner;~SpannerObject;Member[executeSql].Argument[0..].Parameter[1];database-access-result",
|
||||
"@google-cloud/spanner;~SpannerObject;Member[executeSql].ReturnValue.Awaited.Member[0];database-access-result",
|
||||
"@google-cloud/spanner;~SpannerObject;Member[run].ReturnValue.Awaited;database-access-result",
|
||||
"@google-cloud/spanner;~SpannerObject;Member[run].Argument[0..].Parameter[1];database-access-result",
|
||||
"@google-cloud/spanner.~SpannerObject;Member[executeSql].Argument[0..].Parameter[1];database-access-result",
|
||||
"@google-cloud/spanner.~SpannerObject;Member[executeSql].ReturnValue.Awaited.Member[0];database-access-result",
|
||||
"@google-cloud/spanner.~SpannerObject;Member[run].ReturnValue.Awaited;database-access-result",
|
||||
"@google-cloud/spanner.~SpannerObject;Member[run].Argument[0..].Parameter[1];database-access-result",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,11 +115,6 @@ module Vue {
|
||||
kind = DataFlow::MemberKind::setter() and result = "set"
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED. This class has been renamed to `Vue::Component`.
|
||||
*/
|
||||
deprecated class Instance = Component;
|
||||
|
||||
/**
|
||||
* A Vue component, such as a `new Vue({ ... })` call or a `.vue` file.
|
||||
*
|
||||
@@ -383,23 +378,6 @@ module Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED. Use `Vue::Component` instead.
|
||||
*
|
||||
* A Vue component from `new Vue({...})`.
|
||||
*/
|
||||
deprecated class VueInstance extends Component {
|
||||
VueInstance() {
|
||||
// restrict charpred to match original behavior
|
||||
this = MkComponentInstantiation(vueLibrary().getAnInstantiation())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED. Use `Vue::ComponentExtension` or `Vue::Component` instead.
|
||||
*/
|
||||
deprecated class ExtendedVue = ComponentExtension;
|
||||
|
||||
/**
|
||||
* A component created via an explicit call to `Vue.extend({...})` or `CustomComponent.extend({...})`.
|
||||
*/
|
||||
@@ -429,19 +407,6 @@ module Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED. Use `Vue::Component` instead.
|
||||
*
|
||||
* An instance of an extended Vue, for example `instance` of `var Ext = Vue.extend({...}); var instance = new Ext({...})`.
|
||||
*/
|
||||
deprecated class ExtendedInstance extends Component {
|
||||
ExtendedInstance() {
|
||||
// restrict charpred to match original behavior
|
||||
this =
|
||||
MkComponentInstantiation(vueLibrary().getMember("extend").getReturn().getAnInstantiation())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A Vue component from `Vue.component("my-component", { ... })`.
|
||||
*/
|
||||
@@ -568,9 +533,6 @@ module Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/** DEPRECATED. Do not use. */
|
||||
deprecated class InstanceHeapStep = PropStep;
|
||||
|
||||
/**
|
||||
* A Vue `v-html` attribute.
|
||||
*/
|
||||
@@ -609,11 +571,6 @@ module Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED. Do not use.
|
||||
*/
|
||||
deprecated class VHtmlSourceWrite = VHtmlAttributeStep;
|
||||
|
||||
/*
|
||||
* Provides classes for working with Vue templates.
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Module for parsing access paths from CSV models, both the identifying access path used
|
||||
* Module for parsing access paths from MaD models, both the identifying access path used
|
||||
* by dynamic languages, and the input/output specifications for summary steps.
|
||||
*
|
||||
* This file is used by the shared data flow library and by the JavaScript libraries
|
||||
|
||||
@@ -5,23 +5,20 @@
|
||||
*
|
||||
* The CSV specification has the following columns:
|
||||
* - Sources:
|
||||
* `package; type; path; kind`
|
||||
* `type; path; kind`
|
||||
* - Sinks:
|
||||
* `package; type; path; kind`
|
||||
* `type; path; kind`
|
||||
* - Summaries:
|
||||
* `package; type; path; input; output; kind`
|
||||
* `type; path; input; output; kind`
|
||||
* - Types:
|
||||
* `package1; type1; package2; type2; path`
|
||||
* `type1; type2; path`
|
||||
*
|
||||
* The interpretation of a row is similar to API-graphs with a left-to-right
|
||||
* reading.
|
||||
* 1. The `package` column selects a package name, as it would be referenced in the source code,
|
||||
* such as an NPM package, PIP package, or Ruby gem. (See `ModelsAsData.qll` for language-specific details).
|
||||
* It may also be a synthetic package used for a type definition (see type definitions below).
|
||||
* 2. The `type` column selects all instances of a named type originating from that package,
|
||||
* or the empty string if referring to the package itself.
|
||||
* 1. The `type` column selects all instances of a named type. The syntax of this column is language-specific.
|
||||
* The language defines some type names that the analysis knows how to identify without models.
|
||||
* It can also be a synthetic type name defined by a type definition (see type definitions below).
|
||||
* 3. The `path` column is a `.`-separated list of "access path tokens" to resolve, starting at the node selected by `package` and `type`.
|
||||
* 2. The `path` column is a `.`-separated list of "access path tokens" to resolve, starting at the node selected by `type`.
|
||||
*
|
||||
* Every language supports the following tokens:
|
||||
* - Argument[n]: the n-th argument to a call. May be a range of form `x..y` (inclusive) and/or a comma-separated list.
|
||||
@@ -42,10 +39,10 @@
|
||||
*
|
||||
* For the time being, please consult `ApiGraphModelsSpecific.qll` to see which language-specific tokens are currently supported.
|
||||
*
|
||||
* 4. The `input` and `output` columns specify how data enters and leaves the element selected by the
|
||||
* first `(package, type, path)` tuple. Both strings are `.`-separated access paths
|
||||
* 3. The `input` and `output` columns specify how data enters and leaves the element selected by the
|
||||
* first `(type, path)` tuple. Both strings are `.`-separated access paths
|
||||
* of the same syntax as the `path` column.
|
||||
* 5. The `kind` column is a tag that can be referenced from QL to determine to
|
||||
* 4. The `kind` column is a tag that can be referenced from QL to determine to
|
||||
* which classes the interpreted elements should be added. For example, for
|
||||
* sources `"remote"` indicates a default remote flow source, and for summaries
|
||||
* `"taint"` indicates a default additional taint step and `"value"` indicates a
|
||||
@@ -53,17 +50,17 @@
|
||||
*
|
||||
* ### Types
|
||||
*
|
||||
* A type row of form `package1; type1; package2; type2; path` indicates that `package2; type2; path`
|
||||
* should be seen as an instance of the type `package1; type1`.
|
||||
* A type row of form `type1; type2; path` indicates that `type2; path`
|
||||
* should be seen as an instance of the type `type1`.
|
||||
*
|
||||
* A `(package,type)` pair may refer to a static type or a synthetic type name used internally in the model.
|
||||
* A type may refer to a static type or a synthetic type name used internally in the model.
|
||||
* Synthetic type names can be used to reuse intermediate sub-paths, when there are multiple ways to access the same
|
||||
* element.
|
||||
* See `ModelsAsData.qll` for the language-specific interpretation of packages and static type names.
|
||||
* See `ModelsAsData.qll` for the language-specific interpretation of type names.
|
||||
*
|
||||
* By convention, if one wants to avoid clashes with static types from the package, the type name
|
||||
* should be prefixed with a tilde character (`~`). For example, `(foo, ~Bar)` can be used to indicate that
|
||||
* the type is related to the `foo` package but is not intended to match a static type.
|
||||
* By convention, if one wants to avoid clashes with static types, the type name
|
||||
* should be prefixed with a tilde character (`~`). For example, `~Bar` can be used to indicate that
|
||||
* the type is not intended to match a static type.
|
||||
*/
|
||||
|
||||
private import ApiGraphModelsSpecific as Specific
|
||||
@@ -89,9 +86,9 @@ module ModelInput {
|
||||
*
|
||||
* A row of form
|
||||
* ```
|
||||
* package;type;path;kind
|
||||
* type;path;kind
|
||||
* ```
|
||||
* indicates that the value at `(package, type, path)` should be seen as a flow
|
||||
* indicates that the value at `(type, path)` should be seen as a flow
|
||||
* source of the given `kind`.
|
||||
*
|
||||
* The kind `remote` represents a general remote flow source.
|
||||
@@ -110,9 +107,9 @@ module ModelInput {
|
||||
*
|
||||
* A row of form
|
||||
* ```
|
||||
* package;type;path;kind
|
||||
* type;path;kind
|
||||
* ```
|
||||
* indicates that the value at `(package, type, path)` should be seen as a sink
|
||||
* indicates that the value at `(type, path)` should be seen as a sink
|
||||
* of the given `kind`.
|
||||
*/
|
||||
abstract predicate row(string row);
|
||||
@@ -129,9 +126,9 @@ module ModelInput {
|
||||
*
|
||||
* A row of form
|
||||
* ```
|
||||
* package;type;path;input;output;kind
|
||||
* type;path;input;output;kind
|
||||
* ```
|
||||
* indicates that for each call to `(package, type, path)`, the value referred to by `input`
|
||||
* indicates that for each call to `(type, path)`, the value referred to by `input`
|
||||
* can flow to the value referred to by `output`.
|
||||
*
|
||||
* `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps,
|
||||
@@ -151,9 +148,9 @@ module ModelInput {
|
||||
*
|
||||
* A row of form,
|
||||
* ```
|
||||
* package1;type1;package2;type2;path
|
||||
* type1;type2;path
|
||||
* ```
|
||||
* indicates that `(package2, type2, path)` should be seen as an instance of `(package1, type1)`.
|
||||
* indicates that `(type2, path)` should be seen as an instance of `type1`.
|
||||
*/
|
||||
abstract predicate row(string row);
|
||||
}
|
||||
@@ -163,28 +160,28 @@ module ModelInput {
|
||||
*/
|
||||
class TypeModel extends Unit {
|
||||
/**
|
||||
* Gets a data-flow node that is a source of the type `package;type`.
|
||||
* Gets a data-flow node that is a source of the given `type`.
|
||||
*
|
||||
* This must not depend on API graphs, but ensures that an API node is generated for
|
||||
* the source.
|
||||
*/
|
||||
DataFlow::Node getASource(string package, string type) { none() }
|
||||
DataFlow::Node getASource(string type) { none() }
|
||||
|
||||
/**
|
||||
* Gets a data-flow node that is a sink of the type `package;type`,
|
||||
* Gets a data-flow node that is a sink of the given `type`,
|
||||
* usually because it is an argument passed to a parameter of that type.
|
||||
*
|
||||
* This must not depend on API graphs, but ensures that an API node is generated for
|
||||
* the sink.
|
||||
*/
|
||||
DataFlow::Node getASink(string package, string type) { none() }
|
||||
DataFlow::Node getASink(string type) { none() }
|
||||
|
||||
/**
|
||||
* Gets an API node that is a source or sink of the type `package;type`.
|
||||
* Gets an API node that is a source or sink of the given `type`.
|
||||
*
|
||||
* Unlike `getASource` and `getASink`, this may depend on API graphs.
|
||||
*/
|
||||
API::Node getAnApiNode(string package, string type) { none() }
|
||||
API::Node getAnApiNode(string type) { none() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -209,7 +206,7 @@ private import ModelInput
|
||||
/**
|
||||
* An empty class, except in specific tests.
|
||||
*
|
||||
* If this is non-empty, all models are parsed even if the package is not
|
||||
* If this is non-empty, all models are parsed even if the type name is not
|
||||
* considered relevant for the current database.
|
||||
*/
|
||||
abstract class TestAllModels extends Unit { }
|
||||
@@ -232,53 +229,44 @@ private predicate typeModel(string row) { any(TypeModelCsv s).row(inversePad(row
|
||||
private predicate typeVariableModel(string row) { any(TypeVariableModelCsv s).row(inversePad(row)) }
|
||||
|
||||
/** Holds if a source model exists for the given parameters. */
|
||||
predicate sourceModel(string package, string type, string path, string kind) {
|
||||
predicate sourceModel(string type, string path, string kind) {
|
||||
exists(string row |
|
||||
sourceModel(row) and
|
||||
row.splitAt(";", 0) = package and
|
||||
row.splitAt(";", 1) = type and
|
||||
row.splitAt(";", 2) = path and
|
||||
row.splitAt(";", 3) = kind
|
||||
row.splitAt(";", 0) = type and
|
||||
row.splitAt(";", 1) = path and
|
||||
row.splitAt(";", 2) = kind
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if a sink model exists for the given parameters. */
|
||||
private predicate sinkModel(string package, string type, string path, string kind) {
|
||||
private predicate sinkModel(string type, string path, string kind) {
|
||||
exists(string row |
|
||||
sinkModel(row) and
|
||||
row.splitAt(";", 0) = package and
|
||||
row.splitAt(";", 1) = type and
|
||||
row.splitAt(";", 2) = path and
|
||||
row.splitAt(";", 3) = kind
|
||||
row.splitAt(";", 0) = type and
|
||||
row.splitAt(";", 1) = path and
|
||||
row.splitAt(";", 2) = kind
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if a summary model `row` exists for the given parameters. */
|
||||
private predicate summaryModel(
|
||||
string package, string type, string path, string input, string output, string kind
|
||||
) {
|
||||
private predicate summaryModel(string type, string path, string input, string output, string kind) {
|
||||
exists(string row |
|
||||
summaryModel(row) and
|
||||
row.splitAt(";", 0) = package and
|
||||
row.splitAt(";", 1) = type and
|
||||
row.splitAt(";", 2) = path and
|
||||
row.splitAt(";", 3) = input and
|
||||
row.splitAt(";", 4) = output and
|
||||
row.splitAt(";", 5) = kind
|
||||
row.splitAt(";", 0) = type and
|
||||
row.splitAt(";", 1) = path and
|
||||
row.splitAt(";", 2) = input and
|
||||
row.splitAt(";", 3) = output and
|
||||
row.splitAt(";", 4) = kind
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if a type model exists for the given parameters. */
|
||||
private predicate typeModel(
|
||||
string package1, string type1, string package2, string type2, string path
|
||||
) {
|
||||
private predicate typeModel(string type1, string type2, string path) {
|
||||
exists(string row |
|
||||
typeModel(row) and
|
||||
row.splitAt(";", 0) = package1 and
|
||||
row.splitAt(";", 1) = type1 and
|
||||
row.splitAt(";", 2) = package2 and
|
||||
row.splitAt(";", 3) = type2 and
|
||||
row.splitAt(";", 4) = path
|
||||
row.splitAt(";", 0) = type1 and
|
||||
row.splitAt(";", 1) = type2 and
|
||||
row.splitAt(";", 2) = path
|
||||
)
|
||||
}
|
||||
|
||||
@@ -292,61 +280,50 @@ private predicate typeVariableModel(string name, string path) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a package that should be seen as an alias for the given other `package`,
|
||||
* or the `package` itself.
|
||||
* Holds if CSV rows involving `type` might be relevant for the analysis of this database.
|
||||
*/
|
||||
bindingset[package]
|
||||
bindingset[result]
|
||||
string getAPackageAlias(string package) {
|
||||
typeModel(package, "", result, "", "")
|
||||
or
|
||||
result = package
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if CSV rows involving `package` might be relevant for the analysis of this database.
|
||||
*/
|
||||
private predicate isRelevantPackage(string package) {
|
||||
predicate isRelevantType(string type) {
|
||||
(
|
||||
sourceModel(package, _, _, _) or
|
||||
sinkModel(package, _, _, _) or
|
||||
summaryModel(package, _, _, _, _, _) or
|
||||
typeModel(_, _, package, _, _)
|
||||
sourceModel(type, _, _) or
|
||||
sinkModel(type, _, _) or
|
||||
summaryModel(type, _, _, _, _) or
|
||||
typeModel(_, type, _)
|
||||
) and
|
||||
(
|
||||
Specific::isPackageUsed(package)
|
||||
Specific::isTypeUsed(type)
|
||||
or
|
||||
exists(TestAllModels t)
|
||||
)
|
||||
or
|
||||
exists(string other |
|
||||
isRelevantPackage(other) and
|
||||
typeModel(package, _, other, _, _)
|
||||
exists(string other | isRelevantType(other) |
|
||||
typeModel(type, other, _)
|
||||
or
|
||||
Specific::hasImplicitTypeModel(type, other)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `package,type,path` is used in some CSV row.
|
||||
* Holds if `type,path` is used in some CSV row.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
predicate isRelevantFullPath(string package, string type, string path) {
|
||||
isRelevantPackage(package) and
|
||||
predicate isRelevantFullPath(string type, string path) {
|
||||
isRelevantType(type) and
|
||||
(
|
||||
sourceModel(package, type, path, _) or
|
||||
sinkModel(package, type, path, _) or
|
||||
summaryModel(package, type, path, _, _, _) or
|
||||
typeModel(_, _, package, type, path)
|
||||
sourceModel(type, path, _) or
|
||||
sinkModel(type, path, _) or
|
||||
summaryModel(type, path, _, _, _) or
|
||||
typeModel(_, type, path)
|
||||
)
|
||||
}
|
||||
|
||||
/** A string from a CSV row that should be parsed as an access path. */
|
||||
private class AccessPathRange extends AccessPath::Range {
|
||||
AccessPathRange() {
|
||||
isRelevantFullPath(_, _, this)
|
||||
isRelevantFullPath(_, this)
|
||||
or
|
||||
exists(string package | isRelevantPackage(package) |
|
||||
summaryModel(package, _, _, this, _, _) or
|
||||
summaryModel(package, _, _, _, this, _)
|
||||
exists(string type | isRelevantType(type) |
|
||||
summaryModel(type, _, this, _, _) or
|
||||
summaryModel(type, _, _, this, _)
|
||||
)
|
||||
or
|
||||
typeVariableModel(_, this)
|
||||
@@ -400,83 +377,73 @@ private predicate invocationMatchesCallSiteFilter(Specific::InvokeNode invoke, A
|
||||
}
|
||||
|
||||
private class TypeModelUseEntry extends API::EntryPoint {
|
||||
private string package;
|
||||
private string type;
|
||||
|
||||
TypeModelUseEntry() {
|
||||
exists(any(TypeModel tm).getASource(package, type)) and
|
||||
this = "TypeModelUseEntry;" + package + ";" + type
|
||||
exists(any(TypeModel tm).getASource(type)) and
|
||||
this = "TypeModelUseEntry;" + type
|
||||
}
|
||||
|
||||
override DataFlow::LocalSourceNode getASource() {
|
||||
result = any(TypeModel tm).getASource(package, type)
|
||||
}
|
||||
override DataFlow::LocalSourceNode getASource() { result = any(TypeModel tm).getASource(type) }
|
||||
|
||||
API::Node getNodeForType(string package_, string type_) {
|
||||
package = package_ and type = type_ and result = this.getANode()
|
||||
}
|
||||
API::Node getNodeForType(string type_) { type = type_ and result = this.getANode() }
|
||||
}
|
||||
|
||||
private class TypeModelDefEntry extends API::EntryPoint {
|
||||
private string package;
|
||||
private string type;
|
||||
|
||||
TypeModelDefEntry() {
|
||||
exists(any(TypeModel tm).getASink(package, type)) and
|
||||
this = "TypeModelDefEntry;" + package + ";" + type
|
||||
exists(any(TypeModel tm).getASink(type)) and
|
||||
this = "TypeModelDefEntry;" + type
|
||||
}
|
||||
|
||||
override DataFlow::Node getASink() { result = any(TypeModel tm).getASink(package, type) }
|
||||
override DataFlow::Node getASink() { result = any(TypeModel tm).getASink(type) }
|
||||
|
||||
API::Node getNodeForType(string package_, string type_) {
|
||||
package = package_ and type = type_ and result = this.getANode()
|
||||
}
|
||||
API::Node getNodeForType(string type_) { type = type_ and result = this.getANode() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an API node identified by the given `(package,type)` pair.
|
||||
* Gets an API node identified by the given `type`.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private API::Node getNodeFromType(string package, string type) {
|
||||
exists(string package2, string type2, AccessPath path2 |
|
||||
typeModel(package, type, package2, type2, path2) and
|
||||
result = getNodeFromPath(package2, type2, path2)
|
||||
private API::Node getNodeFromType(string type) {
|
||||
exists(string type2, AccessPath path2 |
|
||||
typeModel(type, type2, path2) and
|
||||
result = getNodeFromPath(type2, path2)
|
||||
)
|
||||
or
|
||||
result = any(TypeModelUseEntry e).getNodeForType(package, type)
|
||||
result = any(TypeModelUseEntry e).getNodeForType(type)
|
||||
or
|
||||
result = any(TypeModelDefEntry e).getNodeForType(package, type)
|
||||
result = any(TypeModelDefEntry e).getNodeForType(type)
|
||||
or
|
||||
result = any(TypeModel t).getAnApiNode(package, type)
|
||||
result = any(TypeModel t).getAnApiNode(type)
|
||||
or
|
||||
result = Specific::getExtraNodeFromType(package, type)
|
||||
result = Specific::getExtraNodeFromType(type)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the API node identified by the first `n` tokens of `path` in the given `(package, type, path)` tuple.
|
||||
* Gets the API node identified by the first `n` tokens of `path` in the given `(type, path)` tuple.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private API::Node getNodeFromPath(string package, string type, AccessPath path, int n) {
|
||||
isRelevantFullPath(package, type, path) and
|
||||
private API::Node getNodeFromPath(string type, AccessPath path, int n) {
|
||||
isRelevantFullPath(type, path) and
|
||||
(
|
||||
n = 0 and
|
||||
result = getNodeFromType(package, type)
|
||||
result = getNodeFromType(type)
|
||||
or
|
||||
result = Specific::getExtraNodeFromPath(package, type, path, n)
|
||||
result = Specific::getExtraNodeFromPath(type, path, n)
|
||||
)
|
||||
or
|
||||
result = getSuccessorFromNode(getNodeFromPath(package, type, path, n - 1), path.getToken(n - 1))
|
||||
result = getSuccessorFromNode(getNodeFromPath(type, path, n - 1), path.getToken(n - 1))
|
||||
or
|
||||
// Similar to the other recursive case, but where the path may have stepped through one or more call-site filters
|
||||
result =
|
||||
getSuccessorFromInvoke(getInvocationFromPath(package, type, path, n - 1), path.getToken(n - 1))
|
||||
result = getSuccessorFromInvoke(getInvocationFromPath(type, path, n - 1), path.getToken(n - 1))
|
||||
or
|
||||
// Apply a subpath
|
||||
result =
|
||||
getNodeFromSubPath(getNodeFromPath(package, type, path, n - 1), getSubPathAt(path, n - 1))
|
||||
result = getNodeFromSubPath(getNodeFromPath(type, path, n - 1), getSubPathAt(path, n - 1))
|
||||
or
|
||||
// Apply a type step
|
||||
typeStep(getNodeFromPath(package, type, path, n), result)
|
||||
typeStep(getNodeFromPath(type, path, n), result)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -496,15 +463,15 @@ private AccessPath getSubPathAt(AccessPath path, int n) {
|
||||
pragma[nomagic]
|
||||
private API::Node getNodeFromSubPath(API::Node base, AccessPath subPath, int n) {
|
||||
exists(AccessPath path, int k |
|
||||
base = [getNodeFromPath(_, _, path, k), getNodeFromSubPath(_, path, k)] and
|
||||
base = [getNodeFromPath(_, path, k), getNodeFromSubPath(_, path, k)] and
|
||||
subPath = getSubPathAt(path, k) and
|
||||
result = base and
|
||||
n = 0
|
||||
)
|
||||
or
|
||||
exists(string package, string type, AccessPath basePath |
|
||||
typeStepModel(package, type, basePath, subPath) and
|
||||
base = getNodeFromPath(package, type, basePath) and
|
||||
exists(string type, AccessPath basePath |
|
||||
typeStepModel(type, basePath, subPath) and
|
||||
base = getNodeFromPath(type, basePath) and
|
||||
result = base and
|
||||
n = 0
|
||||
)
|
||||
@@ -543,42 +510,40 @@ private API::Node getNodeFromSubPath(API::Node base, AccessPath subPath) {
|
||||
result = getNodeFromSubPath(base, subPath, subPath.getNumToken())
|
||||
}
|
||||
|
||||
/** Gets the node identified by the given `(package, type, path)` tuple. */
|
||||
private API::Node getNodeFromPath(string package, string type, AccessPath path) {
|
||||
result = getNodeFromPath(package, type, path, path.getNumToken())
|
||||
/** Gets the node identified by the given `(type, path)` tuple. */
|
||||
private API::Node getNodeFromPath(string type, AccessPath path) {
|
||||
result = getNodeFromPath(type, path, path.getNumToken())
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate typeStepModel(string package, string type, AccessPath basePath, AccessPath output) {
|
||||
summaryModel(package, type, basePath, "", output, "type")
|
||||
private predicate typeStepModel(string type, AccessPath basePath, AccessPath output) {
|
||||
summaryModel(type, basePath, "", output, "type")
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate typeStep(API::Node pred, API::Node succ) {
|
||||
exists(string package, string type, AccessPath basePath, AccessPath output |
|
||||
typeStepModel(package, type, basePath, output) and
|
||||
pred = getNodeFromPath(package, type, basePath) and
|
||||
exists(string type, AccessPath basePath, AccessPath output |
|
||||
typeStepModel(type, basePath, output) and
|
||||
pred = getNodeFromPath(type, basePath) and
|
||||
succ = getNodeFromSubPath(pred, output)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an invocation identified by the given `(package, type, path)` tuple.
|
||||
* Gets an invocation identified by the given `(type, path)` tuple.
|
||||
*
|
||||
* Unlike `getNodeFromPath`, the `path` may end with one or more call-site filters.
|
||||
*/
|
||||
private Specific::InvokeNode getInvocationFromPath(
|
||||
string package, string type, AccessPath path, int n
|
||||
) {
|
||||
result = Specific::getAnInvocationOf(getNodeFromPath(package, type, path, n))
|
||||
private Specific::InvokeNode getInvocationFromPath(string type, AccessPath path, int n) {
|
||||
result = Specific::getAnInvocationOf(getNodeFromPath(type, path, n))
|
||||
or
|
||||
result = getInvocationFromPath(package, type, path, n - 1) and
|
||||
result = getInvocationFromPath(type, path, n - 1) and
|
||||
invocationMatchesCallSiteFilter(result, path.getToken(n - 1))
|
||||
}
|
||||
|
||||
/** Gets an invocation identified by the given `(package, type, path)` tuple. */
|
||||
private Specific::InvokeNode getInvocationFromPath(string package, string type, AccessPath path) {
|
||||
result = getInvocationFromPath(package, type, path, path.getNumToken())
|
||||
/** Gets an invocation identified by the given `(type, path)` tuple. */
|
||||
private Specific::InvokeNode getInvocationFromPath(string type, AccessPath path) {
|
||||
result = getInvocationFromPath(type, path, path.getNumToken())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -631,9 +596,9 @@ module ModelOutput {
|
||||
*/
|
||||
cached
|
||||
API::Node getASourceNode(string kind) {
|
||||
exists(string package, string type, string path |
|
||||
sourceModel(package, type, path, kind) and
|
||||
result = getNodeFromPath(package, type, path)
|
||||
exists(string type, string path |
|
||||
sourceModel(type, path, kind) and
|
||||
result = getNodeFromPath(type, path)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -642,9 +607,9 @@ module ModelOutput {
|
||||
*/
|
||||
cached
|
||||
API::Node getASinkNode(string kind) {
|
||||
exists(string package, string type, string path |
|
||||
sinkModel(package, type, path, kind) and
|
||||
result = getNodeFromPath(package, type, path)
|
||||
exists(string type, string path |
|
||||
sinkModel(type, path, kind) and
|
||||
result = getNodeFromPath(type, path)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -653,32 +618,31 @@ module ModelOutput {
|
||||
*/
|
||||
cached
|
||||
predicate relevantSummaryModel(
|
||||
string package, string type, string path, string input, string output, string kind
|
||||
string type, string path, string input, string output, string kind
|
||||
) {
|
||||
isRelevantPackage(package) and
|
||||
summaryModel(package, type, path, input, output, kind)
|
||||
isRelevantType(type) and
|
||||
summaryModel(type, path, input, output, kind)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if a `baseNode` is an invocation identified by the `package,type,path` part of a summary row.
|
||||
* Holds if a `baseNode` is an invocation identified by the `type,path` part of a summary row.
|
||||
*/
|
||||
cached
|
||||
predicate resolvedSummaryBase(
|
||||
string package, string type, string path, Specific::InvokeNode baseNode
|
||||
) {
|
||||
summaryModel(package, type, path, _, _, _) and
|
||||
baseNode = getInvocationFromPath(package, type, path)
|
||||
predicate resolvedSummaryBase(string type, string path, Specific::InvokeNode baseNode) {
|
||||
summaryModel(type, path, _, _, _) and
|
||||
baseNode = getInvocationFromPath(type, path)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `node` is seen as an instance of `(package,type)` due to a type definition
|
||||
* Holds if `node` is seen as an instance of `type` due to a type definition
|
||||
* contributed by a CSV model.
|
||||
*/
|
||||
cached
|
||||
API::Node getATypeNode(string package, string type) { result = getNodeFromType(package, type) }
|
||||
API::Node getATypeNode(string type) { result = getNodeFromType(type) }
|
||||
}
|
||||
|
||||
import Cached
|
||||
import Specific::ModelOutputSpecific
|
||||
|
||||
/**
|
||||
* Gets an error message relating to an invalid CSV row in a model.
|
||||
@@ -686,13 +650,13 @@ module ModelOutput {
|
||||
string getAWarning() {
|
||||
// Check number of columns
|
||||
exists(string row, string kind, int expectedArity, int actualArity |
|
||||
any(SourceModelCsv csv).row(row) and kind = "source" and expectedArity = 4
|
||||
any(SourceModelCsv csv).row(row) and kind = "source" and expectedArity = 3
|
||||
or
|
||||
any(SinkModelCsv csv).row(row) and kind = "sink" and expectedArity = 4
|
||||
any(SinkModelCsv csv).row(row) and kind = "sink" and expectedArity = 3
|
||||
or
|
||||
any(SummaryModelCsv csv).row(row) and kind = "summary" and expectedArity = 6
|
||||
any(SummaryModelCsv csv).row(row) and kind = "summary" and expectedArity = 5
|
||||
or
|
||||
any(TypeModelCsv csv).row(row) and kind = "type" and expectedArity = 5
|
||||
any(TypeModelCsv csv).row(row) and kind = "type" and expectedArity = 3
|
||||
or
|
||||
any(TypeVariableModelCsv csv).row(row) and kind = "type-variable" and expectedArity = 2
|
||||
|
|
||||
@@ -705,7 +669,7 @@ module ModelOutput {
|
||||
or
|
||||
// Check names and arguments of access path tokens
|
||||
exists(AccessPath path, AccessPathToken token |
|
||||
(isRelevantFullPath(_, _, path) or typeVariableModel(_, path)) and
|
||||
(isRelevantFullPath(_, path) or typeVariableModel(_, path)) and
|
||||
token = path.getToken(_)
|
||||
|
|
||||
not isValidTokenNameInIdentifyingAccessPath(token.getName()) and
|
||||
|
||||
@@ -31,6 +31,21 @@ import semmle.javascript.frameworks.data.internal.AccessPathSyntax as AccessPath
|
||||
import JS::DataFlow as DataFlow
|
||||
private import AccessPathSyntax
|
||||
|
||||
/**
|
||||
* Holds if `rawType` represents the JavaScript type `qualifiedName` from the given NPM `package`.
|
||||
*
|
||||
* Type names have form `package.type` or just `package` if referring to the package export
|
||||
* object. If `package` contains a `.` character it must be enclosed in single quotes, such as `'package'.type`.
|
||||
*/
|
||||
bindingset[rawType]
|
||||
predicate parseTypeString(string rawType, string package, string qualifiedName) {
|
||||
exists(string regexp |
|
||||
regexp = "('[^']+'|[^.]+)(.*)" and
|
||||
package = rawType.regexpCapture(regexp, 1).regexpReplaceAll("^'|'$", "") and
|
||||
qualifiedName = rawType.regexpCapture(regexp, 2).regexpReplaceAll("^\\.", "")
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if models describing `package` may be relevant for the analysis of this database.
|
||||
*/
|
||||
@@ -42,10 +57,30 @@ predicate isPackageUsed(string package) {
|
||||
any(DataFlow::SourceNode sn).hasUnderlyingType(package, _)
|
||||
}
|
||||
|
||||
bindingset[type]
|
||||
predicate isTypeUsed(string type) {
|
||||
exists(string package |
|
||||
parseTypeString(type, package, _) and
|
||||
isPackageUsed(package)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `type` can be obtained from an instance of `otherType` due to
|
||||
* language semantics modeled by `getExtraNodeFromType`.
|
||||
*/
|
||||
predicate hasImplicitTypeModel(string type, string otherType) { none() }
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate parseRelevantTypeString(string rawType, string package, string qualifiedName) {
|
||||
isRelevantFullPath(rawType, _) and
|
||||
parseTypeString(rawType, package, qualifiedName)
|
||||
}
|
||||
|
||||
/** Holds if `global` is a global variable referenced via a the `global` package in a CSV row. */
|
||||
private predicate isRelevantGlobal(string global) {
|
||||
exists(AccessPath path, AccessPathToken token |
|
||||
isRelevantFullPath("global", "", path) and
|
||||
isRelevantFullPath("global", path) and
|
||||
token = path.getToken(0) and
|
||||
token.getName() = "Member" and
|
||||
global = token.getAnArgument()
|
||||
@@ -74,13 +109,12 @@ private API::Node getGlobalNode(string globalName) {
|
||||
result = any(GlobalApiEntryPoint e | e.getGlobal() = globalName).getANode()
|
||||
}
|
||||
|
||||
/** Gets a JavaScript-specific interpretation of the `(package, type, path)` tuple after resolving the first `n` access path tokens. */
|
||||
bindingset[package, type, path]
|
||||
API::Node getExtraNodeFromPath(string package, string type, AccessPath path, int n) {
|
||||
/** Gets a JavaScript-specific interpretation of the `(type, path)` tuple after resolving the first `n` access path tokens. */
|
||||
bindingset[type, path]
|
||||
API::Node getExtraNodeFromPath(string type, AccessPath path, int n) {
|
||||
// Global variable accesses is via the 'global' package
|
||||
exists(AccessPathToken token |
|
||||
package = getAPackageAlias("global") and
|
||||
type = "" and
|
||||
type = "global" and
|
||||
token = path.getToken(0) and
|
||||
token.getName() = "Member" and
|
||||
result = getGlobalNode(token.getAnArgument()) and
|
||||
@@ -89,12 +123,16 @@ API::Node getExtraNodeFromPath(string package, string type, AccessPath path, int
|
||||
}
|
||||
|
||||
/** Gets a JavaScript-specific interpretation of the `(package, type)` tuple. */
|
||||
API::Node getExtraNodeFromType(string package, string type) {
|
||||
type = "" and
|
||||
result = API::moduleImport(package)
|
||||
or
|
||||
// Access instance of a type based on type annotations
|
||||
result = API::Internal::getANodeOfTypeRaw(getAPackageAlias(package), type)
|
||||
API::Node getExtraNodeFromType(string type) {
|
||||
exists(string package, string qualifiedName |
|
||||
parseRelevantTypeString(type, package, qualifiedName)
|
||||
|
|
||||
qualifiedName = "" and
|
||||
result = API::moduleImport(package)
|
||||
or
|
||||
// Access instance of a type based on type annotations
|
||||
result = API::Internal::getANodeOfTypeRaw(package, qualifiedName)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -184,9 +222,9 @@ predicate invocationMatchesExtraCallSiteFilter(API::InvokeNode invoke, AccessPat
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate relevantInputOutputPath(API::InvokeNode base, AccessPath inputOrOutput) {
|
||||
exists(string package, string type, string input, string output, string path |
|
||||
ModelOutput::relevantSummaryModel(package, type, path, input, output, _) and
|
||||
ModelOutput::resolvedSummaryBase(package, type, path, base) and
|
||||
exists(string type, string input, string output, string path |
|
||||
ModelOutput::relevantSummaryModel(type, path, input, output, _) and
|
||||
ModelOutput::resolvedSummaryBase(type, path, base) and
|
||||
inputOrOutput = [input, output]
|
||||
)
|
||||
}
|
||||
@@ -216,12 +254,9 @@ private API::Node getNodeFromInputOutputPath(API::InvokeNode baseNode, AccessPat
|
||||
* Holds if a CSV summary contributed the step `pred -> succ` of the given `kind`.
|
||||
*/
|
||||
predicate summaryStep(API::Node pred, API::Node succ, string kind) {
|
||||
exists(
|
||||
string package, string type, string path, API::InvokeNode base, AccessPath input,
|
||||
AccessPath output
|
||||
|
|
||||
ModelOutput::relevantSummaryModel(package, type, path, input, output, kind) and
|
||||
ModelOutput::resolvedSummaryBase(package, type, path, base) and
|
||||
exists(string type, string path, API::InvokeNode base, AccessPath input, AccessPath output |
|
||||
ModelOutput::relevantSummaryModel(type, path, input, output, kind) and
|
||||
ModelOutput::resolvedSummaryBase(type, path, base) and
|
||||
pred = getNodeFromInputOutputPath(base, input) and
|
||||
succ = getNodeFromInputOutputPath(base, output)
|
||||
)
|
||||
@@ -270,3 +305,17 @@ predicate isExtraValidTokenArgumentInIdentifyingAccessPath(string name, string a
|
||||
exists(argument.indexOf("=")) and
|
||||
exists(AccessPath::parseIntWithArity(argument.splitAt("=", 0), 10))
|
||||
}
|
||||
|
||||
module ModelOutputSpecific {
|
||||
/**
|
||||
* Gets a node that should be seen as an instance of `package,type` due to a type definition
|
||||
* contributed by a CSV model.
|
||||
*/
|
||||
cached
|
||||
API::Node getATypeNode(string package, string qualifiedName) {
|
||||
exists(string rawType |
|
||||
result = ModelOutput::getATypeNode(rawType) and
|
||||
parseTypeString(rawType, package, qualifiedName)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,81 +6,81 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"minimongo/IndexedDb;IndexedDbCollection;minimongo/IndexedDb;IndexedDbCollectionStatic;Instance", //
|
||||
"minimongo/IndexedDb;IndexedDbCollection;minimongo/lib/IndexedDb;default;Member[collections].AnyMember", //
|
||||
"minimongo/MemoryDb;Collection;minimongo/MemoryDb;CollectionStatic;Instance", //
|
||||
"minimongo/MemoryDb;Collection;minimongo/lib/MemoryDb;default;Member[collections].AnyMember", //
|
||||
"minimongo/RemoteDb;Collection;minimongo/RemoteDb;CollectionStatic;Instance", //
|
||||
"minimongo/RemoteDb;Collection;minimongo/lib/RemoteDb;default;Member[collections].AnyMember", //
|
||||
"minimongo/ReplicatingDb;Collection;minimongo/ReplicatingDb;CollectionStatic;Instance", //
|
||||
"minimongo/ReplicatingDb;Collection;minimongo/lib/ReplicatingDb;default;Member[collections].AnyMember", //
|
||||
"minimongo/lib/HybridDb;default;minimongo/lib/HybridDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/HybridDb;defaultStatic;minimongo/lib/HybridDb;;Member[default]", //
|
||||
"minimongo/lib/HybridDb;defaultStatic;minimongo;;Member[HybridDb]", //
|
||||
"minimongo/lib/IndexedDb;default;minimongo/lib/IndexedDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/IndexedDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/IndexedDb;defaultStatic;minimongo/lib/IndexedDb;;Member[default]", //
|
||||
"minimongo/lib/IndexedDb;defaultStatic;minimongo;;Member[IndexedDb]", //
|
||||
"minimongo/lib/LocalStorageDb;default;minimongo/lib/LocalStorageDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/LocalStorageDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/LocalStorageDb;defaultStatic;minimongo/lib/LocalStorageDb;;Member[default]", //
|
||||
"minimongo/lib/LocalStorageDb;defaultStatic;minimongo;;Member[LocalStorageDb]", //
|
||||
"minimongo/lib/MemoryDb;default;minimongo/lib/MemoryDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/MemoryDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/MemoryDb;defaultStatic;minimongo/lib/MemoryDb;;Member[default]", //
|
||||
"minimongo/lib/MemoryDb;defaultStatic;minimongo;;Member[MemoryDb]", //
|
||||
"minimongo/lib/RemoteDb;default;minimongo/lib/RemoteDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/RemoteDb;defaultStatic;minimongo/lib/RemoteDb;;Member[default]", //
|
||||
"minimongo/lib/RemoteDb;defaultStatic;minimongo;;Member[RemoteDb]", //
|
||||
"minimongo/lib/ReplicatingDb;default;minimongo/lib/ReplicatingDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/ReplicatingDb;defaultStatic;minimongo/lib/ReplicatingDb;;Member[default]", //
|
||||
"minimongo/lib/ReplicatingDb;defaultStatic;minimongo;;Member[ReplicatingDb]", //
|
||||
"minimongo/lib/WebSQLDb;default;minimongo/lib/WebSQLDb;defaultStatic;Instance", //
|
||||
"minimongo/lib/WebSQLDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/WebSQLDb;defaultStatic;minimongo/lib/WebSQLDb;;Member[default]", //
|
||||
"minimongo/lib/WebSQLDb;defaultStatic;minimongo;;Member[WebSQLDb]", //
|
||||
"minimongo;HybridCollection;minimongo/lib/HybridDb;HybridCollection;", //
|
||||
"minimongo;HybridCollection;minimongo/lib/HybridDb;default;Member[collections].AnyMember", //
|
||||
"minimongo;HybridCollection;minimongo;HybridCollectionStatic;Instance", //
|
||||
"minimongo;HybridCollectionStatic;minimongo/lib/HybridDb;;Member[HybridCollection]", //
|
||||
"minimongo;HybridCollectionStatic;minimongo/lib/HybridDb;HybridCollectionStatic;", //
|
||||
"minimongo;HybridCollectionStatic;minimongo;;Member[HybridCollection]", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo/RemoteDb;Collection;", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo/lib/types;MinimongoBaseCollection;", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo;HybridCollection;", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoCollection;", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoDb;AnyMember", //
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoLocalCollection;", //
|
||||
"minimongo;MinimongoCollection;minimongo/lib/LocalStorageDb;default;Member[collections].AnyMember", //
|
||||
"minimongo;MinimongoCollection;minimongo/lib/WebSQLDb;default;Member[collections].AnyMember", //
|
||||
"minimongo;MinimongoCollection;minimongo/lib/types;MinimongoCollection;", //
|
||||
"minimongo;MinimongoCollection;minimongo;HybridCollection;Member[remoteCol]", //
|
||||
"minimongo;MinimongoCollection;minimongo;MinimongoDb;Member[collections].AnyMember", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/HybridDb;default;", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/HybridDb;default;Member[remoteDb]", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/LocalStorageDb;default;", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/MemoryDb;default;", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/RemoteDb;default;", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/ReplicatingDb;default;Member[masterDb,replicaDb]", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/WebSQLDb;default;", //
|
||||
"minimongo;MinimongoDb;minimongo/lib/types;MinimongoDb;", //
|
||||
"minimongo;MinimongoDb;minimongo;MinimongoDb;Member[remoteDb]", //
|
||||
"minimongo;MinimongoDb;minimongo;MinimongoLocalDb;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo/IndexedDb;IndexedDbCollection;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo/MemoryDb;Collection;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo/ReplicatingDb;Collection;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo/ReplicatingDb;Collection;Member[masterCol,replicaCol]", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo/lib/types;MinimongoLocalCollection;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo;HybridCollection;Member[localCol]", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoCollection;", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoLocalDb;Member[addCollection].Argument[2].Argument[0]", //
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoLocalDb;Member[collections].AnyMember", //
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/HybridDb;default;Member[localDb]", //
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/IndexedDb;default;", //
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/ReplicatingDb;default;", //
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/types;MinimongoLocalDb;", //
|
||||
"minimongo;MinimongoLocalDb;minimongo;MinimongoDb;Member[localDb]", //
|
||||
"mongodb;Collection;minimongo;MinimongoBaseCollection;", //
|
||||
"minimongo.HybridCollection;minimongo.HybridCollectionStatic;Instance", //
|
||||
"minimongo.HybridCollection;minimongo/lib/HybridDb.HybridCollection;", //
|
||||
"minimongo.HybridCollection;minimongo/lib/HybridDb.default;Member[collections].AnyMember", //
|
||||
"minimongo.HybridCollectionStatic;minimongo/lib/HybridDb.HybridCollectionStatic;", //
|
||||
"minimongo.HybridCollectionStatic;minimongo/lib/HybridDb;Member[HybridCollection]", //
|
||||
"minimongo.HybridCollectionStatic;minimongo;Member[HybridCollection]", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo.HybridCollection;", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoCollection;", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoDb;AnyMember", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoLocalCollection;", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo/RemoteDb.Collection;", //
|
||||
"minimongo.MinimongoBaseCollection;minimongo/lib/types.MinimongoBaseCollection;", //
|
||||
"minimongo.MinimongoCollection;minimongo.HybridCollection;Member[remoteCol]", //
|
||||
"minimongo.MinimongoCollection;minimongo.MinimongoDb;Member[collections].AnyMember", //
|
||||
"minimongo.MinimongoCollection;minimongo/lib/LocalStorageDb.default;Member[collections].AnyMember", //
|
||||
"minimongo.MinimongoCollection;minimongo/lib/WebSQLDb.default;Member[collections].AnyMember", //
|
||||
"minimongo.MinimongoCollection;minimongo/lib/types.MinimongoCollection;", //
|
||||
"minimongo.MinimongoDb;minimongo.MinimongoDb;Member[remoteDb]", //
|
||||
"minimongo.MinimongoDb;minimongo.MinimongoLocalDb;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/HybridDb.default;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/HybridDb.default;Member[remoteDb]", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/LocalStorageDb.default;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/MemoryDb.default;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/RemoteDb.default;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/ReplicatingDb.default;Member[masterDb,replicaDb]", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/WebSQLDb.default;", //
|
||||
"minimongo.MinimongoDb;minimongo/lib/types.MinimongoDb;", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo.HybridCollection;Member[localCol]", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoCollection;", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoLocalDb;Member[addCollection].Argument[2].Argument[0]", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoLocalDb;Member[collections].AnyMember", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo/IndexedDb.IndexedDbCollection;", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo/MemoryDb.Collection;", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo/ReplicatingDb.Collection;", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo/ReplicatingDb.Collection;Member[masterCol,replicaCol]", //
|
||||
"minimongo.MinimongoLocalCollection;minimongo/lib/types.MinimongoLocalCollection;", //
|
||||
"minimongo.MinimongoLocalDb;minimongo.MinimongoDb;Member[localDb]", //
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/HybridDb.default;Member[localDb]", //
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/IndexedDb.default;", //
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/ReplicatingDb.default;", //
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/types.MinimongoLocalDb;", //
|
||||
"minimongo/IndexedDb.IndexedDbCollection;minimongo/IndexedDb.IndexedDbCollectionStatic;Instance", //
|
||||
"minimongo/IndexedDb.IndexedDbCollection;minimongo/lib/IndexedDb.default;Member[collections].AnyMember", //
|
||||
"minimongo/MemoryDb.Collection;minimongo/MemoryDb.CollectionStatic;Instance", //
|
||||
"minimongo/MemoryDb.Collection;minimongo/lib/MemoryDb.default;Member[collections].AnyMember", //
|
||||
"minimongo/RemoteDb.Collection;minimongo/RemoteDb.CollectionStatic;Instance", //
|
||||
"minimongo/RemoteDb.Collection;minimongo/lib/RemoteDb.default;Member[collections].AnyMember", //
|
||||
"minimongo/ReplicatingDb.Collection;minimongo/ReplicatingDb.CollectionStatic;Instance", //
|
||||
"minimongo/ReplicatingDb.Collection;minimongo/lib/ReplicatingDb.default;Member[collections].AnyMember", //
|
||||
"minimongo/lib/HybridDb.default;minimongo/lib/HybridDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/HybridDb.defaultStatic;minimongo/lib/HybridDb;Member[default]", //
|
||||
"minimongo/lib/HybridDb.defaultStatic;minimongo;Member[HybridDb]", //
|
||||
"minimongo/lib/IndexedDb.default;minimongo/lib/IndexedDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/IndexedDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/IndexedDb.defaultStatic;minimongo/lib/IndexedDb;Member[default]", //
|
||||
"minimongo/lib/IndexedDb.defaultStatic;minimongo;Member[IndexedDb]", //
|
||||
"minimongo/lib/LocalStorageDb.default;minimongo/lib/LocalStorageDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/LocalStorageDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/LocalStorageDb.defaultStatic;minimongo/lib/LocalStorageDb;Member[default]", //
|
||||
"minimongo/lib/LocalStorageDb.defaultStatic;minimongo;Member[LocalStorageDb]", //
|
||||
"minimongo/lib/MemoryDb.default;minimongo/lib/MemoryDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/MemoryDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/MemoryDb.defaultStatic;minimongo/lib/MemoryDb;Member[default]", //
|
||||
"minimongo/lib/MemoryDb.defaultStatic;minimongo;Member[MemoryDb]", //
|
||||
"minimongo/lib/RemoteDb.default;minimongo/lib/RemoteDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/RemoteDb.defaultStatic;minimongo/lib/RemoteDb;Member[default]", //
|
||||
"minimongo/lib/RemoteDb.defaultStatic;minimongo;Member[RemoteDb]", //
|
||||
"minimongo/lib/ReplicatingDb.default;minimongo/lib/ReplicatingDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/ReplicatingDb.defaultStatic;minimongo/lib/ReplicatingDb;Member[default]", //
|
||||
"minimongo/lib/ReplicatingDb.defaultStatic;minimongo;Member[ReplicatingDb]", //
|
||||
"minimongo/lib/WebSQLDb.default;minimongo/lib/WebSQLDb.defaultStatic;Instance", //
|
||||
"minimongo/lib/WebSQLDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue", //
|
||||
"minimongo/lib/WebSQLDb.defaultStatic;minimongo/lib/WebSQLDb;Member[default]", //
|
||||
"minimongo/lib/WebSQLDb.defaultStatic;minimongo;Member[WebSQLDb]", //
|
||||
"mongodb.Collection;minimongo.MinimongoBaseCollection;", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,87 +6,87 @@
|
||||
"language": "javascript",
|
||||
"model": {
|
||||
"typeDefinitions": [
|
||||
"mongodb;Collection;minimongo;MinimongoBaseCollection;",
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoDb;AnyMember"
|
||||
"mongodb.Collection;minimongo.MinimongoBaseCollection;",
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoDb;AnyMember"
|
||||
],
|
||||
"sinks": []
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"minimongo/IndexedDb;IndexedDbCollection;minimongo/IndexedDb;IndexedDbCollectionStatic;Instance",
|
||||
"minimongo/IndexedDb;IndexedDbCollection;minimongo/lib/IndexedDb;default;Member[collections].AnyMember",
|
||||
"minimongo/MemoryDb;Collection;minimongo/MemoryDb;CollectionStatic;Instance",
|
||||
"minimongo/MemoryDb;Collection;minimongo/lib/MemoryDb;default;Member[collections].AnyMember",
|
||||
"minimongo/RemoteDb;Collection;minimongo/RemoteDb;CollectionStatic;Instance",
|
||||
"minimongo/RemoteDb;Collection;minimongo/lib/RemoteDb;default;Member[collections].AnyMember",
|
||||
"minimongo/ReplicatingDb;Collection;minimongo/ReplicatingDb;CollectionStatic;Instance",
|
||||
"minimongo/ReplicatingDb;Collection;minimongo/lib/ReplicatingDb;default;Member[collections].AnyMember",
|
||||
"minimongo/lib/HybridDb;default;minimongo/lib/HybridDb;defaultStatic;Instance",
|
||||
"minimongo/lib/HybridDb;defaultStatic;minimongo/lib/HybridDb;;Member[default]",
|
||||
"minimongo/lib/HybridDb;defaultStatic;minimongo;;Member[HybridDb]",
|
||||
"minimongo/lib/IndexedDb;default;minimongo/lib/IndexedDb;defaultStatic;Instance",
|
||||
"minimongo/lib/IndexedDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/IndexedDb;defaultStatic;minimongo/lib/IndexedDb;;Member[default]",
|
||||
"minimongo/lib/IndexedDb;defaultStatic;minimongo;;Member[IndexedDb]",
|
||||
"minimongo/lib/LocalStorageDb;default;minimongo/lib/LocalStorageDb;defaultStatic;Instance",
|
||||
"minimongo/lib/LocalStorageDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/LocalStorageDb;defaultStatic;minimongo/lib/LocalStorageDb;;Member[default]",
|
||||
"minimongo/lib/LocalStorageDb;defaultStatic;minimongo;;Member[LocalStorageDb]",
|
||||
"minimongo/lib/MemoryDb;default;minimongo/lib/MemoryDb;defaultStatic;Instance",
|
||||
"minimongo/lib/MemoryDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/MemoryDb;defaultStatic;minimongo/lib/MemoryDb;;Member[default]",
|
||||
"minimongo/lib/MemoryDb;defaultStatic;minimongo;;Member[MemoryDb]",
|
||||
"minimongo/lib/RemoteDb;default;minimongo/lib/RemoteDb;defaultStatic;Instance",
|
||||
"minimongo/lib/RemoteDb;defaultStatic;minimongo/lib/RemoteDb;;Member[default]",
|
||||
"minimongo/lib/RemoteDb;defaultStatic;minimongo;;Member[RemoteDb]",
|
||||
"minimongo/lib/ReplicatingDb;default;minimongo/lib/ReplicatingDb;defaultStatic;Instance",
|
||||
"minimongo/lib/ReplicatingDb;defaultStatic;minimongo/lib/ReplicatingDb;;Member[default]",
|
||||
"minimongo/lib/ReplicatingDb;defaultStatic;minimongo;;Member[ReplicatingDb]",
|
||||
"minimongo/lib/WebSQLDb;default;minimongo/lib/WebSQLDb;defaultStatic;Instance",
|
||||
"minimongo/lib/WebSQLDb;default;minimongo;;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/WebSQLDb;defaultStatic;minimongo/lib/WebSQLDb;;Member[default]",
|
||||
"minimongo/lib/WebSQLDb;defaultStatic;minimongo;;Member[WebSQLDb]",
|
||||
"minimongo;HybridCollection;minimongo/lib/HybridDb;HybridCollection;",
|
||||
"minimongo;HybridCollection;minimongo/lib/HybridDb;default;Member[collections].AnyMember",
|
||||
"minimongo;HybridCollection;minimongo;HybridCollectionStatic;Instance",
|
||||
"minimongo;HybridCollectionStatic;minimongo/lib/HybridDb;;Member[HybridCollection]",
|
||||
"minimongo;HybridCollectionStatic;minimongo/lib/HybridDb;HybridCollectionStatic;",
|
||||
"minimongo;HybridCollectionStatic;minimongo;;Member[HybridCollection]",
|
||||
"minimongo;MinimongoBaseCollection;minimongo/RemoteDb;Collection;",
|
||||
"minimongo;MinimongoBaseCollection;minimongo/lib/types;MinimongoBaseCollection;",
|
||||
"minimongo;MinimongoBaseCollection;minimongo;HybridCollection;",
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoCollection;",
|
||||
"minimongo;MinimongoBaseCollection;minimongo;MinimongoLocalCollection;",
|
||||
"minimongo;MinimongoCollection;minimongo/lib/LocalStorageDb;default;Member[collections].AnyMember",
|
||||
"minimongo;MinimongoCollection;minimongo/lib/WebSQLDb;default;Member[collections].AnyMember",
|
||||
"minimongo;MinimongoCollection;minimongo/lib/types;MinimongoCollection;",
|
||||
"minimongo;MinimongoCollection;minimongo;HybridCollection;Member[remoteCol]",
|
||||
"minimongo;MinimongoCollection;minimongo;MinimongoDb;Member[collections].AnyMember",
|
||||
"minimongo;MinimongoDb;minimongo/lib/HybridDb;default;",
|
||||
"minimongo;MinimongoDb;minimongo/lib/HybridDb;default;Member[remoteDb]",
|
||||
"minimongo;MinimongoDb;minimongo/lib/LocalStorageDb;default;",
|
||||
"minimongo;MinimongoDb;minimongo/lib/MemoryDb;default;",
|
||||
"minimongo;MinimongoDb;minimongo/lib/RemoteDb;default;",
|
||||
"minimongo;MinimongoDb;minimongo/lib/ReplicatingDb;default;Member[masterDb,replicaDb]",
|
||||
"minimongo;MinimongoDb;minimongo/lib/WebSQLDb;default;",
|
||||
"minimongo;MinimongoDb;minimongo/lib/types;MinimongoDb;",
|
||||
"minimongo;MinimongoDb;minimongo;MinimongoDb;Member[remoteDb]",
|
||||
"minimongo;MinimongoDb;minimongo;MinimongoLocalDb;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo/IndexedDb;IndexedDbCollection;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo/MemoryDb;Collection;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo/ReplicatingDb;Collection;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo/ReplicatingDb;Collection;Member[masterCol,replicaCol]",
|
||||
"minimongo;MinimongoLocalCollection;minimongo/lib/types;MinimongoLocalCollection;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo;HybridCollection;Member[localCol]",
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoCollection;",
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoLocalDb;Member[addCollection].Argument[2].Argument[0]",
|
||||
"minimongo;MinimongoLocalCollection;minimongo;MinimongoLocalDb;Member[collections].AnyMember",
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/HybridDb;default;Member[localDb]",
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/IndexedDb;default;",
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/ReplicatingDb;default;",
|
||||
"minimongo;MinimongoLocalDb;minimongo/lib/types;MinimongoLocalDb;",
|
||||
"minimongo;MinimongoLocalDb;minimongo;MinimongoDb;Member[localDb]"
|
||||
"minimongo.HybridCollection;minimongo.HybridCollectionStatic;Instance",
|
||||
"minimongo.HybridCollection;minimongo/lib/HybridDb.HybridCollection;",
|
||||
"minimongo.HybridCollection;minimongo/lib/HybridDb.default;Member[collections].AnyMember",
|
||||
"minimongo.HybridCollectionStatic;minimongo/lib/HybridDb.HybridCollectionStatic;",
|
||||
"minimongo.HybridCollectionStatic;minimongo/lib/HybridDb;Member[HybridCollection]",
|
||||
"minimongo.HybridCollectionStatic;minimongo;Member[HybridCollection]",
|
||||
"minimongo.MinimongoBaseCollection;minimongo.HybridCollection;",
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoCollection;",
|
||||
"minimongo.MinimongoBaseCollection;minimongo.MinimongoLocalCollection;",
|
||||
"minimongo.MinimongoBaseCollection;minimongo/RemoteDb.Collection;",
|
||||
"minimongo.MinimongoBaseCollection;minimongo/lib/types.MinimongoBaseCollection;",
|
||||
"minimongo.MinimongoCollection;minimongo.HybridCollection;Member[remoteCol]",
|
||||
"minimongo.MinimongoCollection;minimongo.MinimongoDb;Member[collections].AnyMember",
|
||||
"minimongo.MinimongoCollection;minimongo/lib/LocalStorageDb.default;Member[collections].AnyMember",
|
||||
"minimongo.MinimongoCollection;minimongo/lib/WebSQLDb.default;Member[collections].AnyMember",
|
||||
"minimongo.MinimongoCollection;minimongo/lib/types.MinimongoCollection;",
|
||||
"minimongo.MinimongoDb;minimongo.MinimongoDb;Member[remoteDb]",
|
||||
"minimongo.MinimongoDb;minimongo.MinimongoLocalDb;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/HybridDb.default;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/HybridDb.default;Member[remoteDb]",
|
||||
"minimongo.MinimongoDb;minimongo/lib/LocalStorageDb.default;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/MemoryDb.default;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/RemoteDb.default;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/ReplicatingDb.default;Member[masterDb,replicaDb]",
|
||||
"minimongo.MinimongoDb;minimongo/lib/WebSQLDb.default;",
|
||||
"minimongo.MinimongoDb;minimongo/lib/types.MinimongoDb;",
|
||||
"minimongo.MinimongoLocalCollection;minimongo.HybridCollection;Member[localCol]",
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoCollection;",
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoLocalDb;Member[addCollection].Argument[2].Argument[0]",
|
||||
"minimongo.MinimongoLocalCollection;minimongo.MinimongoLocalDb;Member[collections].AnyMember",
|
||||
"minimongo.MinimongoLocalCollection;minimongo/IndexedDb.IndexedDbCollection;",
|
||||
"minimongo.MinimongoLocalCollection;minimongo/MemoryDb.Collection;",
|
||||
"minimongo.MinimongoLocalCollection;minimongo/ReplicatingDb.Collection;",
|
||||
"minimongo.MinimongoLocalCollection;minimongo/ReplicatingDb.Collection;Member[masterCol,replicaCol]",
|
||||
"minimongo.MinimongoLocalCollection;minimongo/lib/types.MinimongoLocalCollection;",
|
||||
"minimongo.MinimongoLocalDb;minimongo.MinimongoDb;Member[localDb]",
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/HybridDb.default;Member[localDb]",
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/IndexedDb.default;",
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/ReplicatingDb.default;",
|
||||
"minimongo.MinimongoLocalDb;minimongo/lib/types.MinimongoLocalDb;",
|
||||
"minimongo/IndexedDb.IndexedDbCollection;minimongo/IndexedDb.IndexedDbCollectionStatic;Instance",
|
||||
"minimongo/IndexedDb.IndexedDbCollection;minimongo/lib/IndexedDb.default;Member[collections].AnyMember",
|
||||
"minimongo/MemoryDb.Collection;minimongo/MemoryDb.CollectionStatic;Instance",
|
||||
"minimongo/MemoryDb.Collection;minimongo/lib/MemoryDb.default;Member[collections].AnyMember",
|
||||
"minimongo/RemoteDb.Collection;minimongo/RemoteDb.CollectionStatic;Instance",
|
||||
"minimongo/RemoteDb.Collection;minimongo/lib/RemoteDb.default;Member[collections].AnyMember",
|
||||
"minimongo/ReplicatingDb.Collection;minimongo/ReplicatingDb.CollectionStatic;Instance",
|
||||
"minimongo/ReplicatingDb.Collection;minimongo/lib/ReplicatingDb.default;Member[collections].AnyMember",
|
||||
"minimongo/lib/HybridDb.default;minimongo/lib/HybridDb.defaultStatic;Instance",
|
||||
"minimongo/lib/HybridDb.defaultStatic;minimongo/lib/HybridDb;Member[default]",
|
||||
"minimongo/lib/HybridDb.defaultStatic;minimongo;Member[HybridDb]",
|
||||
"minimongo/lib/IndexedDb.default;minimongo/lib/IndexedDb.defaultStatic;Instance",
|
||||
"minimongo/lib/IndexedDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/IndexedDb.defaultStatic;minimongo/lib/IndexedDb;Member[default]",
|
||||
"minimongo/lib/IndexedDb.defaultStatic;minimongo;Member[IndexedDb]",
|
||||
"minimongo/lib/LocalStorageDb.default;minimongo/lib/LocalStorageDb.defaultStatic;Instance",
|
||||
"minimongo/lib/LocalStorageDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/LocalStorageDb.defaultStatic;minimongo/lib/LocalStorageDb;Member[default]",
|
||||
"minimongo/lib/LocalStorageDb.defaultStatic;minimongo;Member[LocalStorageDb]",
|
||||
"minimongo/lib/MemoryDb.default;minimongo/lib/MemoryDb.defaultStatic;Instance",
|
||||
"minimongo/lib/MemoryDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/MemoryDb.defaultStatic;minimongo/lib/MemoryDb;Member[default]",
|
||||
"minimongo/lib/MemoryDb.defaultStatic;minimongo;Member[MemoryDb]",
|
||||
"minimongo/lib/RemoteDb.default;minimongo/lib/RemoteDb.defaultStatic;Instance",
|
||||
"minimongo/lib/RemoteDb.defaultStatic;minimongo/lib/RemoteDb;Member[default]",
|
||||
"minimongo/lib/RemoteDb.defaultStatic;minimongo;Member[RemoteDb]",
|
||||
"minimongo/lib/ReplicatingDb.default;minimongo/lib/ReplicatingDb.defaultStatic;Instance",
|
||||
"minimongo/lib/ReplicatingDb.defaultStatic;minimongo/lib/ReplicatingDb;Member[default]",
|
||||
"minimongo/lib/ReplicatingDb.defaultStatic;minimongo;Member[ReplicatingDb]",
|
||||
"minimongo/lib/WebSQLDb.default;minimongo/lib/WebSQLDb.defaultStatic;Instance",
|
||||
"minimongo/lib/WebSQLDb.default;minimongo;Member[utils].Member[autoselectLocalDb].ReturnValue",
|
||||
"minimongo/lib/WebSQLDb.defaultStatic;minimongo/lib/WebSQLDb;Member[default]",
|
||||
"minimongo/lib/WebSQLDb.defaultStatic;minimongo;Member[WebSQLDb]"
|
||||
],
|
||||
"summaries": [],
|
||||
"typeVariables": []
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -6,40 +6,40 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"mssql;ConnectionPool;mssql/msnodesqlv8;;Member[connect].ReturnValue.Awaited", //
|
||||
"mssql;ConnectionPool;mssql/msnodesqlv8;;Member[pool]", //
|
||||
"mssql;ConnectionPool;mssql;;Member[connect].ReturnValue.Awaited", //
|
||||
"mssql;ConnectionPool;mssql;;Member[pool]", //
|
||||
"mssql;ConnectionPool;mssql;ConnectionPool;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"mssql;ConnectionPool;mssql;ConnectionPoolStatic;Instance", //
|
||||
"mssql;ConnectionPoolStatic;mssql/msnodesqlv8;;Member[ConnectionPool]", //
|
||||
"mssql;ConnectionPoolStatic;mssql;;Member[ConnectionPool]", //
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[input,output].ReturnValue", //
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[prepare].WithArity[0,1,2].ReturnValue", //
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[unprepare].WithArity[1].ReturnValue", //
|
||||
"mssql;PreparedStatement;mssql;PreparedStatementStatic;Instance", //
|
||||
"mssql;PreparedStatement;mssql;Request;Member[pstatement]", //
|
||||
"mssql;PreparedStatementStatic;mssql/msnodesqlv8;;Member[PreparedStatement]", //
|
||||
"mssql;PreparedStatementStatic;mssql;;Member[PreparedStatement]", //
|
||||
"mssql;Request;mssql;ConnectionPool;Member[request].ReturnValue", //
|
||||
"mssql;Request;mssql;PreparedStatement;Member[execute].WithArity[2].ReturnValue", //
|
||||
"mssql;Request;mssql;Request;Member[input,output,replaceInput].ReturnValue", //
|
||||
"mssql;Request;mssql;Request;Member[replaceOutput].ReturnValue", //
|
||||
"mssql;Request;mssql;RequestStatic;Instance", //
|
||||
"mssql;Request;mssql;Transaction;Member[request].ReturnValue", //
|
||||
"mssql;RequestStatic;mssql/msnodesqlv8;;Member[Request]", //
|
||||
"mssql;RequestStatic;mssql;;Member[Request]", //
|
||||
"mssql;Transaction;mssql;ConnectionPool;Member[transaction].ReturnValue", //
|
||||
"mssql;Transaction;mssql;PreparedStatement;Member[transaction]", //
|
||||
"mssql;Transaction;mssql;Request;Member[transaction]", //
|
||||
"mssql;Transaction;mssql;Transaction;Member[begin].WithArity[0,1,2].ReturnValue", //
|
||||
"mssql;Transaction;mssql;Transaction;Member[begin].WithArity[0,1].ReturnValue.Awaited", //
|
||||
"mssql;Transaction;mssql;TransactionStatic;Instance", //
|
||||
"mssql;TransactionStatic;mssql/msnodesqlv8;;Member[Transaction]", //
|
||||
"mssql;TransactionStatic;mssql;;Member[Transaction]", //
|
||||
"mssql;config;mssql/msnodesqlv8;;Member[connect].Argument[0]", //
|
||||
"mssql;config;mssql;;Member[connect].Argument[0]", //
|
||||
"mssql;config;mssql;ConnectionPoolStatic;WithArity[1,2].Argument[0]", //
|
||||
"mssql.ConnectionPool;mssql.ConnectionPool;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"mssql.ConnectionPool;mssql.ConnectionPoolStatic;Instance", //
|
||||
"mssql.ConnectionPool;mssql/msnodesqlv8;Member[connect].ReturnValue.Awaited", //
|
||||
"mssql.ConnectionPool;mssql/msnodesqlv8;Member[pool]", //
|
||||
"mssql.ConnectionPool;mssql;Member[connect].ReturnValue.Awaited", //
|
||||
"mssql.ConnectionPool;mssql;Member[pool]", //
|
||||
"mssql.ConnectionPoolStatic;mssql/msnodesqlv8;Member[ConnectionPool]", //
|
||||
"mssql.ConnectionPoolStatic;mssql;Member[ConnectionPool]", //
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[input,output].ReturnValue", //
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[prepare].WithArity[0,1,2].ReturnValue", //
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[unprepare].WithArity[1].ReturnValue", //
|
||||
"mssql.PreparedStatement;mssql.PreparedStatementStatic;Instance", //
|
||||
"mssql.PreparedStatement;mssql.Request;Member[pstatement]", //
|
||||
"mssql.PreparedStatementStatic;mssql/msnodesqlv8;Member[PreparedStatement]", //
|
||||
"mssql.PreparedStatementStatic;mssql;Member[PreparedStatement]", //
|
||||
"mssql.Request;mssql.ConnectionPool;Member[request].ReturnValue", //
|
||||
"mssql.Request;mssql.PreparedStatement;Member[execute].WithArity[2].ReturnValue", //
|
||||
"mssql.Request;mssql.Request;Member[input,output,replaceInput].ReturnValue", //
|
||||
"mssql.Request;mssql.Request;Member[replaceOutput].ReturnValue", //
|
||||
"mssql.Request;mssql.RequestStatic;Instance", //
|
||||
"mssql.Request;mssql.Transaction;Member[request].ReturnValue", //
|
||||
"mssql.RequestStatic;mssql/msnodesqlv8;Member[Request]", //
|
||||
"mssql.RequestStatic;mssql;Member[Request]", //
|
||||
"mssql.Transaction;mssql.ConnectionPool;Member[transaction].ReturnValue", //
|
||||
"mssql.Transaction;mssql.PreparedStatement;Member[transaction]", //
|
||||
"mssql.Transaction;mssql.Request;Member[transaction]", //
|
||||
"mssql.Transaction;mssql.Transaction;Member[begin].WithArity[0,1,2].ReturnValue", //
|
||||
"mssql.Transaction;mssql.Transaction;Member[begin].WithArity[0,1].ReturnValue.Awaited", //
|
||||
"mssql.Transaction;mssql.TransactionStatic;Instance", //
|
||||
"mssql.TransactionStatic;mssql/msnodesqlv8;Member[Transaction]", //
|
||||
"mssql.TransactionStatic;mssql;Member[Transaction]", //
|
||||
"mssql.config;mssql.ConnectionPoolStatic;WithArity[1,2].Argument[0]", //
|
||||
"mssql.config;mssql/msnodesqlv8;Member[connect].Argument[0]", //
|
||||
"mssql.config;mssql;Member[connect].Argument[0]", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,55 +10,55 @@
|
||||
"language": "javascript",
|
||||
"usedTypes": {
|
||||
"sources": [
|
||||
"mssql;Request",
|
||||
"mssql;ConnectionPool"
|
||||
"mssql.Request",
|
||||
"mssql.ConnectionPool"
|
||||
],
|
||||
"sinks": [
|
||||
"mssql;config"
|
||||
"mssql.config"
|
||||
]
|
||||
},
|
||||
"model": {
|
||||
"typeDefinitions": [
|
||||
"mssql;Request;mssql;Request;Member[replaceOutput].ReturnValue"
|
||||
"mssql.Request;mssql.Request;Member[replaceOutput].ReturnValue"
|
||||
],
|
||||
"sinks": []
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"mssql;ConnectionPool;mssql/msnodesqlv8;;Member[connect].ReturnValue.Awaited",
|
||||
"mssql;ConnectionPool;mssql/msnodesqlv8;;Member[pool]",
|
||||
"mssql;ConnectionPool;mssql;;Member[connect].ReturnValue.Awaited",
|
||||
"mssql;ConnectionPool;mssql;;Member[pool]",
|
||||
"mssql;ConnectionPool;mssql;ConnectionPool;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"mssql;ConnectionPool;mssql;ConnectionPoolStatic;Instance",
|
||||
"mssql;ConnectionPoolStatic;mssql/msnodesqlv8;;Member[ConnectionPool]",
|
||||
"mssql;ConnectionPoolStatic;mssql;;Member[ConnectionPool]",
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[input,output].ReturnValue",
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[prepare].WithArity[0,1,2].ReturnValue",
|
||||
"mssql;PreparedStatement;mssql;PreparedStatement;Member[unprepare].WithArity[1].ReturnValue",
|
||||
"mssql;PreparedStatement;mssql;PreparedStatementStatic;Instance",
|
||||
"mssql;PreparedStatement;mssql;Request;Member[pstatement]",
|
||||
"mssql;PreparedStatementStatic;mssql/msnodesqlv8;;Member[PreparedStatement]",
|
||||
"mssql;PreparedStatementStatic;mssql;;Member[PreparedStatement]",
|
||||
"mssql;Request;mssql;ConnectionPool;Member[request].ReturnValue",
|
||||
"mssql;Request;mssql;PreparedStatement;Member[execute].WithArity[2].ReturnValue",
|
||||
"mssql;Request;mssql;Request;Member[input,output,replaceInput].ReturnValue",
|
||||
"mssql;Request;mssql;RequestStatic;Instance",
|
||||
"mssql;Request;mssql;Transaction;Member[request].ReturnValue",
|
||||
"mssql;RequestStatic;mssql/msnodesqlv8;;Member[Request]",
|
||||
"mssql;RequestStatic;mssql;;Member[Request]",
|
||||
"mssql;Transaction;mssql;ConnectionPool;Member[transaction].ReturnValue",
|
||||
"mssql;Transaction;mssql;PreparedStatement;Member[transaction]",
|
||||
"mssql;Transaction;mssql;Request;Member[transaction]",
|
||||
"mssql;Transaction;mssql;Transaction;Member[begin].WithArity[0,1,2].ReturnValue",
|
||||
"mssql;Transaction;mssql;Transaction;Member[begin].WithArity[0,1].ReturnValue.Awaited",
|
||||
"mssql;Transaction;mssql;TransactionStatic;Instance",
|
||||
"mssql;TransactionStatic;mssql/msnodesqlv8;;Member[Transaction]",
|
||||
"mssql;TransactionStatic;mssql;;Member[Transaction]",
|
||||
"mssql;config;mssql/msnodesqlv8;;Member[connect].Argument[0]",
|
||||
"mssql;config;mssql;;Member[connect].Argument[0]",
|
||||
"mssql;config;mssql;ConnectionPoolStatic;WithArity[1,2].Argument[0]"
|
||||
"mssql.ConnectionPool;mssql.ConnectionPool;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"mssql.ConnectionPool;mssql.ConnectionPoolStatic;Instance",
|
||||
"mssql.ConnectionPool;mssql/msnodesqlv8;Member[connect].ReturnValue.Awaited",
|
||||
"mssql.ConnectionPool;mssql/msnodesqlv8;Member[pool]",
|
||||
"mssql.ConnectionPool;mssql;Member[connect].ReturnValue.Awaited",
|
||||
"mssql.ConnectionPool;mssql;Member[pool]",
|
||||
"mssql.ConnectionPoolStatic;mssql/msnodesqlv8;Member[ConnectionPool]",
|
||||
"mssql.ConnectionPoolStatic;mssql;Member[ConnectionPool]",
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[input,output].ReturnValue",
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[prepare].WithArity[0,1,2].ReturnValue",
|
||||
"mssql.PreparedStatement;mssql.PreparedStatement;Member[unprepare].WithArity[1].ReturnValue",
|
||||
"mssql.PreparedStatement;mssql.PreparedStatementStatic;Instance",
|
||||
"mssql.PreparedStatement;mssql.Request;Member[pstatement]",
|
||||
"mssql.PreparedStatementStatic;mssql/msnodesqlv8;Member[PreparedStatement]",
|
||||
"mssql.PreparedStatementStatic;mssql;Member[PreparedStatement]",
|
||||
"mssql.Request;mssql.ConnectionPool;Member[request].ReturnValue",
|
||||
"mssql.Request;mssql.PreparedStatement;Member[execute].WithArity[2].ReturnValue",
|
||||
"mssql.Request;mssql.Request;Member[input,output,replaceInput].ReturnValue",
|
||||
"mssql.Request;mssql.RequestStatic;Instance",
|
||||
"mssql.Request;mssql.Transaction;Member[request].ReturnValue",
|
||||
"mssql.RequestStatic;mssql/msnodesqlv8;Member[Request]",
|
||||
"mssql.RequestStatic;mssql;Member[Request]",
|
||||
"mssql.Transaction;mssql.ConnectionPool;Member[transaction].ReturnValue",
|
||||
"mssql.Transaction;mssql.PreparedStatement;Member[transaction]",
|
||||
"mssql.Transaction;mssql.Request;Member[transaction]",
|
||||
"mssql.Transaction;mssql.Transaction;Member[begin].WithArity[0,1,2].ReturnValue",
|
||||
"mssql.Transaction;mssql.Transaction;Member[begin].WithArity[0,1].ReturnValue.Awaited",
|
||||
"mssql.Transaction;mssql.TransactionStatic;Instance",
|
||||
"mssql.TransactionStatic;mssql/msnodesqlv8;Member[Transaction]",
|
||||
"mssql.TransactionStatic;mssql;Member[Transaction]",
|
||||
"mssql.config;mssql.ConnectionPoolStatic;WithArity[1,2].Argument[0]",
|
||||
"mssql.config;mssql/msnodesqlv8;Member[connect].Argument[0]",
|
||||
"mssql.config;mssql;Member[connect].Argument[0]"
|
||||
],
|
||||
"summaries": [],
|
||||
"typeVariables": []
|
||||
|
||||
@@ -6,63 +6,63 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"mysql2/promise;Connection;mysql2/promise;;Member[createConnectionPromise].ReturnValue.Awaited", //
|
||||
"mysql2/promise;Connection;mysql2/promise;;Member[createConnection].ReturnValue.Awaited", //
|
||||
"mysql2/promise;Connection;mysql2/promise;PoolConnection;", //
|
||||
"mysql2/promise;Connection;mysql2;;Member[createConnectionPromise].ReturnValue.Awaited", //
|
||||
"mysql2/promise;Connection;mysql2;Connection;Member[promise].ReturnValue", //
|
||||
"mysql2/promise;Pool;mysql2/promise;;Member[createPool].ReturnValue", //
|
||||
"mysql2/promise;Pool;mysql2/promise;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"mysql2/promise;Pool;mysql2;Pool;Member[promise].ReturnValue", //
|
||||
"mysql2/promise;PoolConnection;mysql2/promise;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql2/promise;PoolConnection;mysql2/promise;Pool;Member[getConnection].ReturnValue.Awaited", //
|
||||
"mysql2/promise;PoolConnection;mysql2;PoolConnection;Member[promise].ReturnValue", //
|
||||
"mysql2/typings/mysql/lib/Connection;;mysql2/typings/mysql/lib/PoolConnection;;", //
|
||||
"mysql2/typings/mysql/lib/Connection;;mysql2/typings/mysql;Connection;", //
|
||||
"mysql2/typings/mysql/lib/PoolConnection;;mysql2/typings/mysql;PoolConnection;", //
|
||||
"mysql2/typings/mysql;Connection;mysql2;Connection;", //
|
||||
"mysql2/typings/mysql;Connection;mysql2;Pool;", //
|
||||
"mysql2/typings/mysql;PoolConnection;mysql2;PoolConnection;", //
|
||||
"mysql2;Connection;mysql2;;Member[createConnection].ReturnValue", //
|
||||
"mysql2;Connection;mysql2;PoolConnection;", //
|
||||
"mysql2;Connection;mysql2;authPlugins;Argument[0].Member[connection]", //
|
||||
"mysql2;ConnectionOptions;mysql2/promise;;Member[createConnection].Argument[0]", //
|
||||
"mysql2;ConnectionOptions;mysql2/promise;Connection;Member[changeUser].Argument[0]", //
|
||||
"mysql2;ConnectionOptions;mysql2/promise;Connection;Member[config]", //
|
||||
"mysql2;ConnectionOptions;mysql2;;Member[createConnection].Argument[0]", //
|
||||
"mysql2;ConnectionOptions;mysql2;PoolOptions;", //
|
||||
"mysql2;Pool;mysql2;;Member[createPool].ReturnValue", //
|
||||
"mysql2;Pool;mysql2;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"mysql2;PoolConnection;mysql2;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql2;PoolConnection;mysql2;Pool;Member[getConnection].Argument[0].Argument[1]", //
|
||||
"mysql2;PoolOptions;mysql2/promise;;Member[createPool].Argument[0]", //
|
||||
"mysql2;PoolOptions;mysql2;;Member[createPool].Argument[0]", //
|
||||
"mysql2;authPlugins;mysql2;ConnectionOptions;Member[authPlugins].AnyMember", //
|
||||
"mysql;Connection;mysql;;Member[createConnection].ReturnValue", //
|
||||
"mysql;Connection;mysql;Pool;Member[on,addListener].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql;Connection;mysql;PoolConnection;", //
|
||||
"mysql;Connection;mysql;Query;Member[RowDataPacket].Argument[2]", //
|
||||
"mysql;ConnectionConfig;mysql;;Member[createConnection].Argument[0]", //
|
||||
"mysql;ConnectionConfig;mysql;Connection;Member[config]", //
|
||||
"mysql;ConnectionConfig;mysql;PoolConfig;", //
|
||||
"mysql;ConnectionOptions;mysql;Connection;Member[changeUser].WithArity[1,2].Argument[0]", //
|
||||
"mysql;ConnectionOptions;mysql;ConnectionConfig;", //
|
||||
"mysql;Pool;mysql;;Member[createPool].ReturnValue", //
|
||||
"mysql;Pool;mysql;PoolCluster;Member[of].ReturnValue", //
|
||||
"mysql;PoolCluster;mysql;;Member[createPoolCluster].ReturnValue", //
|
||||
"mysql;PoolConfig;mysql;;Member[createPool].Argument[0]", //
|
||||
"mysql;PoolConfig;mysql;PoolCluster;Member[add].Argument[1]", //
|
||||
"mysql;PoolConfig;mysql;PoolCluster;Member[add].WithArity[1].Argument[0]", //
|
||||
"mysql;PoolConnection;mysql;Pool;Member[acquireConnection].Argument[0]", //
|
||||
"mysql;PoolConnection;mysql;Pool;Member[acquireConnection].Argument[1].Argument[1]", //
|
||||
"mysql;PoolConnection;mysql;Pool;Member[getConnection].Argument[0].Argument[1]", //
|
||||
"mysql;PoolConnection;mysql;PoolCluster;Member[getConnection].Argument[1,2].Argument[1]", //
|
||||
"mysql;PoolConnection;mysql;PoolCluster;Member[getConnection].WithArity[1].Argument[0].Argument[1]", //
|
||||
"mysql;Query;mysql;Query;Member[on].ReturnValue", //
|
||||
"mysql;Query;mysql;QueryFunction;ReturnValue", //
|
||||
"mysql;Query;mysql;QueryFunction;WithArity[1].Argument[0]", //
|
||||
"mysql;QueryFunction;mysql;Connection;Member[createQuery,query]", //
|
||||
"mysql;QueryFunction;mysql;Pool;Member[query]", //
|
||||
"mysql.Connection;mysql.Pool;Member[on,addListener].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql.Connection;mysql.PoolConnection;", //
|
||||
"mysql.Connection;mysql.Query;Member[RowDataPacket].Argument[2]", //
|
||||
"mysql.Connection;mysql;Member[createConnection].ReturnValue", //
|
||||
"mysql.ConnectionConfig;mysql.Connection;Member[config]", //
|
||||
"mysql.ConnectionConfig;mysql.PoolConfig;", //
|
||||
"mysql.ConnectionConfig;mysql;Member[createConnection].Argument[0]", //
|
||||
"mysql.ConnectionOptions;mysql.Connection;Member[changeUser].WithArity[1,2].Argument[0]", //
|
||||
"mysql.ConnectionOptions;mysql.ConnectionConfig;", //
|
||||
"mysql.Pool;mysql.PoolCluster;Member[of].ReturnValue", //
|
||||
"mysql.Pool;mysql;Member[createPool].ReturnValue", //
|
||||
"mysql.PoolCluster;mysql;Member[createPoolCluster].ReturnValue", //
|
||||
"mysql.PoolConfig;mysql.PoolCluster;Member[add].Argument[1]", //
|
||||
"mysql.PoolConfig;mysql.PoolCluster;Member[add].WithArity[1].Argument[0]", //
|
||||
"mysql.PoolConfig;mysql;Member[createPool].Argument[0]", //
|
||||
"mysql.PoolConnection;mysql.Pool;Member[acquireConnection].Argument[0]", //
|
||||
"mysql.PoolConnection;mysql.Pool;Member[acquireConnection].Argument[1].Argument[1]", //
|
||||
"mysql.PoolConnection;mysql.Pool;Member[getConnection].Argument[0].Argument[1]", //
|
||||
"mysql.PoolConnection;mysql.PoolCluster;Member[getConnection].Argument[1,2].Argument[1]", //
|
||||
"mysql.PoolConnection;mysql.PoolCluster;Member[getConnection].WithArity[1].Argument[0].Argument[1]", //
|
||||
"mysql.Query;mysql.Query;Member[on].ReturnValue", //
|
||||
"mysql.Query;mysql.QueryFunction;ReturnValue", //
|
||||
"mysql.Query;mysql.QueryFunction;WithArity[1].Argument[0]", //
|
||||
"mysql.QueryFunction;mysql.Connection;Member[createQuery,query]", //
|
||||
"mysql.QueryFunction;mysql.Pool;Member[query]", //
|
||||
"mysql2.Connection;mysql2.PoolConnection;", //
|
||||
"mysql2.Connection;mysql2.authPlugins;Argument[0].Member[connection]", //
|
||||
"mysql2.Connection;mysql2;Member[createConnection].ReturnValue", //
|
||||
"mysql2.ConnectionOptions;mysql2.PoolOptions;", //
|
||||
"mysql2.ConnectionOptions;mysql2/promise.Connection;Member[changeUser].Argument[0]", //
|
||||
"mysql2.ConnectionOptions;mysql2/promise.Connection;Member[config]", //
|
||||
"mysql2.ConnectionOptions;mysql2/promise;Member[createConnection].Argument[0]", //
|
||||
"mysql2.ConnectionOptions;mysql2;Member[createConnection].Argument[0]", //
|
||||
"mysql2.Pool;mysql2.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"mysql2.Pool;mysql2;Member[createPool].ReturnValue", //
|
||||
"mysql2.PoolConnection;mysql2.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql2.PoolConnection;mysql2.Pool;Member[getConnection].Argument[0].Argument[1]", //
|
||||
"mysql2.PoolOptions;mysql2/promise;Member[createPool].Argument[0]", //
|
||||
"mysql2.PoolOptions;mysql2;Member[createPool].Argument[0]", //
|
||||
"mysql2.authPlugins;mysql2.ConnectionOptions;Member[authPlugins].AnyMember", //
|
||||
"mysql2/promise.Connection;mysql2.Connection;Member[promise].ReturnValue", //
|
||||
"mysql2/promise.Connection;mysql2/promise.PoolConnection;", //
|
||||
"mysql2/promise.Connection;mysql2/promise;Member[createConnectionPromise].ReturnValue.Awaited", //
|
||||
"mysql2/promise.Connection;mysql2/promise;Member[createConnection].ReturnValue.Awaited", //
|
||||
"mysql2/promise.Connection;mysql2;Member[createConnectionPromise].ReturnValue.Awaited", //
|
||||
"mysql2/promise.Pool;mysql2.Pool;Member[promise].ReturnValue", //
|
||||
"mysql2/promise.Pool;mysql2/promise.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"mysql2/promise.Pool;mysql2/promise;Member[createPool].ReturnValue", //
|
||||
"mysql2/promise.PoolConnection;mysql2.PoolConnection;Member[promise].ReturnValue", //
|
||||
"mysql2/promise.PoolConnection;mysql2/promise.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]", //
|
||||
"mysql2/promise.PoolConnection;mysql2/promise.Pool;Member[getConnection].ReturnValue.Awaited", //
|
||||
"mysql2/typings/mysql.Connection;mysql2.Connection;", //
|
||||
"mysql2/typings/mysql.Connection;mysql2.Pool;", //
|
||||
"mysql2/typings/mysql.PoolConnection;mysql2.PoolConnection;", //
|
||||
"mysql2/typings/mysql/lib/Connection;mysql2/typings/mysql.Connection;", //
|
||||
"mysql2/typings/mysql/lib/Connection;mysql2/typings/mysql/lib/PoolConnection;", //
|
||||
"mysql2/typings/mysql/lib/PoolConnection;mysql2/typings/mysql.PoolConnection;", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -71,9 +71,9 @@ private class Summaries extends ModelInput::SummaryModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"mysql2/promise;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"mysql2/typings/mysql/lib/Connection;;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"mysql2;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"mysql2.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"mysql2/promise.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"mysql2/typings/mysql/lib/Connection;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,89 +11,89 @@
|
||||
"language": "javascript",
|
||||
"usedTypes": {
|
||||
"sources": [
|
||||
"mysql;Pool",
|
||||
"mysql;Connection",
|
||||
"mysql2;Pool",
|
||||
"mysql2;Connection",
|
||||
"mysql2/promise;Pool",
|
||||
"mysql2/promise;Connection"
|
||||
"mysql.Pool",
|
||||
"mysql.Connection",
|
||||
"mysql2.Pool",
|
||||
"mysql2.Connection",
|
||||
"mysql2/promise.Pool",
|
||||
"mysql2/promise.Connection"
|
||||
],
|
||||
"sinks": [
|
||||
"mysql;ConnectionOptions",
|
||||
"mysql2;ConnectionOptions",
|
||||
"mysql2/promise;ConnectionOptions"
|
||||
"mysql.ConnectionOptions",
|
||||
"mysql2.ConnectionOptions",
|
||||
"mysql2/promise.ConnectionOptions"
|
||||
]
|
||||
},
|
||||
"model": {
|
||||
"sinks": [],
|
||||
"typeDefinitions": [
|
||||
"mysql;Connection;mysql;Pool;Member[on,addListener].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2/promise;Connection;mysql2;;Member[createConnectionPromise].ReturnValue.Awaited",
|
||||
"mysql2/promise;Connection;mysql2/promise;;Member[createConnectionPromise].ReturnValue.Awaited"
|
||||
"mysql.Connection;mysql.Pool;Member[on,addListener].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2/promise.Connection;mysql2;Member[createConnectionPromise].ReturnValue.Awaited",
|
||||
"mysql2/promise.Connection;mysql2/promise;Member[createConnectionPromise].ReturnValue.Awaited"
|
||||
]
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"mysql2/promise;Connection;mysql2/promise;;Member[createConnection].ReturnValue.Awaited",
|
||||
"mysql2/promise;Connection;mysql2/promise;PoolConnection;",
|
||||
"mysql2/promise;Connection;mysql2;Connection;Member[promise].ReturnValue",
|
||||
"mysql2/promise;Pool;mysql2/promise;;Member[createPool].ReturnValue",
|
||||
"mysql2/promise;Pool;mysql2/promise;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"mysql2/promise;Pool;mysql2;Pool;Member[promise].ReturnValue",
|
||||
"mysql2/promise;PoolConnection;mysql2/promise;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2/promise;PoolConnection;mysql2/promise;Pool;Member[getConnection].ReturnValue.Awaited",
|
||||
"mysql2/promise;PoolConnection;mysql2;PoolConnection;Member[promise].ReturnValue",
|
||||
"mysql2/typings/mysql/lib/Connection;;mysql2/typings/mysql/lib/PoolConnection;;",
|
||||
"mysql2/typings/mysql/lib/Connection;;mysql2/typings/mysql;Connection;",
|
||||
"mysql2/typings/mysql/lib/PoolConnection;;mysql2/typings/mysql;PoolConnection;",
|
||||
"mysql2/typings/mysql;Connection;mysql2;Connection;",
|
||||
"mysql2/typings/mysql;Connection;mysql2;Pool;",
|
||||
"mysql2/typings/mysql;PoolConnection;mysql2;PoolConnection;",
|
||||
"mysql2;Connection;mysql2;;Member[createConnection].ReturnValue",
|
||||
"mysql2;Connection;mysql2;PoolConnection;",
|
||||
"mysql2;Connection;mysql2;authPlugins;Argument[0].Member[connection]",
|
||||
"mysql2;ConnectionOptions;mysql2/promise;;Member[createConnection].Argument[0]",
|
||||
"mysql2;ConnectionOptions;mysql2/promise;Connection;Member[changeUser].Argument[0]",
|
||||
"mysql2;ConnectionOptions;mysql2/promise;Connection;Member[config]",
|
||||
"mysql2;ConnectionOptions;mysql2;;Member[createConnection].Argument[0]",
|
||||
"mysql2;ConnectionOptions;mysql2;PoolOptions;",
|
||||
"mysql2;Pool;mysql2;;Member[createPool].ReturnValue",
|
||||
"mysql2;Pool;mysql2;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"mysql2;PoolConnection;mysql2;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2;PoolConnection;mysql2;Pool;Member[getConnection].Argument[0].Argument[1]",
|
||||
"mysql2;PoolOptions;mysql2/promise;;Member[createPool].Argument[0]",
|
||||
"mysql2;PoolOptions;mysql2;;Member[createPool].Argument[0]",
|
||||
"mysql2;authPlugins;mysql2;ConnectionOptions;Member[authPlugins].AnyMember",
|
||||
"mysql;Connection;mysql;;Member[createConnection].ReturnValue",
|
||||
"mysql;Connection;mysql;PoolConnection;",
|
||||
"mysql;Connection;mysql;Query;Member[RowDataPacket].Argument[2]",
|
||||
"mysql;ConnectionConfig;mysql;;Member[createConnection].Argument[0]",
|
||||
"mysql;ConnectionConfig;mysql;Connection;Member[config]",
|
||||
"mysql;ConnectionConfig;mysql;PoolConfig;",
|
||||
"mysql;ConnectionOptions;mysql;Connection;Member[changeUser].WithArity[1,2].Argument[0]",
|
||||
"mysql;ConnectionOptions;mysql;ConnectionConfig;",
|
||||
"mysql;Pool;mysql;;Member[createPool].ReturnValue",
|
||||
"mysql;Pool;mysql;PoolCluster;Member[of].ReturnValue",
|
||||
"mysql;PoolCluster;mysql;;Member[createPoolCluster].ReturnValue",
|
||||
"mysql;PoolConfig;mysql;;Member[createPool].Argument[0]",
|
||||
"mysql;PoolConfig;mysql;PoolCluster;Member[add].Argument[1]",
|
||||
"mysql;PoolConfig;mysql;PoolCluster;Member[add].WithArity[1].Argument[0]",
|
||||
"mysql;PoolConnection;mysql;Pool;Member[acquireConnection].Argument[0]",
|
||||
"mysql;PoolConnection;mysql;Pool;Member[acquireConnection].Argument[1].Argument[1]",
|
||||
"mysql;PoolConnection;mysql;Pool;Member[getConnection].Argument[0].Argument[1]",
|
||||
"mysql;PoolConnection;mysql;PoolCluster;Member[getConnection].Argument[1,2].Argument[1]",
|
||||
"mysql;PoolConnection;mysql;PoolCluster;Member[getConnection].WithArity[1].Argument[0].Argument[1]",
|
||||
"mysql;Query;mysql;Query;Member[on].ReturnValue",
|
||||
"mysql;Query;mysql;QueryFunction;ReturnValue",
|
||||
"mysql;Query;mysql;QueryFunction;WithArity[1].Argument[0]",
|
||||
"mysql;QueryFunction;mysql;Connection;Member[createQuery,query]",
|
||||
"mysql;QueryFunction;mysql;Pool;Member[query]"
|
||||
"mysql.Connection;mysql.PoolConnection;",
|
||||
"mysql.Connection;mysql.Query;Member[RowDataPacket].Argument[2]",
|
||||
"mysql.Connection;mysql;Member[createConnection].ReturnValue",
|
||||
"mysql.ConnectionConfig;mysql.Connection;Member[config]",
|
||||
"mysql.ConnectionConfig;mysql.PoolConfig;",
|
||||
"mysql.ConnectionConfig;mysql;Member[createConnection].Argument[0]",
|
||||
"mysql.ConnectionOptions;mysql.Connection;Member[changeUser].WithArity[1,2].Argument[0]",
|
||||
"mysql.ConnectionOptions;mysql.ConnectionConfig;",
|
||||
"mysql.Pool;mysql.PoolCluster;Member[of].ReturnValue",
|
||||
"mysql.Pool;mysql;Member[createPool].ReturnValue",
|
||||
"mysql.PoolCluster;mysql;Member[createPoolCluster].ReturnValue",
|
||||
"mysql.PoolConfig;mysql.PoolCluster;Member[add].Argument[1]",
|
||||
"mysql.PoolConfig;mysql.PoolCluster;Member[add].WithArity[1].Argument[0]",
|
||||
"mysql.PoolConfig;mysql;Member[createPool].Argument[0]",
|
||||
"mysql.PoolConnection;mysql.Pool;Member[acquireConnection].Argument[0]",
|
||||
"mysql.PoolConnection;mysql.Pool;Member[acquireConnection].Argument[1].Argument[1]",
|
||||
"mysql.PoolConnection;mysql.Pool;Member[getConnection].Argument[0].Argument[1]",
|
||||
"mysql.PoolConnection;mysql.PoolCluster;Member[getConnection].Argument[1,2].Argument[1]",
|
||||
"mysql.PoolConnection;mysql.PoolCluster;Member[getConnection].WithArity[1].Argument[0].Argument[1]",
|
||||
"mysql.Query;mysql.Query;Member[on].ReturnValue",
|
||||
"mysql.Query;mysql.QueryFunction;ReturnValue",
|
||||
"mysql.Query;mysql.QueryFunction;WithArity[1].Argument[0]",
|
||||
"mysql.QueryFunction;mysql.Connection;Member[createQuery,query]",
|
||||
"mysql.QueryFunction;mysql.Pool;Member[query]",
|
||||
"mysql2.Connection;mysql2.PoolConnection;",
|
||||
"mysql2.Connection;mysql2.authPlugins;Argument[0].Member[connection]",
|
||||
"mysql2.Connection;mysql2;Member[createConnection].ReturnValue",
|
||||
"mysql2.ConnectionOptions;mysql2.PoolOptions;",
|
||||
"mysql2.ConnectionOptions;mysql2/promise.Connection;Member[changeUser].Argument[0]",
|
||||
"mysql2.ConnectionOptions;mysql2/promise.Connection;Member[config]",
|
||||
"mysql2.ConnectionOptions;mysql2/promise;Member[createConnection].Argument[0]",
|
||||
"mysql2.ConnectionOptions;mysql2;Member[createConnection].Argument[0]",
|
||||
"mysql2.Pool;mysql2.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"mysql2.Pool;mysql2;Member[createPool].ReturnValue",
|
||||
"mysql2.PoolConnection;mysql2.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2.PoolConnection;mysql2.Pool;Member[getConnection].Argument[0].Argument[1]",
|
||||
"mysql2.PoolOptions;mysql2/promise;Member[createPool].Argument[0]",
|
||||
"mysql2.PoolOptions;mysql2;Member[createPool].Argument[0]",
|
||||
"mysql2.authPlugins;mysql2.ConnectionOptions;Member[authPlugins].AnyMember",
|
||||
"mysql2/promise.Connection;mysql2.Connection;Member[promise].ReturnValue",
|
||||
"mysql2/promise.Connection;mysql2/promise.PoolConnection;",
|
||||
"mysql2/promise.Connection;mysql2/promise;Member[createConnection].ReturnValue.Awaited",
|
||||
"mysql2/promise.Pool;mysql2.Pool;Member[promise].ReturnValue",
|
||||
"mysql2/promise.Pool;mysql2/promise.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"mysql2/promise.Pool;mysql2/promise;Member[createPool].ReturnValue",
|
||||
"mysql2/promise.PoolConnection;mysql2.PoolConnection;Member[promise].ReturnValue",
|
||||
"mysql2/promise.PoolConnection;mysql2/promise.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connection,0=release].Argument[1].Argument[0]",
|
||||
"mysql2/promise.PoolConnection;mysql2/promise.Pool;Member[getConnection].ReturnValue.Awaited",
|
||||
"mysql2/typings/mysql.Connection;mysql2.Connection;",
|
||||
"mysql2/typings/mysql.Connection;mysql2.Pool;",
|
||||
"mysql2/typings/mysql.PoolConnection;mysql2.PoolConnection;",
|
||||
"mysql2/typings/mysql/lib/Connection;mysql2/typings/mysql.Connection;",
|
||||
"mysql2/typings/mysql/lib/Connection;mysql2/typings/mysql/lib/PoolConnection;",
|
||||
"mysql2/typings/mysql/lib/PoolConnection;mysql2/typings/mysql.PoolConnection;"
|
||||
],
|
||||
"summaries": [
|
||||
"mysql2/promise;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"mysql2/typings/mysql/lib/Connection;;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"mysql2;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type"
|
||||
"mysql2.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"mysql2/promise.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"mysql2/typings/mysql/lib/Connection;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type"
|
||||
],
|
||||
"typeVariables": []
|
||||
}
|
||||
|
||||
@@ -6,71 +6,71 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"events;;pg-cursor;;", //
|
||||
"events;;pg-promise/pg-subset;pg.IClient;", //
|
||||
"events;;pg-promise/pg-subset;pg.IConnection;", //
|
||||
"events;;pg-promise/pg-subset;pg.IPool;", //
|
||||
"events;;pg;ClientBase;", //
|
||||
"events;;pg;Events;", //
|
||||
"events;;pg;Pool;", //
|
||||
"global;NodeJS.EventEmitter;events;;", //
|
||||
"pg-cursor;;pg-cursor;Static;Instance", //
|
||||
"pg-cursor;Static;pg-cursor;;", //
|
||||
"pg-pool;;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg-pool;;pg-pool;Static;Instance", //
|
||||
"pg-pool;Static;pg-pool;;", //
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise/pg-subset;;Member[Client].Instance", //
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;;Argument[0].TypeVar[pg-promise.IInitOptions.1]", //
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;IMain;Argument[0].TypeVar[pg-promise/pg-subset.pg.IConnectionParameters.0]", //
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;IMain;ReturnValue.TypeVar[pg-promise.IDatabase.1]", //
|
||||
"pg-promise/pg-subset;pg.IConnection;pg-promise/pg-subset;pg.IClient;Member[connection]", //
|
||||
"pg-promise/pg-subset;pg.IPool;pg-promise;IDatabase;Member[$pool]", //
|
||||
"pg-promise;IBaseProtocol;pg-promise/typescript/pg-promise;IBaseProtocol;", //
|
||||
"pg-promise;IBaseProtocol;pg-promise;IConnected;", //
|
||||
"pg-promise;IBaseProtocol;pg-promise;IDatabase;", //
|
||||
"pg-promise;IBaseProtocol;pg-promise;ITask;", //
|
||||
"pg-promise;IConnected;pg-promise/typescript/pg-promise;IConnected;", //
|
||||
"pg-promise;IConnected;pg-promise;IDatabase;Member[connect].ReturnValue.Awaited", //
|
||||
"pg-promise;IDatabase;pg-promise/typescript/pg-promise;IDatabase;", //
|
||||
"pg-promise;IDatabase;pg-promise;IInitOptions;Member[extend].Argument[0]", //
|
||||
"pg-promise;IDatabase;pg-promise;IMain;ReturnValue", //
|
||||
"pg-promise;IInitOptions;pg-promise/typescript/pg-promise;IInitOptions;", //
|
||||
"pg-promise;IInitOptions;pg-promise;;Argument[0]", //
|
||||
"pg-promise;IInitOptions;pg-promise;ILibConfig;Member[options]", //
|
||||
"pg-promise;ILibConfig;pg-promise/typescript/pg-promise;ILibConfig;", //
|
||||
"pg-promise;ILibConfig;pg-promise;IDatabase;Member[$config]", //
|
||||
"pg-promise;IMain;pg-promise/typescript/pg-promise;IMain;", //
|
||||
"pg-promise;IMain;pg-promise;;ReturnValue", //
|
||||
"pg-promise;IMain;pg-promise;ILibConfig;Member[pgp]", //
|
||||
"pg-promise;ITask;pg-promise/typescript/pg-promise;ITask;", //
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[task,taskIf,tx,txIf].Argument[1].Argument[0]", //
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[task,taskIf,tx,txIf].WithArity[1].Argument[0].Argument[0]", //
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[taskIf].WithArity[2].Argument[0].Member[cnd].Argument[0]", //
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[txIf].WithArity[2].Argument[0].Member[cnd,reusable].Argument[0]", //
|
||||
"pg;Client;pg-pool;Static;Instance.TypeVar[pg-pool..0]", //
|
||||
"pg;Client;pg-promise/pg-subset;pg.IClient;", //
|
||||
"pg;Client;pg;ClientStatic;Instance", //
|
||||
"pg;Client;pg;Events;Member[addListener,on,once,prependListener,prependOnceListener].Argument[1].Argument[1]", //
|
||||
"pg;ClientBase;pg;Client;", //
|
||||
"pg;ClientBase;pg;PoolClient;", //
|
||||
"pg;ClientStatic;pg;;Member[Client]", //
|
||||
"pg;Connection;pg-promise/pg-subset;pg.IConnection;", //
|
||||
"pg;Events;pg;Events;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg;Events;pg;EventsStatic;Instance", //
|
||||
"pg;EventsStatic;pg;;Member[Events]", //
|
||||
"pg;Pool;pg-pool;;", //
|
||||
"pg;Pool;pg-promise/pg-subset;pg.IPool;", //
|
||||
"pg;Pool;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg;Pool;pg;PoolStatic;Instance", //
|
||||
"pg;PoolClient;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg;PoolClient;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg;PoolClient;pg-pool;;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg;PoolClient;pg-pool;;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg;PoolClient;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg;PoolClient;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg;PoolClient;pg;Pool;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg;PoolClient;pg;Pool;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg;PoolStatic;pg;;Member[Pool]", //
|
||||
"events;pg-cursor;", //
|
||||
"events;pg-promise/pg-subset.pg.IClient;", //
|
||||
"events;pg-promise/pg-subset.pg.IConnection;", //
|
||||
"events;pg-promise/pg-subset.pg.IPool;", //
|
||||
"events;pg.ClientBase;", //
|
||||
"events;pg.Events;", //
|
||||
"events;pg.Pool;", //
|
||||
"global.NodeJS.EventEmitter;events;", //
|
||||
"pg-cursor.Static;pg-cursor;", //
|
||||
"pg-cursor;pg-cursor.Static;Instance", //
|
||||
"pg-pool.Static;pg-pool;", //
|
||||
"pg-pool;pg-pool.Static;Instance", //
|
||||
"pg-pool;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg-promise.IBaseProtocol;pg-promise.IConnected;", //
|
||||
"pg-promise.IBaseProtocol;pg-promise.IDatabase;", //
|
||||
"pg-promise.IBaseProtocol;pg-promise.ITask;", //
|
||||
"pg-promise.IBaseProtocol;pg-promise/typescript/pg-promise.IBaseProtocol;", //
|
||||
"pg-promise.IConnected;pg-promise.IDatabase;Member[connect].ReturnValue.Awaited", //
|
||||
"pg-promise.IConnected;pg-promise/typescript/pg-promise.IConnected;", //
|
||||
"pg-promise.IDatabase;pg-promise.IInitOptions;Member[extend].Argument[0]", //
|
||||
"pg-promise.IDatabase;pg-promise.IMain;ReturnValue", //
|
||||
"pg-promise.IDatabase;pg-promise/typescript/pg-promise.IDatabase;", //
|
||||
"pg-promise.IInitOptions;pg-promise.ILibConfig;Member[options]", //
|
||||
"pg-promise.IInitOptions;pg-promise/typescript/pg-promise.IInitOptions;", //
|
||||
"pg-promise.IInitOptions;pg-promise;Argument[0]", //
|
||||
"pg-promise.ILibConfig;pg-promise.IDatabase;Member[$config]", //
|
||||
"pg-promise.ILibConfig;pg-promise/typescript/pg-promise.ILibConfig;", //
|
||||
"pg-promise.IMain;pg-promise.ILibConfig;Member[pgp]", //
|
||||
"pg-promise.IMain;pg-promise/typescript/pg-promise.IMain;", //
|
||||
"pg-promise.IMain;pg-promise;ReturnValue", //
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[task,taskIf,tx,txIf].Argument[1].Argument[0]", //
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[task,taskIf,tx,txIf].WithArity[1].Argument[0].Argument[0]", //
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[taskIf].WithArity[2].Argument[0].Member[cnd].Argument[0]", //
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[txIf].WithArity[2].Argument[0].Member[cnd,reusable].Argument[0]", //
|
||||
"pg-promise.ITask;pg-promise/typescript/pg-promise.ITask;", //
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise.IMain;Argument[0].TypeVar[pg-promise/pg-subset.pg.IConnectionParameters.0]", //
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise.IMain;ReturnValue.TypeVar[pg-promise.IDatabase.1]", //
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise/pg-subset;Member[Client].Instance", //
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise;Argument[0].TypeVar[pg-promise.IInitOptions.1]", //
|
||||
"pg-promise/pg-subset.pg.IConnection;pg-promise/pg-subset.pg.IClient;Member[connection]", //
|
||||
"pg-promise/pg-subset.pg.IPool;pg-promise.IDatabase;Member[$pool]", //
|
||||
"pg.Client;pg-pool.Static;Instance.TypeVar[pg-pool.0]", //
|
||||
"pg.Client;pg-promise/pg-subset.pg.IClient;", //
|
||||
"pg.Client;pg.ClientStatic;Instance", //
|
||||
"pg.Client;pg.Events;Member[addListener,on,once,prependListener,prependOnceListener].Argument[1].Argument[1]", //
|
||||
"pg.ClientBase;pg.Client;", //
|
||||
"pg.ClientBase;pg.PoolClient;", //
|
||||
"pg.ClientStatic;pg;Member[Client]", //
|
||||
"pg.Connection;pg-promise/pg-subset.pg.IConnection;", //
|
||||
"pg.Events;pg.Events;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg.Events;pg.EventsStatic;Instance", //
|
||||
"pg.EventsStatic;pg;Member[Events]", //
|
||||
"pg.Pool;pg-pool;", //
|
||||
"pg.Pool;pg-promise/pg-subset.pg.IPool;", //
|
||||
"pg.Pool;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue", //
|
||||
"pg.Pool;pg.PoolStatic;Instance", //
|
||||
"pg.PoolClient;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg.PoolClient;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg.PoolClient;pg-pool;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg.PoolClient;pg-pool;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg.PoolClient;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg.PoolClient;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg.PoolClient;pg.Pool;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg.PoolClient;pg.Pool;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg.PoolStatic;pg;Member[Pool]", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -79,11 +79,11 @@ private class Summaries extends ModelInput::SummaryModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"global;NodeJS.EventEmitter;;;Member[addListener,off,on,once,prependListener,prependOnceListener,removeAllListeners,removeListener,setMaxListeners].ReturnValue;type", //
|
||||
"pg-pool;;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg;ClientBase;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg;Events;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"global.NodeJS.EventEmitter;;;Member[addListener,off,on,once,prependListener,prependOnceListener,removeAllListeners,removeListener,setMaxListeners].ReturnValue;type", //
|
||||
"pg-pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg.ClientBase;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg.Events;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
"pg.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -92,11 +92,11 @@ private class TypeVariables extends ModelInput::TypeVariableModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"pg-pool..0;Member[Client].TypeVar[pg-pool.ClientLikeCtr.0]", //
|
||||
"pg-pool..0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg-pool..0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg-pool..0;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg-pool..0;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg-pool.0;Member[Client].TypeVar[pg-pool.ClientLikeCtr.0]", //
|
||||
"pg-pool.0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]", //
|
||||
"pg-pool.0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]", //
|
||||
"pg-pool.0;Member[connect].Argument[0].Argument[1]", //
|
||||
"pg-pool.0;Member[connect].WithArity[0].ReturnValue.Awaited", //
|
||||
"pg-pool.ClientLikeCtr.0;Instance", //
|
||||
"pg-promise.IConnected.1;Member[client]", //
|
||||
"pg-promise.IConnectionOptions.0;Member[onLost].Argument[1].TypeVar[pg-promise.ILostContext.0]", //
|
||||
|
||||
@@ -18,103 +18,103 @@
|
||||
"language": "javascript",
|
||||
"usedTypes": {
|
||||
"sources": [
|
||||
"pg-cursor;",
|
||||
"pg-pool;",
|
||||
"pg-promise;IBaseProtocol",
|
||||
"pg;Client",
|
||||
"pg;ClientStatic",
|
||||
"pg;Pool",
|
||||
"pg;PoolClient",
|
||||
"pg;PoolStatic"
|
||||
"pg-cursor",
|
||||
"pg-pool",
|
||||
"pg-promise.IBaseProtocol",
|
||||
"pg.Client",
|
||||
"pg.ClientStatic",
|
||||
"pg.Pool",
|
||||
"pg.PoolClient",
|
||||
"pg.PoolStatic"
|
||||
]
|
||||
},
|
||||
"model": {
|
||||
"typeDefinitions": [
|
||||
"pg;Client;pg-promise/pg-subset;pg.IClient;",
|
||||
"pg;Connection;pg-promise/pg-subset;pg.IConnection;",
|
||||
"pg;Pool;pg-promise/pg-subset;pg.IPool;"
|
||||
"pg.Client;pg-promise/pg-subset.pg.IClient;",
|
||||
"pg.Connection;pg-promise/pg-subset.pg.IConnection;",
|
||||
"pg.Pool;pg-promise/pg-subset.pg.IPool;"
|
||||
],
|
||||
"sinks": []
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"events;;pg-cursor;;",
|
||||
"events;;pg-promise/pg-subset;pg.IClient;",
|
||||
"events;;pg-promise/pg-subset;pg.IConnection;",
|
||||
"events;;pg-promise/pg-subset;pg.IPool;",
|
||||
"events;;pg;ClientBase;",
|
||||
"events;;pg;Events;",
|
||||
"events;;pg;Pool;",
|
||||
"global;NodeJS.EventEmitter;events;;",
|
||||
"pg-cursor;;pg-cursor;Static;Instance",
|
||||
"pg-cursor;Static;pg-cursor;;",
|
||||
"pg-pool;;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg-pool;;pg-pool;Static;Instance",
|
||||
"pg-pool;Static;pg-pool;;",
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise/pg-subset;;Member[Client].Instance",
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;;Argument[0].TypeVar[pg-promise.IInitOptions.1]",
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;IMain;Argument[0].TypeVar[pg-promise/pg-subset.pg.IConnectionParameters.0]",
|
||||
"pg-promise/pg-subset;pg.IClient;pg-promise;IMain;ReturnValue.TypeVar[pg-promise.IDatabase.1]",
|
||||
"pg-promise/pg-subset;pg.IConnection;pg-promise/pg-subset;pg.IClient;Member[connection]",
|
||||
"pg-promise/pg-subset;pg.IPool;pg-promise;IDatabase;Member[$pool]",
|
||||
"pg-promise;IBaseProtocol;pg-promise/typescript/pg-promise;IBaseProtocol;",
|
||||
"pg-promise;IBaseProtocol;pg-promise;IConnected;",
|
||||
"pg-promise;IBaseProtocol;pg-promise;IDatabase;",
|
||||
"pg-promise;IBaseProtocol;pg-promise;ITask;",
|
||||
"pg-promise;IConnected;pg-promise/typescript/pg-promise;IConnected;",
|
||||
"pg-promise;IConnected;pg-promise;IDatabase;Member[connect].ReturnValue.Awaited",
|
||||
"pg-promise;IDatabase;pg-promise/typescript/pg-promise;IDatabase;",
|
||||
"pg-promise;IDatabase;pg-promise;IInitOptions;Member[extend].Argument[0]",
|
||||
"pg-promise;IDatabase;pg-promise;IMain;ReturnValue",
|
||||
"pg-promise;IInitOptions;pg-promise/typescript/pg-promise;IInitOptions;",
|
||||
"pg-promise;IInitOptions;pg-promise;;Argument[0]",
|
||||
"pg-promise;IInitOptions;pg-promise;ILibConfig;Member[options]",
|
||||
"pg-promise;ILibConfig;pg-promise/typescript/pg-promise;ILibConfig;",
|
||||
"pg-promise;ILibConfig;pg-promise;IDatabase;Member[$config]",
|
||||
"pg-promise;IMain;pg-promise/typescript/pg-promise;IMain;",
|
||||
"pg-promise;IMain;pg-promise;;ReturnValue",
|
||||
"pg-promise;IMain;pg-promise;ILibConfig;Member[pgp]",
|
||||
"pg-promise;ITask;pg-promise/typescript/pg-promise;ITask;",
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[task,taskIf,tx,txIf].Argument[1].Argument[0]",
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[task,taskIf,tx,txIf].WithArity[1].Argument[0].Argument[0]",
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[taskIf].WithArity[2].Argument[0].Member[cnd].Argument[0]",
|
||||
"pg-promise;ITask;pg-promise;IBaseProtocol;Member[txIf].WithArity[2].Argument[0].Member[cnd,reusable].Argument[0]",
|
||||
"pg;Client;pg-pool;Static;Instance.TypeVar[pg-pool..0]",
|
||||
"pg;Client;pg;ClientStatic;Instance",
|
||||
"pg;Client;pg;Events;Member[addListener,on,once,prependListener,prependOnceListener].Argument[1].Argument[1]",
|
||||
"pg;ClientBase;pg;Client;",
|
||||
"pg;ClientBase;pg;PoolClient;",
|
||||
"pg;ClientStatic;pg;;Member[Client]",
|
||||
"pg;Events;pg;Events;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg;Events;pg;EventsStatic;Instance",
|
||||
"pg;EventsStatic;pg;;Member[Events]",
|
||||
"pg;Pool;pg-pool;;",
|
||||
"pg;Pool;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg;Pool;pg;PoolStatic;Instance",
|
||||
"pg;PoolClient;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg;PoolClient;pg-pool;;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg;PoolClient;pg-pool;;Member[connect].Argument[0].Argument[1]",
|
||||
"pg;PoolClient;pg-pool;;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg;PoolClient;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg;PoolClient;pg;Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg;PoolClient;pg;Pool;Member[connect].Argument[0].Argument[1]",
|
||||
"pg;PoolClient;pg;Pool;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg;PoolStatic;pg;;Member[Pool]"
|
||||
"events;pg-cursor;",
|
||||
"events;pg-promise/pg-subset.pg.IClient;",
|
||||
"events;pg-promise/pg-subset.pg.IConnection;",
|
||||
"events;pg-promise/pg-subset.pg.IPool;",
|
||||
"events;pg.ClientBase;",
|
||||
"events;pg.Events;",
|
||||
"events;pg.Pool;",
|
||||
"global.NodeJS.EventEmitter;events;",
|
||||
"pg-cursor.Static;pg-cursor;",
|
||||
"pg-cursor;pg-cursor.Static;Instance",
|
||||
"pg-pool.Static;pg-pool;",
|
||||
"pg-pool;pg-pool.Static;Instance",
|
||||
"pg-pool;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg-promise.IBaseProtocol;pg-promise.IConnected;",
|
||||
"pg-promise.IBaseProtocol;pg-promise.IDatabase;",
|
||||
"pg-promise.IBaseProtocol;pg-promise.ITask;",
|
||||
"pg-promise.IBaseProtocol;pg-promise/typescript/pg-promise.IBaseProtocol;",
|
||||
"pg-promise.IConnected;pg-promise.IDatabase;Member[connect].ReturnValue.Awaited",
|
||||
"pg-promise.IConnected;pg-promise/typescript/pg-promise.IConnected;",
|
||||
"pg-promise.IDatabase;pg-promise.IInitOptions;Member[extend].Argument[0]",
|
||||
"pg-promise.IDatabase;pg-promise.IMain;ReturnValue",
|
||||
"pg-promise.IDatabase;pg-promise/typescript/pg-promise.IDatabase;",
|
||||
"pg-promise.IInitOptions;pg-promise.ILibConfig;Member[options]",
|
||||
"pg-promise.IInitOptions;pg-promise/typescript/pg-promise.IInitOptions;",
|
||||
"pg-promise.IInitOptions;pg-promise;Argument[0]",
|
||||
"pg-promise.ILibConfig;pg-promise.IDatabase;Member[$config]",
|
||||
"pg-promise.ILibConfig;pg-promise/typescript/pg-promise.ILibConfig;",
|
||||
"pg-promise.IMain;pg-promise.ILibConfig;Member[pgp]",
|
||||
"pg-promise.IMain;pg-promise/typescript/pg-promise.IMain;",
|
||||
"pg-promise.IMain;pg-promise;ReturnValue",
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[task,taskIf,tx,txIf].Argument[1].Argument[0]",
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[task,taskIf,tx,txIf].WithArity[1].Argument[0].Argument[0]",
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[taskIf].WithArity[2].Argument[0].Member[cnd].Argument[0]",
|
||||
"pg-promise.ITask;pg-promise.IBaseProtocol;Member[txIf].WithArity[2].Argument[0].Member[cnd,reusable].Argument[0]",
|
||||
"pg-promise.ITask;pg-promise/typescript/pg-promise.ITask;",
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise.IMain;Argument[0].TypeVar[pg-promise/pg-subset.pg.IConnectionParameters.0]",
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise.IMain;ReturnValue.TypeVar[pg-promise.IDatabase.1]",
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise/pg-subset;Member[Client].Instance",
|
||||
"pg-promise/pg-subset.pg.IClient;pg-promise;Argument[0].TypeVar[pg-promise.IInitOptions.1]",
|
||||
"pg-promise/pg-subset.pg.IConnection;pg-promise/pg-subset.pg.IClient;Member[connection]",
|
||||
"pg-promise/pg-subset.pg.IPool;pg-promise.IDatabase;Member[$pool]",
|
||||
"pg.Client;pg-pool.Static;Instance.TypeVar[pg-pool.0]",
|
||||
"pg.Client;pg.ClientStatic;Instance",
|
||||
"pg.Client;pg.Events;Member[addListener,on,once,prependListener,prependOnceListener].Argument[1].Argument[1]",
|
||||
"pg.ClientBase;pg.Client;",
|
||||
"pg.ClientBase;pg.PoolClient;",
|
||||
"pg.ClientStatic;pg;Member[Client]",
|
||||
"pg.Events;pg.Events;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg.Events;pg.EventsStatic;Instance",
|
||||
"pg.EventsStatic;pg;Member[Events]",
|
||||
"pg.Pool;pg-pool;",
|
||||
"pg.Pool;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue",
|
||||
"pg.Pool;pg.PoolStatic;Instance",
|
||||
"pg.PoolClient;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg.PoolClient;pg-pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg.PoolClient;pg-pool;Member[connect].Argument[0].Argument[1]",
|
||||
"pg.PoolClient;pg-pool;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg.PoolClient;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg.PoolClient;pg.Pool;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg.PoolClient;pg.Pool;Member[connect].Argument[0].Argument[1]",
|
||||
"pg.PoolClient;pg.Pool;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg.PoolStatic;pg;Member[Pool]"
|
||||
],
|
||||
"summaries": [
|
||||
"global;NodeJS.EventEmitter;;;Member[addListener,off,on,once,prependListener,prependOnceListener,removeAllListeners,removeListener,setMaxListeners].ReturnValue;type",
|
||||
"pg-pool;;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg;ClientBase;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg;Events;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg;Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type"
|
||||
"global.NodeJS.EventEmitter;;;Member[addListener,off,on,once,prependListener,prependOnceListener,removeAllListeners,removeListener,setMaxListeners].ReturnValue;type",
|
||||
"pg-pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg.ClientBase;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg.Events;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type",
|
||||
"pg.Pool;;;Member[addListener,on,once,prependListener,prependOnceListener].ReturnValue;type"
|
||||
],
|
||||
"typeVariables": [
|
||||
"pg-pool..0;Member[Client].TypeVar[pg-pool.ClientLikeCtr.0]",
|
||||
"pg-pool..0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg-pool..0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg-pool..0;Member[connect].Argument[0].Argument[1]",
|
||||
"pg-pool..0;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg-pool.0;Member[Client].TypeVar[pg-pool.ClientLikeCtr.0]",
|
||||
"pg-pool.0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=acquire,0=connect,0=remove].Argument[1].Argument[0]",
|
||||
"pg-pool.0;Member[addListener,on,once,prependListener,prependOnceListener].WithArity[2].WithStringArgument[0=error].Argument[1].Argument[1]",
|
||||
"pg-pool.0;Member[connect].Argument[0].Argument[1]",
|
||||
"pg-pool.0;Member[connect].WithArity[0].ReturnValue.Awaited",
|
||||
"pg-pool.ClientLikeCtr.0;Instance",
|
||||
"pg-promise.IConnected.1;Member[client]",
|
||||
"pg-promise.IConnectionOptions.0;Member[onLost].Argument[1].TypeVar[pg-promise.ILostContext.0]",
|
||||
|
||||
@@ -6,13 +6,13 @@ private class Sinks extends ModelInput::SinkModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"sequelize;;Argument[0..].Member[password];credentials[password]", //
|
||||
"sequelize;;Argument[0..].Member[username];credentials[username]", //
|
||||
"sequelize;;Argument[1];credentials[username]", //
|
||||
"sequelize;;Argument[2];credentials[password]", //
|
||||
"sequelize;Sequelize;Member[query].Argument[0].Member[query];sql-injection", //
|
||||
"sequelize;Sequelize;Member[query].Argument[0];sql-injection", //
|
||||
"sequelize;SequelizeStaticAndInstance;Member[asIs,literal].Argument[0];sql-injection", //
|
||||
"sequelize.Sequelize;Member[query].Argument[0].Member[query];sql-injection", //
|
||||
"sequelize.Sequelize;Member[query].Argument[0];sql-injection", //
|
||||
"sequelize.SequelizeStaticAndInstance;Member[asIs,literal].Argument[0];sql-injection", //
|
||||
"sequelize;Argument[0..].Member[password];credentials[password]", //
|
||||
"sequelize;Argument[0..].Member[username];credentials[username]", //
|
||||
"sequelize;Argument[1];credentials[username]", //
|
||||
"sequelize;Argument[2];credentials[password]", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -21,254 +21,254 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"sequelize-typescript/associations/foreign-key/foreign-key-meta;ForeignKeyMeta;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[getForeignKeys].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript/model/model/association/association-create-options;AssociationCreateOptions;sequelize-typescript;Model;Member[$create].Argument[2]", //
|
||||
"sequelize-typescript/model/shared/model-not-initialized-error;ModelNotInitializedErrorStatic;sequelize-typescript/model/shared/model-not-initialized-error;;Member[ModelNotInitializedError]", //
|
||||
"sequelize-typescript;AssociationCountOptions;sequelize-typescript/model/model/association/association-count-options;AssociationCountOptions;", //
|
||||
"sequelize-typescript;AssociationCountOptions;sequelize-typescript;Model;Member[$count].Argument[1]", //
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript/model/model/association/association-get-options;AssociationGetOptions;", //
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript;Model;Member[$get].Argument[1]", //
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript;Model;Member[$has].Argument[2]", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[addAssociation].Argument[1]", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[setAssociations].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/base-association;BaseAssociation;", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[addAssociation].Argument[1]", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[setAssociations].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BaseAssociationStatic;Instance", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BelongsToAssociation;", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BelongsToManyAssociation;", //
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;HasAssociation;", //
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;;Member[BaseAssociation]", //
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;BaseAssociationStatic;", //
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript;;Member[BaseAssociation]", //
|
||||
"sequelize-typescript;BelongsToAssociation;sequelize-typescript/associations/belongs-to/belongs-to-association;BelongsToAssociation;", //
|
||||
"sequelize-typescript;BelongsToAssociation;sequelize-typescript;BelongsToAssociationStatic;Instance", //
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;;Member[BelongsToAssociation]", //
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;BelongsToAssociationStatic;", //
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript;;Member[BelongsToAssociation]", //
|
||||
"sequelize-typescript;BelongsToManyAssociation;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;BelongsToManyAssociation;", //
|
||||
"sequelize-typescript;BelongsToManyAssociation;sequelize-typescript;BelongsToManyAssociationStatic;Instance", //
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;;Member[BelongsToManyAssociation]", //
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;BelongsToManyAssociationStatic;", //
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript;;Member[BelongsToManyAssociation]", //
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript/scopes/default-scope;;Member[DefaultScope].Argument[0]", //
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript/scopes/scope-options;DefaultScopeGetter;", //
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript;;Member[DefaultScope].Argument[0]", //
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript;ScopeOptionsGetters;Member[getDefaultScope]", //
|
||||
"sequelize-typescript;HasAssociation;sequelize-typescript/associations/has/has-association;HasAssociation;", //
|
||||
"sequelize-typescript;HasAssociation;sequelize-typescript;HasAssociationStatic;Instance", //
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript/associations/has/has-association;;Member[HasAssociation]", //
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript/associations/has/has-association;HasAssociationStatic;", //
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript;;Member[HasAssociation]", //
|
||||
"sequelize-typescript;Model;sequelize-typescript/model/model/model;Model;", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$add,$has,$remove,$set].Argument[1]", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$add,$has,$remove,$set].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$create,reload].ReturnValue.Awaited", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelStatic~;Instance", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelStatic~;Member[initialize].ReturnValue.TypeVar[sequelize-typescript.ModelStatic.0]", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelType;Instance", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;Sequelize;Member[getRepository].Argument[0].Instance", //
|
||||
"sequelize-typescript;Model;sequelize-typescript;Sequelize;Member[getRepository].ReturnValue.TypeVar[sequelize-typescript.Repository.0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/belongs-to-many/belongs-to-many;;Member[BelongsToMany].Argument[0,1]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/belongs-to/belongs-to;;Member[BelongsTo].Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-meta;ForeignKeyMeta;Member[relatedClassGetter]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[addForeignKey].Argument[1]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key;;Member[ForeignKey].Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/has/has-many;;Member[HasMany].Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/has/has-one;;Member[HasOne].Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/model/shared/model-class-getter;ModelClassGetter;", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;;Member[BelongsTo,ForeignKey,HasMany,HasOne].Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;;Member[BelongsToMany].Argument[0,1]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BaseAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BelongsToAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BelongsToManyAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;HasAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/model/model;;Member[Model]", //
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/model/model;ModelStatic~;", //
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/shared/model-not-initialized-error;ModelNotInitializedErrorStatic;Argument[0]", //
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript;;Member[Model]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[getForeignKeyOptions].Argument[0,1]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript/model/model/model;ModelType;", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BaseAssociation;Member[getAssociatedClass].ReturnValue", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BaseAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BelongsToAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BelongsToManyAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;HasAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;ModelClassGetter;ReturnValue", //
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;Sequelize;Member[model].Argument[0]", //
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-options;ScopeOptionsGetters;", //
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]", //
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;;Member[getScopeOptionsGetters].ReturnValue", //
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript;;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]", //
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript;;Member[getScopeOptionsGetters].ReturnValue", //
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript/scopes/scope-options;ScopesOptions;", //
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript/scopes/scope-service;;Member[resolveScope].Argument[2]", //
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript;;Member[resolveScope].Argument[2]", //
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript;ScopesOptionsGetter;ReturnValue.AnyMember", //
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript/scopes/scope-options;ScopesOptionsGetter;", //
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript/scopes/scopes;;Member[Scopes].Argument[0]", //
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript;;Member[Scopes].Argument[0]", //
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript;ScopeOptionsGetters;Member[getScopes]", //
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript/sequelize/sequelize/sequelize;Sequelize;", //
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;BaseAssociation;Member[getSequelizeOptions].Argument[1]", //
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;BelongsToManyAssociation;Member[getSequelizeOptions].Argument[1]", //
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;SequelizeStatic;Instance", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-options;SequelizeOptions;", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareArgs].ReturnValue.Member[options]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareOptions].Argument[0]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareOptions].ReturnValue", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareArgs].ReturnValue.Member[options]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareOptions].Argument[0]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareOptions].ReturnValue", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;Sequelize;Member[options]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;Argument[3]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[0].Argument[0]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[1].Argument[0,1]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[2].Argument[1,2]", //
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[3].Argument[2]", //
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;;Member[Sequelize]", //
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;SequelizeStatic;", //
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript;;Member[Sequelize]", //
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManyAddAssociationMixin;Argument[1]", //
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManyAddAssociationsMixin;Argument[1]", //
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManySetAssociationsMixin;Argument[1]", //
|
||||
"sequelize;AnyFindOptions;sequelize;DefineOptions;Member[defaultScope]", //
|
||||
"sequelize;AnyFindOptions;sequelize;DefineScopeOptions;AnyMember", //
|
||||
"sequelize;AnyFindOptions;sequelize;HasManySetAssociationsMixin;Argument[1]", //
|
||||
"sequelize;AnyFindOptions;sequelize;Instance;Member[reload].Argument[0]", //
|
||||
"sequelize;AnyFindOptions;sequelize;Model;Member[addScope].Argument[1]", //
|
||||
"sequelize;AssociationOptionsBelongsToMany;sequelize;Associations;Member[belongsToMany].Argument[1]", //
|
||||
"sequelize;Associations;sequelize;Model;", //
|
||||
"sequelize;Associations;sequelize;SequelizeStaticAndInstance.Model;", //
|
||||
"sequelize;BuildOptions;sequelize-typescript;ModelStatic~;Argument[1]", //
|
||||
"sequelize;BuildOptions;sequelize;CreateOptions;", //
|
||||
"sequelize;BuildOptions;sequelize;Model;Member[build,bulkBuild].Argument[1]", //
|
||||
"sequelize;CountOptions;sequelize;Model;Member[count].Argument[0]", //
|
||||
"sequelize;CreateOptions;sequelize-typescript/model/model/association/association-create-options;AssociationCreateOptions;", //
|
||||
"sequelize;CreateOptions;sequelize;BelongsToCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize;CreateOptions;sequelize;BelongsToManyCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize;CreateOptions;sequelize;HasManyCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize;CreateOptions;sequelize;HasOneCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize;CreateOptions;sequelize;Model;Member[create].Argument[1]", //
|
||||
"sequelize;DefineAttributeColumnOptions;sequelize;DefineAttributes;AnyMember", //
|
||||
"sequelize;DefineAttributeColumnOptions;sequelize;QueryInterface;Member[addColumn,changeColumn].Argument[2]", //
|
||||
"sequelize;DefineAttributeColumnReferencesOptions;sequelize;DefineAttributeColumnOptions;Member[references]", //
|
||||
"sequelize;DefineAttributes;sequelize;Hooks;Member[beforeDefine].Argument[1].Argument[0]", //
|
||||
"sequelize;DefineAttributes;sequelize;Hooks;Member[beforeDefine].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize;DefineAttributes;sequelize;QueryInterface;Member[createTable].Argument[1]", //
|
||||
"sequelize;DefineOptions;sequelize;Options;Member[define]", //
|
||||
"sequelize;DefineOptions;sequelize;Sequelize;Member[define].Argument[2]", //
|
||||
"sequelize;DefineScopeOptions;sequelize;DefineOptions;Member[scopes]", //
|
||||
"sequelize;FindCreateFindOptions;sequelize;Model;Member[findCreateFind].Argument[0]", //
|
||||
"sequelize;FindOptions;sequelize-typescript;AssociationCountOptions;", //
|
||||
"sequelize;FindOptions;sequelize-typescript;AssociationGetOptions;", //
|
||||
"sequelize;FindOptions;sequelize-typescript;DefaultScopeGetter;ReturnValue", //
|
||||
"sequelize;FindOptions;sequelize-typescript;Model;Member[reload].Argument[0]", //
|
||||
"sequelize;FindOptions;sequelize-typescript;ScopesOptions;", //
|
||||
"sequelize;FindOptions;sequelize-typescript;ScopesOptions;ReturnValue", //
|
||||
"sequelize;FindOptions;sequelize;AnyFindOptions;", //
|
||||
"sequelize;FindOptions;sequelize;FindCreateFindOptions;", //
|
||||
"sequelize;FindOptions;sequelize;FindOrInitializeOptions;", //
|
||||
"sequelize;FindOptions;sequelize;Model;Member[all,find,findAll,findAndCount,findAndCountAll,findOne].Argument[0]", //
|
||||
"sequelize;FindOptionsOrderArray;sequelize;FindOptions;Member[order]", //
|
||||
"sequelize;FindOptionsOrderArray;sequelize;FindOptions;Member[order].ArrayElement", //
|
||||
"sequelize;FindOrInitializeOptions;sequelize;Model;Member[findOrBuild,findOrCreate,findOrInitialize].Argument[0]", //
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyGetAssociationsMixin;Argument[0]", //
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyHasAssociationMixin;Argument[1]", //
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyHasAssociationsMixin;Argument[1]", //
|
||||
"sequelize;Hooks;sequelize;Hooks;Member[addHook,hook,removeHook].ReturnValue", //
|
||||
"sequelize;Hooks;sequelize;Model;", //
|
||||
"sequelize;Hooks;sequelize;Sequelize;", //
|
||||
"sequelize;Hooks;sequelize;SequelizeStaticAndInstance.Model;", //
|
||||
"sequelize;IncludeAssociation;sequelize;Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].ReturnValue", //
|
||||
"sequelize;IncludeAssociation;sequelize;IncludeOptions;Member[association]", //
|
||||
"sequelize;IncludeOptions;sequelize;BuildOptions;Member[include].ArrayElement", //
|
||||
"sequelize;IncludeOptions;sequelize;CountOptions;Member[include]", //
|
||||
"sequelize;IncludeOptions;sequelize;CountOptions;Member[include].ArrayElement", //
|
||||
"sequelize;IncludeOptions;sequelize;FindOptions;Member[include]", //
|
||||
"sequelize;IncludeOptions;sequelize;FindOptions;Member[include].ArrayElement", //
|
||||
"sequelize;IncludeOptions;sequelize;HasManyGetAssociationsMixinOptions;Member[include]", //
|
||||
"sequelize;IncludeOptions;sequelize;IncludeOptions;Member[include]", //
|
||||
"sequelize;IncludeOptions;sequelize;IncludeOptions;Member[include].ArrayElement", //
|
||||
"sequelize;Instance;sequelize;Instance;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited", //
|
||||
"sequelize;Instance;sequelize;Instance;Member[equalsOneOf].Argument[0].ArrayElement", //
|
||||
"sequelize;Instance;sequelize;Instance;Member[equals].Argument[0]", //
|
||||
"sequelize;Instance;sequelize;Instance;Member[set,setAttributes].ReturnValue", //
|
||||
"sequelize;Instance;sequelize;Model;Member[Instance,build].ReturnValue", //
|
||||
"sequelize;Instance;sequelize;Model;Member[all,bulkCreate,findAll].ReturnValue.Awaited.ArrayElement", //
|
||||
"sequelize;Instance;sequelize;Model;Member[bulkBuild].ReturnValue.ArrayElement", //
|
||||
"sequelize;Instance;sequelize;Model;Member[create,find,findById,findByPk,findByPrimary,findOne].ReturnValue.Awaited", //
|
||||
"sequelize;Instance;sequelize;Model;Member[findAndCount,findAndCountAll].ReturnValue.Awaited.Member[rows].ArrayElement", //
|
||||
"sequelize;Instance;sequelize;QueryInterface;Member[delete,increment,insert,update].Argument[0]", //
|
||||
"sequelize;Instance;sequelize;QueryOptions;Member[instance]", //
|
||||
"sequelize;Instance;sequelize;SequelizeStaticAndInstance;Member[Instance]", //
|
||||
"sequelize;Model;sequelize;AssociationOptionsBelongsToMany;Member[through]", //
|
||||
"sequelize;Model;sequelize;Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].Argument[0]", //
|
||||
"sequelize;Model;sequelize;BuildOptions;Member[include].ArrayElement", //
|
||||
"sequelize;Model;sequelize;CountOptions;Member[include]", //
|
||||
"sequelize;Model;sequelize;CountOptions;Member[include].ArrayElement", //
|
||||
"sequelize;Model;sequelize;DefineAttributeColumnReferencesOptions;Member[model]", //
|
||||
"sequelize;Model;sequelize;FindOptions;Member[include]", //
|
||||
"sequelize;Model;sequelize;FindOptions;Member[include].ArrayElement", //
|
||||
"sequelize;Model;sequelize;FindOptions;Member[lock].Member[of]", //
|
||||
"sequelize;Model;sequelize;FindOptionsOrderArray;ArrayElement", //
|
||||
"sequelize;Model;sequelize;FindOptionsOrderArray;ArrayElement.Member[model]", //
|
||||
"sequelize;Model;sequelize;Hooks;Member[afterDefine].Argument[1].Argument[0]", //
|
||||
"sequelize;Model;sequelize;Hooks;Member[afterDefine].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize;Model;sequelize;IncludeAssociation;Member[source,target]", //
|
||||
"sequelize;Model;sequelize;IncludeOptions;Member[include,model]", //
|
||||
"sequelize;Model;sequelize;IncludeOptions;Member[include].ArrayElement", //
|
||||
"sequelize;Model;sequelize;Instance;Member[Model]", //
|
||||
"sequelize;Model;sequelize;Model;Member[schema,scope,unscoped].ReturnValue", //
|
||||
"sequelize;Model;sequelize;Model;Member[sync].ReturnValue.Awaited", //
|
||||
"sequelize;Model;sequelize;Models;AnyMember", //
|
||||
"sequelize;Model;sequelize;ModelsHashInterface;AnyMember", //
|
||||
"sequelize;Model;sequelize;QueryInterface;Member[bulkDelete,rawSelect,upsert].Argument[3]", //
|
||||
"sequelize;Model;sequelize;QueryInterface;Member[select].Argument[0]", //
|
||||
"sequelize;Model;sequelize;QueryOptions;Member[model]", //
|
||||
"sequelize;Model;sequelize;Sequelize;Member[define,import,model].ReturnValue", //
|
||||
"sequelize;Model;sequelize;Sequelize;Member[import].Argument[1].ReturnValue", //
|
||||
"sequelize;Model;sequelize;SequelizeStaticAndInstance;Member[Model]", //
|
||||
"sequelize;Model;sequelize;ThroughOptions;Member[model]", //
|
||||
"sequelize;Model;sequelize;Utils;Member[mapOptionFieldNames].Argument[1]", //
|
||||
"sequelize;Model;sequelize;Utils;Member[mapValueFieldNames].Argument[2]", //
|
||||
"sequelize;Models;sequelize;Model;Member[associate].Argument[0]", //
|
||||
"sequelize;ModelsHashInterface;sequelize;Sequelize;Member[models]", //
|
||||
"sequelize;Options;sequelize-typescript;SequelizeOptions;", //
|
||||
"sequelize;Options;sequelize;Sequelize;Member[options]", //
|
||||
"sequelize;Options;sequelize;SequelizeStatic;Argument[3]", //
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[1].Argument[0,1]", //
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[2].Argument[1,2]", //
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[3].Argument[2]", //
|
||||
"sequelize;QueryInterface;sequelize;Sequelize;Member[getQueryInterface].ReturnValue", //
|
||||
"sequelize;QueryOptions;sequelize;Options;Member[query]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[bulkDelete,bulkInsert,createTable,select,setAutocommit,setIsolationLevel].Argument[2]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[bulkUpdate,delete,insert].Argument[3]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[commitTransaction,deferConstraints,dropTable,rawSelect,rollbackTransaction,showIndex,startTransaction].Argument[1]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[createFunction].Argument[5]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[dropAllEnums,dropAllTables,showAllSchemas,showAllTables].Argument[0]", //
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[increment,update,upsert].Argument[4]", //
|
||||
"sequelize;QueryOptions;sequelize;Sequelize;Member[authenticate,validate].Argument[0]", //
|
||||
"sequelize;QueryOptions;sequelize;Sequelize;Member[query].Argument[1]", //
|
||||
"sequelize;Sequelize;sequelize-typescript;Sequelize;", //
|
||||
"sequelize;Sequelize;sequelize;Hooks;Member[afterInit].Argument[1].Argument[0]", //
|
||||
"sequelize;Sequelize;sequelize;Hooks;Member[afterInit].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize;Sequelize;sequelize;Instance;Member[sequelize]", //
|
||||
"sequelize;Sequelize;sequelize;QueryInterface;Member[sequelize]", //
|
||||
"sequelize;Sequelize;sequelize;Sequelize;Member[import].Argument[1].Argument[0]", //
|
||||
"sequelize;Sequelize;sequelize;SequelizeStatic;Instance", //
|
||||
"sequelize;Sequelize;sequelize;SequelizeStatic;Member[useCLS].ReturnValue", //
|
||||
"sequelize;SequelizeStatic;sequelize-typescript;Sequelize;", //
|
||||
"sequelize;SequelizeStatic;sequelize;;", //
|
||||
"sequelize;SequelizeStatic;sequelize;Sequelize;Member[Sequelize]", //
|
||||
"sequelize;SequelizeStatic;sequelize;SequelizeStatic;Member[Sequelize,default]", //
|
||||
"sequelize;SequelizeStaticAndInstance.Model;sequelize-typescript;Model;", //
|
||||
"sequelize;SequelizeStaticAndInstance;sequelize;Sequelize;", //
|
||||
"sequelize;SequelizeStaticAndInstance;sequelize;SequelizeStatic;", //
|
||||
"sequelize;ThroughOptions;sequelize;AssociationOptionsBelongsToMany;Member[through]", //
|
||||
"sequelize;Utils;sequelize;SequelizeStaticAndInstance;Member[Utils]", //
|
||||
"sequelize-typescript.AssociationCountOptions;sequelize-typescript.Model;Member[$count].Argument[1]", //
|
||||
"sequelize-typescript.AssociationCountOptions;sequelize-typescript/model/model/association/association-count-options.AssociationCountOptions;", //
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript.Model;Member[$get].Argument[1]", //
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript.Model;Member[$has].Argument[2]", //
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript/model/model/association/association-get-options.AssociationGetOptions;", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BaseAssociationStatic;Instance", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BelongsToAssociation;", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BelongsToManyAssociation;", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.HasAssociation;", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[addAssociation].Argument[1]", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[setAssociations].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/base-association.BaseAssociation;", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[addAssociation].Argument[1]", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[setAssociations].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript/associations/shared/base-association.BaseAssociationStatic;", //
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;Member[BaseAssociation]", //
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript;Member[BaseAssociation]", //
|
||||
"sequelize-typescript.BelongsToAssociation;sequelize-typescript.BelongsToAssociationStatic;Instance", //
|
||||
"sequelize-typescript.BelongsToAssociation;sequelize-typescript/associations/belongs-to/belongs-to-association.BelongsToAssociation;", //
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association.BelongsToAssociationStatic;", //
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;Member[BelongsToAssociation]", //
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript;Member[BelongsToAssociation]", //
|
||||
"sequelize-typescript.BelongsToManyAssociation;sequelize-typescript.BelongsToManyAssociationStatic;Instance", //
|
||||
"sequelize-typescript.BelongsToManyAssociation;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association.BelongsToManyAssociation;", //
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association.BelongsToManyAssociationStatic;", //
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;Member[BelongsToManyAssociation]", //
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript;Member[BelongsToManyAssociation]", //
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript.ScopeOptionsGetters;Member[getDefaultScope]", //
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript/scopes/default-scope;Member[DefaultScope].Argument[0]", //
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript/scopes/scope-options.DefaultScopeGetter;", //
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript;Member[DefaultScope].Argument[0]", //
|
||||
"sequelize-typescript.HasAssociation;sequelize-typescript.HasAssociationStatic;Instance", //
|
||||
"sequelize-typescript.HasAssociation;sequelize-typescript/associations/has/has-association.HasAssociation;", //
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript/associations/has/has-association.HasAssociationStatic;", //
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript/associations/has/has-association;Member[HasAssociation]", //
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript;Member[HasAssociation]", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$add,$has,$remove,$set].Argument[1]", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$add,$has,$remove,$set].Argument[1].ArrayElement", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$create,reload].ReturnValue.Awaited", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelStatic~;Instance", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelStatic~;Member[initialize].ReturnValue.TypeVar[sequelize-typescript.ModelStatic.0]", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelType;Instance", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.Sequelize;Member[getRepository].Argument[0].Instance", //
|
||||
"sequelize-typescript.Model;sequelize-typescript.Sequelize;Member[getRepository].ReturnValue.TypeVar[sequelize-typescript.Repository.0]", //
|
||||
"sequelize-typescript.Model;sequelize-typescript/model/model/model.Model;", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BaseAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BelongsToAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BelongsToManyAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.HasAssociationStatic;Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/belongs-to-many/belongs-to-many;Member[BelongsToMany].Argument[0,1]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/belongs-to/belongs-to;Member[BelongsTo].Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-meta.ForeignKeyMeta;Member[relatedClassGetter]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[addForeignKey].Argument[1]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key;Member[ForeignKey].Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/has/has-many;Member[HasMany].Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/has/has-one;Member[HasOne].Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/model/shared/model-class-getter.ModelClassGetter;", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript;Member[BelongsTo,ForeignKey,HasMany,HasOne].Argument[0]", //
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript;Member[BelongsToMany].Argument[0,1]", //
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/model/model.ModelStatic~;", //
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/model/model;Member[Model]", //
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/shared/model-not-initialized-error.ModelNotInitializedErrorStatic;Argument[0]", //
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript;Member[Model]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BaseAssociation;Member[getAssociatedClass].ReturnValue", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BaseAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BelongsToAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BelongsToManyAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.HasAssociation;Member[getSequelizeOptions].Argument[0]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.ModelClassGetter;ReturnValue", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.Sequelize;Member[model].Argument[0]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[getForeignKeyOptions].Argument[0,1]", //
|
||||
"sequelize-typescript.ModelType;sequelize-typescript/model/model/model.ModelType;", //
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-options.ScopeOptionsGetters;", //
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]", //
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;Member[getScopeOptionsGetters].ReturnValue", //
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]", //
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript;Member[getScopeOptionsGetters].ReturnValue", //
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript.ScopesOptionsGetter;ReturnValue.AnyMember", //
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript/scopes/scope-options.ScopesOptions;", //
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript/scopes/scope-service;Member[resolveScope].Argument[2]", //
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript;Member[resolveScope].Argument[2]", //
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript.ScopeOptionsGetters;Member[getScopes]", //
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript/scopes/scope-options.ScopesOptionsGetter;", //
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript/scopes/scopes;Member[Scopes].Argument[0]", //
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript;Member[Scopes].Argument[0]", //
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.BaseAssociation;Member[getSequelizeOptions].Argument[1]", //
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.BelongsToManyAssociation;Member[getSequelizeOptions].Argument[1]", //
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.SequelizeStatic;Instance", //
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript/sequelize/sequelize/sequelize.Sequelize;", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.Sequelize;Member[options]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;Argument[3]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[0].Argument[0]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[1].Argument[0,1]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[2].Argument[1,2]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[3].Argument[2]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-options.SequelizeOptions;", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareArgs].ReturnValue.Member[options]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareOptions].Argument[0]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareOptions].ReturnValue", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareArgs].ReturnValue.Member[options]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareOptions].Argument[0]", //
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareOptions].ReturnValue", //
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize.SequelizeStatic;", //
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;Member[Sequelize]", //
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript;Member[Sequelize]", //
|
||||
"sequelize-typescript/associations/foreign-key/foreign-key-meta.ForeignKeyMeta;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[getForeignKeys].ReturnValue.ArrayElement", //
|
||||
"sequelize-typescript/model/model/association/association-create-options.AssociationCreateOptions;sequelize-typescript.Model;Member[$create].Argument[2]", //
|
||||
"sequelize-typescript/model/shared/model-not-initialized-error.ModelNotInitializedErrorStatic;sequelize-typescript/model/shared/model-not-initialized-error;Member[ModelNotInitializedError]", //
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManyAddAssociationMixin;Argument[1]", //
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManyAddAssociationsMixin;Argument[1]", //
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManySetAssociationsMixin;Argument[1]", //
|
||||
"sequelize.AnyFindOptions;sequelize.DefineOptions;Member[defaultScope]", //
|
||||
"sequelize.AnyFindOptions;sequelize.DefineScopeOptions;AnyMember", //
|
||||
"sequelize.AnyFindOptions;sequelize.HasManySetAssociationsMixin;Argument[1]", //
|
||||
"sequelize.AnyFindOptions;sequelize.Instance;Member[reload].Argument[0]", //
|
||||
"sequelize.AnyFindOptions;sequelize.Model;Member[addScope].Argument[1]", //
|
||||
"sequelize.AssociationOptionsBelongsToMany;sequelize.Associations;Member[belongsToMany].Argument[1]", //
|
||||
"sequelize.Associations;sequelize.Model;", //
|
||||
"sequelize.Associations;sequelize.SequelizeStaticAndInstance.Model;", //
|
||||
"sequelize.BuildOptions;sequelize-typescript.ModelStatic~;Argument[1]", //
|
||||
"sequelize.BuildOptions;sequelize.CreateOptions;", //
|
||||
"sequelize.BuildOptions;sequelize.Model;Member[build,bulkBuild].Argument[1]", //
|
||||
"sequelize.CountOptions;sequelize.Model;Member[count].Argument[0]", //
|
||||
"sequelize.CreateOptions;sequelize-typescript/model/model/association/association-create-options.AssociationCreateOptions;", //
|
||||
"sequelize.CreateOptions;sequelize.BelongsToCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize.CreateOptions;sequelize.BelongsToManyCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize.CreateOptions;sequelize.HasManyCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize.CreateOptions;sequelize.HasOneCreateAssociationMixin;Argument[1]", //
|
||||
"sequelize.CreateOptions;sequelize.Model;Member[create].Argument[1]", //
|
||||
"sequelize.DefineAttributeColumnOptions;sequelize.DefineAttributes;AnyMember", //
|
||||
"sequelize.DefineAttributeColumnOptions;sequelize.QueryInterface;Member[addColumn,changeColumn].Argument[2]", //
|
||||
"sequelize.DefineAttributeColumnReferencesOptions;sequelize.DefineAttributeColumnOptions;Member[references]", //
|
||||
"sequelize.DefineAttributes;sequelize.Hooks;Member[beforeDefine].Argument[1].Argument[0]", //
|
||||
"sequelize.DefineAttributes;sequelize.Hooks;Member[beforeDefine].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize.DefineAttributes;sequelize.QueryInterface;Member[createTable].Argument[1]", //
|
||||
"sequelize.DefineOptions;sequelize.Options;Member[define]", //
|
||||
"sequelize.DefineOptions;sequelize.Sequelize;Member[define].Argument[2]", //
|
||||
"sequelize.DefineScopeOptions;sequelize.DefineOptions;Member[scopes]", //
|
||||
"sequelize.FindCreateFindOptions;sequelize.Model;Member[findCreateFind].Argument[0]", //
|
||||
"sequelize.FindOptions;sequelize-typescript.AssociationCountOptions;", //
|
||||
"sequelize.FindOptions;sequelize-typescript.AssociationGetOptions;", //
|
||||
"sequelize.FindOptions;sequelize-typescript.DefaultScopeGetter;ReturnValue", //
|
||||
"sequelize.FindOptions;sequelize-typescript.Model;Member[reload].Argument[0]", //
|
||||
"sequelize.FindOptions;sequelize-typescript.ScopesOptions;", //
|
||||
"sequelize.FindOptions;sequelize-typescript.ScopesOptions;ReturnValue", //
|
||||
"sequelize.FindOptions;sequelize.AnyFindOptions;", //
|
||||
"sequelize.FindOptions;sequelize.FindCreateFindOptions;", //
|
||||
"sequelize.FindOptions;sequelize.FindOrInitializeOptions;", //
|
||||
"sequelize.FindOptions;sequelize.Model;Member[all,find,findAll,findAndCount,findAndCountAll,findOne].Argument[0]", //
|
||||
"sequelize.FindOptionsOrderArray;sequelize.FindOptions;Member[order]", //
|
||||
"sequelize.FindOptionsOrderArray;sequelize.FindOptions;Member[order].ArrayElement", //
|
||||
"sequelize.FindOrInitializeOptions;sequelize.Model;Member[findOrBuild,findOrCreate,findOrInitialize].Argument[0]", //
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyGetAssociationsMixin;Argument[0]", //
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyHasAssociationMixin;Argument[1]", //
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyHasAssociationsMixin;Argument[1]", //
|
||||
"sequelize.Hooks;sequelize.Hooks;Member[addHook,hook,removeHook].ReturnValue", //
|
||||
"sequelize.Hooks;sequelize.Model;", //
|
||||
"sequelize.Hooks;sequelize.Sequelize;", //
|
||||
"sequelize.Hooks;sequelize.SequelizeStaticAndInstance.Model;", //
|
||||
"sequelize.IncludeAssociation;sequelize.Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].ReturnValue", //
|
||||
"sequelize.IncludeAssociation;sequelize.IncludeOptions;Member[association]", //
|
||||
"sequelize.IncludeOptions;sequelize.BuildOptions;Member[include].ArrayElement", //
|
||||
"sequelize.IncludeOptions;sequelize.CountOptions;Member[include]", //
|
||||
"sequelize.IncludeOptions;sequelize.CountOptions;Member[include].ArrayElement", //
|
||||
"sequelize.IncludeOptions;sequelize.FindOptions;Member[include]", //
|
||||
"sequelize.IncludeOptions;sequelize.FindOptions;Member[include].ArrayElement", //
|
||||
"sequelize.IncludeOptions;sequelize.HasManyGetAssociationsMixinOptions;Member[include]", //
|
||||
"sequelize.IncludeOptions;sequelize.IncludeOptions;Member[include]", //
|
||||
"sequelize.IncludeOptions;sequelize.IncludeOptions;Member[include].ArrayElement", //
|
||||
"sequelize.Instance;sequelize.Instance;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited", //
|
||||
"sequelize.Instance;sequelize.Instance;Member[equalsOneOf].Argument[0].ArrayElement", //
|
||||
"sequelize.Instance;sequelize.Instance;Member[equals].Argument[0]", //
|
||||
"sequelize.Instance;sequelize.Instance;Member[set,setAttributes].ReturnValue", //
|
||||
"sequelize.Instance;sequelize.Model;Member[Instance,build].ReturnValue", //
|
||||
"sequelize.Instance;sequelize.Model;Member[all,bulkCreate,findAll].ReturnValue.Awaited.ArrayElement", //
|
||||
"sequelize.Instance;sequelize.Model;Member[bulkBuild].ReturnValue.ArrayElement", //
|
||||
"sequelize.Instance;sequelize.Model;Member[create,find,findById,findByPk,findByPrimary,findOne].ReturnValue.Awaited", //
|
||||
"sequelize.Instance;sequelize.Model;Member[findAndCount,findAndCountAll].ReturnValue.Awaited.Member[rows].ArrayElement", //
|
||||
"sequelize.Instance;sequelize.QueryInterface;Member[delete,increment,insert,update].Argument[0]", //
|
||||
"sequelize.Instance;sequelize.QueryOptions;Member[instance]", //
|
||||
"sequelize.Instance;sequelize.SequelizeStaticAndInstance;Member[Instance]", //
|
||||
"sequelize.Model;sequelize.AssociationOptionsBelongsToMany;Member[through]", //
|
||||
"sequelize.Model;sequelize.Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].Argument[0]", //
|
||||
"sequelize.Model;sequelize.BuildOptions;Member[include].ArrayElement", //
|
||||
"sequelize.Model;sequelize.CountOptions;Member[include]", //
|
||||
"sequelize.Model;sequelize.CountOptions;Member[include].ArrayElement", //
|
||||
"sequelize.Model;sequelize.DefineAttributeColumnReferencesOptions;Member[model]", //
|
||||
"sequelize.Model;sequelize.FindOptions;Member[include]", //
|
||||
"sequelize.Model;sequelize.FindOptions;Member[include].ArrayElement", //
|
||||
"sequelize.Model;sequelize.FindOptions;Member[lock].Member[of]", //
|
||||
"sequelize.Model;sequelize.FindOptionsOrderArray;ArrayElement", //
|
||||
"sequelize.Model;sequelize.FindOptionsOrderArray;ArrayElement.Member[model]", //
|
||||
"sequelize.Model;sequelize.Hooks;Member[afterDefine].Argument[1].Argument[0]", //
|
||||
"sequelize.Model;sequelize.Hooks;Member[afterDefine].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize.Model;sequelize.IncludeAssociation;Member[source,target]", //
|
||||
"sequelize.Model;sequelize.IncludeOptions;Member[include,model]", //
|
||||
"sequelize.Model;sequelize.IncludeOptions;Member[include].ArrayElement", //
|
||||
"sequelize.Model;sequelize.Instance;Member[Model]", //
|
||||
"sequelize.Model;sequelize.Model;Member[schema,scope,unscoped].ReturnValue", //
|
||||
"sequelize.Model;sequelize.Model;Member[sync].ReturnValue.Awaited", //
|
||||
"sequelize.Model;sequelize.Models;AnyMember", //
|
||||
"sequelize.Model;sequelize.ModelsHashInterface;AnyMember", //
|
||||
"sequelize.Model;sequelize.QueryInterface;Member[bulkDelete,rawSelect,upsert].Argument[3]", //
|
||||
"sequelize.Model;sequelize.QueryInterface;Member[select].Argument[0]", //
|
||||
"sequelize.Model;sequelize.QueryOptions;Member[model]", //
|
||||
"sequelize.Model;sequelize.Sequelize;Member[define,import,model].ReturnValue", //
|
||||
"sequelize.Model;sequelize.Sequelize;Member[import].Argument[1].ReturnValue", //
|
||||
"sequelize.Model;sequelize.SequelizeStaticAndInstance;Member[Model]", //
|
||||
"sequelize.Model;sequelize.ThroughOptions;Member[model]", //
|
||||
"sequelize.Model;sequelize.Utils;Member[mapOptionFieldNames].Argument[1]", //
|
||||
"sequelize.Model;sequelize.Utils;Member[mapValueFieldNames].Argument[2]", //
|
||||
"sequelize.Models;sequelize.Model;Member[associate].Argument[0]", //
|
||||
"sequelize.ModelsHashInterface;sequelize.Sequelize;Member[models]", //
|
||||
"sequelize.Options;sequelize-typescript.SequelizeOptions;", //
|
||||
"sequelize.Options;sequelize.Sequelize;Member[options]", //
|
||||
"sequelize.Options;sequelize.SequelizeStatic;Argument[3]", //
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[1].Argument[0,1]", //
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[2].Argument[1,2]", //
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[3].Argument[2]", //
|
||||
"sequelize.QueryInterface;sequelize.Sequelize;Member[getQueryInterface].ReturnValue", //
|
||||
"sequelize.QueryOptions;sequelize.Options;Member[query]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[bulkDelete,bulkInsert,createTable,select,setAutocommit,setIsolationLevel].Argument[2]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[bulkUpdate,delete,insert].Argument[3]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[commitTransaction,deferConstraints,dropTable,rawSelect,rollbackTransaction,showIndex,startTransaction].Argument[1]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[createFunction].Argument[5]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[dropAllEnums,dropAllTables,showAllSchemas,showAllTables].Argument[0]", //
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[increment,update,upsert].Argument[4]", //
|
||||
"sequelize.QueryOptions;sequelize.Sequelize;Member[authenticate,validate].Argument[0]", //
|
||||
"sequelize.QueryOptions;sequelize.Sequelize;Member[query].Argument[1]", //
|
||||
"sequelize.Sequelize;sequelize-typescript.Sequelize;", //
|
||||
"sequelize.Sequelize;sequelize.Hooks;Member[afterInit].Argument[1].Argument[0]", //
|
||||
"sequelize.Sequelize;sequelize.Hooks;Member[afterInit].WithArity[1].Argument[0].Argument[0]", //
|
||||
"sequelize.Sequelize;sequelize.Instance;Member[sequelize]", //
|
||||
"sequelize.Sequelize;sequelize.QueryInterface;Member[sequelize]", //
|
||||
"sequelize.Sequelize;sequelize.Sequelize;Member[import].Argument[1].Argument[0]", //
|
||||
"sequelize.Sequelize;sequelize.SequelizeStatic;Instance", //
|
||||
"sequelize.Sequelize;sequelize.SequelizeStatic;Member[useCLS].ReturnValue", //
|
||||
"sequelize.SequelizeStatic;sequelize-typescript.Sequelize;", //
|
||||
"sequelize.SequelizeStatic;sequelize.Sequelize;Member[Sequelize]", //
|
||||
"sequelize.SequelizeStatic;sequelize.SequelizeStatic;Member[Sequelize,default]", //
|
||||
"sequelize.SequelizeStatic;sequelize;", //
|
||||
"sequelize.SequelizeStaticAndInstance.Model;sequelize-typescript.Model;", //
|
||||
"sequelize.SequelizeStaticAndInstance;sequelize.Sequelize;", //
|
||||
"sequelize.SequelizeStaticAndInstance;sequelize.SequelizeStatic;", //
|
||||
"sequelize.ThroughOptions;sequelize.AssociationOptionsBelongsToMany;Member[through]", //
|
||||
"sequelize.Utils;sequelize.SequelizeStaticAndInstance;Member[Utils]", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -277,11 +277,11 @@ private class Summaries extends ModelInput::SummaryModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"sequelize-typescript;Model;;;Member[reload].ReturnValue.Awaited;type", //
|
||||
"sequelize;Instance;;;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited;type", //
|
||||
"sequelize;Instance;;;Member[set,setAttributes].ReturnValue;type", //
|
||||
"sequelize;Model;;;Member[schema,scope,unscoped].ReturnValue;type", //
|
||||
"sequelize;Model;;;Member[sync].ReturnValue.Awaited;type", //
|
||||
"sequelize-typescript.Model;;;Member[reload].ReturnValue.Awaited;type", //
|
||||
"sequelize.Instance;;;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited;type", //
|
||||
"sequelize.Instance;;;Member[set,setAttributes].ReturnValue;type", //
|
||||
"sequelize.Model;;;Member[schema,scope,unscoped].ReturnValue;type", //
|
||||
"sequelize.Model;;;Member[sync].ReturnValue.Awaited;type", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,279 +12,279 @@
|
||||
},
|
||||
"language": "javascript",
|
||||
"replaceTypeParameters": [
|
||||
"sequelize;Model;TInstance;sequelize;Instance"
|
||||
"sequelize.Model;TInstance;sequelize.Instance"
|
||||
],
|
||||
"model": {
|
||||
"sinks": [
|
||||
"sequelize;;Argument[0..].Member[password];credentials[password]",
|
||||
"sequelize;;Argument[0..].Member[username];credentials[username]",
|
||||
"sequelize;;Argument[1];credentials[username]",
|
||||
"sequelize;;Argument[2];credentials[password]",
|
||||
"sequelize;Sequelize;Member[query].Argument[0].Member[query];sql-injection",
|
||||
"sequelize;Sequelize;Member[query].Argument[0];sql-injection",
|
||||
"sequelize;SequelizeStaticAndInstance;Member[asIs,literal].Argument[0];sql-injection"
|
||||
"sequelize.Sequelize;Member[query].Argument[0].Member[query];sql-injection",
|
||||
"sequelize.Sequelize;Member[query].Argument[0];sql-injection",
|
||||
"sequelize.SequelizeStaticAndInstance;Member[asIs,literal].Argument[0];sql-injection",
|
||||
"sequelize;Argument[0..].Member[password];credentials[password]",
|
||||
"sequelize;Argument[0..].Member[username];credentials[username]",
|
||||
"sequelize;Argument[1];credentials[username]",
|
||||
"sequelize;Argument[2];credentials[password]"
|
||||
],
|
||||
"typeDefinitions": [
|
||||
"sequelize;Sequelize;sequelize-typescript;Sequelize;"
|
||||
"sequelize.Sequelize;sequelize-typescript.Sequelize;"
|
||||
]
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"sequelize-typescript/associations/foreign-key/foreign-key-meta;ForeignKeyMeta;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[getForeignKeys].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript/model/model/association/association-create-options;AssociationCreateOptions;sequelize-typescript;Model;Member[$create].Argument[2]",
|
||||
"sequelize-typescript/model/shared/model-not-initialized-error;ModelNotInitializedErrorStatic;sequelize-typescript/model/shared/model-not-initialized-error;;Member[ModelNotInitializedError]",
|
||||
"sequelize-typescript;AssociationCountOptions;sequelize-typescript/model/model/association/association-count-options;AssociationCountOptions;",
|
||||
"sequelize-typescript;AssociationCountOptions;sequelize-typescript;Model;Member[$count].Argument[1]",
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript/model/model/association/association-get-options;AssociationGetOptions;",
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript;Model;Member[$get].Argument[1]",
|
||||
"sequelize-typescript;AssociationGetOptions;sequelize-typescript;Model;Member[$has].Argument[2]",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[addAssociation].Argument[1]",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/association-service;;Member[setAssociations].Argument[1].ArrayElement",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript/associations/shared/base-association;BaseAssociation;",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[addAssociation].Argument[1]",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;;Member[setAssociations].Argument[1].ArrayElement",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BaseAssociationStatic;Instance",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BelongsToAssociation;",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;BelongsToManyAssociation;",
|
||||
"sequelize-typescript;BaseAssociation;sequelize-typescript;HasAssociation;",
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;;Member[BaseAssociation]",
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;BaseAssociationStatic;",
|
||||
"sequelize-typescript;BaseAssociationStatic;sequelize-typescript;;Member[BaseAssociation]",
|
||||
"sequelize-typescript;BelongsToAssociation;sequelize-typescript/associations/belongs-to/belongs-to-association;BelongsToAssociation;",
|
||||
"sequelize-typescript;BelongsToAssociation;sequelize-typescript;BelongsToAssociationStatic;Instance",
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;;Member[BelongsToAssociation]",
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;BelongsToAssociationStatic;",
|
||||
"sequelize-typescript;BelongsToAssociationStatic;sequelize-typescript;;Member[BelongsToAssociation]",
|
||||
"sequelize-typescript;BelongsToManyAssociation;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;BelongsToManyAssociation;",
|
||||
"sequelize-typescript;BelongsToManyAssociation;sequelize-typescript;BelongsToManyAssociationStatic;Instance",
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;;Member[BelongsToManyAssociation]",
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;BelongsToManyAssociationStatic;",
|
||||
"sequelize-typescript;BelongsToManyAssociationStatic;sequelize-typescript;;Member[BelongsToManyAssociation]",
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript/scopes/default-scope;;Member[DefaultScope].Argument[0]",
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript/scopes/scope-options;DefaultScopeGetter;",
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript;;Member[DefaultScope].Argument[0]",
|
||||
"sequelize-typescript;DefaultScopeGetter;sequelize-typescript;ScopeOptionsGetters;Member[getDefaultScope]",
|
||||
"sequelize-typescript;HasAssociation;sequelize-typescript/associations/has/has-association;HasAssociation;",
|
||||
"sequelize-typescript;HasAssociation;sequelize-typescript;HasAssociationStatic;Instance",
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript/associations/has/has-association;;Member[HasAssociation]",
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript/associations/has/has-association;HasAssociationStatic;",
|
||||
"sequelize-typescript;HasAssociationStatic;sequelize-typescript;;Member[HasAssociation]",
|
||||
"sequelize-typescript;Model;sequelize-typescript/model/model/model;Model;",
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$add,$has,$remove,$set].Argument[1]",
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$add,$has,$remove,$set].Argument[1].ArrayElement",
|
||||
"sequelize-typescript;Model;sequelize-typescript;Model;Member[$create,reload].ReturnValue.Awaited",
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelStatic~;Instance",
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelStatic~;Member[initialize].ReturnValue.TypeVar[sequelize-typescript.ModelStatic.0]",
|
||||
"sequelize-typescript;Model;sequelize-typescript;ModelType;Instance",
|
||||
"sequelize-typescript;Model;sequelize-typescript;Sequelize;Member[getRepository].Argument[0].Instance",
|
||||
"sequelize-typescript;Model;sequelize-typescript;Sequelize;Member[getRepository].ReturnValue.TypeVar[sequelize-typescript.Repository.0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/belongs-to-many/belongs-to-many;;Member[BelongsToMany].Argument[0,1]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/belongs-to/belongs-to;;Member[BelongsTo].Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-meta;ForeignKeyMeta;Member[relatedClassGetter]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[addForeignKey].Argument[1]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key;;Member[ForeignKey].Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/has/has-many;;Member[HasMany].Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/associations/has/has-one;;Member[HasOne].Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript/model/shared/model-class-getter;ModelClassGetter;",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;;Member[BelongsTo,ForeignKey,HasMany,HasOne].Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;;Member[BelongsToMany].Argument[0,1]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BaseAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BelongsToAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;BelongsToManyAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript;ModelClassGetter;sequelize-typescript;HasAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/model/model;;Member[Model]",
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/model/model;ModelStatic~;",
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript/model/shared/model-not-initialized-error;ModelNotInitializedErrorStatic;Argument[0]",
|
||||
"sequelize-typescript;ModelStatic~;sequelize-typescript;;Member[Model]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript/associations/foreign-key/foreign-key-service;;Member[getForeignKeyOptions].Argument[0,1]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript/model/model/model;ModelType;",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BaseAssociation;Member[getAssociatedClass].ReturnValue",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BaseAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BelongsToAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;BelongsToManyAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;HasAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;ModelClassGetter;ReturnValue",
|
||||
"sequelize-typescript;ModelType;sequelize-typescript;Sequelize;Member[model].Argument[0]",
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-options;ScopeOptionsGetters;",
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]",
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;;Member[getScopeOptionsGetters].ReturnValue",
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript;;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]",
|
||||
"sequelize-typescript;ScopeOptionsGetters;sequelize-typescript;;Member[getScopeOptionsGetters].ReturnValue",
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript/scopes/scope-options;ScopesOptions;",
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript/scopes/scope-service;;Member[resolveScope].Argument[2]",
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript;;Member[resolveScope].Argument[2]",
|
||||
"sequelize-typescript;ScopesOptions;sequelize-typescript;ScopesOptionsGetter;ReturnValue.AnyMember",
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript/scopes/scope-options;ScopesOptionsGetter;",
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript/scopes/scopes;;Member[Scopes].Argument[0]",
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript;;Member[Scopes].Argument[0]",
|
||||
"sequelize-typescript;ScopesOptionsGetter;sequelize-typescript;ScopeOptionsGetters;Member[getScopes]",
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript/sequelize/sequelize/sequelize;Sequelize;",
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;BaseAssociation;Member[getSequelizeOptions].Argument[1]",
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;BelongsToManyAssociation;Member[getSequelizeOptions].Argument[1]",
|
||||
"sequelize-typescript;Sequelize;sequelize-typescript;SequelizeStatic;Instance",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-options;SequelizeOptions;",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareArgs].ReturnValue.Member[options]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareOptions].Argument[0]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;;Member[prepareOptions].ReturnValue",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareArgs].ReturnValue.Member[options]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareOptions].Argument[0]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;;Member[prepareOptions].ReturnValue",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;Sequelize;Member[options]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;Argument[3]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[0].Argument[0]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[1].Argument[0,1]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[2].Argument[1,2]",
|
||||
"sequelize-typescript;SequelizeOptions;sequelize-typescript;SequelizeStatic;WithArity[3].Argument[2]",
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;;Member[Sequelize]",
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;SequelizeStatic;",
|
||||
"sequelize-typescript;SequelizeStatic;sequelize-typescript;;Member[Sequelize]",
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManyAddAssociationMixin;Argument[1]",
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManyAddAssociationsMixin;Argument[1]",
|
||||
"sequelize;AnyFindOptions;sequelize;BelongsToManySetAssociationsMixin;Argument[1]",
|
||||
"sequelize;AnyFindOptions;sequelize;DefineOptions;Member[defaultScope]",
|
||||
"sequelize;AnyFindOptions;sequelize;DefineScopeOptions;AnyMember",
|
||||
"sequelize;AnyFindOptions;sequelize;HasManySetAssociationsMixin;Argument[1]",
|
||||
"sequelize;AnyFindOptions;sequelize;Instance;Member[reload].Argument[0]",
|
||||
"sequelize;AnyFindOptions;sequelize;Model;Member[addScope].Argument[1]",
|
||||
"sequelize;AssociationOptionsBelongsToMany;sequelize;Associations;Member[belongsToMany].Argument[1]",
|
||||
"sequelize;Associations;sequelize;Model;",
|
||||
"sequelize;Associations;sequelize;SequelizeStaticAndInstance.Model;",
|
||||
"sequelize;BuildOptions;sequelize-typescript;ModelStatic~;Argument[1]",
|
||||
"sequelize;BuildOptions;sequelize;CreateOptions;",
|
||||
"sequelize;BuildOptions;sequelize;Model;Member[build,bulkBuild].Argument[1]",
|
||||
"sequelize;CountOptions;sequelize;Model;Member[count].Argument[0]",
|
||||
"sequelize;CreateOptions;sequelize-typescript/model/model/association/association-create-options;AssociationCreateOptions;",
|
||||
"sequelize;CreateOptions;sequelize;BelongsToCreateAssociationMixin;Argument[1]",
|
||||
"sequelize;CreateOptions;sequelize;BelongsToManyCreateAssociationMixin;Argument[1]",
|
||||
"sequelize;CreateOptions;sequelize;HasManyCreateAssociationMixin;Argument[1]",
|
||||
"sequelize;CreateOptions;sequelize;HasOneCreateAssociationMixin;Argument[1]",
|
||||
"sequelize;CreateOptions;sequelize;Model;Member[create].Argument[1]",
|
||||
"sequelize;DefineAttributeColumnOptions;sequelize;DefineAttributes;AnyMember",
|
||||
"sequelize;DefineAttributeColumnOptions;sequelize;QueryInterface;Member[addColumn,changeColumn].Argument[2]",
|
||||
"sequelize;DefineAttributeColumnReferencesOptions;sequelize;DefineAttributeColumnOptions;Member[references]",
|
||||
"sequelize;DefineAttributes;sequelize;Hooks;Member[beforeDefine].Argument[1].Argument[0]",
|
||||
"sequelize;DefineAttributes;sequelize;Hooks;Member[beforeDefine].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize;DefineAttributes;sequelize;QueryInterface;Member[createTable].Argument[1]",
|
||||
"sequelize;DefineOptions;sequelize;Options;Member[define]",
|
||||
"sequelize;DefineOptions;sequelize;Sequelize;Member[define].Argument[2]",
|
||||
"sequelize;DefineScopeOptions;sequelize;DefineOptions;Member[scopes]",
|
||||
"sequelize;FindCreateFindOptions;sequelize;Model;Member[findCreateFind].Argument[0]",
|
||||
"sequelize;FindOptions;sequelize-typescript;AssociationCountOptions;",
|
||||
"sequelize;FindOptions;sequelize-typescript;AssociationGetOptions;",
|
||||
"sequelize;FindOptions;sequelize-typescript;DefaultScopeGetter;ReturnValue",
|
||||
"sequelize;FindOptions;sequelize-typescript;Model;Member[reload].Argument[0]",
|
||||
"sequelize;FindOptions;sequelize-typescript;ScopesOptions;",
|
||||
"sequelize;FindOptions;sequelize-typescript;ScopesOptions;ReturnValue",
|
||||
"sequelize;FindOptions;sequelize;AnyFindOptions;",
|
||||
"sequelize;FindOptions;sequelize;FindCreateFindOptions;",
|
||||
"sequelize;FindOptions;sequelize;FindOrInitializeOptions;",
|
||||
"sequelize;FindOptions;sequelize;Model;Member[all,find,findAll,findAndCount,findAndCountAll,findOne].Argument[0]",
|
||||
"sequelize;FindOptionsOrderArray;sequelize;FindOptions;Member[order]",
|
||||
"sequelize;FindOptionsOrderArray;sequelize;FindOptions;Member[order].ArrayElement",
|
||||
"sequelize;FindOrInitializeOptions;sequelize;Model;Member[findOrBuild,findOrCreate,findOrInitialize].Argument[0]",
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyGetAssociationsMixin;Argument[0]",
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyHasAssociationMixin;Argument[1]",
|
||||
"sequelize;HasManyGetAssociationsMixinOptions;sequelize;HasManyHasAssociationsMixin;Argument[1]",
|
||||
"sequelize;Hooks;sequelize;Hooks;Member[addHook,hook,removeHook].ReturnValue",
|
||||
"sequelize;Hooks;sequelize;Model;",
|
||||
"sequelize;Hooks;sequelize;Sequelize;",
|
||||
"sequelize;Hooks;sequelize;SequelizeStaticAndInstance.Model;",
|
||||
"sequelize;IncludeAssociation;sequelize;Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].ReturnValue",
|
||||
"sequelize;IncludeAssociation;sequelize;IncludeOptions;Member[association]",
|
||||
"sequelize;IncludeOptions;sequelize;BuildOptions;Member[include].ArrayElement",
|
||||
"sequelize;IncludeOptions;sequelize;CountOptions;Member[include]",
|
||||
"sequelize;IncludeOptions;sequelize;CountOptions;Member[include].ArrayElement",
|
||||
"sequelize;IncludeOptions;sequelize;FindOptions;Member[include]",
|
||||
"sequelize;IncludeOptions;sequelize;FindOptions;Member[include].ArrayElement",
|
||||
"sequelize;IncludeOptions;sequelize;HasManyGetAssociationsMixinOptions;Member[include]",
|
||||
"sequelize;IncludeOptions;sequelize;IncludeOptions;Member[include]",
|
||||
"sequelize;IncludeOptions;sequelize;IncludeOptions;Member[include].ArrayElement",
|
||||
"sequelize;Instance;sequelize;Instance;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited",
|
||||
"sequelize;Instance;sequelize;Instance;Member[equalsOneOf].Argument[0].ArrayElement",
|
||||
"sequelize;Instance;sequelize;Instance;Member[equals].Argument[0]",
|
||||
"sequelize;Instance;sequelize;Instance;Member[set,setAttributes].ReturnValue",
|
||||
"sequelize;Instance;sequelize;Model;Member[Instance,build].ReturnValue",
|
||||
"sequelize;Instance;sequelize;Model;Member[all,bulkCreate,findAll].ReturnValue.Awaited.ArrayElement",
|
||||
"sequelize;Instance;sequelize;Model;Member[bulkBuild].ReturnValue.ArrayElement",
|
||||
"sequelize;Instance;sequelize;Model;Member[create,find,findById,findByPk,findByPrimary,findOne].ReturnValue.Awaited",
|
||||
"sequelize;Instance;sequelize;Model;Member[findAndCount,findAndCountAll].ReturnValue.Awaited.Member[rows].ArrayElement",
|
||||
"sequelize;Instance;sequelize;QueryInterface;Member[delete,increment,insert,update].Argument[0]",
|
||||
"sequelize;Instance;sequelize;QueryOptions;Member[instance]",
|
||||
"sequelize;Instance;sequelize;SequelizeStaticAndInstance;Member[Instance]",
|
||||
"sequelize;Model;sequelize;AssociationOptionsBelongsToMany;Member[through]",
|
||||
"sequelize;Model;sequelize;Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].Argument[0]",
|
||||
"sequelize;Model;sequelize;BuildOptions;Member[include].ArrayElement",
|
||||
"sequelize;Model;sequelize;CountOptions;Member[include]",
|
||||
"sequelize;Model;sequelize;CountOptions;Member[include].ArrayElement",
|
||||
"sequelize;Model;sequelize;DefineAttributeColumnReferencesOptions;Member[model]",
|
||||
"sequelize;Model;sequelize;FindOptions;Member[include]",
|
||||
"sequelize;Model;sequelize;FindOptions;Member[include].ArrayElement",
|
||||
"sequelize;Model;sequelize;FindOptions;Member[lock].Member[of]",
|
||||
"sequelize;Model;sequelize;FindOptionsOrderArray;ArrayElement",
|
||||
"sequelize;Model;sequelize;FindOptionsOrderArray;ArrayElement.Member[model]",
|
||||
"sequelize;Model;sequelize;Hooks;Member[afterDefine].Argument[1].Argument[0]",
|
||||
"sequelize;Model;sequelize;Hooks;Member[afterDefine].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize;Model;sequelize;IncludeAssociation;Member[source,target]",
|
||||
"sequelize;Model;sequelize;IncludeOptions;Member[include,model]",
|
||||
"sequelize;Model;sequelize;IncludeOptions;Member[include].ArrayElement",
|
||||
"sequelize;Model;sequelize;Instance;Member[Model]",
|
||||
"sequelize;Model;sequelize;Model;Member[schema,scope,unscoped].ReturnValue",
|
||||
"sequelize;Model;sequelize;Model;Member[sync].ReturnValue.Awaited",
|
||||
"sequelize;Model;sequelize;Models;AnyMember",
|
||||
"sequelize;Model;sequelize;ModelsHashInterface;AnyMember",
|
||||
"sequelize;Model;sequelize;QueryInterface;Member[bulkDelete,rawSelect,upsert].Argument[3]",
|
||||
"sequelize;Model;sequelize;QueryInterface;Member[select].Argument[0]",
|
||||
"sequelize;Model;sequelize;QueryOptions;Member[model]",
|
||||
"sequelize;Model;sequelize;Sequelize;Member[define,import,model].ReturnValue",
|
||||
"sequelize;Model;sequelize;Sequelize;Member[import].Argument[1].ReturnValue",
|
||||
"sequelize;Model;sequelize;SequelizeStaticAndInstance;Member[Model]",
|
||||
"sequelize;Model;sequelize;ThroughOptions;Member[model]",
|
||||
"sequelize;Model;sequelize;Utils;Member[mapOptionFieldNames].Argument[1]",
|
||||
"sequelize;Model;sequelize;Utils;Member[mapValueFieldNames].Argument[2]",
|
||||
"sequelize;Models;sequelize;Model;Member[associate].Argument[0]",
|
||||
"sequelize;ModelsHashInterface;sequelize;Sequelize;Member[models]",
|
||||
"sequelize;Options;sequelize-typescript;SequelizeOptions;",
|
||||
"sequelize;Options;sequelize;Sequelize;Member[options]",
|
||||
"sequelize;Options;sequelize;SequelizeStatic;Argument[3]",
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[1].Argument[0,1]",
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[2].Argument[1,2]",
|
||||
"sequelize;Options;sequelize;SequelizeStatic;WithArity[3].Argument[2]",
|
||||
"sequelize;QueryInterface;sequelize;Sequelize;Member[getQueryInterface].ReturnValue",
|
||||
"sequelize;QueryOptions;sequelize;Options;Member[query]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[bulkDelete,bulkInsert,createTable,select,setAutocommit,setIsolationLevel].Argument[2]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[bulkUpdate,delete,insert].Argument[3]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[commitTransaction,deferConstraints,dropTable,rawSelect,rollbackTransaction,showIndex,startTransaction].Argument[1]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[createFunction].Argument[5]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[dropAllEnums,dropAllTables,showAllSchemas,showAllTables].Argument[0]",
|
||||
"sequelize;QueryOptions;sequelize;QueryInterface;Member[increment,update,upsert].Argument[4]",
|
||||
"sequelize;QueryOptions;sequelize;Sequelize;Member[authenticate,validate].Argument[0]",
|
||||
"sequelize;QueryOptions;sequelize;Sequelize;Member[query].Argument[1]",
|
||||
"sequelize;Sequelize;sequelize;Hooks;Member[afterInit].Argument[1].Argument[0]",
|
||||
"sequelize;Sequelize;sequelize;Hooks;Member[afterInit].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize;Sequelize;sequelize;Instance;Member[sequelize]",
|
||||
"sequelize;Sequelize;sequelize;QueryInterface;Member[sequelize]",
|
||||
"sequelize;Sequelize;sequelize;Sequelize;Member[import].Argument[1].Argument[0]",
|
||||
"sequelize;Sequelize;sequelize;SequelizeStatic;Instance",
|
||||
"sequelize;Sequelize;sequelize;SequelizeStatic;Member[useCLS].ReturnValue",
|
||||
"sequelize;SequelizeStatic;sequelize-typescript;Sequelize;",
|
||||
"sequelize;SequelizeStatic;sequelize;;",
|
||||
"sequelize;SequelizeStatic;sequelize;Sequelize;Member[Sequelize]",
|
||||
"sequelize;SequelizeStatic;sequelize;SequelizeStatic;Member[Sequelize,default]",
|
||||
"sequelize;SequelizeStaticAndInstance.Model;sequelize-typescript;Model;",
|
||||
"sequelize;SequelizeStaticAndInstance;sequelize;Sequelize;",
|
||||
"sequelize;SequelizeStaticAndInstance;sequelize;SequelizeStatic;",
|
||||
"sequelize;ThroughOptions;sequelize;AssociationOptionsBelongsToMany;Member[through]",
|
||||
"sequelize;Utils;sequelize;SequelizeStaticAndInstance;Member[Utils]"
|
||||
"sequelize-typescript.AssociationCountOptions;sequelize-typescript.Model;Member[$count].Argument[1]",
|
||||
"sequelize-typescript.AssociationCountOptions;sequelize-typescript/model/model/association/association-count-options.AssociationCountOptions;",
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript.Model;Member[$get].Argument[1]",
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript.Model;Member[$has].Argument[2]",
|
||||
"sequelize-typescript.AssociationGetOptions;sequelize-typescript/model/model/association/association-get-options.AssociationGetOptions;",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BaseAssociationStatic;Instance",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BelongsToAssociation;",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.BelongsToManyAssociation;",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript.HasAssociation;",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[addAssociation].Argument[1]",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/association-service;Member[setAssociations].Argument[1].ArrayElement",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript/associations/shared/base-association.BaseAssociation;",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[addAssociation].Argument[1]",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[getAssociations,getAssociationsByRelation].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript.BaseAssociation;sequelize-typescript;Member[setAssociations].Argument[1].ArrayElement",
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript/associations/shared/base-association.BaseAssociationStatic;",
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript/associations/shared/base-association;Member[BaseAssociation]",
|
||||
"sequelize-typescript.BaseAssociationStatic;sequelize-typescript;Member[BaseAssociation]",
|
||||
"sequelize-typescript.BelongsToAssociation;sequelize-typescript.BelongsToAssociationStatic;Instance",
|
||||
"sequelize-typescript.BelongsToAssociation;sequelize-typescript/associations/belongs-to/belongs-to-association.BelongsToAssociation;",
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association.BelongsToAssociationStatic;",
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript/associations/belongs-to/belongs-to-association;Member[BelongsToAssociation]",
|
||||
"sequelize-typescript.BelongsToAssociationStatic;sequelize-typescript;Member[BelongsToAssociation]",
|
||||
"sequelize-typescript.BelongsToManyAssociation;sequelize-typescript.BelongsToManyAssociationStatic;Instance",
|
||||
"sequelize-typescript.BelongsToManyAssociation;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association.BelongsToManyAssociation;",
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association.BelongsToManyAssociationStatic;",
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript/associations/belongs-to-many/belongs-to-many-association;Member[BelongsToManyAssociation]",
|
||||
"sequelize-typescript.BelongsToManyAssociationStatic;sequelize-typescript;Member[BelongsToManyAssociation]",
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript.ScopeOptionsGetters;Member[getDefaultScope]",
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript/scopes/default-scope;Member[DefaultScope].Argument[0]",
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript/scopes/scope-options.DefaultScopeGetter;",
|
||||
"sequelize-typescript.DefaultScopeGetter;sequelize-typescript;Member[DefaultScope].Argument[0]",
|
||||
"sequelize-typescript.HasAssociation;sequelize-typescript.HasAssociationStatic;Instance",
|
||||
"sequelize-typescript.HasAssociation;sequelize-typescript/associations/has/has-association.HasAssociation;",
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript/associations/has/has-association.HasAssociationStatic;",
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript/associations/has/has-association;Member[HasAssociation]",
|
||||
"sequelize-typescript.HasAssociationStatic;sequelize-typescript;Member[HasAssociation]",
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$add,$has,$remove,$set].Argument[1]",
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$add,$has,$remove,$set].Argument[1].ArrayElement",
|
||||
"sequelize-typescript.Model;sequelize-typescript.Model;Member[$create,reload].ReturnValue.Awaited",
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelStatic~;Instance",
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelStatic~;Member[initialize].ReturnValue.TypeVar[sequelize-typescript.ModelStatic.0]",
|
||||
"sequelize-typescript.Model;sequelize-typescript.ModelType;Instance",
|
||||
"sequelize-typescript.Model;sequelize-typescript.Sequelize;Member[getRepository].Argument[0].Instance",
|
||||
"sequelize-typescript.Model;sequelize-typescript.Sequelize;Member[getRepository].ReturnValue.TypeVar[sequelize-typescript.Repository.0]",
|
||||
"sequelize-typescript.Model;sequelize-typescript/model/model/model.Model;",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BaseAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BelongsToAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.BelongsToManyAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript.HasAssociationStatic;Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/belongs-to-many/belongs-to-many;Member[BelongsToMany].Argument[0,1]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/belongs-to/belongs-to;Member[BelongsTo].Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-meta.ForeignKeyMeta;Member[relatedClassGetter]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[addForeignKey].Argument[1]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/foreign-key/foreign-key;Member[ForeignKey].Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/has/has-many;Member[HasMany].Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/associations/has/has-one;Member[HasOne].Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript/model/shared/model-class-getter.ModelClassGetter;",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript;Member[BelongsTo,ForeignKey,HasMany,HasOne].Argument[0]",
|
||||
"sequelize-typescript.ModelClassGetter;sequelize-typescript;Member[BelongsToMany].Argument[0,1]",
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/model/model.ModelStatic~;",
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/model/model;Member[Model]",
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript/model/shared/model-not-initialized-error.ModelNotInitializedErrorStatic;Argument[0]",
|
||||
"sequelize-typescript.ModelStatic~;sequelize-typescript;Member[Model]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BaseAssociation;Member[getAssociatedClass].ReturnValue",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BaseAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BelongsToAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.BelongsToManyAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.HasAssociation;Member[getSequelizeOptions].Argument[0]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.ModelClassGetter;ReturnValue",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript.Sequelize;Member[model].Argument[0]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[getForeignKeyOptions].Argument[0,1]",
|
||||
"sequelize-typescript.ModelType;sequelize-typescript/model/model/model.ModelType;",
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-options.ScopeOptionsGetters;",
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]",
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript/scopes/scope-service;Member[getScopeOptionsGetters].ReturnValue",
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript;Member[addScopeOptionsGetter,setScopeOptionsGetters].Argument[1]",
|
||||
"sequelize-typescript.ScopeOptionsGetters;sequelize-typescript;Member[getScopeOptionsGetters].ReturnValue",
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript.ScopesOptionsGetter;ReturnValue.AnyMember",
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript/scopes/scope-options.ScopesOptions;",
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript/scopes/scope-service;Member[resolveScope].Argument[2]",
|
||||
"sequelize-typescript.ScopesOptions;sequelize-typescript;Member[resolveScope].Argument[2]",
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript.ScopeOptionsGetters;Member[getScopes]",
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript/scopes/scope-options.ScopesOptionsGetter;",
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript/scopes/scopes;Member[Scopes].Argument[0]",
|
||||
"sequelize-typescript.ScopesOptionsGetter;sequelize-typescript;Member[Scopes].Argument[0]",
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.BaseAssociation;Member[getSequelizeOptions].Argument[1]",
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.BelongsToManyAssociation;Member[getSequelizeOptions].Argument[1]",
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript.SequelizeStatic;Instance",
|
||||
"sequelize-typescript.Sequelize;sequelize-typescript/sequelize/sequelize/sequelize.Sequelize;",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.Sequelize;Member[options]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;Argument[3]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[0].Argument[0]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[1].Argument[0,1]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[2].Argument[1,2]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript.SequelizeStatic;WithArity[3].Argument[2]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-options.SequelizeOptions;",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareArgs].ReturnValue.Member[options]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareOptions].Argument[0]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript/sequelize/sequelize/sequelize-service;Member[prepareOptions].ReturnValue",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareArgs].ReturnValue.Member[options]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareOptions].Argument[0]",
|
||||
"sequelize-typescript.SequelizeOptions;sequelize-typescript;Member[prepareOptions].ReturnValue",
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize.SequelizeStatic;",
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript/sequelize/sequelize/sequelize;Member[Sequelize]",
|
||||
"sequelize-typescript.SequelizeStatic;sequelize-typescript;Member[Sequelize]",
|
||||
"sequelize-typescript/associations/foreign-key/foreign-key-meta.ForeignKeyMeta;sequelize-typescript/associations/foreign-key/foreign-key-service;Member[getForeignKeys].ReturnValue.ArrayElement",
|
||||
"sequelize-typescript/model/model/association/association-create-options.AssociationCreateOptions;sequelize-typescript.Model;Member[$create].Argument[2]",
|
||||
"sequelize-typescript/model/shared/model-not-initialized-error.ModelNotInitializedErrorStatic;sequelize-typescript/model/shared/model-not-initialized-error;Member[ModelNotInitializedError]",
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManyAddAssociationMixin;Argument[1]",
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManyAddAssociationsMixin;Argument[1]",
|
||||
"sequelize.AnyFindOptions;sequelize.BelongsToManySetAssociationsMixin;Argument[1]",
|
||||
"sequelize.AnyFindOptions;sequelize.DefineOptions;Member[defaultScope]",
|
||||
"sequelize.AnyFindOptions;sequelize.DefineScopeOptions;AnyMember",
|
||||
"sequelize.AnyFindOptions;sequelize.HasManySetAssociationsMixin;Argument[1]",
|
||||
"sequelize.AnyFindOptions;sequelize.Instance;Member[reload].Argument[0]",
|
||||
"sequelize.AnyFindOptions;sequelize.Model;Member[addScope].Argument[1]",
|
||||
"sequelize.AssociationOptionsBelongsToMany;sequelize.Associations;Member[belongsToMany].Argument[1]",
|
||||
"sequelize.Associations;sequelize.Model;",
|
||||
"sequelize.Associations;sequelize.SequelizeStaticAndInstance.Model;",
|
||||
"sequelize.BuildOptions;sequelize-typescript.ModelStatic~;Argument[1]",
|
||||
"sequelize.BuildOptions;sequelize.CreateOptions;",
|
||||
"sequelize.BuildOptions;sequelize.Model;Member[build,bulkBuild].Argument[1]",
|
||||
"sequelize.CountOptions;sequelize.Model;Member[count].Argument[0]",
|
||||
"sequelize.CreateOptions;sequelize-typescript/model/model/association/association-create-options.AssociationCreateOptions;",
|
||||
"sequelize.CreateOptions;sequelize.BelongsToCreateAssociationMixin;Argument[1]",
|
||||
"sequelize.CreateOptions;sequelize.BelongsToManyCreateAssociationMixin;Argument[1]",
|
||||
"sequelize.CreateOptions;sequelize.HasManyCreateAssociationMixin;Argument[1]",
|
||||
"sequelize.CreateOptions;sequelize.HasOneCreateAssociationMixin;Argument[1]",
|
||||
"sequelize.CreateOptions;sequelize.Model;Member[create].Argument[1]",
|
||||
"sequelize.DefineAttributeColumnOptions;sequelize.DefineAttributes;AnyMember",
|
||||
"sequelize.DefineAttributeColumnOptions;sequelize.QueryInterface;Member[addColumn,changeColumn].Argument[2]",
|
||||
"sequelize.DefineAttributeColumnReferencesOptions;sequelize.DefineAttributeColumnOptions;Member[references]",
|
||||
"sequelize.DefineAttributes;sequelize.Hooks;Member[beforeDefine].Argument[1].Argument[0]",
|
||||
"sequelize.DefineAttributes;sequelize.Hooks;Member[beforeDefine].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize.DefineAttributes;sequelize.QueryInterface;Member[createTable].Argument[1]",
|
||||
"sequelize.DefineOptions;sequelize.Options;Member[define]",
|
||||
"sequelize.DefineOptions;sequelize.Sequelize;Member[define].Argument[2]",
|
||||
"sequelize.DefineScopeOptions;sequelize.DefineOptions;Member[scopes]",
|
||||
"sequelize.FindCreateFindOptions;sequelize.Model;Member[findCreateFind].Argument[0]",
|
||||
"sequelize.FindOptions;sequelize-typescript.AssociationCountOptions;",
|
||||
"sequelize.FindOptions;sequelize-typescript.AssociationGetOptions;",
|
||||
"sequelize.FindOptions;sequelize-typescript.DefaultScopeGetter;ReturnValue",
|
||||
"sequelize.FindOptions;sequelize-typescript.Model;Member[reload].Argument[0]",
|
||||
"sequelize.FindOptions;sequelize-typescript.ScopesOptions;",
|
||||
"sequelize.FindOptions;sequelize-typescript.ScopesOptions;ReturnValue",
|
||||
"sequelize.FindOptions;sequelize.AnyFindOptions;",
|
||||
"sequelize.FindOptions;sequelize.FindCreateFindOptions;",
|
||||
"sequelize.FindOptions;sequelize.FindOrInitializeOptions;",
|
||||
"sequelize.FindOptions;sequelize.Model;Member[all,find,findAll,findAndCount,findAndCountAll,findOne].Argument[0]",
|
||||
"sequelize.FindOptionsOrderArray;sequelize.FindOptions;Member[order]",
|
||||
"sequelize.FindOptionsOrderArray;sequelize.FindOptions;Member[order].ArrayElement",
|
||||
"sequelize.FindOrInitializeOptions;sequelize.Model;Member[findOrBuild,findOrCreate,findOrInitialize].Argument[0]",
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyGetAssociationsMixin;Argument[0]",
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyHasAssociationMixin;Argument[1]",
|
||||
"sequelize.HasManyGetAssociationsMixinOptions;sequelize.HasManyHasAssociationsMixin;Argument[1]",
|
||||
"sequelize.Hooks;sequelize.Hooks;Member[addHook,hook,removeHook].ReturnValue",
|
||||
"sequelize.Hooks;sequelize.Model;",
|
||||
"sequelize.Hooks;sequelize.Sequelize;",
|
||||
"sequelize.Hooks;sequelize.SequelizeStaticAndInstance.Model;",
|
||||
"sequelize.IncludeAssociation;sequelize.Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].ReturnValue",
|
||||
"sequelize.IncludeAssociation;sequelize.IncludeOptions;Member[association]",
|
||||
"sequelize.IncludeOptions;sequelize.BuildOptions;Member[include].ArrayElement",
|
||||
"sequelize.IncludeOptions;sequelize.CountOptions;Member[include]",
|
||||
"sequelize.IncludeOptions;sequelize.CountOptions;Member[include].ArrayElement",
|
||||
"sequelize.IncludeOptions;sequelize.FindOptions;Member[include]",
|
||||
"sequelize.IncludeOptions;sequelize.FindOptions;Member[include].ArrayElement",
|
||||
"sequelize.IncludeOptions;sequelize.HasManyGetAssociationsMixinOptions;Member[include]",
|
||||
"sequelize.IncludeOptions;sequelize.IncludeOptions;Member[include]",
|
||||
"sequelize.IncludeOptions;sequelize.IncludeOptions;Member[include].ArrayElement",
|
||||
"sequelize.Instance;sequelize.Instance;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited",
|
||||
"sequelize.Instance;sequelize.Instance;Member[equalsOneOf].Argument[0].ArrayElement",
|
||||
"sequelize.Instance;sequelize.Instance;Member[equals].Argument[0]",
|
||||
"sequelize.Instance;sequelize.Instance;Member[set,setAttributes].ReturnValue",
|
||||
"sequelize.Instance;sequelize.Model;Member[Instance,build].ReturnValue",
|
||||
"sequelize.Instance;sequelize.Model;Member[all,bulkCreate,findAll].ReturnValue.Awaited.ArrayElement",
|
||||
"sequelize.Instance;sequelize.Model;Member[bulkBuild].ReturnValue.ArrayElement",
|
||||
"sequelize.Instance;sequelize.Model;Member[create,find,findById,findByPk,findByPrimary,findOne].ReturnValue.Awaited",
|
||||
"sequelize.Instance;sequelize.Model;Member[findAndCount,findAndCountAll].ReturnValue.Awaited.Member[rows].ArrayElement",
|
||||
"sequelize.Instance;sequelize.QueryInterface;Member[delete,increment,insert,update].Argument[0]",
|
||||
"sequelize.Instance;sequelize.QueryOptions;Member[instance]",
|
||||
"sequelize.Instance;sequelize.SequelizeStaticAndInstance;Member[Instance]",
|
||||
"sequelize.Model;sequelize.AssociationOptionsBelongsToMany;Member[through]",
|
||||
"sequelize.Model;sequelize.Associations;Member[belongsTo,belongsToMany,hasMany,hasOne].Argument[0]",
|
||||
"sequelize.Model;sequelize.BuildOptions;Member[include].ArrayElement",
|
||||
"sequelize.Model;sequelize.CountOptions;Member[include]",
|
||||
"sequelize.Model;sequelize.CountOptions;Member[include].ArrayElement",
|
||||
"sequelize.Model;sequelize.DefineAttributeColumnReferencesOptions;Member[model]",
|
||||
"sequelize.Model;sequelize.FindOptions;Member[include]",
|
||||
"sequelize.Model;sequelize.FindOptions;Member[include].ArrayElement",
|
||||
"sequelize.Model;sequelize.FindOptions;Member[lock].Member[of]",
|
||||
"sequelize.Model;sequelize.FindOptionsOrderArray;ArrayElement",
|
||||
"sequelize.Model;sequelize.FindOptionsOrderArray;ArrayElement.Member[model]",
|
||||
"sequelize.Model;sequelize.Hooks;Member[afterDefine].Argument[1].Argument[0]",
|
||||
"sequelize.Model;sequelize.Hooks;Member[afterDefine].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize.Model;sequelize.IncludeAssociation;Member[source,target]",
|
||||
"sequelize.Model;sequelize.IncludeOptions;Member[include,model]",
|
||||
"sequelize.Model;sequelize.IncludeOptions;Member[include].ArrayElement",
|
||||
"sequelize.Model;sequelize.Instance;Member[Model]",
|
||||
"sequelize.Model;sequelize.Model;Member[schema,scope,unscoped].ReturnValue",
|
||||
"sequelize.Model;sequelize.Model;Member[sync].ReturnValue.Awaited",
|
||||
"sequelize.Model;sequelize.Models;AnyMember",
|
||||
"sequelize.Model;sequelize.ModelsHashInterface;AnyMember",
|
||||
"sequelize.Model;sequelize.QueryInterface;Member[bulkDelete,rawSelect,upsert].Argument[3]",
|
||||
"sequelize.Model;sequelize.QueryInterface;Member[select].Argument[0]",
|
||||
"sequelize.Model;sequelize.QueryOptions;Member[model]",
|
||||
"sequelize.Model;sequelize.Sequelize;Member[define,import,model].ReturnValue",
|
||||
"sequelize.Model;sequelize.Sequelize;Member[import].Argument[1].ReturnValue",
|
||||
"sequelize.Model;sequelize.SequelizeStaticAndInstance;Member[Model]",
|
||||
"sequelize.Model;sequelize.ThroughOptions;Member[model]",
|
||||
"sequelize.Model;sequelize.Utils;Member[mapOptionFieldNames].Argument[1]",
|
||||
"sequelize.Model;sequelize.Utils;Member[mapValueFieldNames].Argument[2]",
|
||||
"sequelize.Models;sequelize.Model;Member[associate].Argument[0]",
|
||||
"sequelize.ModelsHashInterface;sequelize.Sequelize;Member[models]",
|
||||
"sequelize.Options;sequelize-typescript.SequelizeOptions;",
|
||||
"sequelize.Options;sequelize.Sequelize;Member[options]",
|
||||
"sequelize.Options;sequelize.SequelizeStatic;Argument[3]",
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[1].Argument[0,1]",
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[2].Argument[1,2]",
|
||||
"sequelize.Options;sequelize.SequelizeStatic;WithArity[3].Argument[2]",
|
||||
"sequelize.QueryInterface;sequelize.Sequelize;Member[getQueryInterface].ReturnValue",
|
||||
"sequelize.QueryOptions;sequelize.Options;Member[query]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[bulkDelete,bulkInsert,createTable,select,setAutocommit,setIsolationLevel].Argument[2]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[bulkUpdate,delete,insert].Argument[3]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[commitTransaction,deferConstraints,dropTable,rawSelect,rollbackTransaction,showIndex,startTransaction].Argument[1]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[createFunction].Argument[5]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[dropAllEnums,dropAllTables,showAllSchemas,showAllTables].Argument[0]",
|
||||
"sequelize.QueryOptions;sequelize.QueryInterface;Member[increment,update,upsert].Argument[4]",
|
||||
"sequelize.QueryOptions;sequelize.Sequelize;Member[authenticate,validate].Argument[0]",
|
||||
"sequelize.QueryOptions;sequelize.Sequelize;Member[query].Argument[1]",
|
||||
"sequelize.Sequelize;sequelize.Hooks;Member[afterInit].Argument[1].Argument[0]",
|
||||
"sequelize.Sequelize;sequelize.Hooks;Member[afterInit].WithArity[1].Argument[0].Argument[0]",
|
||||
"sequelize.Sequelize;sequelize.Instance;Member[sequelize]",
|
||||
"sequelize.Sequelize;sequelize.QueryInterface;Member[sequelize]",
|
||||
"sequelize.Sequelize;sequelize.Sequelize;Member[import].Argument[1].Argument[0]",
|
||||
"sequelize.Sequelize;sequelize.SequelizeStatic;Instance",
|
||||
"sequelize.Sequelize;sequelize.SequelizeStatic;Member[useCLS].ReturnValue",
|
||||
"sequelize.SequelizeStatic;sequelize-typescript.Sequelize;",
|
||||
"sequelize.SequelizeStatic;sequelize.Sequelize;Member[Sequelize]",
|
||||
"sequelize.SequelizeStatic;sequelize.SequelizeStatic;Member[Sequelize,default]",
|
||||
"sequelize.SequelizeStatic;sequelize;",
|
||||
"sequelize.SequelizeStaticAndInstance.Model;sequelize-typescript.Model;",
|
||||
"sequelize.SequelizeStaticAndInstance;sequelize.Sequelize;",
|
||||
"sequelize.SequelizeStaticAndInstance;sequelize.SequelizeStatic;",
|
||||
"sequelize.ThroughOptions;sequelize.AssociationOptionsBelongsToMany;Member[through]",
|
||||
"sequelize.Utils;sequelize.SequelizeStaticAndInstance;Member[Utils]"
|
||||
],
|
||||
"summaries": [
|
||||
"sequelize-typescript;Model;;;Member[reload].ReturnValue.Awaited;type",
|
||||
"sequelize;Instance;;;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited;type",
|
||||
"sequelize;Instance;;;Member[set,setAttributes].ReturnValue;type",
|
||||
"sequelize;Model;;;Member[schema,scope,unscoped].ReturnValue;type",
|
||||
"sequelize;Model;;;Member[sync].ReturnValue.Awaited;type"
|
||||
"sequelize-typescript.Model;;;Member[reload].ReturnValue.Awaited;type",
|
||||
"sequelize.Instance;;;Member[decrement,increment,reload,save,update,updateAttributes].ReturnValue.Awaited;type",
|
||||
"sequelize.Instance;;;Member[set,setAttributes].ReturnValue;type",
|
||||
"sequelize.Model;;;Member[schema,scope,unscoped].ReturnValue;type",
|
||||
"sequelize.Model;;;Member[sync].ReturnValue.Awaited;type"
|
||||
],
|
||||
"typeVariables": [
|
||||
"sequelize-typescript.ModelStatic.0;Instance",
|
||||
|
||||
@@ -6,180 +6,180 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner/batch-transaction;BatchTransactionStatic;Instance", //
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner/database;CreateBatchTransactionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner;Database;Member[batchTransaction].ReturnValue", //
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransactionStatic;@google-cloud/spanner/batch-transaction;;Member[BatchTransaction]", //
|
||||
"@google-cloud/spanner/batch-transaction;TransactionIdentifier;@google-cloud/spanner/batch-transaction;BatchTransaction;Member[identifier].ReturnValue", //
|
||||
"@google-cloud/spanner/batch-transaction;TransactionIdentifier;@google-cloud/spanner;Database;Member[batchTransaction].Argument[0]", //
|
||||
"@google-cloud/spanner/database;BatchCreateSessionsCallback;@google-cloud/spanner;Database;Member[batchCreateSessions].Argument[1]", //
|
||||
"@google-cloud/spanner/database;CreateBatchTransactionCallback;@google-cloud/spanner;Database;Member[createBatchTransaction].Argument[1]", //
|
||||
"@google-cloud/spanner/database;CreateBatchTransactionCallback;@google-cloud/spanner;Database;Member[createBatchTransaction].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database;CreateSessionCallback;@google-cloud/spanner;Database;Member[createSession].Argument[1]", //
|
||||
"@google-cloud/spanner/database;CreateSessionCallback;@google-cloud/spanner;Database;Member[createSession].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database;DatabaseCallback;@google-cloud/spanner;Database;Member[get].Argument[1]", //
|
||||
"@google-cloud/spanner/database;DatabaseCallback;@google-cloud/spanner;Database;Member[get].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database;GetSessionsCallback;@google-cloud/spanner;Database;Member[getSessions].Argument[1]", //
|
||||
"@google-cloud/spanner/database;GetSessionsCallback;@google-cloud/spanner;Database;Member[getSessions].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database;GetSnapshotCallback;@google-cloud/spanner;Database;Member[getSnapshot].Argument[1]", //
|
||||
"@google-cloud/spanner/database;GetSnapshotCallback;@google-cloud/spanner;Database;Member[getSnapshot].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database;GetTransactionCallback;@google-cloud/spanner;Database;Member[getTransaction].Argument[0]", //
|
||||
"@google-cloud/spanner/database;PoolRequestCallback;@google-cloud/spanner;Database;Member[makePooledRequest_].Argument[1]", //
|
||||
"@google-cloud/spanner/database;RestoreDatabaseCallback;@google-cloud/spanner;Database;Member[restore].Argument[1,2]", //
|
||||
"@google-cloud/spanner/database;SessionPoolConstructor;@google-cloud/spanner;DatabaseStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/database;SessionPoolConstructor;@google-cloud/spanner;Instance;Member[database].Argument[1]", //
|
||||
"@google-cloud/spanner/instance;CreateDatabaseCallback;@google-cloud/spanner;Instance;Member[createDatabase].Argument[2]", //
|
||||
"@google-cloud/spanner/instance;CreateDatabaseCallback;@google-cloud/spanner;Instance;Member[createDatabase].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/instance;CreateDatabaseOptions;@google-cloud/spanner;Instance;Member[createDatabase].WithArity[1,2,3].Argument[1]", //
|
||||
"@google-cloud/spanner/instance;CreateInstanceCallback;@google-cloud/spanner;Spanner;Member[createInstance].Argument[2]", //
|
||||
"@google-cloud/spanner/instance;GetDatabasesCallback;@google-cloud/spanner;Instance;Member[getDatabases].Argument[1]", //
|
||||
"@google-cloud/spanner/instance;GetDatabasesCallback;@google-cloud/spanner;Instance;Member[getDatabases].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/instance;GetInstanceCallback;@google-cloud/spanner;Instance;Member[get].Argument[1]", //
|
||||
"@google-cloud/spanner/instance;GetInstanceCallback;@google-cloud/spanner;Instance;Member[get].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool;GetReadSessionCallback;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[getReadSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool;GetReadSessionCallback;@google-cloud/spanner;SessionPool;Member[getReadSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool;GetWriteSessionCallback;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[getWriteSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool;GetWriteSessionCallback;@google-cloud/spanner;SessionPool;Member[getWriteSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner/database;SessionPoolConstructor;Instance", //
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner;Database;Member[pool_]", //
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner;SessionPool;", //
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Database;Member[createTable].Argument[2]", //
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Database;Member[createTable].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Table;Member[create].Argument[2]", //
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Table;Member[create].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner;Database;Member[runTransactionAsync].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner;Database;Member[runTransactionAsync].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/transaction-runner;AsyncTransactionRunner;@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;@google-cloud/spanner/transaction-runner;;Member[AsyncTransactionRunner]", //
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner;Database;Member[runTransaction].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner;Database;Member[runTransaction].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;AsyncTransactionRunner;", //
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;RunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;TransactionRunner;", //
|
||||
"@google-cloud/spanner/transaction-runner;RunnerStatic;@google-cloud/spanner/transaction-runner;;Member[Runner]", //
|
||||
"@google-cloud/spanner/transaction-runner;TransactionRunner;@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;@google-cloud/spanner/transaction-runner;;Member[TransactionRunner]", //
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner/transaction;DmlStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner;PartitionedDml;", //
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner;Transaction;", //
|
||||
"@google-cloud/spanner/transaction;DmlStatic;@google-cloud/spanner/transaction;;Member[Dml]", //
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner/backup;;Member[Backup]", //
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner/backup;BackupStatic;", //
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner;;Member[Backup]", //
|
||||
"@google-cloud/spanner;BatchTransaction;@google-cloud/spanner/batch-transaction;BatchTransaction;", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;Database;", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;DatabaseCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;RestoreDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;SessionPoolConstructor;Argument[0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/instance;CreateDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/instance;GetDatabasesCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;DatabaseStatic;Instance", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;Instance;Member[database].ReturnValue", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionPool;Member[database]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionPoolStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;Table;Member[database]", //
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;TableStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner/database;;Member[Database]", //
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner/database;DatabaseStatic;", //
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner;;Member[Database]", //
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner/build/src;GetInstancesCallback;", //
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner;Spanner;Member[getInstances].Argument[1]", //
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner;Spanner;Member[getInstances].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;CreateInstanceCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;GetInstanceCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;Instance;", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;BackupStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;DatabaseStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;GetInstancesCallback;TypeVar[@google-cloud/spanner/common.PagedCallback.0]", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;InstanceStatic;Instance", //
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;Spanner;Member[instance].ReturnValue", //
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner/instance;;Member[Instance]", //
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner/instance;InstanceStatic;", //
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner;;Member[Instance]", //
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner/transaction;PartitionedDml;", //
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner;PartitionedDmlStatic;Instance", //
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner;Session;Member[partitionedDml].ReturnValue", //
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner/transaction;;Member[PartitionedDml]", //
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner/transaction;PartitionedDmlStatic;", //
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner;;Member[PartitionedDml]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/batch-transaction;TransactionIdentifier;Member[session]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;BatchCreateSessionsCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0].ArrayElement", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;CreateSessionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;GetSessionsCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;PoolRequestCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;GetReadSessionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;GetWriteSessionCallback;Argument[1]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[release].Argument[0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session;Session;", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/transaction-runner;Runner;Member[session]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[_runPartitionedUpdate].Argument[0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[makePooledRequest_].WithArity[1].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[session].ReturnValue", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_acquire,_getSession].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_borrow,_destroy,_isValidSession,_ping,_prepareTransaction,_release,release].Argument[0]", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_borrowFrom,_borrowNextAvailableSession].ReturnValue", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_getIdleSessions].ReturnValue.ArrayElement", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionStatic;Instance", //
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Snapshot;Member[session]", //
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner/instance;CreateDatabaseOptions;Member[poolCtor]", //
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner/session-pool;SessionPool;", //
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner;SessionPoolStatic;Instance", //
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner/session-pool;;Member[SessionPool]", //
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner/session-pool;SessionPoolStatic;", //
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner;;Member[SessionPool]", //
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner/session;;Member[Session]", //
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner/session;SessionStatic;", //
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner;;Member[Session]", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/batch-transaction;BatchTransaction;", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/database;GetSnapshotCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/transaction;Dml;", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/transaction;Snapshot;", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner;Session;Member[snapshot].ReturnValue", //
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner;SnapshotStatic;Instance", //
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner/transaction;;Member[Snapshot]", //
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner/transaction;SnapshotStatic;", //
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner;;Member[Snapshot]", //
|
||||
"@google-cloud/spanner;Spanner;@google-cloud/spanner;InstanceStatic;Argument[0]", //
|
||||
"@google-cloud/spanner;Spanner;@google-cloud/spanner;SpannerStatic;Instance", //
|
||||
"@google-cloud/spanner;SpannerStatic;@google-cloud/spanner;;Member[Spanner]", //
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner/table;CreateTableCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner/table;Table;", //
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner;Database;Member[table].ReturnValue", //
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner;TableStatic;Instance", //
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner/table;;Member[Table]", //
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner/table;TableStatic;", //
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner;;Member[Table]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/database;GetTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/session-pool;GetWriteSessionCallback;Argument[2]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;Argument[0]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;RunTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;Runner;Member[getTransaction].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;Runner;Member[transaction]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction;Transaction;", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;Session;Member[transaction].ReturnValue", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;Session;Member[txn]", //
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;TransactionStatic;Instance", //
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner/transaction;;Member[Transaction]", //
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner/transaction;TransactionStatic;", //
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner;;Member[Transaction]", //
|
||||
"@google-cloud/spanner;v1.SpannerClient;@google-cloud/spanner/v1/spanner_client;SpannerClient;", //
|
||||
"@google-cloud/spanner;v1.SpannerClient;@google-cloud/spanner;v1.SpannerClientStatic;Instance", //
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;;Member[SpannerClient]", //
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;SpannerClientStatic;", //
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner;;Member[v1].Member[SpannerClient]", //
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Database;", //
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Snapshot;", //
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Transaction;", //
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;v1.SpannerClient;", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;BatchTransaction;Member[createQueryPartitions]", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Database;Member[run,runPartitionedUpdate,runStream]", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;PartitionedDml;Member[runUpdate]", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Snapshot;Member[run,runStream]", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Transaction;Member[run,runStream,runUpdate]", //
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;v1.SpannerClient;Member[executeSql,executeStreamingSql,partitionQuery]", //
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner/backup.BackupStatic;", //
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner/backup;Member[Backup]", //
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner;Member[Backup]", //
|
||||
"@google-cloud/spanner.BatchTransaction;@google-cloud/spanner/batch-transaction.BatchTransaction;", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.DatabaseStatic;Instance", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.Instance;Member[database].ReturnValue", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionPool;Member[database]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionPoolStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.Table;Member[database]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.TableStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.Database;", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.DatabaseCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.RestoreDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.SessionPoolConstructor;Argument[0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/instance.CreateDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/instance.GetDatabasesCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner/database.DatabaseStatic;", //
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner/database;Member[Database]", //
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner;Member[Database]", //
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner.Spanner;Member[getInstances].Argument[1]", //
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner.Spanner;Member[getInstances].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner/build/src.GetInstancesCallback;", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.BackupStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.DatabaseStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.GetInstancesCallback;TypeVar[@google-cloud/spanner/common.PagedCallback.0]", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.InstanceStatic;Instance", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.Spanner;Member[instance].ReturnValue", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.CreateInstanceCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.GetInstanceCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.Instance;", //
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner/instance.InstanceStatic;", //
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner/instance;Member[Instance]", //
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner;Member[Instance]", //
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner.PartitionedDmlStatic;Instance", //
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner.Session;Member[partitionedDml].ReturnValue", //
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner/transaction.PartitionedDml;", //
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner/transaction.PartitionedDmlStatic;", //
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner/transaction;Member[PartitionedDml]", //
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner;Member[PartitionedDml]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[_runPartitionedUpdate].Argument[0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[makePooledRequest_].WithArity[1].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[session].ReturnValue", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_acquire,_getSession].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_borrow,_destroy,_isValidSession,_ping,_prepareTransaction,_release,release].Argument[0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_borrowFrom,_borrowNextAvailableSession].ReturnValue", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_getIdleSessions].ReturnValue.ArrayElement", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionStatic;Instance", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Snapshot;Member[session]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/batch-transaction.TransactionIdentifier;Member[session]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.BatchCreateSessionsCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0].ArrayElement", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.CreateSessionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.GetSessionsCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.PoolRequestCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.GetReadSessionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.GetWriteSessionCallback;Argument[1]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[release].Argument[0]", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session.Session;", //
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/transaction-runner.Runner;Member[session]", //
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner.SessionPoolStatic;Instance", //
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner/instance.CreateDatabaseOptions;Member[poolCtor]", //
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner/session-pool.SessionPool;", //
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner/session-pool.SessionPoolStatic;", //
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner/session-pool;Member[SessionPool]", //
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner;Member[SessionPool]", //
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner/session.SessionStatic;", //
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner/session;Member[Session]", //
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner;Member[Session]", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner.Session;Member[snapshot].ReturnValue", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner.SnapshotStatic;Instance", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/batch-transaction.BatchTransaction;", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/database.GetSnapshotCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/transaction.Dml;", //
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/transaction.Snapshot;", //
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner/transaction.SnapshotStatic;", //
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner/transaction;Member[Snapshot]", //
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner;Member[Snapshot]", //
|
||||
"@google-cloud/spanner.Spanner;@google-cloud/spanner.InstanceStatic;Argument[0]", //
|
||||
"@google-cloud/spanner.Spanner;@google-cloud/spanner.SpannerStatic;Instance", //
|
||||
"@google-cloud/spanner.SpannerStatic;@google-cloud/spanner;Member[Spanner]", //
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner.Database;Member[table].ReturnValue", //
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner.TableStatic;Instance", //
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner/table.CreateTableCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]", //
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner/table.Table;", //
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner/table.TableStatic;", //
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner/table;Member[Table]", //
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner;Member[Table]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.Session;Member[transaction].ReturnValue", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.Session;Member[txn]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.TransactionStatic;Instance", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/database.GetTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/session-pool.GetWriteSessionCallback;Argument[2]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;Argument[0]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.RunTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.Runner;Member[getTransaction].ReturnValue.Awaited", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.Runner;Member[transaction]", //
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction.Transaction;", //
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner/transaction.TransactionStatic;", //
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner/transaction;Member[Transaction]", //
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner;Member[Transaction]", //
|
||||
"@google-cloud/spanner.v1.SpannerClient;@google-cloud/spanner.v1.SpannerClientStatic;Instance", //
|
||||
"@google-cloud/spanner.v1.SpannerClient;@google-cloud/spanner/v1/spanner_client.SpannerClient;", //
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client.SpannerClientStatic;", //
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;Member[SpannerClient]", //
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner;Member[v1].Member[SpannerClient]", //
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Database;", //
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Snapshot;", //
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Transaction;", //
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.v1.SpannerClient;", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.BatchTransaction;Member[createQueryPartitions]", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Database;Member[run,runPartitionedUpdate,runStream]", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.PartitionedDml;Member[runUpdate]", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Snapshot;Member[run,runStream]", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Transaction;Member[run,runStream,runUpdate]", //
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.v1.SpannerClient;Member[executeSql,executeStreamingSql,partitionQuery]", //
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner.Database;Member[batchTransaction].ReturnValue", //
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner/batch-transaction.BatchTransactionStatic;Instance", //
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner/database.CreateBatchTransactionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]", //
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransactionStatic;@google-cloud/spanner/batch-transaction;Member[BatchTransaction]", //
|
||||
"@google-cloud/spanner/batch-transaction.TransactionIdentifier;@google-cloud/spanner.Database;Member[batchTransaction].Argument[0]", //
|
||||
"@google-cloud/spanner/batch-transaction.TransactionIdentifier;@google-cloud/spanner/batch-transaction.BatchTransaction;Member[identifier].ReturnValue", //
|
||||
"@google-cloud/spanner/database.BatchCreateSessionsCallback;@google-cloud/spanner.Database;Member[batchCreateSessions].Argument[1]", //
|
||||
"@google-cloud/spanner/database.CreateBatchTransactionCallback;@google-cloud/spanner.Database;Member[createBatchTransaction].Argument[1]", //
|
||||
"@google-cloud/spanner/database.CreateBatchTransactionCallback;@google-cloud/spanner.Database;Member[createBatchTransaction].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database.CreateSessionCallback;@google-cloud/spanner.Database;Member[createSession].Argument[1]", //
|
||||
"@google-cloud/spanner/database.CreateSessionCallback;@google-cloud/spanner.Database;Member[createSession].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database.DatabaseCallback;@google-cloud/spanner.Database;Member[get].Argument[1]", //
|
||||
"@google-cloud/spanner/database.DatabaseCallback;@google-cloud/spanner.Database;Member[get].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database.GetSessionsCallback;@google-cloud/spanner.Database;Member[getSessions].Argument[1]", //
|
||||
"@google-cloud/spanner/database.GetSessionsCallback;@google-cloud/spanner.Database;Member[getSessions].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database.GetSnapshotCallback;@google-cloud/spanner.Database;Member[getSnapshot].Argument[1]", //
|
||||
"@google-cloud/spanner/database.GetSnapshotCallback;@google-cloud/spanner.Database;Member[getSnapshot].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/database.GetTransactionCallback;@google-cloud/spanner.Database;Member[getTransaction].Argument[0]", //
|
||||
"@google-cloud/spanner/database.PoolRequestCallback;@google-cloud/spanner.Database;Member[makePooledRequest_].Argument[1]", //
|
||||
"@google-cloud/spanner/database.RestoreDatabaseCallback;@google-cloud/spanner.Database;Member[restore].Argument[1,2]", //
|
||||
"@google-cloud/spanner/database.SessionPoolConstructor;@google-cloud/spanner.DatabaseStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/database.SessionPoolConstructor;@google-cloud/spanner.Instance;Member[database].Argument[1]", //
|
||||
"@google-cloud/spanner/instance.CreateDatabaseCallback;@google-cloud/spanner.Instance;Member[createDatabase].Argument[2]", //
|
||||
"@google-cloud/spanner/instance.CreateDatabaseCallback;@google-cloud/spanner.Instance;Member[createDatabase].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/instance.CreateDatabaseOptions;@google-cloud/spanner.Instance;Member[createDatabase].WithArity[1,2,3].Argument[1]", //
|
||||
"@google-cloud/spanner/instance.CreateInstanceCallback;@google-cloud/spanner.Spanner;Member[createInstance].Argument[2]", //
|
||||
"@google-cloud/spanner/instance.GetDatabasesCallback;@google-cloud/spanner.Instance;Member[getDatabases].Argument[1]", //
|
||||
"@google-cloud/spanner/instance.GetDatabasesCallback;@google-cloud/spanner.Instance;Member[getDatabases].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/instance.GetInstanceCallback;@google-cloud/spanner.Instance;Member[get].Argument[1]", //
|
||||
"@google-cloud/spanner/instance.GetInstanceCallback;@google-cloud/spanner.Instance;Member[get].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool.GetReadSessionCallback;@google-cloud/spanner.SessionPool;Member[getReadSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool.GetReadSessionCallback;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[getReadSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool.GetWriteSessionCallback;@google-cloud/spanner.SessionPool;Member[getWriteSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool.GetWriteSessionCallback;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[getWriteSession].Argument[0]", //
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner.Database;Member[pool_]", //
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner.SessionPool;", //
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner/database.SessionPoolConstructor;Instance", //
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Database;Member[createTable].Argument[2]", //
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Database;Member[createTable].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Table;Member[create].Argument[2]", //
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Table;Member[create].WithArity[2].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner.Database;Member[runTransactionAsync].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner.Database;Member[runTransactionAsync].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/transaction-runner.AsyncTransactionRunner;@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;@google-cloud/spanner/transaction-runner;Member[AsyncTransactionRunner]", //
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner.Database;Member[runTransaction].Argument[1]", //
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner.Database;Member[runTransaction].WithArity[1].Argument[0]", //
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;Argument[2]", //
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.AsyncTransactionRunner;", //
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.RunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.TransactionRunner;", //
|
||||
"@google-cloud/spanner/transaction-runner.RunnerStatic;@google-cloud/spanner/transaction-runner;Member[Runner]", //
|
||||
"@google-cloud/spanner/transaction-runner.TransactionRunner;@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;@google-cloud/spanner/transaction-runner;Member[TransactionRunner]", //
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner.PartitionedDml;", //
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner.Transaction;", //
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner/transaction.DmlStatic;Instance", //
|
||||
"@google-cloud/spanner/transaction.DmlStatic;@google-cloud/spanner/transaction;Member[Dml]", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,186 +56,186 @@
|
||||
"language": "javascript",
|
||||
"model": {
|
||||
"typeDefinitions": [
|
||||
"@google-cloud/spanner;BatchTransaction;@google-cloud/spanner/batch-transaction;BatchTransaction;",
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Database;",
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Snapshot;",
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;Transaction;",
|
||||
"@google-cloud/spanner;~SpannerObject;@google-cloud/spanner;v1.SpannerClient;",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;BatchTransaction;Member[createQueryPartitions]",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Database;Member[run,runPartitionedUpdate,runStream]",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;PartitionedDml;Member[runUpdate]",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Snapshot;Member[run,runStream]",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;Transaction;Member[run,runStream,runUpdate]",
|
||||
"@google-cloud/spanner;~SqlExecutorDirect;@google-cloud/spanner;v1.SpannerClient;Member[executeSql,executeStreamingSql,partitionQuery]"
|
||||
"@google-cloud/spanner.BatchTransaction;@google-cloud/spanner/batch-transaction.BatchTransaction;",
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Database;",
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Snapshot;",
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.Transaction;",
|
||||
"@google-cloud/spanner.~SpannerObject;@google-cloud/spanner.v1.SpannerClient;",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.BatchTransaction;Member[createQueryPartitions]",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Database;Member[run,runPartitionedUpdate,runStream]",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.PartitionedDml;Member[runUpdate]",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Snapshot;Member[run,runStream]",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.Transaction;Member[run,runStream,runUpdate]",
|
||||
"@google-cloud/spanner.~SqlExecutorDirect;@google-cloud/spanner.v1.SpannerClient;Member[executeSql,executeStreamingSql,partitionQuery]"
|
||||
],
|
||||
"sinks": []
|
||||
},
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner/batch-transaction;BatchTransactionStatic;Instance",
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner/database;CreateBatchTransactionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransaction;@google-cloud/spanner;Database;Member[batchTransaction].ReturnValue",
|
||||
"@google-cloud/spanner/batch-transaction;BatchTransactionStatic;@google-cloud/spanner/batch-transaction;;Member[BatchTransaction]",
|
||||
"@google-cloud/spanner/batch-transaction;TransactionIdentifier;@google-cloud/spanner/batch-transaction;BatchTransaction;Member[identifier].ReturnValue",
|
||||
"@google-cloud/spanner/batch-transaction;TransactionIdentifier;@google-cloud/spanner;Database;Member[batchTransaction].Argument[0]",
|
||||
"@google-cloud/spanner/database;BatchCreateSessionsCallback;@google-cloud/spanner;Database;Member[batchCreateSessions].Argument[1]",
|
||||
"@google-cloud/spanner/database;CreateBatchTransactionCallback;@google-cloud/spanner;Database;Member[createBatchTransaction].Argument[1]",
|
||||
"@google-cloud/spanner/database;CreateBatchTransactionCallback;@google-cloud/spanner;Database;Member[createBatchTransaction].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database;CreateSessionCallback;@google-cloud/spanner;Database;Member[createSession].Argument[1]",
|
||||
"@google-cloud/spanner/database;CreateSessionCallback;@google-cloud/spanner;Database;Member[createSession].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database;DatabaseCallback;@google-cloud/spanner;Database;Member[get].Argument[1]",
|
||||
"@google-cloud/spanner/database;DatabaseCallback;@google-cloud/spanner;Database;Member[get].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database;GetSessionsCallback;@google-cloud/spanner;Database;Member[getSessions].Argument[1]",
|
||||
"@google-cloud/spanner/database;GetSessionsCallback;@google-cloud/spanner;Database;Member[getSessions].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database;GetSnapshotCallback;@google-cloud/spanner;Database;Member[getSnapshot].Argument[1]",
|
||||
"@google-cloud/spanner/database;GetSnapshotCallback;@google-cloud/spanner;Database;Member[getSnapshot].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database;GetTransactionCallback;@google-cloud/spanner;Database;Member[getTransaction].Argument[0]",
|
||||
"@google-cloud/spanner/database;PoolRequestCallback;@google-cloud/spanner;Database;Member[makePooledRequest_].Argument[1]",
|
||||
"@google-cloud/spanner/database;RestoreDatabaseCallback;@google-cloud/spanner;Database;Member[restore].Argument[1,2]",
|
||||
"@google-cloud/spanner/database;SessionPoolConstructor;@google-cloud/spanner;DatabaseStatic;Argument[2]",
|
||||
"@google-cloud/spanner/database;SessionPoolConstructor;@google-cloud/spanner;Instance;Member[database].Argument[1]",
|
||||
"@google-cloud/spanner/instance;CreateDatabaseCallback;@google-cloud/spanner;Instance;Member[createDatabase].Argument[2]",
|
||||
"@google-cloud/spanner/instance;CreateDatabaseCallback;@google-cloud/spanner;Instance;Member[createDatabase].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/instance;CreateDatabaseOptions;@google-cloud/spanner;Instance;Member[createDatabase].WithArity[1,2,3].Argument[1]",
|
||||
"@google-cloud/spanner/instance;CreateInstanceCallback;@google-cloud/spanner;Spanner;Member[createInstance].Argument[2]",
|
||||
"@google-cloud/spanner/instance;GetDatabasesCallback;@google-cloud/spanner;Instance;Member[getDatabases].Argument[1]",
|
||||
"@google-cloud/spanner/instance;GetDatabasesCallback;@google-cloud/spanner;Instance;Member[getDatabases].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/instance;GetInstanceCallback;@google-cloud/spanner;Instance;Member[get].Argument[1]",
|
||||
"@google-cloud/spanner/instance;GetInstanceCallback;@google-cloud/spanner;Instance;Member[get].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool;GetReadSessionCallback;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[getReadSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool;GetReadSessionCallback;@google-cloud/spanner;SessionPool;Member[getReadSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool;GetWriteSessionCallback;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[getWriteSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool;GetWriteSessionCallback;@google-cloud/spanner;SessionPool;Member[getWriteSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner/database;SessionPoolConstructor;Instance",
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner;Database;Member[pool_]",
|
||||
"@google-cloud/spanner/session-pool;SessionPoolInterface;@google-cloud/spanner;SessionPool;",
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Database;Member[createTable].Argument[2]",
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Database;Member[createTable].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Table;Member[create].Argument[2]",
|
||||
"@google-cloud/spanner/table;CreateTableCallback;@google-cloud/spanner;Table;Member[create].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;Argument[2]",
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner;Database;Member[runTransactionAsync].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;@google-cloud/spanner;Database;Member[runTransactionAsync].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/transaction-runner;AsyncTransactionRunner;@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner;AsyncTransactionRunnerStatic;@google-cloud/spanner/transaction-runner;;Member[AsyncTransactionRunner]",
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;Argument[2]",
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner;Database;Member[runTransaction].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner;RunTransactionCallback;@google-cloud/spanner;Database;Member[runTransaction].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;AsyncTransactionRunner;",
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;RunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner;Runner;@google-cloud/spanner/transaction-runner;TransactionRunner;",
|
||||
"@google-cloud/spanner/transaction-runner;RunnerStatic;@google-cloud/spanner/transaction-runner;;Member[Runner]",
|
||||
"@google-cloud/spanner/transaction-runner;TransactionRunner;@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner;TransactionRunnerStatic;@google-cloud/spanner/transaction-runner;;Member[TransactionRunner]",
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner/transaction;DmlStatic;Instance",
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner;PartitionedDml;",
|
||||
"@google-cloud/spanner/transaction;Dml;@google-cloud/spanner;Transaction;",
|
||||
"@google-cloud/spanner/transaction;DmlStatic;@google-cloud/spanner/transaction;;Member[Dml]",
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner/backup;;Member[Backup]",
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner/backup;BackupStatic;",
|
||||
"@google-cloud/spanner;BackupStatic;@google-cloud/spanner;;Member[Backup]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;Database;",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;DatabaseCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;RestoreDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/database;SessionPoolConstructor;Argument[0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/instance;CreateDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner/instance;GetDatabasesCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;DatabaseStatic;Instance",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;Instance;Member[database].ReturnValue",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionPool;Member[database]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionPoolStatic;Argument[0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;SessionStatic;Argument[0]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;Table;Member[database]",
|
||||
"@google-cloud/spanner;Database;@google-cloud/spanner;TableStatic;Argument[0]",
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner/database;;Member[Database]",
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner/database;DatabaseStatic;",
|
||||
"@google-cloud/spanner;DatabaseStatic;@google-cloud/spanner;;Member[Database]",
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner/build/src;GetInstancesCallback;",
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner;Spanner;Member[getInstances].Argument[1]",
|
||||
"@google-cloud/spanner;GetInstancesCallback;@google-cloud/spanner;Spanner;Member[getInstances].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;CreateInstanceCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;GetInstanceCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner/instance;Instance;",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;BackupStatic;Argument[0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;DatabaseStatic;Argument[0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;GetInstancesCallback;TypeVar[@google-cloud/spanner/common.PagedCallback.0]",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;InstanceStatic;Instance",
|
||||
"@google-cloud/spanner;Instance;@google-cloud/spanner;Spanner;Member[instance].ReturnValue",
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner/instance;;Member[Instance]",
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner/instance;InstanceStatic;",
|
||||
"@google-cloud/spanner;InstanceStatic;@google-cloud/spanner;;Member[Instance]",
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner/transaction;PartitionedDml;",
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner;PartitionedDmlStatic;Instance",
|
||||
"@google-cloud/spanner;PartitionedDml;@google-cloud/spanner;Session;Member[partitionedDml].ReturnValue",
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner/transaction;;Member[PartitionedDml]",
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner/transaction;PartitionedDmlStatic;",
|
||||
"@google-cloud/spanner;PartitionedDmlStatic;@google-cloud/spanner;;Member[PartitionedDml]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/batch-transaction;TransactionIdentifier;Member[session]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;BatchCreateSessionsCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0].ArrayElement",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;CreateSessionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;GetSessionsCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/database;PoolRequestCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;GetReadSessionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;GetWriteSessionCallback;Argument[1]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session-pool;SessionPoolInterface;Member[release].Argument[0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/session;Session;",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner/transaction-runner;Runner;Member[session]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[_runPartitionedUpdate].Argument[0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[makePooledRequest_].WithArity[1].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Database;Member[session].ReturnValue",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_acquire,_getSession].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_borrow,_destroy,_isValidSession,_ping,_prepareTransaction,_release,release].Argument[0]",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_borrowFrom,_borrowNextAvailableSession].ReturnValue",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionPool;Member[_getIdleSessions].ReturnValue.ArrayElement",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;SessionStatic;Instance",
|
||||
"@google-cloud/spanner;Session;@google-cloud/spanner;Snapshot;Member[session]",
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner/instance;CreateDatabaseOptions;Member[poolCtor]",
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner/session-pool;SessionPool;",
|
||||
"@google-cloud/spanner;SessionPool;@google-cloud/spanner;SessionPoolStatic;Instance",
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner/session-pool;;Member[SessionPool]",
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner/session-pool;SessionPoolStatic;",
|
||||
"@google-cloud/spanner;SessionPoolStatic;@google-cloud/spanner;;Member[SessionPool]",
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner/session;;Member[Session]",
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner/session;SessionStatic;",
|
||||
"@google-cloud/spanner;SessionStatic;@google-cloud/spanner;;Member[Session]",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/batch-transaction;BatchTransaction;",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/database;GetSnapshotCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/transaction;Dml;",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner/transaction;Snapshot;",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner;Session;Member[snapshot].ReturnValue",
|
||||
"@google-cloud/spanner;Snapshot;@google-cloud/spanner;SnapshotStatic;Instance",
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner/transaction;;Member[Snapshot]",
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner/transaction;SnapshotStatic;",
|
||||
"@google-cloud/spanner;SnapshotStatic;@google-cloud/spanner;;Member[Snapshot]",
|
||||
"@google-cloud/spanner;Spanner;@google-cloud/spanner;InstanceStatic;Argument[0]",
|
||||
"@google-cloud/spanner;Spanner;@google-cloud/spanner;SpannerStatic;Instance",
|
||||
"@google-cloud/spanner;SpannerStatic;@google-cloud/spanner;;Member[Spanner]",
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner/table;CreateTableCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner/table;Table;",
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner;Database;Member[table].ReturnValue",
|
||||
"@google-cloud/spanner;Table;@google-cloud/spanner;TableStatic;Instance",
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner/table;;Member[Table]",
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner/table;TableStatic;",
|
||||
"@google-cloud/spanner;TableStatic;@google-cloud/spanner;;Member[Table]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/database;GetTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/session-pool;GetWriteSessionCallback;Argument[2]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;AsyncRunTransactionCallback;Argument[0]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;RunTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;Runner;Member[getTransaction].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction-runner;Runner;Member[transaction]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner/transaction;Transaction;",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;Session;Member[transaction].ReturnValue",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;Session;Member[txn]",
|
||||
"@google-cloud/spanner;Transaction;@google-cloud/spanner;TransactionStatic;Instance",
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner/transaction;;Member[Transaction]",
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner/transaction;TransactionStatic;",
|
||||
"@google-cloud/spanner;TransactionStatic;@google-cloud/spanner;;Member[Transaction]",
|
||||
"@google-cloud/spanner;v1.SpannerClient;@google-cloud/spanner/v1/spanner_client;SpannerClient;",
|
||||
"@google-cloud/spanner;v1.SpannerClient;@google-cloud/spanner;v1.SpannerClientStatic;Instance",
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;;Member[SpannerClient]",
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;SpannerClientStatic;",
|
||||
"@google-cloud/spanner;v1.SpannerClientStatic;@google-cloud/spanner;;Member[v1].Member[SpannerClient]"
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner/backup.BackupStatic;",
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner/backup;Member[Backup]",
|
||||
"@google-cloud/spanner.BackupStatic;@google-cloud/spanner;Member[Backup]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.DatabaseStatic;Instance",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.Instance;Member[database].ReturnValue",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionPool;Member[database]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionPoolStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.SessionStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.Table;Member[database]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner.TableStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.Database;",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.DatabaseCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.RestoreDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/database.SessionPoolConstructor;Argument[0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/instance.CreateDatabaseCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner.Database;@google-cloud/spanner/instance.GetDatabasesCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner/database.DatabaseStatic;",
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner/database;Member[Database]",
|
||||
"@google-cloud/spanner.DatabaseStatic;@google-cloud/spanner;Member[Database]",
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner.Spanner;Member[getInstances].Argument[1]",
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner.Spanner;Member[getInstances].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner.GetInstancesCallback;@google-cloud/spanner/build/src.GetInstancesCallback;",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.BackupStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.DatabaseStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.GetInstancesCallback;TypeVar[@google-cloud/spanner/common.PagedCallback.0]",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.InstanceStatic;Instance",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner.Spanner;Member[instance].ReturnValue",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.CreateInstanceCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.GetInstanceCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner.Instance;@google-cloud/spanner/instance.Instance;",
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner/instance.InstanceStatic;",
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner/instance;Member[Instance]",
|
||||
"@google-cloud/spanner.InstanceStatic;@google-cloud/spanner;Member[Instance]",
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner.PartitionedDmlStatic;Instance",
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner.Session;Member[partitionedDml].ReturnValue",
|
||||
"@google-cloud/spanner.PartitionedDml;@google-cloud/spanner/transaction.PartitionedDml;",
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner/transaction.PartitionedDmlStatic;",
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner/transaction;Member[PartitionedDml]",
|
||||
"@google-cloud/spanner.PartitionedDmlStatic;@google-cloud/spanner;Member[PartitionedDml]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[_runPartitionedUpdate].Argument[0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[makePooledRequest_].WithArity[1].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Database;Member[session].ReturnValue",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_acquire,_getSession].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_borrow,_destroy,_isValidSession,_ping,_prepareTransaction,_release,release].Argument[0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_borrowFrom,_borrowNextAvailableSession].ReturnValue",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionPool;Member[_getIdleSessions].ReturnValue.ArrayElement",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.SessionStatic;Instance",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner.Snapshot;Member[session]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/batch-transaction.TransactionIdentifier;Member[session]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.BatchCreateSessionsCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0].ArrayElement",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.CreateSessionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.GetSessionsCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/database.PoolRequestCallback;TypeVar[@google-cloud/spanner/common.RequestCallback.0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.GetReadSessionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.GetWriteSessionCallback;Argument[1]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[release].Argument[0]",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/session.Session;",
|
||||
"@google-cloud/spanner.Session;@google-cloud/spanner/transaction-runner.Runner;Member[session]",
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner.SessionPoolStatic;Instance",
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner/instance.CreateDatabaseOptions;Member[poolCtor]",
|
||||
"@google-cloud/spanner.SessionPool;@google-cloud/spanner/session-pool.SessionPool;",
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner/session-pool.SessionPoolStatic;",
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner/session-pool;Member[SessionPool]",
|
||||
"@google-cloud/spanner.SessionPoolStatic;@google-cloud/spanner;Member[SessionPool]",
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner/session.SessionStatic;",
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner/session;Member[Session]",
|
||||
"@google-cloud/spanner.SessionStatic;@google-cloud/spanner;Member[Session]",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner.Session;Member[snapshot].ReturnValue",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner.SnapshotStatic;Instance",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/batch-transaction.BatchTransaction;",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/database.GetSnapshotCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/transaction.Dml;",
|
||||
"@google-cloud/spanner.Snapshot;@google-cloud/spanner/transaction.Snapshot;",
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner/transaction.SnapshotStatic;",
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner/transaction;Member[Snapshot]",
|
||||
"@google-cloud/spanner.SnapshotStatic;@google-cloud/spanner;Member[Snapshot]",
|
||||
"@google-cloud/spanner.Spanner;@google-cloud/spanner.InstanceStatic;Argument[0]",
|
||||
"@google-cloud/spanner.Spanner;@google-cloud/spanner.SpannerStatic;Instance",
|
||||
"@google-cloud/spanner.SpannerStatic;@google-cloud/spanner;Member[Spanner]",
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner.Database;Member[table].ReturnValue",
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner.TableStatic;Instance",
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner/table.CreateTableCallback;TypeVar[@google-cloud/spanner/common.LongRunningCallback.0]",
|
||||
"@google-cloud/spanner.Table;@google-cloud/spanner/table.Table;",
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner/table.TableStatic;",
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner/table;Member[Table]",
|
||||
"@google-cloud/spanner.TableStatic;@google-cloud/spanner;Member[Table]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.Session;Member[transaction].ReturnValue",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.Session;Member[txn]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner.TransactionStatic;Instance",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/database.GetTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/session-pool.GetWriteSessionCallback;Argument[2]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;Argument[0]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.RunTransactionCallback;TypeVar[@google-cloud/spanner/common.NormalCallback.0]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.Runner;Member[getTransaction].ReturnValue.Awaited",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction-runner.Runner;Member[transaction]",
|
||||
"@google-cloud/spanner.Transaction;@google-cloud/spanner/transaction.Transaction;",
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner/transaction.TransactionStatic;",
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner/transaction;Member[Transaction]",
|
||||
"@google-cloud/spanner.TransactionStatic;@google-cloud/spanner;Member[Transaction]",
|
||||
"@google-cloud/spanner.v1.SpannerClient;@google-cloud/spanner.v1.SpannerClientStatic;Instance",
|
||||
"@google-cloud/spanner.v1.SpannerClient;@google-cloud/spanner/v1/spanner_client.SpannerClient;",
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client.SpannerClientStatic;",
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner/v1/spanner_client;Member[SpannerClient]",
|
||||
"@google-cloud/spanner.v1.SpannerClientStatic;@google-cloud/spanner;Member[v1].Member[SpannerClient]",
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner.Database;Member[batchTransaction].ReturnValue",
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner/batch-transaction.BatchTransactionStatic;Instance",
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransaction;@google-cloud/spanner/database.CreateBatchTransactionCallback;TypeVar[@google-cloud/spanner/common.ResourceCallback.0]",
|
||||
"@google-cloud/spanner/batch-transaction.BatchTransactionStatic;@google-cloud/spanner/batch-transaction;Member[BatchTransaction]",
|
||||
"@google-cloud/spanner/batch-transaction.TransactionIdentifier;@google-cloud/spanner.Database;Member[batchTransaction].Argument[0]",
|
||||
"@google-cloud/spanner/batch-transaction.TransactionIdentifier;@google-cloud/spanner/batch-transaction.BatchTransaction;Member[identifier].ReturnValue",
|
||||
"@google-cloud/spanner/database.BatchCreateSessionsCallback;@google-cloud/spanner.Database;Member[batchCreateSessions].Argument[1]",
|
||||
"@google-cloud/spanner/database.CreateBatchTransactionCallback;@google-cloud/spanner.Database;Member[createBatchTransaction].Argument[1]",
|
||||
"@google-cloud/spanner/database.CreateBatchTransactionCallback;@google-cloud/spanner.Database;Member[createBatchTransaction].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database.CreateSessionCallback;@google-cloud/spanner.Database;Member[createSession].Argument[1]",
|
||||
"@google-cloud/spanner/database.CreateSessionCallback;@google-cloud/spanner.Database;Member[createSession].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database.DatabaseCallback;@google-cloud/spanner.Database;Member[get].Argument[1]",
|
||||
"@google-cloud/spanner/database.DatabaseCallback;@google-cloud/spanner.Database;Member[get].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database.GetSessionsCallback;@google-cloud/spanner.Database;Member[getSessions].Argument[1]",
|
||||
"@google-cloud/spanner/database.GetSessionsCallback;@google-cloud/spanner.Database;Member[getSessions].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database.GetSnapshotCallback;@google-cloud/spanner.Database;Member[getSnapshot].Argument[1]",
|
||||
"@google-cloud/spanner/database.GetSnapshotCallback;@google-cloud/spanner.Database;Member[getSnapshot].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/database.GetTransactionCallback;@google-cloud/spanner.Database;Member[getTransaction].Argument[0]",
|
||||
"@google-cloud/spanner/database.PoolRequestCallback;@google-cloud/spanner.Database;Member[makePooledRequest_].Argument[1]",
|
||||
"@google-cloud/spanner/database.RestoreDatabaseCallback;@google-cloud/spanner.Database;Member[restore].Argument[1,2]",
|
||||
"@google-cloud/spanner/database.SessionPoolConstructor;@google-cloud/spanner.DatabaseStatic;Argument[2]",
|
||||
"@google-cloud/spanner/database.SessionPoolConstructor;@google-cloud/spanner.Instance;Member[database].Argument[1]",
|
||||
"@google-cloud/spanner/instance.CreateDatabaseCallback;@google-cloud/spanner.Instance;Member[createDatabase].Argument[2]",
|
||||
"@google-cloud/spanner/instance.CreateDatabaseCallback;@google-cloud/spanner.Instance;Member[createDatabase].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/instance.CreateDatabaseOptions;@google-cloud/spanner.Instance;Member[createDatabase].WithArity[1,2,3].Argument[1]",
|
||||
"@google-cloud/spanner/instance.CreateInstanceCallback;@google-cloud/spanner.Spanner;Member[createInstance].Argument[2]",
|
||||
"@google-cloud/spanner/instance.GetDatabasesCallback;@google-cloud/spanner.Instance;Member[getDatabases].Argument[1]",
|
||||
"@google-cloud/spanner/instance.GetDatabasesCallback;@google-cloud/spanner.Instance;Member[getDatabases].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/instance.GetInstanceCallback;@google-cloud/spanner.Instance;Member[get].Argument[1]",
|
||||
"@google-cloud/spanner/instance.GetInstanceCallback;@google-cloud/spanner.Instance;Member[get].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool.GetReadSessionCallback;@google-cloud/spanner.SessionPool;Member[getReadSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool.GetReadSessionCallback;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[getReadSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool.GetWriteSessionCallback;@google-cloud/spanner.SessionPool;Member[getWriteSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool.GetWriteSessionCallback;@google-cloud/spanner/session-pool.SessionPoolInterface;Member[getWriteSession].Argument[0]",
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner.Database;Member[pool_]",
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner.SessionPool;",
|
||||
"@google-cloud/spanner/session-pool.SessionPoolInterface;@google-cloud/spanner/database.SessionPoolConstructor;Instance",
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Database;Member[createTable].Argument[2]",
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Database;Member[createTable].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Table;Member[create].Argument[2]",
|
||||
"@google-cloud/spanner/table.CreateTableCallback;@google-cloud/spanner.Table;Member[create].WithArity[2].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner.Database;Member[runTransactionAsync].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner.Database;Member[runTransactionAsync].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/transaction-runner.AsyncRunTransactionCallback;@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;Argument[2]",
|
||||
"@google-cloud/spanner/transaction-runner.AsyncTransactionRunner;@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner.AsyncTransactionRunnerStatic;@google-cloud/spanner/transaction-runner;Member[AsyncTransactionRunner]",
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner.Database;Member[runTransaction].Argument[1]",
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner.Database;Member[runTransaction].WithArity[1].Argument[0]",
|
||||
"@google-cloud/spanner/transaction-runner.RunTransactionCallback;@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;Argument[2]",
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.AsyncTransactionRunner;",
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.RunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner.Runner;@google-cloud/spanner/transaction-runner.TransactionRunner;",
|
||||
"@google-cloud/spanner/transaction-runner.RunnerStatic;@google-cloud/spanner/transaction-runner;Member[Runner]",
|
||||
"@google-cloud/spanner/transaction-runner.TransactionRunner;@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;Instance",
|
||||
"@google-cloud/spanner/transaction-runner.TransactionRunnerStatic;@google-cloud/spanner/transaction-runner;Member[TransactionRunner]",
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner.PartitionedDml;",
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner.Transaction;",
|
||||
"@google-cloud/spanner/transaction.Dml;@google-cloud/spanner/transaction.DmlStatic;Instance",
|
||||
"@google-cloud/spanner/transaction.DmlStatic;@google-cloud/spanner/transaction;Member[Dml]"
|
||||
],
|
||||
"summaries": [],
|
||||
"typeVariables": [
|
||||
|
||||
@@ -6,21 +6,21 @@ private class Types extends ModelInput::TypeModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"sqlite3;Database;sqlite3;;Member[cached].Member[Database].ReturnValue", //
|
||||
"sqlite3;Database;sqlite3;Database;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue", //
|
||||
"sqlite3;Database;sqlite3;DatabaseStatic;Instance", //
|
||||
"sqlite3;Database;sqlite3;Statement;Member[finalize].ReturnValue", //
|
||||
"sqlite3;DatabaseStatic;sqlite3;;Member[Database]", //
|
||||
"sqlite3;DatabaseStatic;sqlite3;sqlite3;Member[Database]", //
|
||||
"sqlite3;RunResult;sqlite3;sqlite3;Member[RunResult]", //
|
||||
"sqlite3;Statement;sqlite3;Database;Member[prepare].ReturnValue", //
|
||||
"sqlite3;Statement;sqlite3;RunResult;", //
|
||||
"sqlite3;Statement;sqlite3;Statement;Member[all,bind,each,get,reset,run].ReturnValue", //
|
||||
"sqlite3;Statement;sqlite3;StatementStatic;Instance", //
|
||||
"sqlite3;StatementStatic;sqlite3;;Member[Statement]", //
|
||||
"sqlite3;StatementStatic;sqlite3;sqlite3;Member[Statement]", //
|
||||
"sqlite3;sqlite3;sqlite3;;Member[verbose].ReturnValue", //
|
||||
"sqlite3;sqlite3;sqlite3;sqlite3;Member[verbose].ReturnValue", //
|
||||
"sqlite3.Database;sqlite3.Database;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue", //
|
||||
"sqlite3.Database;sqlite3.DatabaseStatic;Instance", //
|
||||
"sqlite3.Database;sqlite3.Statement;Member[finalize].ReturnValue", //
|
||||
"sqlite3.Database;sqlite3;Member[cached].Member[Database].ReturnValue", //
|
||||
"sqlite3.DatabaseStatic;sqlite3.sqlite3;Member[Database]", //
|
||||
"sqlite3.DatabaseStatic;sqlite3;Member[Database]", //
|
||||
"sqlite3.RunResult;sqlite3.sqlite3;Member[RunResult]", //
|
||||
"sqlite3.Statement;sqlite3.Database;Member[prepare].ReturnValue", //
|
||||
"sqlite3.Statement;sqlite3.RunResult;", //
|
||||
"sqlite3.Statement;sqlite3.Statement;Member[all,bind,each,get,reset,run].ReturnValue", //
|
||||
"sqlite3.Statement;sqlite3.StatementStatic;Instance", //
|
||||
"sqlite3.StatementStatic;sqlite3.sqlite3;Member[Statement]", //
|
||||
"sqlite3.StatementStatic;sqlite3;Member[Statement]", //
|
||||
"sqlite3.sqlite3;sqlite3.sqlite3;Member[verbose].ReturnValue", //
|
||||
"sqlite3.sqlite3;sqlite3;Member[verbose].ReturnValue", //
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -29,9 +29,9 @@ private class Summaries extends ModelInput::SummaryModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
"sqlite3;Database;;;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue;type", //
|
||||
"sqlite3;Statement;;;Member[all,bind,each,get,reset,run].ReturnValue;type", //
|
||||
"sqlite3;sqlite3;;;Member[verbose].ReturnValue;type", //
|
||||
"sqlite3.Database;;;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue;type", //
|
||||
"sqlite3.Statement;;;Member[all,bind,each,get,reset,run].ReturnValue;type", //
|
||||
"sqlite3.sqlite3;;;Member[verbose].ReturnValue;type", //
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"language": "javascript",
|
||||
"usedTypes": {
|
||||
"sources": [
|
||||
"sqlite3;Database"
|
||||
"sqlite3.Database"
|
||||
]
|
||||
},
|
||||
"model": {
|
||||
@@ -17,26 +17,26 @@
|
||||
"generatedModel": {
|
||||
"//": "Autogenerated section. Manual edits in here will be lost.",
|
||||
"typeDefinitions": [
|
||||
"sqlite3;Database;sqlite3;;Member[cached].Member[Database].ReturnValue",
|
||||
"sqlite3;Database;sqlite3;Database;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue",
|
||||
"sqlite3;Database;sqlite3;DatabaseStatic;Instance",
|
||||
"sqlite3;Database;sqlite3;Statement;Member[finalize].ReturnValue",
|
||||
"sqlite3;DatabaseStatic;sqlite3;;Member[Database]",
|
||||
"sqlite3;DatabaseStatic;sqlite3;sqlite3;Member[Database]",
|
||||
"sqlite3;RunResult;sqlite3;sqlite3;Member[RunResult]",
|
||||
"sqlite3;Statement;sqlite3;Database;Member[prepare].ReturnValue",
|
||||
"sqlite3;Statement;sqlite3;RunResult;",
|
||||
"sqlite3;Statement;sqlite3;Statement;Member[all,bind,each,get,reset,run].ReturnValue",
|
||||
"sqlite3;Statement;sqlite3;StatementStatic;Instance",
|
||||
"sqlite3;StatementStatic;sqlite3;;Member[Statement]",
|
||||
"sqlite3;StatementStatic;sqlite3;sqlite3;Member[Statement]",
|
||||
"sqlite3;sqlite3;sqlite3;;Member[verbose].ReturnValue",
|
||||
"sqlite3;sqlite3;sqlite3;sqlite3;Member[verbose].ReturnValue"
|
||||
"sqlite3.Database;sqlite3.Database;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue",
|
||||
"sqlite3.Database;sqlite3.DatabaseStatic;Instance",
|
||||
"sqlite3.Database;sqlite3.Statement;Member[finalize].ReturnValue",
|
||||
"sqlite3.Database;sqlite3;Member[cached].Member[Database].ReturnValue",
|
||||
"sqlite3.DatabaseStatic;sqlite3.sqlite3;Member[Database]",
|
||||
"sqlite3.DatabaseStatic;sqlite3;Member[Database]",
|
||||
"sqlite3.RunResult;sqlite3.sqlite3;Member[RunResult]",
|
||||
"sqlite3.Statement;sqlite3.Database;Member[prepare].ReturnValue",
|
||||
"sqlite3.Statement;sqlite3.RunResult;",
|
||||
"sqlite3.Statement;sqlite3.Statement;Member[all,bind,each,get,reset,run].ReturnValue",
|
||||
"sqlite3.Statement;sqlite3.StatementStatic;Instance",
|
||||
"sqlite3.StatementStatic;sqlite3.sqlite3;Member[Statement]",
|
||||
"sqlite3.StatementStatic;sqlite3;Member[Statement]",
|
||||
"sqlite3.sqlite3;sqlite3.sqlite3;Member[verbose].ReturnValue",
|
||||
"sqlite3.sqlite3;sqlite3;Member[verbose].ReturnValue"
|
||||
],
|
||||
"summaries": [
|
||||
"sqlite3;Database;;;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue;type",
|
||||
"sqlite3;Statement;;;Member[all,bind,each,get,reset,run].ReturnValue;type",
|
||||
"sqlite3;sqlite3;;;Member[verbose].ReturnValue;type"
|
||||
"sqlite3.Database;;;Member[addListener,all,each,exec,get,on,once,prependListener,prependOnceListener,run].ReturnValue;type",
|
||||
"sqlite3.Statement;;;Member[all,bind,each,get,reset,run].ReturnValue;type",
|
||||
"sqlite3.sqlite3;;;Member[verbose].ReturnValue;type"
|
||||
],
|
||||
"typeVariables": []
|
||||
}
|
||||
|
||||
@@ -2,155 +2,7 @@
|
||||
* Provides predicates for reasoning about bad tag filter vulnerabilities.
|
||||
*/
|
||||
|
||||
import regexp.RegexpMatching
|
||||
|
||||
/**
|
||||
* Holds if the regexp `root` should be tested against `str`.
|
||||
* Implements the `isRegexpMatchingCandidateSig` signature from `RegexpMatching`.
|
||||
* `ignorePrefix` toggles whether the regular expression should be treated as accepting any prefix if it's unanchored.
|
||||
* `testWithGroups` toggles whether it's tested which groups are filled by a given input string.
|
||||
*/
|
||||
private predicate isBadTagFilterCandidate(
|
||||
RootTerm root, string str, boolean ignorePrefix, boolean testWithGroups
|
||||
) {
|
||||
// the regexp must mention "<" and ">" explicitly.
|
||||
forall(string angleBracket | angleBracket = ["<", ">"] |
|
||||
any(RegExpConstant term | term.getValue().matches("%" + angleBracket + "%")).getRootTerm() =
|
||||
root
|
||||
) and
|
||||
ignorePrefix = true and
|
||||
(
|
||||
str = ["<!-- foo -->", "<!-- foo --!>", "<!- foo ->", "<foo>", "<script>"] and
|
||||
testWithGroups = true
|
||||
or
|
||||
str =
|
||||
[
|
||||
"<!-- foo -->", "<!- foo ->", "<!-- foo --!>", "<!-- foo\n -->", "<script>foo</script>",
|
||||
"<script \n>foo</script>", "<script >foo\n</script>", "<foo ></foo>", "<foo>",
|
||||
"<foo src=\"foo\"></foo>", "<script>", "<script src=\"foo\"></script>",
|
||||
"<script src='foo'></script>", "<SCRIPT>foo</SCRIPT>", "<script\tsrc=\"foo\"/>",
|
||||
"<script\tsrc='foo'></script>", "<sCrIpT>foo</ScRiPt>", "<script src=\"foo\">foo</script >",
|
||||
"<script src=\"foo\">foo</script foo=\"bar\">", "<script src=\"foo\">foo</script\t\n bar>"
|
||||
] and
|
||||
testWithGroups = false
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* A regexp that matches some string from the `isBadTagFilterCandidate` predicate.
|
||||
*/
|
||||
class HtmlMatchingRegExp extends RootTerm {
|
||||
HtmlMatchingRegExp() { RegexpMatching<isBadTagFilterCandidate/4>::matches(this, _) }
|
||||
|
||||
/** Holds if this regexp matched `str`, where `str` is one of the string from `isBadTagFilterCandidate`. */
|
||||
predicate matches(string str) { RegexpMatching<isBadTagFilterCandidate/4>::matches(this, str) }
|
||||
|
||||
/** Holds if this regexp fills capture group `g' when matching `str', where `str` is one of the string from `isBadTagFilterCandidate`. */
|
||||
predicate fillsCaptureGroup(string str, int g) {
|
||||
RegexpMatching<isBadTagFilterCandidate/4>::fillsCaptureGroup(this, str, g)
|
||||
}
|
||||
}
|
||||
|
||||
/** DEPRECATED: Alias for HtmlMatchingRegExp */
|
||||
deprecated class HTMLMatchingRegExp = HtmlMatchingRegExp;
|
||||
|
||||
/**
|
||||
* Holds if `regexp` matches some HTML tags, but misses some HTML tags that it should match.
|
||||
*
|
||||
* When adding a new case to this predicate, make sure the test string used in `matches(..)` calls are present in `HTMLMatchingRegExp::test` / `HTMLMatchingRegExp::testWithGroups`.
|
||||
*/
|
||||
predicate isBadRegexpFilter(HtmlMatchingRegExp regexp, string msg) {
|
||||
// CVE-2021-33829 - matching both "<!-- foo -->" and "<!-- foo --!>", but in different capture groups
|
||||
regexp.matches("<!-- foo -->") and
|
||||
regexp.matches("<!-- foo --!>") and
|
||||
exists(int a, int b | a != b |
|
||||
regexp.fillsCaptureGroup("<!-- foo -->", a) and
|
||||
// <!-- foo --> might be ambiguously parsed (matching both capture groups), and that is ok here.
|
||||
regexp.fillsCaptureGroup("<!-- foo --!>", b) and
|
||||
not regexp.fillsCaptureGroup("<!-- foo --!>", a) and
|
||||
msg =
|
||||
"Comments ending with --> are matched differently from comments ending with --!>. The first is matched with capture group "
|
||||
+ a + " and comments ending with --!> are matched with capture group " +
|
||||
strictconcat(int i | regexp.fillsCaptureGroup("<!-- foo --!>", i) | i.toString(), ", ") +
|
||||
"."
|
||||
)
|
||||
or
|
||||
// CVE-2020-17480 - matching "<!-- foo -->" and other tags, but not "<!-- foo --!>".
|
||||
exists(int group, int other |
|
||||
group != other and
|
||||
regexp.fillsCaptureGroup("<!-- foo -->", group) and
|
||||
regexp.fillsCaptureGroup("<foo>", other) and
|
||||
not regexp.matches("<!-- foo --!>") and
|
||||
not regexp.fillsCaptureGroup("<!-- foo -->", any(int i | i != group)) and
|
||||
not regexp.fillsCaptureGroup("<!- foo ->", group) and
|
||||
not regexp.fillsCaptureGroup("<foo>", group) and
|
||||
not regexp.fillsCaptureGroup("<script>", group) and
|
||||
msg =
|
||||
"This regular expression only parses --> (capture group " + group +
|
||||
") and not --!> as an HTML comment end tag."
|
||||
)
|
||||
or
|
||||
regexp.matches("<!-- foo -->") and
|
||||
not regexp.matches("<!-- foo\n -->") and
|
||||
not regexp.matches("<!- foo ->") and
|
||||
not regexp.matches("<foo>") and
|
||||
not regexp.matches("<script>") and
|
||||
msg = "This regular expression does not match comments containing newlines."
|
||||
or
|
||||
regexp.matches("<script>foo</script>") and
|
||||
regexp.matches("<script src=\"foo\"></script>") and
|
||||
not regexp.matches("<foo ></foo>") and
|
||||
(
|
||||
not regexp.matches("<script \n>foo</script>") and
|
||||
msg = "This regular expression matches <script></script>, but not <script \\n></script>"
|
||||
or
|
||||
not regexp.matches("<script >foo\n</script>") and
|
||||
msg = "This regular expression matches <script>...</script>, but not <script >...\\n</script>"
|
||||
)
|
||||
or
|
||||
regexp.matches("<script>foo</script>") and
|
||||
regexp.matches("<script src=\"foo\"></script>") and
|
||||
not regexp.matches("<script src='foo'></script>") and
|
||||
not regexp.matches("<foo>") and
|
||||
msg = "This regular expression does not match script tags where the attribute uses single-quotes."
|
||||
or
|
||||
regexp.matches("<script>foo</script>") and
|
||||
regexp.matches("<script src='foo'></script>") and
|
||||
not regexp.matches("<script src=\"foo\"></script>") and
|
||||
not regexp.matches("<foo>") and
|
||||
msg = "This regular expression does not match script tags where the attribute uses double-quotes."
|
||||
or
|
||||
regexp.matches("<script>foo</script>") and
|
||||
regexp.matches("<script src='foo'></script>") and
|
||||
not regexp.matches("<script\tsrc='foo'></script>") and
|
||||
not regexp.matches("<foo>") and
|
||||
not regexp.matches("<foo src=\"foo\"></foo>") and
|
||||
msg = "This regular expression does not match script tags where tabs are used between attributes."
|
||||
or
|
||||
regexp.matches("<script>foo</script>") and
|
||||
not RegExpFlags::isIgnoreCase(regexp) and
|
||||
not regexp.matches("<foo>") and
|
||||
not regexp.matches("<foo ></foo>") and
|
||||
(
|
||||
not regexp.matches("<SCRIPT>foo</SCRIPT>") and
|
||||
msg = "This regular expression does not match upper case <SCRIPT> tags."
|
||||
or
|
||||
not regexp.matches("<sCrIpT>foo</ScRiPt>") and
|
||||
regexp.matches("<SCRIPT>foo</SCRIPT>") and
|
||||
msg = "This regular expression does not match mixed case <sCrIpT> tags."
|
||||
)
|
||||
or
|
||||
regexp.matches("<script src=\"foo\"></script>") and
|
||||
not regexp.matches("<foo>") and
|
||||
not regexp.matches("<foo ></foo>") and
|
||||
(
|
||||
not regexp.matches("<script src=\"foo\">foo</script >") and
|
||||
msg = "This regular expression does not match script end tags like </script >."
|
||||
or
|
||||
not regexp.matches("<script src=\"foo\">foo</script foo=\"bar\">") and
|
||||
msg = "This regular expression does not match script end tags like </script foo=\"bar\">."
|
||||
or
|
||||
not regexp.matches("<script src=\"foo\">foo</script\t\n bar>") and
|
||||
msg = "This regular expression does not match script end tags like </script\\t\\n bar>."
|
||||
)
|
||||
}
|
||||
private import regexp.RegExpTreeView::RegExpTreeView as TreeView
|
||||
// BadTagFilterQuery should be used directly from the shared pack, and not from this file.
|
||||
deprecated private import codeql.regex.nfa.BadTagFilterQuery::Make<TreeView> as Dep
|
||||
import Dep
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
*/
|
||||
|
||||
import javascript
|
||||
import semmle.javascript.security.regexp.NfaUtils as NfaUtils
|
||||
private import semmle.javascript.security.regexp.RegExpTreeView::RegExpTreeView as TreeView
|
||||
import codeql.regex.nfa.NfaUtils::Make<TreeView> as NfaUtils
|
||||
|
||||
class StringSubstitutionCall = StringReplaceCall;
|
||||
|
||||
|
||||
@@ -2,288 +2,7 @@
|
||||
* Classes and predicates for working with suspicious character ranges.
|
||||
*/
|
||||
|
||||
// We don't need the NFA utils, just the regexp tree.
|
||||
// but the below is a nice shared library that exposes the API we need.
|
||||
import regexp.NfaUtils
|
||||
|
||||
/**
|
||||
* Gets a rank for `range` that is unique for ranges in the same file.
|
||||
* Prioritizes ranges that match more characters.
|
||||
*/
|
||||
int rankRange(RegExpCharacterRange range) {
|
||||
range =
|
||||
rank[result](RegExpCharacterRange r, Location l, int low, int high |
|
||||
r.getLocation() = l and
|
||||
isRange(r, low, high)
|
||||
|
|
||||
r order by (high - low) desc, l.getStartLine(), l.getStartColumn()
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if `range` spans from the unicode code points `low` to `high` (both inclusive). */
|
||||
predicate isRange(RegExpCharacterRange range, int low, int high) {
|
||||
exists(string lowc, string highc |
|
||||
range.isRange(lowc, highc) and
|
||||
low.toUnicode() = lowc and
|
||||
high.toUnicode() = highc
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if `char` is an alpha-numeric character. */
|
||||
predicate isAlphanumeric(string char) {
|
||||
// written like this to avoid having a bindingset for the predicate
|
||||
char = [[48 .. 57], [65 .. 90], [97 .. 122]].toUnicode() // 0-9, A-Z, a-z
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the given ranges are from the same character class
|
||||
* and there exists at least one character matched by both ranges.
|
||||
*/
|
||||
predicate overlap(RegExpCharacterRange a, RegExpCharacterRange b) {
|
||||
exists(RegExpCharacterClass clz |
|
||||
a = clz.getAChild() and
|
||||
b = clz.getAChild() and
|
||||
a != b
|
||||
|
|
||||
exists(int alow, int ahigh, int blow, int bhigh |
|
||||
isRange(a, alow, ahigh) and
|
||||
isRange(b, blow, bhigh) and
|
||||
alow <= bhigh and
|
||||
blow <= ahigh
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `range` overlaps with the char class `escape` from the same character class.
|
||||
*/
|
||||
predicate overlapsWithCharEscape(RegExpCharacterRange range, RegExpCharacterClassEscape escape) {
|
||||
exists(RegExpCharacterClass clz, string low, string high |
|
||||
range = clz.getAChild() and
|
||||
escape = clz.getAChild() and
|
||||
range.isRange(low, high)
|
||||
|
|
||||
escape.getValue() = "w" and
|
||||
getInRange(low, high).regexpMatch("\\w")
|
||||
or
|
||||
escape.getValue() = "d" and
|
||||
getInRange(low, high).regexpMatch("\\d")
|
||||
or
|
||||
escape.getValue() = "s" and
|
||||
getInRange(low, high).regexpMatch("\\s")
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the unicode code point for a `char`. */
|
||||
bindingset[char]
|
||||
int toCodePoint(string char) { result.toUnicode() = char }
|
||||
|
||||
/** A character range that appears to be overly wide. */
|
||||
class OverlyWideRange extends RegExpCharacterRange {
|
||||
OverlyWideRange() {
|
||||
exists(int low, int high, int numChars |
|
||||
isRange(this, low, high) and
|
||||
numChars = (1 + high - low) and
|
||||
this.getRootTerm().isUsedAsRegExp() and
|
||||
numChars >= 10
|
||||
|
|
||||
// across the Z-a range (which includes backticks)
|
||||
toCodePoint("Z") >= low and
|
||||
toCodePoint("a") <= high
|
||||
or
|
||||
// across the 9-A range (which includes e.g. ; and ?)
|
||||
toCodePoint("9") >= low and
|
||||
toCodePoint("A") <= high
|
||||
or
|
||||
// a non-alphanumeric char as part of the range boundaries
|
||||
exists(int bound | bound = [low, high] | not isAlphanumeric(bound.toUnicode())) and
|
||||
// while still being ascii
|
||||
low < 128 and
|
||||
high < 128
|
||||
) and
|
||||
// allowlist for known ranges
|
||||
not this = allowedWideRanges()
|
||||
}
|
||||
|
||||
/** Gets a string representation of a character class that matches the same chars as this range. */
|
||||
string printEquivalent() { result = RangePrinter::printEquivalentCharClass(this) }
|
||||
}
|
||||
|
||||
/** Gets a range that should not be reported as an overly wide range. */
|
||||
RegExpCharacterRange allowedWideRanges() {
|
||||
// ~ is the last printable ASCII character, it's used right in various wide ranges.
|
||||
result.isRange(_, "~")
|
||||
or
|
||||
// the same with " " and "!". " " is the first printable character, and "!" is the first non-white-space printable character.
|
||||
result.isRange([" ", "!"], _)
|
||||
or
|
||||
// the `[@-_]` range is intentional
|
||||
result.isRange("@", "_")
|
||||
or
|
||||
// starting from the zero byte is a good indication that it's purposely matching a large range.
|
||||
result.isRange(0.toUnicode(), _)
|
||||
}
|
||||
|
||||
/** Gets a char between (and including) `low` and `high`. */
|
||||
bindingset[low, high]
|
||||
private string getInRange(string low, string high) {
|
||||
result = [toCodePoint(low) .. toCodePoint(high)].toUnicode()
|
||||
}
|
||||
|
||||
/** A module computing an equivalent character class for an overly wide range. */
|
||||
module RangePrinter {
|
||||
bindingset[char]
|
||||
bindingset[result]
|
||||
private string next(string char) {
|
||||
exists(int prev, int next |
|
||||
prev.toUnicode() = char and
|
||||
next.toUnicode() = result and
|
||||
next = prev + 1
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the points where the parts of the pretty printed range should be cut off. */
|
||||
private string cutoffs() { result = ["A", "Z", "a", "z", "0", "9"] }
|
||||
|
||||
/** Gets the char to use in the low end of a range for a given `cut` */
|
||||
private string lowCut(string cut) {
|
||||
cut = ["A", "a", "0"] and
|
||||
result = cut
|
||||
or
|
||||
cut = ["Z", "z", "9"] and
|
||||
result = next(cut)
|
||||
}
|
||||
|
||||
/** Gets the char to use in the high end of a range for a given `cut` */
|
||||
private string highCut(string cut) {
|
||||
cut = ["Z", "z", "9"] and
|
||||
result = cut
|
||||
or
|
||||
cut = ["A", "a", "0"] and
|
||||
next(result) = cut
|
||||
}
|
||||
|
||||
/** Gets the cutoff char used for a given `part` of a range when pretty-printing it. */
|
||||
private string cutoff(OverlyWideRange range, int part) {
|
||||
exists(int low, int high | isRange(range, low, high) |
|
||||
result =
|
||||
rank[part + 1](string cut |
|
||||
cut = cutoffs() and low < toCodePoint(cut) and toCodePoint(cut) < high
|
||||
|
|
||||
cut order by toCodePoint(cut)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the number of parts we should print for a given `range`. */
|
||||
private int parts(OverlyWideRange range) { result = 1 + count(cutoff(range, _)) }
|
||||
|
||||
/** Holds if the given part of a range should span from `low` to `high`. */
|
||||
private predicate part(OverlyWideRange range, int part, string low, string high) {
|
||||
// first part.
|
||||
part = 0 and
|
||||
(
|
||||
range.isRange(low, high) and
|
||||
parts(range) = 1
|
||||
or
|
||||
parts(range) >= 2 and
|
||||
range.isRange(low, _) and
|
||||
high = highCut(cutoff(range, part))
|
||||
)
|
||||
or
|
||||
// middle
|
||||
part >= 1 and
|
||||
part < parts(range) - 1 and
|
||||
low = lowCut(cutoff(range, part - 1)) and
|
||||
high = highCut(cutoff(range, part))
|
||||
or
|
||||
// last.
|
||||
part = parts(range) - 1 and
|
||||
low = lowCut(cutoff(range, part - 1)) and
|
||||
range.isRange(_, high)
|
||||
}
|
||||
|
||||
/** Gets an escaped `char` for use in a character class. */
|
||||
bindingset[char]
|
||||
private string escape(string char) {
|
||||
exists(string reg | reg = "(\\[|\\]|\\\\|-|/)" |
|
||||
if char.regexpMatch(reg) then result = "\\" + char else result = char
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a part of the equivalent range. */
|
||||
private string printEquivalentCharClass(OverlyWideRange range, int part) {
|
||||
exists(string low, string high | part(range, part, low, high) |
|
||||
if
|
||||
isAlphanumeric(low) and
|
||||
isAlphanumeric(high)
|
||||
then result = low + "-" + high
|
||||
else
|
||||
result =
|
||||
strictconcat(string char | char = getInRange(low, high) | escape(char) order by char)
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the entire pretty printed equivalent range. */
|
||||
string printEquivalentCharClass(OverlyWideRange range) {
|
||||
result =
|
||||
strictconcat(string r, int part |
|
||||
r = "[" and part = -1 and exists(range)
|
||||
or
|
||||
r = printEquivalentCharClass(range, part)
|
||||
or
|
||||
r = "]" and part = parts(range)
|
||||
|
|
||||
r order by part
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/** Gets a char range that is overly large because of `reason`. */
|
||||
RegExpCharacterRange getABadRange(string reason, int priority) {
|
||||
result instanceof OverlyWideRange and
|
||||
priority = 0 and
|
||||
exists(string equiv | equiv = result.(OverlyWideRange).printEquivalent() |
|
||||
if equiv.length() <= 50
|
||||
then reason = "is equivalent to " + equiv
|
||||
else reason = "is equivalent to " + equiv.substring(0, 50) + "..."
|
||||
)
|
||||
or
|
||||
priority = 1 and
|
||||
exists(RegExpCharacterRange other |
|
||||
reason = "overlaps with " + other + " in the same character class" and
|
||||
rankRange(result) < rankRange(other) and
|
||||
overlap(result, other)
|
||||
)
|
||||
or
|
||||
priority = 2 and
|
||||
exists(RegExpCharacterClassEscape escape |
|
||||
reason = "overlaps with " + escape + " in the same character class" and
|
||||
overlapsWithCharEscape(result, escape)
|
||||
)
|
||||
or
|
||||
reason = "is empty" and
|
||||
priority = 3 and
|
||||
exists(int low, int high |
|
||||
isRange(result, low, high) and
|
||||
low > high
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if `range` matches suspiciously many characters. */
|
||||
predicate problem(RegExpCharacterRange range, string reason) {
|
||||
reason =
|
||||
strictconcat(string m, int priority |
|
||||
range = getABadRange(m, priority)
|
||||
|
|
||||
m, ", and " order by priority desc
|
||||
) and
|
||||
// specifying a range using an escape is usually OK.
|
||||
not range.getAChild() instanceof RegExpEscape and
|
||||
// Unicode escapes in strings are interpreted before it turns into a regexp,
|
||||
// so e.g. [\u0001-\uFFFF] will just turn up as a range between two constants.
|
||||
// We therefore exclude these ranges.
|
||||
range.getRootTerm().getParent() instanceof RegExpLiteral and
|
||||
// is used as regexp (mostly for JS where regular expressions are parsed eagerly)
|
||||
range.getRootTerm().isUsedAsRegExp()
|
||||
}
|
||||
private import regexp.RegExpTreeView::RegExpTreeView as TreeView
|
||||
// OverlyLargeRangeQuery should be used directly from the shared pack, and not from this file.
|
||||
deprecated private import codeql.regex.OverlyLargeRangeQuery::Make<TreeView> as Dep
|
||||
import Dep
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `BrokenCryptoAlgorithmQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import BrokenCryptoAlgorithmQuery as BrokenCryptoAlgorithmQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `BrokenCryptoAlgorithmQuery` instead. */
|
||||
deprecated module BrokenCryptoAlgorithm = BrokenCryptoAlgorithmQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `BuildArtifactLeakQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import BuildArtifactLeakQuery as BuildArtifactLeakQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `BuildArtifactLeakQuery` instead. */
|
||||
deprecated module BuildArtifactLeak = BuildArtifactLeakQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `CleartextLoggingQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import CleartextLoggingQuery as CleartextLoggingQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `CleartextLoggingQuery` instead. */
|
||||
deprecated module CleartextLogging = CleartextLoggingQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `CleartextStorageQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import CleartextStorageQuery as CleartextStorageQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `CleartextStorageQuery` instead. */
|
||||
deprecated module CleartextStorage = CleartextStorageQuery;
|
||||
@@ -1,8 +0,0 @@
|
||||
/** DEPRECATED. Import `ClientSideUrlRedirectQuery` instead. */
|
||||
|
||||
import javascript
|
||||
import UrlConcatenation
|
||||
private import ClientSideUrlRedirectQuery as ClientSideUrlRedirectQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `ClientSideUrlRedirectQuery` instead. */
|
||||
deprecated module ClientSideUrlRedirect = ClientSideUrlRedirectQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `CodeInjectionQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import CodeInjectionQuery as CodeInjectionQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `CodeInjectionQuery` instead. */
|
||||
deprecated module CodeInjection = CodeInjectionQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `CommandInjectionQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import CommandInjectionQuery as CommandInjectionQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `CommandInjectionQuery` instead. */
|
||||
deprecated module CommandInjection = CommandInjectionQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `ConditionalBypassQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import ConditionalBypassQuery as ConditionalBypassQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `ConditionalBypassQuery` instead. */
|
||||
deprecated module ConditionalBypass = ConditionalBypassQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `CorsMisconfigurationForCredentialsQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import CorsMisconfigurationForCredentialsQuery as CorsMisconfigurationForCredentialsQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `CorsMisconfigurationForCredentialsQuery` instead. */
|
||||
deprecated module CorsMisconfigurationForCredentials = CorsMisconfigurationForCredentialsQuery;
|
||||
@@ -1,8 +0,0 @@
|
||||
/** DEPRECATED. Import `DeepObjectResourceExhaustionQuery` instead. */
|
||||
|
||||
import javascript
|
||||
import semmle.javascript.security.TaintedObject
|
||||
private import DeepObjectResourceExhaustionQuery as DeepObjectResourceExhaustionQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `DeepObjectResourceExhaustionQuery` instead. */
|
||||
deprecated module DeepObjectResourceExhaustion = DeepObjectResourceExhaustionQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `DifferentKindsComparisonBypassQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import DifferentKindsComparisonBypassQuery as DifferentKindsComparisonBypassQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `DifferentKindsComparisonBypassQuery` instead. */
|
||||
deprecated module DifferentKindsComparisonBypass = DifferentKindsComparisonBypassQuery;
|
||||
@@ -1,7 +0,0 @@
|
||||
/** DEPRECATED. Import `DomBasedXssQuery` instead. */
|
||||
|
||||
import javascript
|
||||
private import DomBasedXssQuery as DomBasedXssQuery // ignore-query-import
|
||||
|
||||
/** DEPRECATED. Import `DomBasedXssQuery` instead. */
|
||||
deprecated module DomBasedXss = DomBasedXssQuery;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user