Grist is the evolution of spreadsheets.
This report summarizes scanner evidence for gristlabs/grist-core, a TypeScript project with 12,030 GitHub stars. SynthScan examined 559,568 lines of code across 2006 source files, recording 1175 pattern matches distributed across 23 syntactic categories. The legacy adjusted pattern signal is 3.4 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 901 finding(s).
Are imports declared and package/API names verified? 117 finding(s).
Are wrappers, guards, and repeated structures necessary? 775 finding(s).
Which changes need focused human review? 1175 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1175 distinct pattern matches across 23 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/plugin/grist-plugin-api.ts | 275 | export async function testWaitForPendingRequests() { | CODE |
| LOW | app/plugin/grist-plugin-api.ts | 605 | function getCssScrollbarProperties(appearance: "light" | "dark") { | CODE |
| LOW | app/plugin/grist-plugin-api.ts | 618 | function getOrCreateStyleElement(id: string) { | CODE |
| LOW | app/server/utils/pruneActionHistory.ts | 43 | export async function pruneActionHistoryFromConsole(argv: string[]): Promise<number> { | CODE |
| LOW | app/server/lib/bootstrapFullEdition.ts | 120 | export function isExtFullEditionSupported(): boolean { | CODE |
| LOW | app/server/lib/bootstrapFullEdition.ts | 320 | async function resolveExtensionsDownload(): Promise<{ url: string; sha256: string }> { | CODE |
| LOW | app/server/lib/sessionUtils.ts | 98 | export function getDocSessionReadOnlyReason(docSession: OptDocSession): DocReadOnlyReason | null { | CODE |
| LOW | app/server/lib/sessionUtils.ts | 126 | export function getDocSessionAccessOrNull(docSession: OptDocSession): Role | null { | CODE |
| LOW | app/server/lib/DocSession.ts | 80 | export function makeExceptionalDocSession(mode: "nascent" | "plugin" | "system" | "share", | CODE |
| LOW | app/server/lib/gristSessions.ts | 60 | function createSessionStoreFactory(sessionsDB: string): () => SessionStore { | CODE |
| LOW | app/server/lib/gristSessions.ts | 111 | export function getAllowedOrgForSessionID(sessionID: string): { org: string, host: string } | null { | CODE |
| LOW | app/server/lib/configureMinIOExternalStorage.ts | 15 | export function configureMinIOExternalStorage(purpose: "doc" | "meta" | "attachments", extraPrefix: string) { | CODE |
| LOW | app/server/lib/configureMinIOExternalStorage.ts | 30 | export function checkMinIOExternalStorage() { | CODE |
| LOW | app/server/lib/OIDCConfig.ts | 152 | export function readOIDCConfigFromSettings(settings: AppSettings): OIDCConfig { | CODE |
| LOW⚡ | app/server/lib/AttachmentStoreProvider.ts | 116 | async function isAttachmentStoreOptionAvailable(option: ICreateAttachmentStoreOptions) { | CODE |
| LOW⚡ | app/server/lib/AttachmentStoreProvider.ts | 125 | function storeOptionIsNotUndefined( | CODE |
| LOW⚡ | app/server/lib/AttachmentStoreProvider.ts | 131 | export async function checkAvailabilityAttachmentStoreOptions( | CODE |
| LOW | app/server/lib/AttachmentStoreProvider.ts | 146 | export async function makeTempFilesystemStoreSpec( | CODE |
| LOW | app/server/lib/AttachmentStoreProvider.ts | 168 | export function getConfiguredStandardAttachmentStore(): string | undefined { | CODE |
| LOW | app/server/lib/AttachmentStoreProvider.ts | 188 | export async function getConfiguredAttachmentStoreConfigs( | CODE |
| LOW | app/server/lib/serverUtils.ts | 193 | export async function assertCompatibleSchemaIds(db: ISQLiteDB): Promise<void> { | CODE |
| LOW | app/server/lib/serverUtils.ts | 214 | export function getSupportedEngineChoices(): EngineCode[] { | CODE |
| LOW | app/server/lib/AssistantStatePermit.ts | 38 | export async function getAndRemoveAssistantStatePermit( | CODE |
| LOW | app/server/lib/AssistantStatePermit.ts | 38 | export async function getAndRemoveAssistantStatePermit( | CODE |
| LOW | app/server/lib/UserPresence.ts | 128 | function getVisibleUserProfileFromDocSession( | CODE |
| LOW | app/server/lib/DiscourseConnect.ts | 100 | export function addDiscourseConnectEndpoints(app: Express, options: { | CODE |
| LOW | app/server/lib/SamlConfig.ts | 101 | export function readSamlConfigFromSettings(settings: AppSettings): SamlConfig { | CODE |
| LOW | app/server/lib/GoogleAuth.ts | 92 | export async function googleAuthTokenMiddleware( | CODE |
| LOW | app/server/lib/uploads.ts | 147 | export async function parseMultipartFormRequest( | CODE |
| LOW | app/server/lib/backupSqliteDatabase.ts | 221 | export async function backupUsingBestConnection( | CODE |
| LOW | app/server/lib/ProxyAgent.ts | 24 | export function getProxyAgentConfiguration() { | CODE |
| LOW | app/server/lib/ProxyAgent.ts | 63 | export function isUntrustedRequestBehaviorSet() { | CODE |
| LOW | app/server/lib/updateChecker.ts | 37 | export async function updateGristServerLatestVersion( | CODE |
| LOW | app/server/lib/loginSystemHelpers.ts | 21 | export function getActiveLoginSystemTypeSource(settings: AppSettings) { | CODE |
| LOW | app/server/lib/loginSystemHelpers.ts | 44 | export function createLoginProviderFactory( | CODE |
| LOW | app/server/lib/ActionHistory.ts | 230 | function getActionUndoInfoWithoutClient(act: LocalActionBundle, retValues?: any[]) { | CODE |
| LOW | app/server/lib/ExpandedQuery.ts | 135 | export function getFormulaErrorForExpandQuery(docData: DocData, tableId: string, colId: string): CellValue { | CODE |
| LOW | app/server/lib/idUtils.ts | 48 | export function getExternalIdForAppSumoUser(email: string) { | CODE |
| LOW | app/server/lib/UpdateManager.ts | 195 | export async function getLatestStableDockerVersion(signal: AbortSignal): Promise<LatestVersion> { | CODE |
| LOW | app/server/lib/usageKeys.ts | 23 | export function billingMonthlyApiUsageKey(billingAccountId: number, m: moment.Moment) { | CODE |
| LOW | app/server/lib/OAuth2Clients.ts | 382 | function renderEndFlowHtmlTemplate(payload: object, openerOrigin: string) { | CODE |
| LOW | app/server/lib/sendAppPage.ts | 270 | function logVisitedPageTelemetryEvent(req: RequestWithLogin, options: LogVisitedPageEventOptions) { | CODE |
| LOW | app/server/lib/sendAppPage.ts | 317 | function configuredPageTitleSuffix() { | CODE |
| LOW | app/server/lib/sendAppPage.ts | 343 | function getPageMetadataHtmlSnippet(req: express.Request, config: GristLoadConfig): string { | CODE |
| LOW | app/server/lib/DocWorkerUtils.ts | 170 | export async function getDocWorkerInfoOrSelfPrefix( | CODE |
| LOW | app/server/lib/SetupRequestsEndpoints.ts | 56 | export function attachSetupRequestsEndpoints( | CODE |
| LOW | app/server/lib/DocManager.ts | 730 | async function updateDocumentAttachmentStoreSettingToValidValue(fname: string, provider: IAttachmentStoreProvider) { | CODE |
| LOW | app/server/lib/DocManager.ts | 747 | async function updateDocumentSettingsInPlace( | CODE |
| LOW | app/server/lib/dbUtils.ts | 78 | export async function getOrCreateConnection(): Promise<DataSource> { | CODE |
| LOW | app/server/lib/GranularAccess.ts | 90 | function isAddOrUpdateRecordAction([actionName]: UserAction): boolean { | CODE |
| LOW | app/server/lib/GranularAccess.ts | 3409 | async function applyToActionsRecursively(actions: (DocAction | UserAction)[], | CODE |
| LOW | app/server/lib/requestUtils.ts | 530 | export function clearSessionCacheIfNeeded(req: Request, options?: { | CODE |
| LOW | app/server/lib/requestUtils.ts | 562 | export function getExtraAttachmentOptions(req: Request): { | CODE |
| LOW | app/server/lib/requestUtils.ts | 672 | export function terminateSocketWithHttpResponse( | CODE |
| LOW | app/server/lib/requestUtils.ts | 994 | export function insertProxiedToTestHeader(headers: http.IncomingHttpHeaders, target: string) { | CODE |
| LOW | app/server/lib/CellDataAccess.ts | 40 | export async function applyAndCheckActionsForCells( | CODE |
| LOW | app/server/lib/GetGristComConfig.ts | 24 | export function readGetGristComConfigFromSettings(settings: AppSettings): OIDCConfig { | CODE |
| LOW | app/server/lib/GetGristComConfig.ts | 61 | function getDecodedGetGristSecretJson(settings: AppSettings) { | CODE |
| LOW | app/server/lib/gristSettings.ts | 108 | export function getAnonPlaygroundEnabledSource(): AppSettingSource | undefined { | CODE |
| LOW | app/server/lib/gristSettings.ts | 158 | export function getCanAnyoneCreateOrgsSource(): AppSettingSource | undefined { | CODE |
| 557 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | sandbox/grist/test_engine.py | 413 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_engine.py | 415 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_engine.py | 443 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_engine.py | 445 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/useractions.py | 2619 | #---------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/useractions.py | 2621 | #---------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/useractions.py | 2648 | #-------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/useractions.py | 2650 | #-------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 381 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 383 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 457 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 459 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 583 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 585 | # ---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 1319 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 1321 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 1630 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 1632 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2188 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2190 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2563 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2565 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2695 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2697 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/codebuilder.py | 283 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/codebuilder.py | 523 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_lookups.py | 29 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_lookups.py | 79 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_lookups.py | 102 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_lookups.py | 151 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_lookups.py | 172 | #---------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/lookup.py | 196 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/lookup.py | 273 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/lookup.py | 566 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_useractions.py | 134 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 35 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 194 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 268 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 354 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 397 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 534 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 599 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 638 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 767 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 816 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 856 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_summary_choicelist.py | 37 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 164 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 474 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 559 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 883 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 947 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 1030 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 1077 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 1196 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 1251 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_table_actions.py | 127 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_table_actions.py | 203 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM | sandbox/grist/test_table_actions.py | 251 | #---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_summary.py | 68 | #---------------------------------------------------------------------- | COMMENT |
| 32 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | app/client/ui/ProposedChangesPage.ts | 499 | const tableRow = this._gristDoc.docModel.tables.rowModels.find(tr => tr?.tableId() === table); | CODE |
| CRITICAL | app/client/ui/ProposedChangesPage.ts | 500 | const columnRows = tableRow ? this._gristDoc.docModel.columns.rowModels.filter( | CODE |
| CRITICAL | app/client/ui/DocumentSettings.ts | 440 | this._gristDoc.app.topAppModel.notifier.createNotification({ | CODE |
| CRITICAL | app/client/ui/WebhookPage.ts | 349 | public docApi = this.gristDoc.docPageModel.appModel.api.getDocAPI(this.gristDoc.docId()); | CODE |
| CRITICAL | app/client/ui/Tools.ts | 62 | owner.autoDispose(gristDoc.docModel.rules.tableData.tableActionEmitter.addListener(updateCanViewAccessRules)); | CODE |
| CRITICAL | app/client/ui/TimingPage.ts | 73 | const docApi = this._gristDoc.docPageModel.appModel.api.getDocAPI(this._gristDoc.docId()); | CODE |
| CRITICAL | app/client/components/VirtualDoc.ts | 682 | const fieldsIds = this._doc.docModel.viewFields.tableData.filterRowIds( | CODE |
| CRITICAL | app/client/components/VirtualDoc.ts | 831 | const fieldsIds = this._doc.docModel.viewFields.tableData.filterRowIds( | CODE |
| CRITICAL | app/client/components/RawDataPage.ts | 35 | const emptyView = this._gristDoc.docModel.views.rowModels.find(x => x.id.peek() === undefined); | CODE |
| CRITICAL | app/client/components/WidgetFrame.ts | 307 | const widgets = await this._options.gristDoc.app.topAppModel.getWidgets(); | CODE |
| CRITICAL | app/client/components/Forms/FormView.ts | 403 | const userId = this.gristDoc.app.topAppModel.appObs.get()?.currentUser?.id || 0; | CODE |
| CRITICAL | app/client/widgets/FieldEditor.ts | 154 | const app = this._gristDoc.app.topAppModel.appObs.get(); | CODE |
| CRITICAL | app/client/widgets/DiscussionEditor.ts | 822 | const currentUserAccess = this.props.gristDoc.docPageModel.currentDoc.get()?.access; | CODE |
| CRITICAL | test/nbrowser/CalendarView.ts | 643 | const col = window.gristCalendarView._view.viewSection.columns.peek() | CODE |
| CRITICAL | sandbox/grist/test_useractions.py | 1655 | rules = self.engine.docmodel.columns.table.get_record(23).rules | CODE |
| CRITICAL | sandbox/grist/test_useractions.py | 1857 | new_section = self.engine.docmodel.view_sections.table.get_record(result.retValues[0]['sectionRef']) | CODE |
| CRITICAL | sandbox/grist/test_useractions.py | 1870 | enabled_section = self.engine.docmodel.view_sections.table.get_record(result.retValues[0]['sectionRef']) | CODE |
| CRITICAL | sandbox/grist/test_undo.py | 46 | for r in self.engine.docmodel.tables.table.filter_records()], [ | CODE |
| CRITICAL | sandbox/grist/test_undo.py | 79 | for r in self.engine.docmodel.tables.table.filter_records()], [ | CODE |
| CRITICAL | sandbox/grist/test_twoway_refs.py | 221 | projects_table = self.engine.docmodel.tables.table.get_record(2) | CODE |
| CRITICAL⚡ | sandbox/grist/test_rules.py | 38 | rules = self.engine.docmodel.columns.table.get_record(col_id).rules | CODE |
| CRITICAL⚡ | sandbox/grist/test_rules.py | 44 | rules = self.engine.docmodel.view_fields.table.get_record(field_id).rules | CODE |
| CRITICAL⚡ | sandbox/grist/test_rules.py | 50 | rules = self.engine.docmodel.columns.table.get_record(col_id).rules | CODE |
| CRITICAL⚡ | sandbox/grist/test_rules.py | 55 | rules = self.engine.docmodel.view_fields.table.get_record(field_id).rules | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | sandbox/gvisor/update_engine_checkpoint.sh | 3 | # Create a checkpoint of a gvisor sandbox. It is best to make the | COMMENT |
| MEDIUM | sandbox/grist/test_sort_key.py | 45 | # Create a simple table (People) with a couple records. | COMMENT |
| MEDIUM | sandbox/grist/test_sort_key.py | 52 | # Create a separate table that does a lookup in the People table. | COMMENT |
| MEDIUM | sandbox/grist/test_dropdown_condition_renames.py | 65 | # Create a similar column with an invalid dropdown condition formula. | COMMENT |
| MEDIUM | sandbox/grist/test_dropdown_condition_renames.py | 162 | # Create a column with None for widget options. Just a presence of such a column was causing | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 989 | # Create a patch and append to the list for this col_rec. | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2278 | # Create a primary view | COMMENT |
| MEDIUM | sandbox/grist/useractions.py | 2577 | # Create the raw view for the new table, with a field for each column. | COMMENT |
| MEDIUM | sandbox/grist/test_table_data_set.py | 16 | # Create a test_* method for each case in testscript, which runs `self._run_test_body()`. | COMMENT |
| MEDIUM | sandbox/grist/lookup.py | 373 | # Create a key in the index for every combination of values in columns | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_useractions.py | 141 | # Create a view + section for the initial table. | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_useractions.py | 151 | # Create a new section for the same view, check that only a section is added. | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 1461 | # Create a new table which automatically gets a raw view section | COMMENT |
| MEDIUM | sandbox/grist/test_useractions.py | 1617 | # Create a new table, Table1, and populate it with some data. | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_summary_choicelist.py | 47 | # Create a summary section, grouped by the "choices1" column. | COMMENT |
| MEDIUM | sandbox/grist/test_summary_choicelist.py | 332 | # Create a summary section, grouped by the "choices1" column. | COMMENT |
| MEDIUM | sandbox/grist/test_summary_choicelist.py | 371 | # Create a summary section, grouped by both choicelist columns. | COMMENT |
| MEDIUM | sandbox/grist/summary.py | 399 | # Create the new table. | COMMENT |
| MEDIUM | sandbox/grist/test_summary2.py | 1207 | # Create a summary of the detached table (tableRef 3) by state (colRef 21). | COMMENT |
| MEDIUM⚡ | sandbox/grist/engine.py | 210 | # Create the formula tracer that can be overridden to trace formula evaluations. It is called | COMMENT |
| MEDIUM⚡ | sandbox/grist/engine.py | 214 | # Create the object that knows how to interpret UserActions. | COMMENT |
| MEDIUM⚡ | sandbox/grist/engine.py | 217 | # Create the object that knows how to interpret UserActions. | COMMENT |
| MEDIUM | sandbox/grist/engine.py | 363 | # Create the new records. | COMMENT |
| MEDIUM | sandbox/grist/test_renames2.py | 22 | # Create a schema with several tables including some references and lookups. | COMMENT |
| MEDIUM | sandbox/grist/timing.py | 51 | # Create a marks array for the last node or append to the existing one. | COMMENT |
| MEDIUM | sandbox/grist/test_display_cols.py | 280 | # Create a display column. | COMMENT |
| MEDIUM | sandbox/grist/test_table_actions.py | 355 | # Create a summary table of People grouped by address (a reference column). | COMMENT |
| MEDIUM | sandbox/grist/test_lookup_find.py | 188 | # Create a simple table (People) with a couple records. | COMMENT |
| MEDIUM | sandbox/grist/test_lookup_find.py | 195 | # Create a separate table that does a lookup in the People table. | COMMENT |
| MEDIUM | sandbox/grist/migrations.py | 561 | # Create the ACL table AND also the default ACL groups, default resource, and the default rule. | COMMENT |
| MEDIUM | sandbox/grist/test_trigger_expression.py | 188 | # Create a table so the trigger has a valid tableRef. | COMMENT |
| MEDIUM | sandbox/grist/test_trigger_expression.py | 285 | # Create a table with columns for tests | COMMENT |
| MEDIUM⚡ | sandbox/grist/test_summary.py | 86 | # Create a view + section for the initial table. | COMMENT |
| MEDIUM | sandbox/grist/test_summary.py | 131 | # Create a summary section, grouped by the "State" column. | COMMENT |
| MEDIUM | sandbox/grist/test_summary.py | 172 | # Create a summary section grouped by two columns ("city" and "state"). | COMMENT |
| MEDIUM | sandbox/grist/test_summary.py | 257 | # Create a summary section grouped by two columns ("city" and "state"). | COMMENT |
| MEDIUM | sandbox/grist/table.py | 303 | # Create a type with a property for each column. We use property-methods rather than | COMMENT |
| MEDIUM | sandbox/grist/test_summary_undo.py | 33 | # Create a summary section, grouped by the "State" column. | COMMENT |
| MEDIUM | sandbox/grist/test_derived.py | 59 | # Create a derived table summarizing count and total of orders by year. | COMMENT |
| MEDIUM | sandbox/grist/test_derived.py | 194 | # Create a summary on the Customers table. Adding orders involves a lookup for each customer. | COMMENT |
| MEDIUM | sandbox/grist/test_derived.py | 205 | # # Create the same summary on the Orders table, looking up 'state' via the Customer reference. | COMMENT |
| MEDIUM | sandbox/grist/test_derived.py | 264 | # Create a summary table summarizing count and total of orders by year. | COMMENT |
| MEDIUM | sandbox/grist/test_completion.py | 47 | # Create a summary table of Students grouped by school | COMMENT |
| MEDIUM | sandbox/grist/functions/date.py | 794 | # This function is actually completely crazy. The rules are strange too. We'll follow the logic | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buildtools/webpack.config.js | 41 | // Workaround for a known issue with webpack + onerror under chrome, see: | COMMENT |
| LOW | buildtools/update_schema.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildtools/publish-grist-full-edition.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | buildtools/publish-grist-full-edition.sh | 21 | # LABEL - Human-friendly label (e.g. v1.7.8, latest-<commit>). See LABEL below. | COMMENT |
| LOW | buildtools/install_edition.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | app/plugin/grist-plugin-api.ts | 1 | // Provide a way to access grist for iframe, web worker (which runs the main safeBrowser script) and | COMMENT |
| LOW | app/server/lib/PermissionInfo.ts | 261 | // can't read. Schema permissions are not row dependent. | COMMENT |
| LOW | app/server/lib/runSQLQuery.ts | 61 | // The underlying SQLite functions used will only process the | COMMENT |
| LOW | app/server/lib/DocWorkerIdentity.ts | 81 | // The port the socket ended up on. Read late by the caller, since with port 0 the real port is | COMMENT |
| LOW | app/server/lib/DocManager.ts | 321 | COMMENT | |
| LOW | app/server/lib/dbUtils.ts | 81 | // share the database connection. This saves locking trouble | COMMENT |
| LOW | app/server/lib/ExternalStorage.ts | 41 | // Upload content from file to the given key. Returns a snapshotId if store supports that. | COMMENT |
| LOW | app/server/lib/GranularAccess.ts | 1521 | // with actions other than other AddOrUpdateRecords, or simple data | COMMENT |
| LOW | app/server/lib/GranularAccess.ts | 2141 | const userAttrAfter = this._getUserAttributes(docSession); | COMMENT |
| LOW | app/server/lib/GranularAccess.ts | 2341 | // Apply the undo actions, since the docActions have already been applied to the db. | COMMENT |
| LOW | app/server/lib/WebhookQueue.ts | 121 | export class WebhookQueue implements ActionQueue<WebhookActionPayload> { | COMMENT |
| LOW | app/server/lib/RestartShell.ts | 61 | COMMENT | |
| LOW | app/server/lib/SQLiteDB.ts | 101 | // in the 'create' function, and added as new entries in the 'migrations' array. Existing | COMMENT |
| LOW | app/server/lib/FlexServer.ts | 3041 | // which meant that the Grist server's keepAlive timeout should be | COMMENT |
| LOW | app/server/lib/Client.ts | 241 | * Sends a message to the client, queuing it up on failure or if the client is disconnected. | COMMENT |
| LOW | app/server/lib/Client.ts | 281 | try { | COMMENT |
| LOW | app/server/lib/SandboxPyodide.ts | 41 | // personally and disruption in the name of security could seem unreasonable. | COMMENT |
| LOW | app/server/lib/DocStorage.ts | 541 | // With an INTEGER, NUMERIC, or REAL affinity, we need to be careful since | COMMENT |
| LOW | app/server/lib/DocStorage.ts | 741 | // the options for WAL are commented out | COMMENT |
| LOW | app/server/lib/ActiveDoc.ts | 521 | COMMENT | |
| LOW | app/server/lib/Triggers.ts | 101 | COMMENT | |
| LOW | app/server/lib/workerExporter.ts | 281 | COMMENT | |
| LOW | app/server/lib/ICreate.ts | 41 | // protection passed on to expressjs-session for security when | COMMENT |
| LOW | app/server/lib/Sharing.ts | 281 | // We have some extra actions, so we need to prepare a fake bundle (only with the extra actions) and | COMMENT |
| LOW | app/common/BillingAPI.ts | 81 | plans: IBillingPlan[]; | COMMENT |
| LOW | app/common/BillingAPI.ts | 101 | userCount: number; | COMMENT |
| LOW | app/common/LinkNode.ts | 261 | return false; | COMMENT |
| LOW | app/common/ACLRuleCollection.ts | 681 | export interface ReadAclOptions { | COMMENT |
| LOW | app/common/UserAPI.ts | 81 | id: number; | COMMENT |
| LOW | app/common/Prefs.ts | 21 | // Whether to record a new sign-up event via Google Tag Manager. Set to true on first login, then | COMMENT |
| LOW | app/common/ActionSummarizer.ts | 721 | if (!v1[1]) { | COMMENT |
| LOW | app/common/ActionSummarizer.ts | 901 | */ | COMMENT |
| LOW | app/common/ActionSummarizer.ts | 921 | // a cell under the live name (e.g. for a row removed before the column went | COMMENT |
| LOW | app/common/ActionBundle.ts | 101 | // Parallel to 'undo': the stored-action index each undo corresponds to (or null), as reported | COMMENT |
| LOW | app/common/ActionLayout.ts | 501 | // [1, 1] one action and its inverse (the common case). | COMMENT |
| LOW | app/common/ActionLayout.ts | 561 | edges.push({ i: node.fromI, a: ci - node.fromI, j: node.fromJ, b: cj - node.fromJ }); | COMMENT |
| LOW | app/gen-server/lib/TypeORMPatches.ts | 1 | // This contains two TypeORM patches. | COMMENT |
| LOW | app/gen-server/lib/homedb/UsersManager.ts | 581 | // delete the forks now. Deleting can be a relatively slow | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 1161 | } else { | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 2041 | // Forcibly remove the aliases relation from the document object, so that TypeORM | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 2601 | } | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 4801 | if (moveTo) { | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 4881 | // Normalize query results in the following ways: | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 5041 | const idColumn = resType.slice(0, -1) + "_id"; | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 5061 | COMMENT | |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 5121 | } | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 5661 | }); | COMMENT |
| LOW | …erver/migration/1764872085347-OAuthClientsAndGrants.ts | 21 | // Core client properties. | COMMENT |
| LOW | app/client/apiconsole.ts | 161 | } | COMMENT |
| LOW | app/client/apiconsole.ts | 301 | COMMENT | |
| LOW | app/client/ui/UserItem.ts | 1 | import { colors, theme, vars } from "app/client/ui2018/cssVars"; | COMMENT |
| LOW | app/client/ui/AccountWidget.ts | 281 | return menuItemLink(t("Support Grist"), " 💛", | COMMENT |
| LOW | app/client/ui/AdminPanel.ts | 981 | // Never checked before (no last version or last check time). | COMMENT |
| LOW | app/client/models/errors.ts | 81 | return reportMessage(msg, { level: "success", ...options }); | COMMENT |
| LOW | app/client/models/ViewFieldConfig.ts | 41 | // Make extra sure that field and column is not disposed, most of the knockout | COMMENT |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | sandbox/grist/match_counter.py | 27 | except TypeError: | CODE |
| HIGH | sandbox/grist/lookup.py | 602 | except TypeError: | CODE |
| HIGH | sandbox/grist/lookup.py | 253 | except Exception: | CODE |
| HIGH | sandbox/grist/test_match_counter.py | 23 | except TypeError: | CODE |
| HIGH | sandbox/grist/engine.py | 396 | except TypeError: | CODE |
| HIGH | sandbox/grist/testutil.py | 140 | except AssertionError as e: | CODE |
| HIGH | sandbox/grist/twowaymap.py | 258 | except ValueError: | CODE |
| HIGH | sandbox/grist/usertypes.py | 399 | except Exception: | CODE |
| HIGH | sandbox/grist/usertypes.py | 506 | except Exception: | CODE |
| HIGH | sandbox/grist/usertypes.py | 380 | except Exception: | CODE |
| HIGH | sandbox/grist/column.py | 409 | except Exception: | CODE |
| HIGH | sandbox/grist/column.py | 702 | except Exception: | CODE |
| HIGH | sandbox/grist/objtypes.py | 216 | except Exception as e: | CODE |
| HIGH | sandbox/grist/imports/import_utils.py | 60 | except (ValueError, OverflowError, TypeError): | CODE |
| HIGH | sandbox/grist/functions/text.py | 744 | except ValueError: | CODE |
| HIGH | sandbox/grist/functions/text.py | 749 | except ValueError: | CODE |
| HIGH | sandbox/grist/functions/text.py | 754 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sandbox/grist/test_lookup_perf.py | 14 | except Exception as e: | CODE |
| LOW | sandbox/grist/test_engine.py | 473 | except Exception as e: | CODE |
| LOW | sandbox/grist/test_table_data_set.py | 99 | except Exception as e: | CODE |
| LOW | sandbox/grist/autocomplete_context.py | 24 | except Exception as e: | CODE |
| LOW | sandbox/grist/autocomplete_context.py | 198 | except Exception: | CODE |
| LOW | sandbox/grist/autocomplete_context.py | 239 | except Exception: | CODE |
| MEDIUM | sandbox/grist/autocomplete_context.py | 21 | def is_grist_func(func): | CODE |
| MEDIUM | sandbox/grist/autocomplete_context.py | 236 | def repr_example(x): | CODE |
| LOW | sandbox/grist/lookup.py | 253 | except Exception: | CODE |
| LOW | sandbox/grist/lookup.py | 339 | except Exception as e: | CODE |
| LOW | sandbox/grist/lookup.py | 382 | except Exception: | CODE |
| LOW | sandbox/grist/test_summary_perf.py | 17 | except Exception: | CODE |
| LOW | sandbox/grist/sandbox.py | 149 | except Exception as e: | CODE |
| LOW | sandbox/grist/summary.py | 134 | except Exception: | CODE |
| LOW | sandbox/grist/engine.py | 1360 | except Exception as e: | CODE |
| LOW | sandbox/grist/engine.py | 1374 | except Exception: | CODE |
| LOW | sandbox/grist/engine.py | 1426 | except Exception: | CODE |
| LOW | sandbox/grist/engine.py | 1435 | except Exception: | CODE |
| LOW | sandbox/grist/acl.py | 107 | except Exception as e: | CODE |
| LOW | sandbox/grist/acl.py | 143 | except Exception as e: | CODE |
| LOW | sandbox/grist/migrations.py | 58 | except Exception: | CODE |
| LOW | sandbox/grist/migrations.py | 508 | except Exception: | CODE |
| LOW | sandbox/grist/migrations.py | 655 | except Exception: | CODE |
| LOW | sandbox/grist/parse_data.py | 42 | except Exception: | CODE |
| LOW | sandbox/grist/parse_data.py | 208 | except Exception: | CODE |
| MEDIUM | sandbox/grist/parse_data.py | 38 | def test(cls, value): | CODE |
| LOW | sandbox/grist/table_data_set.py | 32 | except Exception as e: | CODE |
| MEDIUM | sandbox/grist/table_data_set.py | 29 | def apply_doc_action(self, action): | CODE |
| LOW | sandbox/grist/usertypes.py | 179 | except Exception as e: | CODE |
| LOW | sandbox/grist/usertypes.py | 183 | except Exception: | CODE |
| LOW | sandbox/grist/usertypes.py | 380 | except Exception: | CODE |
| LOW | sandbox/grist/usertypes.py | 399 | except Exception: | CODE |
| LOW | sandbox/grist/usertypes.py | 506 | except Exception: | CODE |
| LOW | sandbox/grist/column.py | 409 | except Exception: | CODE |
| LOW | sandbox/grist/column.py | 702 | except Exception: | CODE |
| LOW | sandbox/grist/attribute_recorder.py | 57 | except Exception: | CODE |
| MEDIUM | sandbox/grist/attribute_recorder.py | 54 | def safe_repr(x): | CODE |
| LOW | sandbox/grist/objtypes.py | 135 | except Exception: | CODE |
| LOW | sandbox/grist/objtypes.py | 144 | except Exception: | CODE |
| LOW | sandbox/grist/objtypes.py | 216 | except Exception as e: | CODE |
| LOW | sandbox/grist/objtypes.py | 256 | except Exception as e: | CODE |
| LOW | sandbox/grist/imports/import_csv.py | 99 | except Exception as e: | CODE |
| LOW | sandbox/grist/functions/math.py | 895 | except Exception: | CODE |
| LOW | sandbox/grist/functions/info.py | 592 | except Exception: | STRING |
| LOW | sandbox/grist/functions/info.py | 630 | except Exception as e: | STRING |
| LOW | sandbox/grist/functions/info.py | 651 | except Exception: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | storybook/authenticationSection.stories.ts | 15 | adminEmail: "admin@example.com", | CODE |
| LOW | app/client/ui/RightPanel.ts | 1096 | dom.prop("placeholder", use => use(field.displayLabel) || use(field.colId)), | CODE |
| LOW | app/client/ui/ColumnFilterMenu.ts | 229 | "placeholder": t("Search values"), | CODE |
| LOW | app/client/ui/searchDropdown.ts | 146 | "placeholder": this._options.placeholder || t("Search"), | CODE |
| LOW | app/client/ui/DescriptionConfig.ts | 137 | dom.prop("placeholder", options.placeholder || ""), | CODE |
| LOW | app/client/ui2018/search.ts | 221 | "placeholder": t("Search in document"), | CODE |
| LOW | app/client/widgets/NumericSpinner.ts | 70 | defaultValue !== undefined ? dom.prop("placeholder", defaultValue) : null, | CODE |
| LOW | app/client/widgets/TextEditor.js | 46 | kd.attr("placeholder", options.placeholder || ""), | CODE |
| LOW | app/client/widgets/DateTimeEditor.ts | 68 | dom.attr("placeholder", placeholder), | CODE |
| LOW | app/client/widgets/DateEditor.ts | 47 | this.textInput.setAttribute("placeholder", placeholder); | CODE |
| LOW | app/client/widgets/HyperLinkEditor.ts | 14 | this.textInput.setAttribute("placeholder", t("[link label] url")); | CODE |
| LOW | app/client/widgets/Assistant.ts | 318 | dom.prop("placeholder", (use) => { | CODE |
| LOW | test/projects/filterUtils.ts | 64 | (await bound.find("input").getAttribute("placeholder")).trim(); | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 451 | email: "fake-email", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 452 | name: "fake-name", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 640 | email: "fake-email", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 675 | email: "fake-email", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 676 | name: "fake-name", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 691 | email: "fake-email", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 692 | name: "fake-name", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 707 | email: "fake-email", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 708 | name: "fake-name", | CODE |
| LOW | test/server/lib/OIDCConfig.ts | 754 | token_type: "fake-token-type", | CODE |
| LOW | test/server/lib/Boot.ts | 46 | profile: { email: "admin@example.com", name: "admin" }, | CODE |
| LOW | test/server/lib/docapi/DocApiWebhooks.ts | 1546 | await check({ authorization: "Bearer fake-token" }, 200); | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 26 | check("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 26 | check("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 34 | "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 34 | "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 40 | "Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/textUtils.ts | 40 | "Nullam dictum felis eu pede mollis pretium. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. " + | CODE |
| LOW⚡ | test/client/lib/ACIndex.ts | 281 | const acIndex = new ACIndexImpl(["Lorem ipsum 𝌆 dolor sit ameͨ͆t.", "mañana", "Москва"].map(makeItem), { | CODE |
| LOW⚡ | test/client/lib/ACIndex.ts | 286 | [["", "Моск", "ва"], ["", "mañ", "ana"], ["Lorem ipsum 𝌆 dolor sit ", "am", "eͨ͆t."]]); | CODE |
| LOW⚡ | test/client/lib/ACIndex.ts | 294 | ["Lorem ipsum 𝌆 dolor sit ", original, "t."]); | CODE |
| LOW | test/nbrowser/ProposedChangesPage.ts | 1810 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " + | CODE |
| LOW | test/nbrowser/ProposedChangesPage.ts | 1810 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " + | CODE |
| LOW | test/nbrowser/AirtableImport.ts | 893 | Name: "Acme Corp", | CODE |
| LOW | test/nbrowser/BootPage.ts | 259 | await driver.find(".test-boot-page-email-input").doClear().sendKeys("admin@example.com"); | CODE |
| LOW | test/nbrowser/BootPage.ts | 264 | assert.deepEqual({ name, email }, { name: "admin", email: "admin@example.com" }); | CODE |
| LOW | test/nbrowser/RowHeights.ts | 66 | assert.equal(await driver.find(".test-row-height-max input").getAttribute("placeholder"), "auto"); | CODE |
| LOW | …-forwarded-headers/configs/authelia/users_database.yml | 13 | email: 'test@example.org' | CODE |
| LOW | …ostgres-redis-rustfs/configs/keycloak/grist-realm.json | 26 | "email": "test@example.org", | CODE |
| LOW | sandbox/grist/functions/info.py | 287 | >>> ISEMAIL("John Doe") | CODE |
| LOW | sandbox/grist/functions/info.py | 298 | >>> ISEMAIL("foo@bar.com") # True, True | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/server/lib/BrowserSession.ts | 114 | // - "S": the user is signed in once; in this case an automatic signin can be unambiguous and seamless. | COMMENT |
| MEDIUM | app/server/lib/ConfigBackendAPI.ts | 82 | // providers, be more nuanced about setting this. | COMMENT |
| MEDIUM | app/server/lib/GranularAccess.ts | 113 | // Actions that won't be allowed (yet) for a user with nuanced access to a document. | COMMENT |
| MEDIUM | app/server/lib/GranularAccess.ts | 1529 | // There might be uses for applying AddOrUpdateRecord in a nuanced | COMMENT |
| MEDIUM | app/server/lib/FlexServer.ts | 223 | // This can be called to do a redirect to signin/signup in a nuanced situation. | COMMENT |
| MEDIUM | app/server/lib/Client.ts | 351 | // We have all the needed messages (possibly an empty array); can do a seamless reconnect. | COMMENT |
| MEDIUM | app/server/lib/ActiveDoc.ts | 2610 | this._fetchCache.clear(); // This could be more nuanced. | CODE |
| MEDIUM | app/client/ui/HomeLeftPane.ts | 115 | // be a bit more nuanced here, but as of today the menu isn't particularly useful | COMMENT |
| MEDIUM | app/client/components/GristWSConnection.ts | 140 | // 0. We keep track of them to allow for seamless reconnects. | COMMENT |
| MEDIUM | test/common/NumberFormat.ts | 10 | // useGrouping became more nuanced in recent node. | COMMENT |
| MEDIUM | test/nbrowser/QuickSetupAuth.ts | 60 | // provider row with a Configure button. Handle both so the helper is robust | COMMENT |
| MEDIUM | sandbox/docker_entrypoint.sh | 11 | # Try to setup permissions and de-elevate to a normal user. | COMMENT |
| LOW | sandbox/grist/test_lookup_perf.py | 91 | # Otherwise, we could just use statistics.linear_regression() | COMMENT |
| MEDIUM | sandbox/grist/testscript.json | 95 | // Essentially a duplicate of the UserAction, but as a DocAction. | COMMENT |
| LOW⚡ | sandbox/grist/useractions.py | 2610 | # TODO: Deprecated; should just use RemoveRecord('_grist_Views', view_id) | COMMENT |
| LOW⚡ | sandbox/grist/useractions.py | 2639 | # TODO: Deprecated; should just use RemoveRecord('_grist_Views_section', view_id) | COMMENT |
| LOW | sandbox/grist/summary.py | 49 | # not a valid json string, i.e. in tests), just return the original updates. | COMMENT |
| MEDIUM | sandbox/grist/functions/text.py | 733 | # This is not particularly robust, but makes an attempt to handle a number of cases: numbers, | STRING |
| LOW | .github/workflows/docker_latest.yml | 7 | # personal access tokens so we just use a cron job. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/client/components/GristDoc.ts | 294 | // One of the section can be expanded (as requested from the Layout), we will | COMMENT |
| HIGH | app/client/components/Layout.ts | 242 | // Normally, we just add a sibling as requested. | COMMENT |
| HIGH | test/gen-server/lib/scrubUserFromOrg.ts | 427 | // user2's access should be changed just as requested | COMMENT |
| HIGH | test/gen-server/lib/scrubUserFromOrg.ts | 449 | // user2's access should be changed just as requested | COMMENT |
| HIGH | sandbox/grist/test_useractions.py | 1600 | # Actually testing that the time is updated as requested | COMMENT |
| HIGH | sandbox/grist/table.py | 31 | # UserTables are only created in auto-generated code by using UserTable as decorator for a table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sandbox/grist/test_predicate_formula.py | 5 | CODE | |
| LOW | sandbox/grist/test_replay.py | 39 | CODE | |
| LOW | sandbox/grist/test_renames.py | 417 | CODE | |
| LOW | sandbox/grist/xmlrunner.py | 10 | CODE | |
| LOW | sandbox/grist/test_prevnext.py | 5 | CODE | |
| LOW | sandbox/grist/test_codebuilder.py | 2 | CODE | |
| LOW | sandbox/grist/engine.py | 43 | CODE | |
| LOW | sandbox/grist/test_renames2.py | 2 | CODE | |
| LOW | sandbox/grist/test_lookup_find.py | 3 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 8 | CODE | |
| LOW | sandbox/grist/grist.py | 10 | CODE | |
| LOW | sandbox/grist/grist.py | 10 | CODE | |
| LOW | sandbox/grist/grist.py | 10 | CODE | |
| LOW | sandbox/grist/grist.py | 10 | CODE | |
| LOW | sandbox/grist/grist.py | 10 | CODE | |
| LOW | sandbox/grist/grist.py | 13 | CODE | |
| LOW | sandbox/grist/runtests.py | 11 | CODE | |
| LOW | sandbox/grist/functions/logical.py | 2 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 2 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 3 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 4 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 5 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 6 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 7 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 8 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 9 | CODE | |
| LOW | sandbox/grist/functions/__init__.py | 10 | CODE | |
| LOW | sandbox/grist/functions/stats.py | 6 | CODE | |
| LOW | sandbox/grist/functions/math.py | 3 | CODE | |
| LOW | sandbox/grist/functions/info.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sandbox/grist/test_replay.py | 63 | CODE | |
| LOW | sandbox/grist/test_engine.py | 446 | CODE | |
| LOW | sandbox/grist/useractions.py | 726 | CODE | |
| LOW | sandbox/grist/useractions.py | 804 | CODE | |
| LOW | sandbox/grist/useractions.py | 934 | CODE | |
| LOW | sandbox/grist/useractions.py | 1153 | CODE | |
| LOW | sandbox/grist/test_table_data_set.py | 72 | CODE | |
| LOW | sandbox/grist/test_table_data_set.py | 118 | CODE | |
| LOW | sandbox/grist/codebuilder.py | 98 | CODE | |
| LOW | sandbox/grist/codebuilder.py | 525 | CODE | |
| LOW | sandbox/grist/summary_helper.py | 145 | CODE | |
| LOW | sandbox/grist/formula_prompt.py | 17 | CODE | |
| LOW | sandbox/grist/formula_prompt.py | 54 | CODE | |
| LOW | sandbox/grist/formula_prompt.py | 89 | CODE | |
| LOW | sandbox/grist/actions.py | 194 | CODE | |
| LOW | sandbox/grist/trigger_expression.py | 23 | CODE | |
| LOW | sandbox/grist/test_migrations.py | 8 | CODE | |
| LOW | sandbox/grist/engine.py | 382 | CODE | |
| LOW | sandbox/grist/engine.py | 571 | CODE | |
| LOW | sandbox/grist/engine.py | 764 | CODE | |
| LOW | sandbox/grist/engine.py | 959 | CODE | |
| LOW | sandbox/grist/engine.py | 1233 | CODE | |
| LOW | sandbox/grist/engine.py | 1451 | CODE | |
| LOW | sandbox/grist/acl.py | 87 | CODE | |
| LOW | sandbox/grist/acl.py | 116 | CODE | |
| LOW | sandbox/grist/import_actions.py | 71 | CODE | |
| LOW | sandbox/grist/import_actions.py | 119 | CODE | |
| LOW | sandbox/grist/import_actions.py | 182 | CODE | |
| LOW | sandbox/grist/migrations.py | 481 | CODE | |
| LOW | sandbox/grist/depend.py | 124 | CODE | |
| LOW | sandbox/grist/test_reload_oracle.py | 44 | CODE | |
| LOW | sandbox/grist/usertypes.py | 193 | CODE | |
| LOW | sandbox/grist/usertypes.py | 312 | CODE | |
| LOW | sandbox/grist/usertypes.py | 344 | CODE | |
| LOW | sandbox/grist/usertypes.py | 372 | CODE | |
| LOW | sandbox/grist/usertypes.py | 486 | CODE | |
| LOW | sandbox/grist/column.py | 678 | CODE | |
| LOW | sandbox/grist/objtypes.py | 163 | CODE | |
| LOW | sandbox/grist/objtypes.py | 222 | CODE | |
| LOW | sandbox/grist/imports/import_json.py | 151 | CODE | |
| LOW | sandbox/grist/imports/import_xls.py | 42 | CODE | |
| LOW | sandbox/grist/functions/schedule.py | 221 | CODE | |
| LOW | sandbox/grist/functions/info.py | 599 | CODE | |
| LOW | sandbox/grist/functions/info.py | 663 | CODE | |
| LOW | sandbox/grist/functions/date.py | 14 | CODE | |
| LOW | sandbox/grist/functions/date.py | 200 | CODE | |
| LOW | sandbox/grist/functions/date.py | 703 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/server/lib/Triggers.ts | 571 | // as a class that overrides __bool__ to return False, but still allows field access without errors. | COMMENT |
| HIGH | app/client/ui/GridViewMenusDateHelpers.ts | 76 | TIME_BUCKET: "if not $Column:\n return None\n" + | CODE |
| HIGH | app/client/widgets/ConditionalStyle.ts | 148 | t("Rule must return True or False")); | CODE |
| HIGH | test/nbrowser/GridViewNewColumnMenuDateHelpers.ts | 247 | formula: "if not $EventDate:\n return None\n" + | CODE |
| HIGH | test/nbrowser/Formulas.ts | 218 | return None | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buildtools/update_type_info.sh | 24 | # Check if source file exists | COMMENT |
| LOW | buildtools/update_type_info.sh | 29 | # Check if source file is newer than the type info file or force flag is set | COMMENT |
| LOW | sandbox/gvisor/get_checkpoint_path.sh | 33 | # Check if a trivial command works under gvisor with the proposed flags. | COMMENT |
| LOW | sandbox/grist/useractions.py | 983 | # Check if we are seeing a mention of a column that's getting renamed. | COMMENT |
| LOW | sandbox/grist/test_lookups.py | 975 | # Set address to a valid value again. Values that used error cells should get correct order. | STRING |
| LOW | sandbox/grist/engine.py | 656 | # Check if any potentially unused LookupMaps are still unused, and if so, delete them. | COMMENT |
| LOW | sandbox/grist/engine.py | 1181 | # Set flag to rebuild dependencies of trigger columns after any potential renames, etc. | COMMENT |
| LOW | sandbox/grist/engine.py | 1586 | # Check if out_actions ActionObj grew at all since _get_undo_checkpoint(). If yes, revert by | COMMENT |
| LOW | sandbox/grist/migrations.py | 511 | # Set formula to use the current visibleCol in widgetOptions. | COMMENT |
| LOW | sandbox/grist/table.py | 744 | # Check if col_id is in the immediate dictionary of self.Record[Set]; if missing, or inherited | COMMENT |
| LOW | sandbox/grist/table.py | 794 | # Check if 'id' is mentioned explicitly. If so, then no fallback to 'manualSort', or anything | COMMENT |
| LOW | sandbox/grist/functions/date.py | 980 | # Check if the current date is a weekday (Monday=0, Sunday=6) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/server/lib/NSandbox.ts | 713 | // Step 1: Create a sandbox. If a flavor is given, create that exact flavor. | COMMENT |
| LOW | app/server/lib/NSandbox.ts | 729 | // Step 2: Run a simple Python call to check if the sandbox can execute code. | COMMENT |
| LOW | app/server/lib/NSandbox.ts | 740 | // Step 3: Stop the sandbox. If we get here, everything worked. | COMMENT |
| LOW | app/common/NumberParse.ts | 238 | // but for currencies we need to check if there are fewer decimal places than the default. | COMMENT |
| LOW | app/gen-server/lib/homedb/HomeDBManager.ts | 1175 | // We need to check if the current user is disabled or not. In | COMMENT |
| LOW⚡ | test/nbrowser/gristUtils.ts | 4595 | // Step 1: Set fixed size of the window to ensure consistent outer dimensions, and prevent maximized | COMMENT |
| LOW⚡ | test/nbrowser/gristUtils.ts | 4599 | // Step 2: Get outer vs inner difference | COMMENT |
| LOW | test/nbrowser/gristUtils.ts | 4610 | // Step 3: Set outer window size to match desired viewport | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/server/lib/SQLiteDB.ts | 5 | * Here's a simple example, | COMMENT |
| LOW | app/client/ui2018/stretchedLink.ts | 4 | * Don't forget to apply the `position: relative` CSS property to the parent block you want the link to cover. | COMMENT |
| LOW | app/client/components/BaseView.ts | 697 | // Use document timezone. Don't forget to use uppercase HH for 24-hour time. | COMMENT |
| LOW⚡ | sandbox/grist/test_lookup_sort.py | 464 | # (this is a way to check that we don't forget to clean up stale lookup helper columns). | COMMENT |
| LOW⚡ | sandbox/grist/test_lookup_sort.py | 464 | # (this is a way to check that we don't forget to clean up stale lookup helper columns). | COMMENT |
| MEDIUM | sandbox/grist/records.py | 283 | certain date, here is how you can do it old-style: | STRING |
| LOW | sandbox/pyodide/env.sh | 1 | # When you update this, make sure to update worker/package.json and worker/yarn.lock, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/server/lib/NSandbox.ts | 713 | // Step 1: Create a sandbox. If a flavor is given, create that exact flavor. | COMMENT |
| LOW | app/server/lib/NSandbox.ts | 729 | // Step 2: Run a simple Python call to check if the sandbox can execute code. | COMMENT |
| LOW | app/server/lib/NSandbox.ts | 740 | // Step 3: Stop the sandbox. If we get here, everything worked. | COMMENT |
| LOW⚡ | test/nbrowser/gristUtils.ts | 4595 | // Step 1: Set fixed size of the window to ensure consistent outer dimensions, and prevent maximized | COMMENT |
| LOW⚡ | test/nbrowser/gristUtils.ts | 4599 | // Step 2: Get outer vs inner difference | COMMENT |
| LOW | test/nbrowser/gristUtils.ts | 4610 | // Step 3: Set outer window size to match desired viewport | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | sandbox/grist/engine.py | 94 | # In this implementation, rows are identified by a row_id, which functions like an index, so that | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | sandbox/grist/import_actions.py | 76 | If dst_table is null, copy all src columns | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/nbrowser/CustomView.ts | 892 | async function getData(shown: number) { | CODE |
| LOW | sandbox/grist/test_completion.py | 163 | def test_function(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sandbox/grist/functions/__init__.py | 13 | __all__ = [k for k in dir() if not k.startswith('_') and k.isupper()] | CODE |
| LOW | sandbox/grist/functions/schedule.py | 7 | __all__ = ['SCHEDULE'] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/server/lib/Authorizer.ts | 450 | // TODO: implement userSelector for rest API, to allow "sticky" user selection on pages. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | sandbox/grist/useractions.py | 2573 | CODE |