Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js7
-rw-r--r--app/assets/javascripts/static_site_editor/components/publish_toolbar.vue2
-rw-r--r--app/assets/javascripts/static_site_editor/graphql/index.js2
-rw-r--r--app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql5
-rw-r--r--app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql1
-rw-r--r--app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js17
-rw-r--r--app/assets/javascripts/static_site_editor/graphql/typedefs.graphql6
-rw-r--r--app/assets/javascripts/static_site_editor/index.js1
-rw-r--r--app/assets/javascripts/static_site_editor/pages/home.vue18
-rw-r--r--app/assets/javascripts/static_site_editor/pages/success.vue45
-rw-r--r--app/assets/javascripts/static_site_editor/services/front_matterify.js73
-rw-r--r--app/assets/javascripts/static_site_editor/services/parse_source_file.js17
-rw-r--r--app/assets/javascripts/vue_shared/components/gl_mentions.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/members/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/members/table/created_at.vue40
-rw-r--r--app/assets/javascripts/vue_shared/components/members/table/expires_at.vue66
-rw-r--r--app/assets/javascripts/vue_shared/components/members/table/members_table.vue20
-rw-r--r--app/assets/javascripts/whats_new/components/app.vue35
-rw-r--r--app/assets/stylesheets/application.scss11
-rw-r--r--app/assets/stylesheets/application_utilities.scss12
-rw-r--r--app/assets/stylesheets/application_utilities_dark.scss3
-rw-r--r--app/helpers/application_helper.rb6
-rw-r--r--app/services/quick_actions/interpret_service.rb2
-rw-r--r--app/validators/addressable_url_validator.rb2
-rw-r--r--app/views/dashboard/milestones/index.html.haml2
-rw-r--r--app/views/dashboard/todos/index.html.haml2
-rw-r--r--app/views/groups/milestones/index.html.haml2
-rw-r--r--app/views/groups/milestones/show.html.haml2
-rw-r--r--app/views/ide/_show.html.haml3
-rw-r--r--app/views/jira_connect/subscriptions/index.html.haml2
-rw-r--r--app/views/layouts/_head.html.haml6
-rw-r--r--app/views/layouts/jira_connect.html.haml2
-rw-r--r--app/views/projects/cycle_analytics/show.html.haml3
-rw-r--r--app/views/projects/environments/show.html.haml4
-rw-r--r--app/views/projects/issues/index.html.haml2
-rw-r--r--app/views/projects/issues/show.html.haml2
-rw-r--r--app/views/projects/jobs/show.html.haml4
-rw-r--r--app/views/projects/milestones/index.html.haml2
-rw-r--r--app/views/projects/milestones/show.html.haml2
-rw-r--r--app/views/shared/boards/_show.html.haml2
-rw-r--r--changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml5
-rw-r--r--changelogs/unreleased/241738-prevent-assignment-to-groups.yml5
-rw-r--r--changelogs/unreleased/244873-perceived-ux-success-screen.yml5
-rw-r--r--changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml6
-rw-r--r--changelogs/unreleased/zj-update-lang-colors.yml5
-rw-r--r--config/application.rb2
-rw-r--r--db/migrate/20200923102312_update_programming_language_colors.rb21
-rw-r--r--db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb20
-rw-r--r--db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb9
-rw-r--r--db/schema_migrations/202009231023121
-rw-r--r--db/schema_migrations/202009272247501
-rw-r--r--db/schema_migrations/202009290631591
-rw-r--r--db/structure.sql3
-rw-r--r--doc/administration/geo/replication/updating_the_geo_nodes.md3
-rw-r--r--doc/administration/img/export_audit_log_v13_4.pngbin127518 -> 46643 bytes
-rw-r--r--doc/administration/postgresql/external.md6
-rw-r--r--doc/administration/postgresql/index.md5
-rw-r--r--doc/administration/postgresql/pgbouncer.md3
-rw-r--r--doc/administration/postgresql/replication_and_failover.md14
-rw-r--r--doc/administration/postgresql/standalone.md14
-rw-r--r--doc/api/members.md52
-rw-r--r--doc/ci/img/ci_lint.pngbin37745 -> 11525 bytes
-rw-r--r--doc/ci/img/ci_lint_dry_run.pngbin18688 -> 6811 bytes
-rw-r--r--doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.pngbin124100 -> 35397 bytes
-rw-r--r--doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.pngbin241128 -> 55200 bytes
-rw-r--r--doc/development/api_graphql_styleguide.md19
-rw-r--r--doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.pngbin67972 -> 45857 bytes
-rw-r--r--doc/user/admin_area/analytics/img/cohorts_v13_4.pngbin92729 -> 31518 bytes
-rw-r--r--doc/user/admin_area/analytics/img/dev_ops_report_v13_4.pngbin167541 -> 51758 bytes
-rw-r--r--doc/user/analytics/img/mr_throughput_chart_v13_3.pngbin62510 -> 17870 bytes
-rw-r--r--doc/user/analytics/img/mr_throughput_table_v13_3.pngbin55637 -> 20273 bytes
-rw-r--r--doc/user/analytics/img/new_value_stream_v13_3.pngbin82797 -> 31215 bytes
-rw-r--r--doc/user/analytics/img/vsa_filter_bar_v13.3.pngbin117834 -> 33694 bytes
-rw-r--r--doc/user/application_security/img/cve_request_communication.pngbin45402 -> 17386 bytes
-rw-r--r--doc/user/application_security/img/cve_request_communication_publication.pngbin66617 -> 24126 bytes
-rw-r--r--doc/user/application_security/img/new_cve_request_issue.pngbin96795 -> 36847 bytes
-rw-r--r--doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.pngbin99883 -> 35553 bytes
-rw-r--r--doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.pngbin82526 -> 29773 bytes
-rw-r--r--doc/user/application_security/img/vulnerability-check_v13_4.pngbin75105 -> 25832 bytes
-rw-r--r--doc/user/application_security/img/vulnerability_solution.pngbin30211 -> 9750 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.pngbin136030 -> 50648 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.pngbin87684 -> 30034 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.pngbin38731 -> 13264 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.pngbin87470 -> 29797 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.pngbin147574 -> 53541 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.pngbin168847 -> 69112 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.pngbin155207 -> 58167 bytes
-rw-r--r--doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.pngbin164629 -> 61329 bytes
-rw-r--r--doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.pngbin298542 -> 71374 bytes
-rw-r--r--doc/user/compliance/license_compliance/img/license-check_v13_4.pngbin74407 -> 25590 bytes
-rw-r--r--doc/user/img/feature_flags_history_note_info_v13_2.pngbin67034 -> 21794 bytes
-rw-r--r--doc/user/img/version_history_notes_collapsed_v13_2.pngbin27528 -> 7770 bytes
-rw-r--r--doc/user/project/import/img/manifest_status_v13_3.pngbin90811 -> 31313 bytes
-rw-r--r--lib/gitlab/ci/pipeline/chain/command.rb2
-rw-r--r--lib/gitlab/ci/variables/collection/item.rb4
-rw-r--r--lib/gitlab/config/entry/factory.rb2
-rw-r--r--lib/gitlab/config/entry/simplifiable.rb2
-rw-r--r--lib/gitlab/usage_data.rb1
-rw-r--r--locale/gitlab.pot23
-rw-r--r--package.json1
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb27
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js4
-rw-r--r--spec/frontend/static_site_editor/pages/home_spec.js48
-rw-r--r--spec/frontend/static_site_editor/pages/success_spec.js109
-rw-r--r--spec/frontend/static_site_editor/services/front_matterify_spec.js47
-rw-r--r--spec/frontend/vue_shared/components/members/table/created_at_spec.js61
-rw-r--r--spec/frontend/vue_shared/components/members/table/expires_at_spec.js86
-rw-r--r--spec/frontend/vue_shared/components/members/table/members_table_spec.js12
-rw-r--r--spec/frontend/whats_new/components/app_spec.js33
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb1
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb13
-rwxr-xr-xvendor/languages.yml1433
-rw-r--r--yarn.lock25
113 files changed, 2208 insertions, 371 deletions
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index f998d5f1b7f..0329006c62a 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -35,7 +35,6 @@ export function membersBeforeSave(members) {
: '';
return {
- type: member.type,
username: member.username,
avatarTag: autoCompleteAvatar.length === 1 ? txtAvatar : imgAvatar,
title: sanitize(title),
@@ -280,11 +279,7 @@ class GfmAutoComplete {
if (command === MEMBER_COMMAND.ASSIGN) {
// Only include members which are not assigned to Issuable currently
- return data.filter(
- member => member.type === 'User' && !assignees.includes(member.search),
- );
- } else if (command === MEMBER_COMMAND.REASSIGN) {
- return data.filter(member => member.type === 'User');
+ return data.filter(member => !assignees.includes(member.search));
} else if (command === MEMBER_COMMAND.UNASSIGN) {
// Only include members which are assigned to Issuable currently
return data.filter(member => assignees.includes(member.search));
diff --git a/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue b/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue
index 2d62964cb3b..5f00f9f22f3 100644
--- a/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue
+++ b/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue
@@ -41,7 +41,7 @@ export default {
:disabled="savingChanges"
@click="$emit('editSettings')"
>
- {{ __('Settings') }}
+ {{ __('Page settings') }}
</gl-button>
<gl-button
ref="submit"
diff --git a/app/assets/javascripts/static_site_editor/graphql/index.js b/app/assets/javascripts/static_site_editor/graphql/index.js
index 0a5d8c07ad9..fbb3d7fbfcc 100644
--- a/app/assets/javascripts/static_site_editor/graphql/index.js
+++ b/app/assets/javascripts/static_site_editor/graphql/index.js
@@ -4,6 +4,7 @@ import createDefaultClient from '~/lib/graphql';
import typeDefs from './typedefs.graphql';
import fileResolver from './resolvers/file';
import submitContentChangesResolver from './resolvers/submit_content_changes';
+import hasSubmittedChangesResolver from './resolvers/has_submitted_changes';
Vue.use(VueApollo);
@@ -15,6 +16,7 @@ const createApolloProvider = appData => {
},
Mutation: {
submitContentChanges: submitContentChangesResolver,
+ hasSubmittedChanges: hasSubmittedChangesResolver,
},
},
{
diff --git a/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql b/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql
new file mode 100644
index 00000000000..1f47929556a
--- /dev/null
+++ b/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql
@@ -0,0 +1,5 @@
+mutation hasSubmittedChanges($input: HasSubmittedChangesInput) {
+ hasSubmittedChanges(input: $input) @client {
+ hasSubmittedChanges
+ }
+}
diff --git a/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql b/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql
index 946d80efff0..9f4b0afe55f 100644
--- a/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql
+++ b/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql
@@ -1,6 +1,7 @@
query appData {
appData @client {
isSupportedContent
+ hasSubmittedChanges
project
sourcePath
username
diff --git a/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js b/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js
new file mode 100644
index 00000000000..ce55db7f3e5
--- /dev/null
+++ b/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js
@@ -0,0 +1,17 @@
+import query from '../queries/app_data.query.graphql';
+
+const hasSubmittedChangesResolver = (_, { input: { hasSubmittedChanges } }, { cache }) => {
+ const { appData } = cache.readQuery({ query });
+ cache.writeQuery({
+ query,
+ data: {
+ appData: {
+ __typename: 'AppData',
+ ...appData,
+ hasSubmittedChanges,
+ },
+ },
+ });
+};
+
+export default hasSubmittedChangesResolver;
diff --git a/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql b/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql
index 78cc1746cdb..0ded1722d26 100644
--- a/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql
+++ b/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql
@@ -16,12 +16,17 @@ type SavedContentMeta {
type AppData {
isSupportedContent: Boolean!
+ hasSubmittedChanges: Boolean!
project: String!
returnUrl: String
sourcePath: String!
username: String!
}
+input HasSubmittedChangesInput {
+ hasSubmittedChanges: Boolean!
+}
+
input SubmitContentChangesInput {
project: String!
sourcePath: String!
@@ -40,4 +45,5 @@ extend type Query {
extend type Mutation {
submitContentChanges(input: SubmitContentChangesInput!): SavedContentMeta
+ hasSubmittedChanges(input: HasSubmittedChangesInput!): AppData
}
diff --git a/app/assets/javascripts/static_site_editor/index.js b/app/assets/javascripts/static_site_editor/index.js
index b7e5ea4eee3..bd7d5cf29d7 100644
--- a/app/assets/javascripts/static_site_editor/index.js
+++ b/app/assets/javascripts/static_site_editor/index.js
@@ -19,6 +19,7 @@ const initStaticSiteEditor = el => {
const router = createRouter(baseUrl);
const apolloProvider = createApolloProvider({
isSupportedContent: parseBoolean(isSupportedContent),
+ hasSubmittedChanges: false,
project: `${namespace}/${project}`,
returnUrl,
sourcePath,
diff --git a/app/assets/javascripts/static_site_editor/pages/home.vue b/app/assets/javascripts/static_site_editor/pages/home.vue
index eef2bd88f0e..5c1af45b831 100644
--- a/app/assets/javascripts/static_site_editor/pages/home.vue
+++ b/app/assets/javascripts/static_site_editor/pages/home.vue
@@ -5,6 +5,7 @@ import InvalidContentMessage from '../components/invalid_content_message.vue';
import SubmitChangesError from '../components/submit_changes_error.vue';
import appDataQuery from '../graphql/queries/app_data.query.graphql';
import sourceContentQuery from '../graphql/queries/source_content.query.graphql';
+import hasSubmittedChangesMutation from '../graphql/mutations/has_submitted_changes.mutation.graphql';
import submitContentChangesMutation from '../graphql/mutations/submit_content_changes.mutation.graphql';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import Tracking from '~/tracking';
@@ -74,6 +75,20 @@ export default {
submitChanges(images) {
this.isSavingChanges = true;
+ // eslint-disable-next-line promise/catch-or-return
+ this.$apollo
+ .mutate({
+ mutation: hasSubmittedChangesMutation,
+ variables: {
+ input: {
+ hasSubmittedChanges: true,
+ },
+ },
+ })
+ .finally(() => {
+ this.$router.push(SUCCESS_ROUTE);
+ });
+
this.$apollo
.mutate({
mutation: submitContentChangesMutation,
@@ -87,9 +102,6 @@ export default {
},
},
})
- .then(() => {
- this.$router.push(SUCCESS_ROUTE);
- })
.catch(e => {
this.submitChangesError = e.message;
})
diff --git a/app/assets/javascripts/static_site_editor/pages/success.vue b/app/assets/javascripts/static_site_editor/pages/success.vue
index f0d597d7c9b..6a3f40cc1db 100644
--- a/app/assets/javascripts/static_site_editor/pages/success.vue
+++ b/app/assets/javascripts/static_site_editor/pages/success.vue
@@ -1,5 +1,5 @@
<script>
-import { GlEmptyState, GlButton } from '@gitlab/ui';
+import { GlButton, GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
import { s__, __, sprintf } from '~/locale';
import savedContentMetaQuery from '../graphql/queries/saved_content_meta.query.graphql';
@@ -8,8 +8,9 @@ import { HOME_ROUTE } from '../router/constants';
export default {
components: {
- GlEmptyState,
GlButton,
+ GlEmptyState,
+ GlLoadingIcon,
},
props: {
mergeRequestsIllustrationPath: {
@@ -33,7 +34,7 @@ export default {
},
},
created() {
- if (!this.savedContentMeta) {
+ if (!this.appData.hasSubmittedChanges) {
this.$router.push(HOME_ROUTE);
}
},
@@ -50,14 +51,21 @@ export default {
assignMergeRequestInstruction: s__(
'StaticSiteEditor|3. Assign a person to review and accept the merge request.',
),
+ submittingTitle: s__('StaticSiteEditor|Creating your merge request'),
+ submittingNotePrimary: s__(
+ 'StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created.',
+ ),
+ submittingNoteSecondary: s__(
+ 'StaticSiteEditor|A link to view the merge request will appear once ready.',
+ ),
};
</script>
<template>
- <div
- v-if="savedContentMeta"
- class="container gl-flex-grow-1 gl-display-flex gl-flex-direction-column"
- >
- <div class="gl-fixed gl-left-0 gl-right-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-100">
+ <div class="container gl-flex-grow-1 gl-display-flex gl-flex-direction-column">
+ <div
+ v-if="savedContentMeta"
+ class="gl-fixed gl-left-0 gl-right-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-100"
+ >
<div class="container gl-py-4">
<gl-button
v-if="appData.returnUrl"
@@ -73,16 +81,23 @@ export default {
</div>
<gl-empty-state
class="gl-my-9"
- :primary-button-text="$options.primaryButtonText"
- :title="$options.title"
- :primary-button-link="savedContentMeta.mergeRequest.url"
+ :title="savedContentMeta ? $options.title : $options.submittingTitle"
+ :primary-button-text="savedContentMeta && $options.primaryButtonText"
+ :primary-button-link="savedContentMeta && savedContentMeta.mergeRequest.url"
:svg-path="mergeRequestsIllustrationPath"
>
<template #description>
- <p>{{ $options.mergeRequestInstructionsHeading }}</p>
- <p>{{ $options.addTitleInstruction }}</p>
- <p>{{ $options.addDescriptionInstruction }}</p>
- <p>{{ $options.assignMergeRequestInstruction }}</p>
+ <div v-if="savedContentMeta">
+ <p>{{ $options.mergeRequestInstructionsHeading }}</p>
+ <p>{{ $options.addTitleInstruction }}</p>
+ <p>{{ $options.addDescriptionInstruction }}</p>
+ <p>{{ $options.assignMergeRequestInstruction }}</p>
+ </div>
+ <div v-else>
+ <p>{{ $options.submittingNotePrimary }}</p>
+ <p>{{ $options.submittingNoteSecondary }}</p>
+ <gl-loading-icon size="xl" />
+ </div>
</template>
</gl-empty-state>
</div>
diff --git a/app/assets/javascripts/static_site_editor/services/front_matterify.js b/app/assets/javascripts/static_site_editor/services/front_matterify.js
new file mode 100644
index 00000000000..cbf0fffd515
--- /dev/null
+++ b/app/assets/javascripts/static_site_editor/services/front_matterify.js
@@ -0,0 +1,73 @@
+import jsYaml from 'js-yaml';
+
+const NEW_LINE = '\n';
+
+const hasMatter = (firstThreeChars, fourthChar) => {
+ const isYamlDelimiter = firstThreeChars === '---';
+ const isFourthCharNewline = fourthChar === NEW_LINE;
+ return isYamlDelimiter && isFourthCharNewline;
+};
+
+export const frontMatterify = source => {
+ let index = 3;
+ let offset;
+ const delimiter = source.slice(0, index);
+ const type = 'yaml';
+ const NO_FRONTMATTER = {
+ source,
+ matter: null,
+ spacing: null,
+ content: source,
+ delimiter: null,
+ type: null,
+ };
+
+ if (!hasMatter(delimiter, source.charAt(index))) {
+ return NO_FRONTMATTER;
+ }
+
+ offset = source.indexOf(delimiter, index);
+
+ // Finds the end delimiter that starts at a new line
+ while (offset !== -1 && source.charAt(offset - 1) !== NEW_LINE) {
+ index = offset + delimiter.length;
+ offset = source.indexOf(delimiter, index);
+ }
+
+ if (offset === -1) {
+ return NO_FRONTMATTER;
+ }
+
+ const matterStr = source.slice(index, offset);
+ const matter = jsYaml.safeLoad(matterStr);
+
+ let content = source.slice(offset + delimiter.length);
+ let spacing = '';
+ let idx = 0;
+ while (content.charAt(idx).match(/(\s|\n)/)) {
+ spacing += content.charAt(idx);
+ idx += 1;
+ }
+ content = content.replace(spacing, '');
+
+ return {
+ source,
+ matter,
+ spacing,
+ content,
+ delimiter,
+ type,
+ };
+};
+
+export const stringify = ({ matter, spacing, content, delimiter }, newMatter) => {
+ const matterObj = newMatter || matter;
+
+ if (!matterObj) {
+ return content;
+ }
+
+ const header = `${delimiter}${NEW_LINE}${jsYaml.safeDump(matterObj)}${delimiter}`;
+ const body = `${spacing}${content}`;
+ return `${header}${body}`;
+};
diff --git a/app/assets/javascripts/static_site_editor/services/parse_source_file.js b/app/assets/javascripts/static_site_editor/services/parse_source_file.js
index 640186ee1d0..d4fc8b2edb6 100644
--- a/app/assets/javascripts/static_site_editor/services/parse_source_file.js
+++ b/app/assets/javascripts/static_site_editor/services/parse_source_file.js
@@ -1,7 +1,7 @@
-import grayMatter from 'gray-matter';
+import { frontMatterify, stringify } from './front_matterify';
const parseSourceFile = raw => {
- const remake = source => grayMatter(source, {});
+ const remake = source => frontMatterify(source);
let editable = remake(raw);
@@ -13,20 +13,17 @@ const parseSourceFile = raw => {
}
};
- const trimmedEditable = () => grayMatter.stringify(editable).trim();
+ const content = (isBody = false) => (isBody ? editable.content : stringify(editable));
- const content = (isBody = false) => (isBody ? editable.content.trim() : trimmedEditable()); // gray-matter internally adds an eof newline so we trim to bypass, open issue: https://github.com/jonschlinkert/gray-matter/issues/96
-
- const matter = () => editable.data;
+ const matter = () => editable.matter;
const syncMatter = settings => {
- const source = grayMatter.stringify(editable.content, settings);
- syncContent(source);
+ editable.matter = settings;
};
- const isModified = () => trimmedEditable() !== raw;
+ const isModified = () => stringify(editable) !== raw;
- const hasMatter = () => editable.matter.length > 0;
+ const hasMatter = () => Boolean(editable.matter);
return {
matter,
diff --git a/app/assets/javascripts/vue_shared/components/gl_mentions.vue b/app/assets/javascripts/vue_shared/components/gl_mentions.vue
index d15a2b47bff..e895a7a52ab 100644
--- a/app/assets/javascripts/vue_shared/components/gl_mentions.vue
+++ b/app/assets/javascripts/vue_shared/components/gl_mentions.vue
@@ -66,12 +66,10 @@ const autoCompleteMap = {
}
if (doesCurrentLineStartWith('/assign', fullText, selectionStart)) {
- return this.members.filter(
- member => member.type === 'User' && !this.assignees.includes(member.username),
- );
- } else if (doesCurrentLineStartWith('/reassign', fullText, selectionStart)) {
- return this.members.filter(member => member.type === 'User');
- } else if (doesCurrentLineStartWith('/unassign', fullText, selectionStart)) {
+ return this.members.filter(member => !this.assignees.includes(member.username));
+ }
+
+ if (doesCurrentLineStartWith('/unassign', fullText, selectionStart)) {
return this.members.filter(member => this.assignees.includes(member.username));
}
diff --git a/app/assets/javascripts/vue_shared/components/members/constants.js b/app/assets/javascripts/vue_shared/components/members/constants.js
index 5c6bb0cf9bd..9dc0ec97ce6 100644
--- a/app/assets/javascripts/vue_shared/components/members/constants.js
+++ b/app/assets/javascripts/vue_shared/components/members/constants.js
@@ -62,3 +62,5 @@ export const MEMBER_TYPES = {
invite: 'invite',
accessRequest: 'accessRequest',
};
+
+export const DAYS_TO_EXPIRE_SOON = 7;
diff --git a/app/assets/javascripts/vue_shared/components/members/table/created_at.vue b/app/assets/javascripts/vue_shared/components/members/table/created_at.vue
new file mode 100644
index 00000000000..0bad70894f9
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/members/table/created_at.vue
@@ -0,0 +1,40 @@
+<script>
+import { GlSprintf } from '@gitlab/ui';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+export default {
+ name: 'CreatedAt',
+ components: { GlSprintf, TimeAgoTooltip },
+ props: {
+ date: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ createdBy: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ showCreatedBy() {
+ return this.createdBy?.name && this.createdBy?.webUrl;
+ },
+ },
+};
+</script>
+
+<template>
+ <span>
+ <gl-sprintf v-if="showCreatedBy" :message="s__('Members|%{time} by %{user}')">
+ <template #time>
+ <time-ago-tooltip :time="date" />
+ </template>
+ <template #user>
+ <a :href="createdBy.webUrl">{{ createdBy.name }}</a>
+ </template>
+ </gl-sprintf>
+ <time-ago-tooltip v-else :time="date" />
+ </span>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue b/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue
new file mode 100644
index 00000000000..de65e3fb10f
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue
@@ -0,0 +1,66 @@
+<script>
+import { GlSprintf, GlTooltipDirective } from '@gitlab/ui';
+import {
+ approximateDuration,
+ differenceInSeconds,
+ formatDate,
+ getDayDifference,
+} from '~/lib/utils/datetime_utility';
+import { DAYS_TO_EXPIRE_SOON } from '../constants';
+
+export default {
+ name: 'ExpiresAt',
+ components: { GlSprintf },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ date: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ noExpirationSet() {
+ return this.date === null;
+ },
+ parsed() {
+ return new Date(this.date);
+ },
+ differenceInSeconds() {
+ return differenceInSeconds(new Date(), this.parsed);
+ },
+ isExpired() {
+ return this.differenceInSeconds <= 0;
+ },
+ inWords() {
+ return approximateDuration(this.differenceInSeconds);
+ },
+ formatted() {
+ return formatDate(this.parsed);
+ },
+ expiresSoon() {
+ return getDayDifference(new Date(), this.parsed) < DAYS_TO_EXPIRE_SOON;
+ },
+ cssClass() {
+ return {
+ 'gl-text-red-500': this.isExpired,
+ 'gl-text-orange-500': this.expiresSoon,
+ };
+ },
+ },
+};
+</script>
+
+<template>
+ <span v-if="noExpirationSet">{{ s__('Members|No expiration set') }}</span>
+ <span v-else v-gl-tooltip.hover :title="formatted" :class="cssClass">
+ <template v-if="isExpired">{{ s__('Members|Expired') }}</template>
+ <gl-sprintf v-else :message="s__('Members|in %{time}')">
+ <template #time>
+ {{ inWords }}
+ </template>
+ </gl-sprintf>
+ </span>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/members/table/members_table.vue b/app/assets/javascripts/vue_shared/components/members/table/members_table.vue
index 85be74d4346..4401250a665 100644
--- a/app/assets/javascripts/vue_shared/components/members/table/members_table.vue
+++ b/app/assets/javascripts/vue_shared/components/members/table/members_table.vue
@@ -5,6 +5,8 @@ import { FIELDS } from '../constants';
import initUserPopovers from '~/user_popovers';
import MemberAvatar from './member_avatar.vue';
import MemberSource from './member_source.vue';
+import CreatedAt from './created_at.vue';
+import ExpiresAt from './expires_at.vue';
import MembersTableCell from './members_table_cell.vue';
export default {
@@ -12,6 +14,8 @@ export default {
components: {
GlTable,
MemberAvatar,
+ CreatedAt,
+ ExpiresAt,
MembersTableCell,
MemberSource,
},
@@ -51,6 +55,22 @@ export default {
</members-table-cell>
</template>
+ <template #cell(granted)="{ item: { createdAt, createdBy } }">
+ <created-at :date="createdAt" :created-by="createdBy" />
+ </template>
+
+ <template #cell(invited)="{ item: { createdAt, createdBy } }">
+ <created-at :date="createdAt" :created-by="createdBy" />
+ </template>
+
+ <template #cell(requested)="{ item: { createdAt } }">
+ <created-at :date="createdAt" />
+ </template>
+
+ <template #cell(expires)="{ item: { expiresAt } }">
+ <expires-at :date="expiresAt" />
+ </template>
+
<template #head(actions)="{ label }">
<span data-testid="col-actions" class="gl-sr-only">{{ label }}</span>
</template>
diff --git a/app/assets/javascripts/whats_new/components/app.vue b/app/assets/javascripts/whats_new/components/app.vue
index 9fc19c51083..ed17927c5b2 100644
--- a/app/assets/javascripts/whats_new/components/app.vue
+++ b/app/assets/javascripts/whats_new/components/app.vue
@@ -1,6 +1,9 @@
<script>
import { mapState, mapActions } from 'vuex';
import { GlDrawer, GlBadge, GlIcon, GlLink } from '@gitlab/ui';
+import Tracking from '~/tracking';
+
+const trackingMixin = Tracking.mixin();
export default {
components: {
@@ -9,6 +12,7 @@ export default {
GlIcon,
GlLink,
},
+ mixins: [trackingMixin],
props: {
features: {
type: String,
@@ -37,6 +41,11 @@ export default {
},
mounted() {
this.openDrawer(this.storageKey);
+
+ const body = document.querySelector('body');
+ const namespaceId = body.getAttribute('data-namespace-id');
+
+ this.track('click_whats_new_drawer', { label: 'namespace_id', value: namespaceId });
},
methods: {
...mapActions(['openDrawer', 'closeDrawer']),
@@ -52,7 +61,14 @@ export default {
</template>
<div class="pb-6">
<div v-for="feature in parsedFeatures" :key="feature.title" class="mb-6">
- <gl-link :href="feature.url" target="_blank">
+ <gl-link
+ :href="feature.url"
+ target="_blank"
+ data-testid="whats-new-title-link"
+ data-track-event="click_whats_new_item"
+ :data-track-label="feature.title"
+ :data-track-property="feature.url"
+ >
<h5 class="gl-font-base">{{ feature.title }}</h5>
</gl-link>
<div class="mb-2">
@@ -62,7 +78,13 @@ export default {
</gl-badge>
</template>
</div>
- <gl-link :href="feature.url" target="_blank">
+ <gl-link
+ :href="feature.url"
+ target="_blank"
+ data-track-event="click_whats_new_item"
+ :data-track-label="feature.title"
+ :data-track-property="feature.url"
+ >
<img
:alt="feature.title"
:src="feature.image_url"
@@ -70,7 +92,14 @@ export default {
/>
</gl-link>
<p class="pt-2">{{ feature.body }}</p>
- <gl-link :href="feature.url" target="_blank">{{ __('Learn more') }}</gl-link>
+ <gl-link
+ :href="feature.url"
+ target="_blank"
+ data-track-event="click_whats_new_item"
+ :data-track-label="feature.title"
+ :data-track-property="feature.url"
+ >{{ __('Learn more') }}</gl-link
+ >
</div>
</div>
</gl-drawer>
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 8acd338fff8..f3442e437b4 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -36,17 +36,6 @@
// EE-only stylesheets
@import 'application_ee';
-// CSS util classes
-/**
- These are deprecated in favor of the Gitlab UI utilities imported below.
- Please check https://unpkg.com/browse/@gitlab/ui/src/scss/utilities.scss
- to see the available utility classes.
-**/
-@import 'utilities';
-
-// Gitlab UI util classes
-@import '@gitlab/ui/src/scss/utilities';
-
/* print styles */
@media print {
@import 'print';
diff --git a/app/assets/stylesheets/application_utilities.scss b/app/assets/stylesheets/application_utilities.scss
new file mode 100644
index 00000000000..817e983a0ec
--- /dev/null
+++ b/app/assets/stylesheets/application_utilities.scss
@@ -0,0 +1,12 @@
+@import 'page_bundles/mixins_and_variables_and_functions';
+
+// CSS util classes
+/**
+ These are deprecated in favor of the Gitlab UI utilities imported below.
+ Please check https://unpkg.com/browse/@gitlab/ui/src/scss/utilities.scss
+ to see the available utility classes.
+**/
+@import 'utilities';
+
+// Gitlab UI util classes
+@import '@gitlab/ui/src/scss/utilities';
diff --git a/app/assets/stylesheets/application_utilities_dark.scss b/app/assets/stylesheets/application_utilities_dark.scss
new file mode 100644
index 00000000000..eb32cdfc444
--- /dev/null
+++ b/app/assets/stylesheets/application_utilities_dark.scss
@@ -0,0 +1,3 @@
+@import './themes/dark';
+
+@import 'application_utilities';
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 68b8a2e23f2..665184f268c 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -357,6 +357,12 @@ module ApplicationHelper
}
end
+ def add_page_specific_style(path)
+ content_for :page_specific_styles do
+ stylesheet_link_tag_defer path
+ end
+ end
+
def page_startup_api_calls
@api_startup_calls
end
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 65e363e33e7..de1cd7cd981 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -69,7 +69,7 @@ module QuickActions
def extract_users(params)
return [] if params.nil?
- users = extract_references(params, :mentioned_user)
+ users = extract_references(params, :user)
if users.empty?
users =
diff --git a/app/validators/addressable_url_validator.rb b/app/validators/addressable_url_validator.rb
index 9fa99903e36..c6d9bd73566 100644
--- a/app/validators/addressable_url_validator.rb
+++ b/app/validators/addressable_url_validator.rb
@@ -80,7 +80,7 @@ class AddressableUrlValidator < ActiveModel::EachValidator
value = strip_value!(record, attribute, value)
- Gitlab::UrlBlocker.validate!(value, blocker_args)
+ Gitlab::UrlBlocker.validate!(value, **blocker_args)
rescue Gitlab::UrlBlocker::BlockedUrlError => e
record.errors.add(attribute, options.fetch(:blocked_message) % { exception_message: e.message })
end
diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml
index ff991ccea71..923e78ad360 100644
--- a/app/views/dashboard/milestones/index.html.haml
+++ b/app/views/dashboard/milestones/index.html.haml
@@ -1,7 +1,7 @@
- @hide_top_links = true
- page_title _('Milestones')
- header_title _('Milestones'), dashboard_milestones_path
-= stylesheet_link_tag 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/milestone'
.page-title-holder.d-flex.align-items-center
%h1.page-title= _('Milestones')
diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml
index 9c6a6be1bc3..44d968ae26d 100644
--- a/app/views/dashboard/todos/index.html.haml
+++ b/app/views/dashboard/todos/index.html.haml
@@ -3,7 +3,7 @@
- header_title _("To-Do List"), dashboard_todos_path
= render_dashboard_gold_trial(current_user)
-= stylesheet_link_tag 'page_bundles/todos'
+- add_page_specific_style 'page_bundles/todos'
.page-title-holder.d-flex.align-items-center
%h1.page-title= _('To-Do List')
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 83796444b6c..d20fa938a68 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -1,5 +1,5 @@
- page_title _("Milestones")
-= stylesheet_link_tag 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/milestone'
.top-area
= render 'shared/milestones_filter', counts: @milestone_states
diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml
index fdcce864c24..5bbdd3a3b19 100644
--- a/app/views/groups/milestones/show.html.haml
+++ b/app/views/groups/milestones/show.html.haml
@@ -1,4 +1,4 @@
-= stylesheet_link_tag 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/milestone'
= render "header_title"
= render 'shared/milestones/top', milestone: @milestone, group: @group
= render 'shared/milestones/tabs', milestone: @milestone, show_project_name: true
diff --git a/app/views/ide/_show.html.haml b/app/views/ide/_show.html.haml
index d0384fd50bc..79cba2a54b0 100644
--- a/app/views/ide/_show.html.haml
+++ b/app/views/ide/_show.html.haml
@@ -1,8 +1,7 @@
- @body_class = 'ide-layout'
- page_title _('IDE')
-- content_for :page_specific_javascripts do
- = stylesheet_link_tag 'page_bundles/ide'
+- add_page_specific_style 'page_bundles/ide'
#ide.ide-loading{ data: ide_data }
.text-center
diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml
index f7ecfd09209..32dd9a7c275 100644
--- a/app/views/jira_connect/subscriptions/index.html.haml
+++ b/app/views/jira_connect/subscriptions/index.html.haml
@@ -25,4 +25,4 @@
%td= link_to 'Remove', jira_connect_subscription_path(subscription), class: 'remove-subscription'
= page_specific_javascript_tag('jira_connect.js')
-= stylesheet_link_tag 'page_bundles/jira_connect'
+- add_page_specific_style 'page_bundles/jira_connect'
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 3e85e1f5b90..e30f76593ac 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -50,8 +50,14 @@
= render 'layouts/startup_css'
- if user_application_theme == 'gl-dark'
= stylesheet_link_tag_defer "application_dark"
+ - if content_for?(:page_specific_styles)
+ = yield :page_specific_styles
+ = stylesheet_link_tag_defer "application_utilities_dark"
- else
= stylesheet_link_tag_defer "application"
+ - if content_for?(:page_specific_styles)
+ = yield :page_specific_styles
+ = stylesheet_link_tag_defer "application_utilities"
- unless use_startup_css?
= stylesheet_link_tag_defer "themes/#{user_application_theme_css_filename}" if user_application_theme_css_filename
= stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations']
diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml
index fdeb3d3c9ac..175c9af63c7 100644
--- a/app/views/layouts/jira_connect.html.haml
+++ b/app/views/layouts/jira_connect.html.haml
@@ -7,6 +7,8 @@
= stylesheet_link_tag 'https://unpkg.com/@atlaskit/reduced-ui-pack@10.5.5/dist/bundle.css'
= javascript_include_tag 'https://connect-cdn.atl-paas.net/all.js'
= javascript_include_tag 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js'
+ - if content_for?(:page_specific_styles)
+ = yield :page_specific_styles
= yield :head
%body
.ac-content
diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml
index ca689b0bad7..d99579c25c0 100644
--- a/app/views/projects/cycle_analytics/show.html.haml
+++ b/app/views/projects/cycle_analytics/show.html.haml
@@ -1,6 +1,5 @@
- page_title _("Value Stream Analytics")
-- content_for :page_specific_javascripts do
- = stylesheet_link_tag 'page_bundles/cycle_analytics'
+- add_page_specific_style 'page_bundles/cycle_analytics'
#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
- if @cycle_analytics_no_data
diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml
index 929015023d2..308dcf6d7be 100644
--- a/app/views/projects/environments/show.html.haml
+++ b/app/views/projects/environments/show.html.haml
@@ -1,9 +1,7 @@
- add_to_breadcrumbs _("Environments"), project_environments_path(@project)
- breadcrumb_title @environment.name
- page_title _("Environments")
-
-- content_for :page_specific_javascripts do
- = stylesheet_link_tag 'page_bundles/xterm'
+- add_page_specific_style 'page_bundles/xterm'
#environments-detail-view{ data: { name: @environment.name, id: @environment.id, delete_path: environment_delete_path(@environment)} }
- if @environment.available? && can?(current_user, :stop_environment, @environment)
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index 8a093131d35..7fa158e0024 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -2,7 +2,7 @@
- page_title _("Issues")
- new_issue_email = @project.new_issuable_address(current_user, 'issue')
-= stylesheet_link_tag 'page_bundles/issues'
+- add_page_specific_style 'page_bundles/issues'
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} issues")
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index 70b0f2d4d27..c16ebd95429 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -12,7 +12,7 @@
- can_report_spam = @issue.submittable_as_spam_by?(current_user)
- can_create_issue = show_new_issue_link?(@project)
- related_branches_path = related_branches_project_issue_path(@project, @issue)
-= stylesheet_link_tag 'page_bundles/issues'
+- add_page_specific_style 'page_bundles/issues'
= render_if_exists "projects/issues/alert_blocked", issue: @issue, current_user: current_user
= render "projects/issues/alert_moved_from_service_desk", issue: @issue
diff --git a/app/views/projects/jobs/show.html.haml b/app/views/projects/jobs/show.html.haml
index df98a1c7cce..d7a778088ee 100644
--- a/app/views/projects/jobs/show.html.haml
+++ b/app/views/projects/jobs/show.html.haml
@@ -1,9 +1,7 @@
- add_to_breadcrumbs _("Jobs"), project_jobs_path(@project)
- breadcrumb_title "##{@build.id}"
- page_title "#{@build.name} (##{@build.id})", _("Jobs")
-
-- content_for :page_specific_javascripts do
- = stylesheet_link_tag 'page_bundles/xterm'
+- add_page_specific_style 'page_bundles/xterm'
= render_if_exists "shared/shared_runners_minutes_limit_flash_message"
diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml
index 31303e2b9f8..6e81058df2a 100644
--- a/app/views/projects/milestones/index.html.haml
+++ b/app/views/projects/milestones/index.html.haml
@@ -1,5 +1,5 @@
- page_title _('Milestones')
-= stylesheet_link_tag 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/milestone'
.top-area
= render 'shared/milestones_filter', counts: milestone_counts(@project.milestones)
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index f575d8178ac..e7cc75e871a 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -2,7 +2,7 @@
- breadcrumb_title @milestone.title
- page_title @milestone.title, _('Milestones')
- page_description @milestone.description
-= stylesheet_link_tag 'page_bundles/milestone'
+- add_page_specific_style 'page_bundles/milestone'
= render 'shared/milestones/header', milestone: @milestone
= render 'shared/milestones/description', milestone: @milestone
diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml
index 861f9ea427a..879afff0474 100644
--- a/app/views/shared/boards/_show.html.haml
+++ b/app/views/shared/boards/_show.html.haml
@@ -8,7 +8,7 @@
- @content_class = "issue-boards-content js-focus-mode-board"
- breadcrumb_title _("Issue Boards")
- page_title("#{board.name}", _("Boards"))
-= stylesheet_link_tag 'page_bundles/boards'
+- add_page_specific_style 'page_bundles/boards'
- content_for :page_specific_javascripts do
diff --git a/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml b/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml
new file mode 100644
index 00000000000..d6e5dadb688
--- /dev/null
+++ b/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml
@@ -0,0 +1,5 @@
+---
+title: Add projects_creating_incidents to usage ping counts
+merge_request: 42934
+author:
+type: added
diff --git a/changelogs/unreleased/241738-prevent-assignment-to-groups.yml b/changelogs/unreleased/241738-prevent-assignment-to-groups.yml
deleted file mode 100644
index 56ba318d16f..00000000000
--- a/changelogs/unreleased/241738-prevent-assignment-to-groups.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Prevent assignment of groups using quick actions
-merge_request: 42810
-author:
-type: fixed
diff --git a/changelogs/unreleased/244873-perceived-ux-success-screen.yml b/changelogs/unreleased/244873-perceived-ux-success-screen.yml
new file mode 100644
index 00000000000..13722416404
--- /dev/null
+++ b/changelogs/unreleased/244873-perceived-ux-success-screen.yml
@@ -0,0 +1,5 @@
+---
+title: Update user feedback to a dedicated page as opposed to solely a button with a loader
+merge_request: 43189
+author:
+type: changed
diff --git a/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml b/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml
new file mode 100644
index 00000000000..a995bfe7a7f
--- /dev/null
+++ b/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml
@@ -0,0 +1,6 @@
+---
+title: Add a database column to enable or disable the setting that puts newly registered
+ users in a pending state, requiring admin approval for their activation
+merge_request: 43661
+author:
+type: added
diff --git a/changelogs/unreleased/zj-update-lang-colors.yml b/changelogs/unreleased/zj-update-lang-colors.yml
new file mode 100644
index 00000000000..72b2bc01b08
--- /dev/null
+++ b/changelogs/unreleased/zj-update-lang-colors.yml
@@ -0,0 +1,5 @@
+---
+title: Update programming language colors and metadata
+merge_request: 43111
+author:
+type: changed
diff --git a/config/application.rb b/config/application.rb
index 4971d2853b9..c39061a9824 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -174,6 +174,8 @@ module Gitlab
config.assets.paths << Gemojione.images_path
config.assets.paths << "#{config.root}/vendor/assets/fonts"
+ config.assets.precompile << "application_utilities.css"
+ config.assets.precompile << "application_utilities_dark.css"
config.assets.precompile << "application_dark.css"
config.assets.precompile << "startup/*.css"
diff --git a/db/migrate/20200923102312_update_programming_language_colors.rb b/db/migrate/20200923102312_update_programming_language_colors.rb
new file mode 100644
index 00000000000..37233bd3148
--- /dev/null
+++ b/db/migrate/20200923102312_update_programming_language_colors.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+require 'yaml'
+
+class UpdateProgrammingLanguageColors < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ class ProgrammingLanguage < ActiveRecord::Base; end
+
+ def up
+ YAML.load_file("vendor/languages.yml").each do |name, metadata|
+ color = metadata["color"]
+ next unless color.present?
+
+ ProgrammingLanguage.where(name: name).update(color: color)
+ end
+ end
+
+ def down
+ # noop
+ end
+end
diff --git a/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb b/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb
new file mode 100644
index 00000000000..ed4dd5b9cc1
--- /dev/null
+++ b/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddIncidentIssueTypeIndexToIssues < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ INCIDENT_ISSUE_TYPE = 1
+ INDEX_NAME = 'index_issues_project_id_issue_type_incident'
+
+ def up
+ add_concurrent_index :issues, :project_id, where: "issue_type = #{INCIDENT_ISSUE_TYPE}", name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name(:issues, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb b/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb
new file mode 100644
index 00000000000..92d82757b79
--- /dev/null
+++ b/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddRequireAdminApprovalAfterUserSignupToApplicationSettings < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :application_settings, :require_admin_approval_after_user_signup, :boolean, default: false, null: false
+ end
+end
diff --git a/db/schema_migrations/20200923102312 b/db/schema_migrations/20200923102312
new file mode 100644
index 00000000000..52ed07034fc
--- /dev/null
+++ b/db/schema_migrations/20200923102312
@@ -0,0 +1 @@
+f19e61e3863905885c8b5b2129be2586d912d616a5b3b54e99a72c5760082059 \ No newline at end of file
diff --git a/db/schema_migrations/20200927224750 b/db/schema_migrations/20200927224750
new file mode 100644
index 00000000000..9454bec58c5
--- /dev/null
+++ b/db/schema_migrations/20200927224750
@@ -0,0 +1 @@
+8e0c5be3d6fe2d0d718c7b7a99d84b14dfc6006f780ec0622eb5aae937e6b367 \ No newline at end of file
diff --git a/db/schema_migrations/20200929063159 b/db/schema_migrations/20200929063159
new file mode 100644
index 00000000000..b7815e9bb39
--- /dev/null
+++ b/db/schema_migrations/20200929063159
@@ -0,0 +1 @@
+9ef08404b964ccae3e12332340f16c6b8bb2bbdb2c04ba105fe1c0c7e6bf84f2 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index d8367b0ab5a..fba163f7417 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -9270,6 +9270,7 @@ CREATE TABLE application_settings (
gitpod_enabled boolean DEFAULT false NOT NULL,
gitpod_url text DEFAULT 'https://gitpod.io/'::text,
abuse_notification_email character varying,
+ require_admin_approval_after_user_signup boolean DEFAULT false NOT NULL,
CONSTRAINT check_2dba05b802 CHECK ((char_length(gitpod_url) <= 255)),
CONSTRAINT check_51700b31b5 CHECK ((char_length(default_branch_name) <= 255)),
CONSTRAINT check_9c6c447a13 CHECK ((char_length(maintenance_mode_message) <= 255)),
@@ -20372,6 +20373,8 @@ CREATE INDEX index_issues_on_updated_at ON issues USING btree (updated_at);
CREATE INDEX index_issues_on_updated_by_id ON issues USING btree (updated_by_id) WHERE (updated_by_id IS NOT NULL);
+CREATE INDEX index_issues_project_id_issue_type_incident ON issues USING btree (project_id) WHERE (issue_type = 1);
+
CREATE UNIQUE INDEX index_jira_connect_installations_on_client_key ON jira_connect_installations USING btree (client_key);
CREATE INDEX index_jira_connect_subscriptions_on_namespace_id ON jira_connect_subscriptions USING btree (namespace_id);
diff --git a/doc/administration/geo/replication/updating_the_geo_nodes.md b/doc/administration/geo/replication/updating_the_geo_nodes.md
index b78aeb06ebf..9200014ee13 100644
--- a/doc/administration/geo/replication/updating_the_geo_nodes.md
+++ b/doc/administration/geo/replication/updating_the_geo_nodes.md
@@ -21,6 +21,9 @@ Updating Geo nodes involves performing:
NOTE: **Note:**
These general update steps are not intended for [high-availability deployments](https://docs.gitlab.com/omnibus/update/README.html#multi-node--ha-deployment), and will cause downtime. If you want to avoid downtime, consider using [zero downtime updates](https://docs.gitlab.com/omnibus/update/README.html#zero-downtime-updates).
+DANGER: **Danger:**
+In GitLab 13.2 and later versions, promoting a secondary node to a primary while the secondary is paused fails. We are [investigating the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/225173). Do not pause replication before promoting a secondary. If the node is paused, please resume before promoting.
+
To update the Geo nodes when a new GitLab version is released, update **primary**
and all **secondary** nodes:
diff --git a/doc/administration/img/export_audit_log_v13_4.png b/doc/administration/img/export_audit_log_v13_4.png
index 1b404b5742c..e4ba330b8a9 100644
--- a/doc/administration/img/export_audit_log_v13_4.png
+++ b/doc/administration/img/export_audit_log_v13_4.png
Binary files differ
diff --git a/doc/administration/postgresql/external.md b/doc/administration/postgresql/external.md
index 632b68fb014..4a164c66578 100644
--- a/doc/administration/postgresql/external.md
+++ b/doc/administration/postgresql/external.md
@@ -1,3 +1,9 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+---
+
# Configure GitLab using an external PostgreSQL service
If you're hosting GitLab on a cloud provider, you can optionally use a
diff --git a/doc/administration/postgresql/index.md b/doc/administration/postgresql/index.md
index 2720d8e696b..c7ec46db654 100644
--- a/doc/administration/postgresql/index.md
+++ b/doc/administration/postgresql/index.md
@@ -1,11 +1,14 @@
---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
type: reference
---
# Configuring PostgreSQL for scaling
In this section, you'll be guided through configuring a PostgreSQL database to
-be used with GitLab in one of our [Scalable and Highly Available Setups](../reference_architectures/index.md).
+be used with GitLab in one of our [reference architectures](../reference_architectures/index.md).
There are essentially three setups to choose from.
## PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM ONLY)**
diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md
index 9db3e017359..b946c0949c4 100644
--- a/doc/administration/postgresql/pgbouncer.md
+++ b/doc/administration/postgresql/pgbouncer.md
@@ -1,4 +1,7 @@
---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
type: reference
---
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index 20878f49cd9..a9584f2ffd7 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -1,10 +1,16 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+---
+
# PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM ONLY)**
-This document will focus only on configuration supported with [GitLab Premium](https://about.gitlab.com/pricing/), using the Omnibus GitLab package.
-If you are a Community Edition or Starter user, consider using a cloud hosted solution.
-This document will not cover installations from source.
+This document focuses on configuration supported with [GitLab Premium](https://about.gitlab.com/pricing/), using the Omnibus GitLab package.
+If you're a Community Edition or Starter user, consider using a cloud hosted solution.
+This document doesn't cover installations from source.
-If a setup with replication and failover is not what you were looking for, see
+If a setup with replication and failover isn't what you were looking for, see
the [database configuration document](https://docs.gitlab.com/omnibus/settings/database.html)
for the Omnibus GitLab packages.
diff --git a/doc/administration/postgresql/standalone.md b/doc/administration/postgresql/standalone.md
index 2747749066e..2ac74e8a4a0 100644
--- a/doc/administration/postgresql/standalone.md
+++ b/doc/administration/postgresql/standalone.md
@@ -1,15 +1,21 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+---
+
# Standalone PostgreSQL using Omnibus GitLab **(CORE ONLY)**
If you wish to have your database service hosted separately from your GitLab
-application server(s), you can do this using the PostgreSQL binaries packaged
+application servers, you can do this using the PostgreSQL binaries packaged
together with Omnibus GitLab. This is recommended as part of our
[reference architecture for up to 2,000 users](../reference_architectures/2k_users.md).
## Setting it up
-1. SSH into the PostgreSQL server.
-1. [Download/install](https://about.gitlab.com/install/) the Omnibus GitLab
- package you want using **steps 1 and 2** from the GitLab downloads page.
+1. SSH in to the PostgreSQL server.
+1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
+ package you want using *steps 1 and 2* from the GitLab downloads page.
- Do not complete any other steps on the download page.
1. Generate a password hash for PostgreSQL. This assumes you will use the default
username of `gitlab` (recommended). The command will request a password
diff --git a/doc/api/members.md b/doc/api/members.md
index 76d63b277c4..43012a5cb80 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -223,6 +223,58 @@ Example response:
}
```
+## List all billable members of a group
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217384) in GitLab 13.5.
+
+Gets a list of group members who counts as billable, including members in the sub group/project.
+
+This function takes [pagination](README.md#pagination) parameters `page` and `per_page` to restrict the list of users.
+
+```plaintext
+GET /groups/:id/billable_members
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "username": "raymond_smith",
+ "name": "Raymond Smith",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ },
+ {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "email": "john@example.com"
+ },
+ {
+ "id": 3,
+ "username": "foo_bar",
+ "name": "Foo bar",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ }
+]
+```
+
## Add a member to a group or project
Adds a member to a group or project.
diff --git a/doc/ci/img/ci_lint.png b/doc/ci/img/ci_lint.png
index e62de011293..fdc3868cdce 100644
--- a/doc/ci/img/ci_lint.png
+++ b/doc/ci/img/ci_lint.png
Binary files differ
diff --git a/doc/ci/img/ci_lint_dry_run.png b/doc/ci/img/ci_lint_dry_run.png
index 4092b66d534..61d6379f70e 100644
--- a/doc/ci/img/ci_lint_dry_run.png
+++ b/doc/ci/img/ci_lint_dry_run.png
Binary files differ
diff --git a/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png b/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png
index 1715e8224ab..421fddaf38d 100644
--- a/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png
+++ b/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png
Binary files differ
diff --git a/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png b/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png
index 0956e76804e..59276bda727 100644
--- a/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png
+++ b/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png
Binary files differ
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index e3f1d4f705e..d3520ca9c2f 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -780,6 +780,25 @@ to advertise the need for lookahead:
For an example of real world use, please
see [`ResolvesMergeRequests`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/graphql/resolvers/concerns/resolves_merge_requests.rb).
+### Negated arguments
+
+Negated filters can filter some resources (for example, find all issues that
+have the `bug` label, but don't have the `bug2` label assigned). The `not`
+argument is the preferred syntax to pass negated arguments:
+
+```graphql
+issues(labelName: "bug", not: {labelName: "bug2"}) {
+ nodes {
+ id
+ title
+ }
+}
+```
+
+To avoid duplicated argument definitions, you can place these arguments in a reusable module (or
+class, if the arguments are nested). Alternatively, you can consider to add a
+[helper resolver method](https://gitlab.com/gitlab-org/gitlab/-/issues/258969).
+
## Pass a parent object into a child Presenter
Sometimes you need to access the resolved query parent in a child context to compute fields. Usually the parent is only
diff --git a/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png b/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png
index 4f6d3b3dfa4..3c3203265e1 100644
--- a/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png
+++ b/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png
Binary files differ
diff --git a/doc/user/admin_area/analytics/img/cohorts_v13_4.png b/doc/user/admin_area/analytics/img/cohorts_v13_4.png
index 4af1841a033..6f7dd5101f2 100644
--- a/doc/user/admin_area/analytics/img/cohorts_v13_4.png
+++ b/doc/user/admin_area/analytics/img/cohorts_v13_4.png
Binary files differ
diff --git a/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png b/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png
index 1fa070a6915..d47d86cd514 100644
--- a/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png
+++ b/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png
Binary files differ
diff --git a/doc/user/analytics/img/mr_throughput_chart_v13_3.png b/doc/user/analytics/img/mr_throughput_chart_v13_3.png
index 04fa54f323c..100c9a8557c 100644
--- a/doc/user/analytics/img/mr_throughput_chart_v13_3.png
+++ b/doc/user/analytics/img/mr_throughput_chart_v13_3.png
Binary files differ
diff --git a/doc/user/analytics/img/mr_throughput_table_v13_3.png b/doc/user/analytics/img/mr_throughput_table_v13_3.png
index 63ffb9389f4..bb63770dc3f 100644
--- a/doc/user/analytics/img/mr_throughput_table_v13_3.png
+++ b/doc/user/analytics/img/mr_throughput_table_v13_3.png
Binary files differ
diff --git a/doc/user/analytics/img/new_value_stream_v13_3.png b/doc/user/analytics/img/new_value_stream_v13_3.png
index 4284b8ab194..bc8502e85a6 100644
--- a/doc/user/analytics/img/new_value_stream_v13_3.png
+++ b/doc/user/analytics/img/new_value_stream_v13_3.png
Binary files differ
diff --git a/doc/user/analytics/img/vsa_filter_bar_v13.3.png b/doc/user/analytics/img/vsa_filter_bar_v13.3.png
index 71e59892434..506765f63cb 100644
--- a/doc/user/analytics/img/vsa_filter_bar_v13.3.png
+++ b/doc/user/analytics/img/vsa_filter_bar_v13.3.png
Binary files differ
diff --git a/doc/user/application_security/img/cve_request_communication.png b/doc/user/application_security/img/cve_request_communication.png
index 0766b371c11..5c58df463ef 100644
--- a/doc/user/application_security/img/cve_request_communication.png
+++ b/doc/user/application_security/img/cve_request_communication.png
Binary files differ
diff --git a/doc/user/application_security/img/cve_request_communication_publication.png b/doc/user/application_security/img/cve_request_communication_publication.png
index 9e34c217e13..9eb6f2f8d9f 100644
--- a/doc/user/application_security/img/cve_request_communication_publication.png
+++ b/doc/user/application_security/img/cve_request_communication_publication.png
Binary files differ
diff --git a/doc/user/application_security/img/new_cve_request_issue.png b/doc/user/application_security/img/new_cve_request_issue.png
index a342c73992e..6ea7ca4a2ab 100644
--- a/doc/user/application_security/img/new_cve_request_issue.png
+++ b/doc/user/application_security/img/new_cve_request_issue.png
Binary files differ
diff --git a/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png b/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png
index f497b0fbc4e..7b04988afdb 100644
--- a/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png
+++ b/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png b/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png
index fc847b578f5..b9b6dd13294 100644
--- a/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png
+++ b/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability-check_v13_4.png b/doc/user/application_security/img/vulnerability-check_v13_4.png
index e0b53059b45..3e38f6eebe7 100644
--- a/doc/user/application_security/img/vulnerability-check_v13_4.png
+++ b/doc/user/application_security/img/vulnerability-check_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/img/vulnerability_solution.png b/doc/user/application_security/img/vulnerability_solution.png
index 97d7736d798..63e9c1473b6 100644
--- a/doc/user/application_security/img/vulnerability_solution.png
+++ b/doc/user/application_security/img/vulnerability_solution.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png b/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png
index 10130da0f89..0310ef3ea0a 100644
--- a/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png
index d7d5961087c..4223494c294 100644
--- a/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png
index 3c618090be8..5edceb32e5c 100644
--- a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png
index 5e52bcc650a..5379b5c6e5d 100644
--- a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png
index 163288fd5a7..eb1dfe6c6f4 100644
--- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png
index 34c64f830ba..adae37e0190 100644
--- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png
+++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png
index 8b55bacc4fb..ea4f188c80e 100644
--- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png b/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png
index 6de51fe29bd..760942c3239 100644
--- a/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png
+++ b/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png
Binary files differ
diff --git a/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png b/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png
index a06f8812b41..89f4e917567 100644
--- a/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png
+++ b/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png
Binary files differ
diff --git a/doc/user/compliance/license_compliance/img/license-check_v13_4.png b/doc/user/compliance/license_compliance/img/license-check_v13_4.png
index d3658cbaa18..bc80f938395 100644
--- a/doc/user/compliance/license_compliance/img/license-check_v13_4.png
+++ b/doc/user/compliance/license_compliance/img/license-check_v13_4.png
Binary files differ
diff --git a/doc/user/img/feature_flags_history_note_info_v13_2.png b/doc/user/img/feature_flags_history_note_info_v13_2.png
index 403a6002603..07d096b6dde 100644
--- a/doc/user/img/feature_flags_history_note_info_v13_2.png
+++ b/doc/user/img/feature_flags_history_note_info_v13_2.png
Binary files differ
diff --git a/doc/user/img/version_history_notes_collapsed_v13_2.png b/doc/user/img/version_history_notes_collapsed_v13_2.png
index 42ea11ae8ff..b85c9cb36dd 100644
--- a/doc/user/img/version_history_notes_collapsed_v13_2.png
+++ b/doc/user/img/version_history_notes_collapsed_v13_2.png
Binary files differ
diff --git a/doc/user/project/import/img/manifest_status_v13_3.png b/doc/user/project/import/img/manifest_status_v13_3.png
index 3f0063e6715..c1a55ba1f50 100644
--- a/doc/user/project/import/img/manifest_status_v13_3.png
+++ b/doc/user/project/import/img/manifest_status_v13_3.png
Binary files differ
diff --git a/lib/gitlab/ci/pipeline/chain/command.rb b/lib/gitlab/ci/pipeline/chain/command.rb
index d1882059dd8..06096a33f27 100644
--- a/lib/gitlab/ci/pipeline/chain/command.rb
+++ b/lib/gitlab/ci/pipeline/chain/command.rb
@@ -16,7 +16,7 @@ module Gitlab
) do
include Gitlab::Utils::StrongMemoize
- def initialize(**params)
+ def initialize(params = {})
params.each do |key, value|
self[key] = value
end
diff --git a/lib/gitlab/ci/variables/collection/item.rb b/lib/gitlab/ci/variables/collection/item.rb
index a072036daa8..84a9280e507 100644
--- a/lib/gitlab/ci/variables/collection/item.rb
+++ b/lib/gitlab/ci/variables/collection/item.rb
@@ -36,9 +36,9 @@ module Gitlab
def self.fabricate(resource)
case resource
when Hash
- self.new(resource.symbolize_keys)
+ self.new(**resource.symbolize_keys)
when ::Ci::HasVariable
- self.new(resource.to_runner_variable)
+ self.new(**resource.to_runner_variable)
when self
resource.dup
else
diff --git a/lib/gitlab/config/entry/factory.rb b/lib/gitlab/config/entry/factory.rb
index 7c5ffaa7621..f76c98f7cbf 100644
--- a/lib/gitlab/config/entry/factory.rb
+++ b/lib/gitlab/config/entry/factory.rb
@@ -79,7 +79,7 @@ module Gitlab
end
def fabricate(entry_class, value = nil)
- entry_class.new(value, @metadata) do |node|
+ entry_class.new(value, **@metadata) do |node|
node.key = @attributes[:key]
node.parent = @attributes[:parent]
node.default = @attributes[:default]
diff --git a/lib/gitlab/config/entry/simplifiable.rb b/lib/gitlab/config/entry/simplifiable.rb
index 315f1947e2c..ee28891a174 100644
--- a/lib/gitlab/config/entry/simplifiable.rb
+++ b/lib/gitlab/config/entry/simplifiable.rb
@@ -19,7 +19,7 @@ module Gitlab
entry = self.class.entry_class(strategy)
- @subject = entry.new(config, metadata, &blk)
+ @subject = entry.new(config, **metadata, &blk)
super(@subject)
end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 7de54d39709..212643901f2 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -138,6 +138,7 @@ module Gitlab
pages_domains: count(PagesDomain),
pool_repositories: count(PoolRepository),
projects: count(Project),
+ projects_creating_incidents: distinct_count(Issue.incident, :project_id),
projects_imported_from_github: count(Project.where(import_type: 'github')),
projects_with_repositories_enabled: count(ProjectFeature.where('repository_access_level > ?', ProjectFeature::DISABLED)),
projects_with_error_tracking_enabled: count(::ErrorTracking::ProjectErrorTrackingSetting.where(enabled: true)),
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 4904fd8ad29..f7e0c185270 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -8,8 +8,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-09-22 19:32+0200\n"
-"PO-Revision-Date: 2020-09-22 19:32+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -15700,6 +15698,18 @@ msgstr ""
msgid "Members with access to %{strong_start}%{group_name}%{strong_end}"
msgstr ""
+msgid "Members|%{time} by %{user}"
+msgstr ""
+
+msgid "Members|Expired"
+msgstr ""
+
+msgid "Members|No expiration set"
+msgstr ""
+
+msgid "Members|in %{time}"
+msgstr ""
+
msgid "Memory Usage"
msgstr ""
@@ -24434,6 +24444,9 @@ msgstr ""
msgid "StaticSiteEditor|3. Assign a person to review and accept the merge request."
msgstr ""
+msgid "StaticSiteEditor|A link to view the merge request will appear once ready."
+msgstr ""
+
msgid "StaticSiteEditor|An error occurred while submitting your changes."
msgstr ""
@@ -24446,6 +24459,9 @@ msgstr ""
msgid "StaticSiteEditor|Could not create merge request."
msgstr ""
+msgid "StaticSiteEditor|Creating your merge request"
+msgstr ""
+
msgid "StaticSiteEditor|Incompatible file content"
msgstr ""
@@ -24467,6 +24483,9 @@ msgstr ""
msgid "StaticSiteEditor|View documentation"
msgstr ""
+msgid "StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created."
+msgstr ""
+
msgid "StaticSiteEditor|Your merge request has been created"
msgstr ""
diff --git a/package.json b/package.json
index 79b6eb6faff..78f09ead5ad 100644
--- a/package.json
+++ b/package.json
@@ -93,7 +93,6 @@
"glob": "^7.1.6",
"graphql": "^14.7.0",
"graphql-tag": "^2.10.1",
- "gray-matter": "^4.0.2",
"immer": "^7.0.7",
"imports-loader": "^0.8.0",
"ipaddr.js": "^1.9.1",
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 62e292c557c..ff78b9e608f 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -297,21 +297,18 @@ RSpec.describe 'GFM autocomplete', :js do
end
context 'assignees' do
- let_it_be(:issue_assignee) { create(:issue, project: project, assignees: [user]) }
- let_it_be(:unassigned_user) { create(:user) }
+ let(:issue_assignee) { create(:issue, project: project) }
+ let(:unassigned_user) { create(:user) }
- let_it_be(:group) { create(:group) }
+ before do
+ issue_assignee.update(assignees: [user])
- before_all do
project.add_maintainer(unassigned_user)
- group.add_developer(user)
end
it 'lists users who are currently not assigned to the issue when using /assign' do
visit project_issue_path(project, issue_assignee)
- wait_for_requests
-
note = find('#note-body')
page.within '.timeline-content-form' do
note.native.send_keys('/as')
@@ -323,7 +320,6 @@ RSpec.describe 'GFM autocomplete', :js do
wait_for_requests
expect(find('#at-view-users .atwho-view-ul')).not_to have_content(user.username)
- expect(find('#at-view-users .atwho-view-ul')).not_to have_content(group.name)
expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username)
end
@@ -336,7 +332,6 @@ RSpec.describe 'GFM autocomplete', :js do
textarea.native.send_keys(:tab)
expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username)
- expect(find('#at-view-users .atwho-view-ul')).not_to have_content(group.name)
expect(find('#at-view-users .atwho-view-ul')).to have_content(user.username)
end
end
@@ -669,21 +664,18 @@ RSpec.describe 'GFM autocomplete', :js do
end
context 'assignees' do
- let_it_be(:issue_assignee) { create(:issue, project: project, assignees: [user]) }
- let_it_be(:unassigned_user) { create(:user) }
+ let(:issue_assignee) { create(:issue, project: project) }
+ let(:unassigned_user) { create(:user) }
- let_it_be(:group) { create(:group) }
+ before do
+ issue_assignee.update(assignees: [user])
- before_all do
project.add_maintainer(unassigned_user)
- group.add_developer(user)
end
it 'lists users who are currently not assigned to the issue when using /assign' do
visit project_issue_path(project, issue_assignee)
- wait_for_requests
-
note = find('#note-body')
page.within '.timeline-content-form' do
note.native.send_keys('/as')
@@ -696,15 +688,12 @@ RSpec.describe 'GFM autocomplete', :js do
wait_for_requests
expect(find('.tribute-container ul', visible: true)).not_to have_content(user.username)
- expect(find('.tribute-container ul', visible: true)).not_to have_content(group.name)
expect(find('.tribute-container ul', visible: true)).to have_content(unassigned_user.username)
end
it 'lists users who are currently not assigned to the issue when using /assign on the second line' do
visit project_issue_path(project, issue_assignee)
- wait_for_requests
-
note = find('#note-body')
page.within '.timeline-content-form' do
note.native.send_keys('/assign @user2')
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 0b62aa20002..38a0da95080 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -491,7 +491,6 @@ describe('GfmAutoComplete', () => {
it('should set the text avatar if avatar_url is null', () => {
expect(membersBeforeSave([{ ...mockGroup, avatar_url: null }])).toEqual([
{
- type: 'Group',
username: 'my-group',
avatarTag: '<div class="avatar rect-avatar center avatar-inline s26">M</div>',
title: 'My Group (2)',
@@ -504,7 +503,6 @@ describe('GfmAutoComplete', () => {
it('should set the image avatar if avatar_url is given', () => {
expect(membersBeforeSave([mockGroup])).toEqual([
{
- type: 'Group',
username: 'my-group',
avatarTag:
'<img src="./group.jpg" alt="my-group" class="avatar rect-avatar avatar-inline center s26"/>',
@@ -518,7 +516,6 @@ describe('GfmAutoComplete', () => {
it('should set mentions disabled icon if mentionsDisabled is set', () => {
expect(membersBeforeSave([{ ...mockGroup, mentionsDisabled: true }])).toEqual([
{
- type: 'Group',
username: 'my-group',
avatarTag:
'<img src="./group.jpg" alt="my-group" class="avatar rect-avatar avatar-inline center s26"/>',
@@ -537,7 +534,6 @@ describe('GfmAutoComplete', () => {
]),
).toEqual([
{
- type: 'User',
username: 'my-user',
avatarTag:
'<img src="./users.jpg" alt="my-user" class="avatar avatar-inline center s26"/>',
diff --git a/spec/frontend/static_site_editor/pages/home_spec.js b/spec/frontend/static_site_editor/pages/home_spec.js
index 41f8a1075c0..ade65b20d6d 100644
--- a/spec/frontend/static_site_editor/pages/home_spec.js
+++ b/spec/frontend/static_site_editor/pages/home_spec.js
@@ -1,4 +1,3 @@
-import Vuex from 'vuex';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import Home from '~/static_site_editor/pages/home.vue';
@@ -7,6 +6,7 @@ import EditArea from '~/static_site_editor/components/edit_area.vue';
import InvalidContentMessage from '~/static_site_editor/components/invalid_content_message.vue';
import SubmitChangesError from '~/static_site_editor/components/submit_changes_error.vue';
import submitContentChangesMutation from '~/static_site_editor/graphql/mutations/submit_content_changes.mutation.graphql';
+import hasSubmittedChangesMutation from '~/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql';
import { SUCCESS_ROUTE } from '~/static_site_editor/router/constants';
import { TRACKING_ACTION_INITIALIZE_EDITOR } from '~/static_site_editor/constants';
@@ -24,8 +24,6 @@ import {
const localVue = createLocalVue();
-localVue.use(Vuex);
-
describe('static_site_editor/pages/home', () => {
let wrapper;
let store;
@@ -33,6 +31,19 @@ describe('static_site_editor/pages/home', () => {
let $router;
let mutateMock;
let trackingSpy;
+ const defaultAppData = {
+ isSupportedContent: true,
+ hasSubmittedChanges: false,
+ returnUrl,
+ project,
+ username,
+ sourcePath,
+ };
+ const hasSubmittedChangesMutationPayload = {
+ data: {
+ appData: { ...defaultAppData, hasSubmittedChanges: true },
+ },
+ };
const buildApollo = (queries = {}) => {
mutateMock = jest.fn();
@@ -64,7 +75,7 @@ describe('static_site_editor/pages/home', () => {
},
data() {
return {
- appData: { isSupportedContent: true, returnUrl, project, username, sourcePath },
+ appData: { ...defaultAppData },
sourceContent: { title, content },
...data,
};
@@ -152,8 +163,14 @@ describe('static_site_editor/pages/home', () => {
});
describe('when submitting changes fails', () => {
+ const setupMutateMock = () => {
+ mutateMock
+ .mockResolvedValueOnce(hasSubmittedChangesMutationPayload)
+ .mockRejectedValueOnce(new Error(submitChangesError));
+ };
+
beforeEach(() => {
- mutateMock.mockRejectedValue(new Error(submitChangesError));
+ setupMutateMock();
buildWrapper();
findEditArea().vm.$emit('submit', { content });
@@ -166,6 +183,8 @@ describe('static_site_editor/pages/home', () => {
});
it('retries submitting changes when retry button is clicked', () => {
+ setupMutateMock();
+
findSubmitChangesError().vm.$emit('retry');
expect(mutateMock).toHaveBeenCalled();
@@ -190,7 +209,11 @@ describe('static_site_editor/pages/home', () => {
const newContent = `new ${content}`;
beforeEach(() => {
- mutateMock.mockResolvedValueOnce({ data: { submitContentChanges: savedContentMeta } });
+ mutateMock.mockResolvedValueOnce(hasSubmittedChangesMutationPayload).mockResolvedValueOnce({
+ data: {
+ submitContentChanges: savedContentMeta,
+ },
+ });
buildWrapper();
findEditArea().vm.$emit('submit', { content: newContent });
@@ -198,8 +221,19 @@ describe('static_site_editor/pages/home', () => {
return wrapper.vm.$nextTick();
});
+ it('dispatches hasSubmittedChanges mutation', () => {
+ expect(mutateMock).toHaveBeenNthCalledWith(1, {
+ mutation: hasSubmittedChangesMutation,
+ variables: {
+ input: {
+ hasSubmittedChanges: true,
+ },
+ },
+ });
+ });
+
it('dispatches submitContentChanges mutation', () => {
- expect(mutateMock).toHaveBeenCalledWith({
+ expect(mutateMock).toHaveBeenNthCalledWith(2, {
mutation: submitContentChangesMutation,
variables: {
input: {
diff --git a/spec/frontend/static_site_editor/pages/success_spec.js b/spec/frontend/static_site_editor/pages/success_spec.js
index 3e19e2413e7..712da4825c7 100644
--- a/spec/frontend/static_site_editor/pages/success_spec.js
+++ b/spec/frontend/static_site_editor/pages/success_spec.js
@@ -1,10 +1,10 @@
import { shallowMount } from '@vue/test-utils';
-import { GlEmptyState, GlButton } from '@gitlab/ui';
+import { GlButton, GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
import Success from '~/static_site_editor/pages/success.vue';
import { savedContentMeta, returnUrl, sourcePath } from '../mock_data';
import { HOME_ROUTE } from '~/static_site_editor/router/constants';
-describe('static_site_editor/pages/success', () => {
+describe('~/static_site_editor/pages/success.vue', () => {
const mergeRequestsIllustrationPath = 'illustrations/merge_requests.svg';
let wrapper;
let router;
@@ -15,14 +15,15 @@ describe('static_site_editor/pages/success', () => {
};
};
- const buildWrapper = (data = {}) => {
+ const buildWrapper = (data = {}, appData = {}) => {
wrapper = shallowMount(Success, {
mocks: {
$router: router,
},
stubs: {
- GlEmptyState,
GlButton,
+ GlEmptyState,
+ GlLoadingIcon,
},
propsData: {
mergeRequestsIllustrationPath,
@@ -33,6 +34,8 @@ describe('static_site_editor/pages/success', () => {
appData: {
returnUrl,
sourcePath,
+ hasSubmittedChanges: true,
+ ...appData,
},
...data,
};
@@ -40,8 +43,9 @@ describe('static_site_editor/pages/success', () => {
});
};
- const findEmptyState = () => wrapper.find(GlEmptyState);
const findReturnUrlButton = () => wrapper.find(GlButton);
+ const findEmptyState = () => wrapper.find(GlEmptyState);
+ const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
beforeEach(() => {
buildRouter();
@@ -52,50 +56,75 @@ describe('static_site_editor/pages/success', () => {
wrapper = null;
});
- it('renders empty state with a link to the created merge request', () => {
- buildWrapper();
+ describe('when savedContentMeta is valid', () => {
+ it('renders empty state with a link to the created merge request', () => {
+ buildWrapper();
+
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findEmptyState().props()).toMatchObject({
+ primaryButtonText: 'View merge request',
+ primaryButtonLink: savedContentMeta.mergeRequest.url,
+ title: 'Your merge request has been created',
+ svgPath: mergeRequestsIllustrationPath,
+ });
+ });
- expect(findEmptyState().exists()).toBe(true);
- expect(findEmptyState().props()).toMatchObject({
- primaryButtonText: 'View merge request',
- primaryButtonLink: savedContentMeta.mergeRequest.url,
- title: 'Your merge request has been created',
- svgPath: mergeRequestsIllustrationPath,
+ it('displays merge request instructions in the empty state', () => {
+ buildWrapper();
+
+ expect(findEmptyState().text()).toContain(
+ 'To see your changes live you will need to do the following things:',
+ );
+ expect(findEmptyState().text()).toContain('1. Add a clear title to describe the change.');
+ expect(findEmptyState().text()).toContain(
+ '2. Add a description to explain why the change is being made.',
+ );
+ expect(findEmptyState().text()).toContain(
+ '3. Assign a person to review and accept the merge request.',
+ );
});
- });
- it('displays merge request instructions in the empty state', () => {
- buildWrapper();
-
- expect(findEmptyState().text()).toContain(
- 'To see your changes live you will need to do the following things:',
- );
- expect(findEmptyState().text()).toContain('1. Add a clear title to describe the change.');
- expect(findEmptyState().text()).toContain(
- '2. Add a description to explain why the change is being made.',
- );
- expect(findEmptyState().text()).toContain(
- '3. Assign a person to review and accept the merge request.',
- );
- });
+ it('displays return to site button', () => {
+ buildWrapper();
+
+ expect(findReturnUrlButton().text()).toBe('Return to site');
+ expect(findReturnUrlButton().attributes().href).toBe(returnUrl);
+ });
- it('displays return to site button', () => {
- buildWrapper();
+ it('displays source path', () => {
+ buildWrapper();
- expect(findReturnUrlButton().text()).toBe('Return to site');
- expect(findReturnUrlButton().attributes().href).toBe(returnUrl);
+ expect(wrapper.text()).toContain(`Update ${sourcePath} file`);
+ });
});
- it('displays source path', () => {
- buildWrapper();
+ describe('when savedContentMeta is invalid', () => {
+ it('renders empty state with a loader', () => {
+ buildWrapper({ savedContentMeta: null });
- expect(wrapper.text()).toContain(`Update ${sourcePath} file`);
- });
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findEmptyState().props()).toMatchObject({
+ title: 'Creating your merge request',
+ svgPath: mergeRequestsIllustrationPath,
+ });
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
- it('redirects to the HOME route when content has not been submitted', () => {
- buildWrapper({ savedContentMeta: null });
+ it('displays helper info in the empty state', () => {
+ buildWrapper({ savedContentMeta: null });
- expect(router.push).toHaveBeenCalledWith(HOME_ROUTE);
- expect(wrapper.html()).toBe('');
+ expect(findEmptyState().text()).toContain(
+ 'You can set an assignee to get your changes reviewed and deployed once your merge request is created',
+ );
+ expect(findEmptyState().text()).toContain(
+ 'A link to view the merge request will appear once ready',
+ );
+ });
+
+ it('redirects to the HOME route when content has not been submitted', () => {
+ buildWrapper({ savedContentMeta: null }, { hasSubmittedChanges: false });
+
+ expect(router.push).toHaveBeenCalledWith(HOME_ROUTE);
+ });
});
});
diff --git a/spec/frontend/static_site_editor/services/front_matterify_spec.js b/spec/frontend/static_site_editor/services/front_matterify_spec.js
new file mode 100644
index 00000000000..dbaedc30849
--- /dev/null
+++ b/spec/frontend/static_site_editor/services/front_matterify_spec.js
@@ -0,0 +1,47 @@
+import {
+ sourceContentYAML as content,
+ sourceContentHeaderObjYAML as yamlFrontMatterObj,
+ sourceContentSpacing as spacing,
+ sourceContentBody as body,
+} from '../mock_data';
+
+import { frontMatterify, stringify } from '~/static_site_editor/services/front_matterify';
+
+describe('static_site_editor/services/front_matterify', () => {
+ const frontMatterifiedContent = {
+ source: content,
+ matter: yamlFrontMatterObj,
+ spacing,
+ content: body,
+ delimiter: '---',
+ type: 'yaml',
+ };
+ const frontMatterifiedBody = {
+ source: body,
+ matter: null,
+ spacing: null,
+ content: body,
+ delimiter: null,
+ type: null,
+ };
+
+ describe('frontMatterify', () => {
+ it.each`
+ frontMatterified | target
+ ${frontMatterify(content)} | ${frontMatterifiedContent}
+ ${frontMatterify(body)} | ${frontMatterifiedBody}
+ `('returns $target from $frontMatterified', ({ frontMatterified, target }) => {
+ expect(frontMatterified).toEqual(target);
+ });
+ });
+
+ describe('stringify', () => {
+ it.each`
+ stringified | target
+ ${stringify(frontMatterifiedContent)} | ${content}
+ ${stringify(frontMatterifiedBody)} | ${body}
+ `('returns $target from $stringified', ({ stringified, target }) => {
+ expect(stringified).toBe(target);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/members/table/created_at_spec.js b/spec/frontend/vue_shared/components/members/table/created_at_spec.js
new file mode 100644
index 00000000000..cf3821baf44
--- /dev/null
+++ b/spec/frontend/vue_shared/components/members/table/created_at_spec.js
@@ -0,0 +1,61 @@
+import { mount, createWrapper } from '@vue/test-utils';
+import { within } from '@testing-library/dom';
+import { useFakeDate } from 'helpers/fake_date';
+import CreatedAt from '~/vue_shared/components/members/table/created_at.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+describe('CreatedAt', () => {
+ // March 15th, 2020
+ useFakeDate(2020, 2, 15);
+
+ const date = '2020-03-01T00:00:00.000';
+ const dateTimeAgo = '2 weeks ago';
+
+ let wrapper;
+
+ const createComponent = propsData => {
+ wrapper = mount(CreatedAt, {
+ propsData: {
+ date,
+ ...propsData,
+ },
+ });
+ };
+
+ const getByText = (text, options) =>
+ createWrapper(within(wrapper.element).getByText(text, options));
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('created at text', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('displays created at text', () => {
+ expect(getByText(dateTimeAgo).exists()).toBe(true);
+ });
+
+ it('uses `TimeAgoTooltip` component to display tooltip', () => {
+ expect(wrapper.find(TimeAgoTooltip).exists()).toBe(true);
+ });
+ });
+
+ describe('when `createdBy` prop is provided', () => {
+ it('displays a link to the user that created the member', () => {
+ createComponent({
+ createdBy: {
+ name: 'Administrator',
+ webUrl: 'https://gitlab.com/root',
+ },
+ });
+
+ const link = getByText('Administrator');
+
+ expect(link.exists()).toBe(true);
+ expect(link.attributes('href')).toBe('https://gitlab.com/root');
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/members/table/expires_at_spec.js b/spec/frontend/vue_shared/components/members/table/expires_at_spec.js
new file mode 100644
index 00000000000..95ae251b0fd
--- /dev/null
+++ b/spec/frontend/vue_shared/components/members/table/expires_at_spec.js
@@ -0,0 +1,86 @@
+import { mount, createWrapper } from '@vue/test-utils';
+import { within } from '@testing-library/dom';
+import { useFakeDate } from 'helpers/fake_date';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import ExpiresAt from '~/vue_shared/components/members/table/expires_at.vue';
+
+describe('ExpiresAt', () => {
+ // March 15th, 2020
+ useFakeDate(2020, 2, 15);
+
+ let wrapper;
+
+ const createComponent = propsData => {
+ wrapper = mount(ExpiresAt, {
+ propsData,
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ const getByText = (text, options) =>
+ createWrapper(within(wrapper.element).getByText(text, options));
+
+ const getTooltipDirective = elementWrapper => getBinding(elementWrapper.element, 'gl-tooltip');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when no expiration date is set', () => {
+ it('displays "No expiration set"', () => {
+ createComponent({ date: null });
+
+ expect(getByText('No expiration set').exists()).toBe(true);
+ });
+ });
+
+ describe('when expiration date is in the past', () => {
+ let expiredText;
+
+ beforeEach(() => {
+ createComponent({ date: '2019-03-15T00:00:00.000' });
+
+ expiredText = getByText('Expired');
+ });
+
+ it('displays "Expired"', () => {
+ expect(expiredText.exists()).toBe(true);
+ expect(expiredText.classes()).toContain('gl-text-red-500');
+ });
+
+ it('displays tooltip with formatted date', () => {
+ const tooltipDirective = getTooltipDirective(expiredText);
+
+ expect(tooltipDirective).not.toBeUndefined();
+ expect(expiredText.attributes('title')).toBe('Mar 15, 2019 12:00am GMT+0000');
+ });
+ });
+
+ describe('when expiration date is in the future', () => {
+ it.each`
+ date | expected | warningColor
+ ${'2020-03-23T00:00:00.000'} | ${'in 8 days'} | ${false}
+ ${'2020-03-20T00:00:00.000'} | ${'in 5 days'} | ${true}
+ ${'2020-03-16T00:00:00.000'} | ${'in 1 day'} | ${true}
+ ${'2020-03-15T05:00:00.000'} | ${'in about 5 hours'} | ${true}
+ ${'2020-03-15T01:00:00.000'} | ${'in about 1 hour'} | ${true}
+ ${'2020-03-15T00:30:00.000'} | ${'in 30 minutes'} | ${true}
+ ${'2020-03-15T00:01:15.000'} | ${'in 1 minute'} | ${true}
+ ${'2020-03-15T00:00:15.000'} | ${'in less than a minute'} | ${true}
+ `('displays "$expected"', ({ date, expected, warningColor }) => {
+ createComponent({ date });
+
+ const expiredText = getByText(expected);
+
+ expect(expiredText.exists()).toBe(true);
+
+ if (warningColor) {
+ expect(expiredText.classes()).toContain('gl-text-orange-500');
+ } else {
+ expect(expiredText.classes()).not.toContain('gl-text-orange-500');
+ }
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/members/table/members_table_spec.js b/spec/frontend/vue_shared/components/members/table/members_table_spec.js
index dbad203b4f6..4979a7096ac 100644
--- a/spec/frontend/vue_shared/components/members/table/members_table_spec.js
+++ b/spec/frontend/vue_shared/components/members/table/members_table_spec.js
@@ -7,6 +7,8 @@ import {
import MembersTable from '~/vue_shared/components/members/table/members_table.vue';
import MemberAvatar from '~/vue_shared/components/members/table/member_avatar.vue';
import MemberSource from '~/vue_shared/components/members/table/member_source.vue';
+import ExpiresAt from '~/vue_shared/components/members/table/expires_at.vue';
+import CreatedAt from '~/vue_shared/components/members/table/created_at.vue';
import * as initUserPopovers from '~/user_popovers';
import { member as memberMock, invite, accessRequest } from '../mock_data';
@@ -30,7 +32,7 @@ describe('MemberList', () => {
wrapper = mount(MembersTable, {
localVue,
store: createStore(state),
- stubs: ['member-avatar'],
+ stubs: ['member-avatar', 'member-source', 'expires-at', 'created-at'],
});
};
@@ -50,10 +52,10 @@ describe('MemberList', () => {
field | label | member | expectedComponent
${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar}
${'source'} | ${'Source'} | ${memberMock} | ${MemberSource}
- ${'granted'} | ${'Access granted'} | ${memberMock} | ${null}
- ${'invited'} | ${'Invited'} | ${invite} | ${null}
- ${'requested'} | ${'Requested'} | ${accessRequest} | ${null}
- ${'expires'} | ${'Access expires'} | ${memberMock} | ${null}
+ ${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt}
+ ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
+ ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
+ ${'expires'} | ${'Access expires'} | ${memberMock} | ${ExpiresAt}
${'maxRole'} | ${'Max role'} | ${memberMock} | ${null}
${'expiration'} | ${'Expiration'} | ${memberMock} | ${null}
`('renders the $label field', ({ field, label, member, expectedComponent }) => {
diff --git a/spec/frontend/whats_new/components/app_spec.js b/spec/frontend/whats_new/components/app_spec.js
index 586bdf8f454..157faa90efa 100644
--- a/spec/frontend/whats_new/components/app_spec.js
+++ b/spec/frontend/whats_new/components/app_spec.js
@@ -1,6 +1,7 @@
import { createLocalVue, mount } from '@vue/test-utils';
import Vuex from 'vuex';
import { GlDrawer } from '@gitlab/ui';
+import { mockTracking, unmockTracking, triggerEvent } from 'helpers/tracking_helper';
import App from '~/whats_new/components/app.vue';
const localVue = createLocalVue();
@@ -12,6 +13,7 @@ describe('App', () => {
let actions;
let state;
let propsData = { features: '[ {"title":"Whats New Drawer"} ]', storageKey: 'storage-key' };
+ let trackingSpy;
const buildWrapper = () => {
actions = {
@@ -36,11 +38,16 @@ describe('App', () => {
};
beforeEach(() => {
+ document.body.dataset.page = 'test-page';
+ document.body.dataset.namespaceId = 'namespace-840';
+
+ trackingSpy = mockTracking('_category_', null, jest.spyOn);
buildWrapper();
});
afterEach(() => {
wrapper.destroy();
+ unmockTracking();
});
const getDrawer = () => wrapper.find(GlDrawer);
@@ -50,8 +57,11 @@ describe('App', () => {
});
it('dispatches openDrawer when mounted', () => {
- expect(actions.openDrawer).toHaveBeenCalled();
expect(actions.openDrawer).toHaveBeenCalledWith(expect.any(Object), 'storage-key');
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_whats_new_drawer', {
+ label: 'namespace_id',
+ value: 'namespace-840',
+ });
});
it('dispatches closeDrawer when clicking close', () => {
@@ -77,4 +87,25 @@ describe('App', () => {
expect(getDrawer().exists()).toBe(true);
});
+
+ it('send an event when feature item is clicked', () => {
+ propsData = {
+ features: '[ {"title":"Whats New Drawer", "url": "www.url.com"} ]',
+ storageKey: 'storage-key',
+ };
+ buildWrapper();
+ trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn);
+
+ const link = wrapper.find('[data-testid="whats-new-title-link"]');
+ triggerEvent(link.element);
+
+ expect(trackingSpy.mock.calls[2]).toMatchObject([
+ '_category_',
+ 'click_whats_new_item',
+ {
+ label: 'Whats New Drawer',
+ property: 'www.url.com',
+ },
+ ]);
+ });
});
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index f22809bb9a8..36cdd1558b8 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -497,6 +497,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(count_data[:personal_snippets]).to eq(2)
expect(count_data[:project_snippets]).to eq(4)
+ expect(count_data[:projects_creating_incidents]).to eq(2)
expect(count_data[:projects_with_packages]).to eq(2)
expect(count_data[:packages]).to eq(4)
expect(count_data[:user_preferences_user_gitpod_enabled]).to eq(1)
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index a9453706288..8f0c60d5d65 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -834,19 +834,6 @@ RSpec.describe QuickActions::InterpretService do
let(:issuable) { issue }
end
- context 'assigning to a group' do
- let_it_be(:group) { create(:group, :public) }
-
- before_all do
- group.add_developer(create(:user))
- end
-
- it_behaves_like 'empty command', "Failed to assign a user because no user was found." do
- let(:content) { "/assign #{group.to_reference}" }
- let(:issuable) { issue }
- end
- end
-
context 'unassign command' do
let(:content) { '/unassign' }
diff --git a/vendor/languages.yml b/vendor/languages.yml
index a6edb0415b2..5e7a955b1bb 100755
--- a/vendor/languages.yml
+++ b/vendor/languages.yml
@@ -1,7 +1,8 @@
-# Extracted from https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
-
# Defines all Languages known to GitHub.
#
+# fs_name - Optional field. Only necessary as a replacement for the sample directory name if the
+# language name is not a valid filename under the Windows filesystem (e.g., if it
+# contains an asterisk).
# type - Either data, programming, markup, prose, or nil
# aliases - An Array of additional aliases (implicitly
# includes name.downcase)
@@ -22,7 +23,7 @@
# language_id - Integer used as a language-name-independent indexed field so that we can rename
# languages in Linguist without reindexing all the code on GitHub. Must not be
# changed for existing languages without the explicit permission of GitHub staff.
-# color - CSS hex color to represent the language. Only used if type is "programming" or "prose".
+# color - CSS hex color to represent the language. Only used if type is "programming" or "markup".
# tm_scope - The TextMate scope that represents this programming
# language. This should match one of the scopes listed in
# the grammars.yml file. Use "none" if there is no grammar
@@ -45,11 +46,19 @@
tm_scope: source.bsl
ace_mode: text
language_id: 0
+4D:
+ type: programming
+ extensions:
+ - ".4dm"
+ tm_scope: source.4dm
+ ace_mode: text
+ language_id: 577529595
ABAP:
type: programming
color: "#E8274B"
extensions:
- ".abap"
+ tm_scope: source.abap
ace_mode: abap
language_id: 1
ABNF:
@@ -72,6 +81,14 @@ AGS Script:
codemirror_mode: clike
codemirror_mime_type: text/x-c++src
language_id: 2
+AL Code:
+ type: programming
+ color: "#3AA2B5"
+ extensions:
+ - ".al"
+ tm_scope: source.al
+ ace_mode: text
+ language_id: 658971832
AMPL:
type: programming
color: "#E6EFBB"
@@ -86,6 +103,7 @@ ANTLR:
color: "#9DC3FF"
extensions:
- ".g4"
+ tm_scope: source.antlr
ace_mode: text
language_id: 4
API Blueprint:
@@ -111,6 +129,14 @@ APL:
codemirror_mode: apl
codemirror_mime_type: text/apl
language_id: 6
+ASL:
+ type: programming
+ ace_mode: text
+ extensions:
+ - ".asl"
+ - ".dsl"
+ tm_scope: source.asl
+ language_id: 124996147
ASN.1:
type: data
extensions:
@@ -121,15 +147,14 @@ ASN.1:
codemirror_mode: asn.1
codemirror_mime_type: text/x-ttcn-asn
language_id: 7
-ASP:
+ASP.NET:
type: programming
- color: "#6a40fd"
tm_scope: text.html.asp
+ color: "#9400ff"
aliases:
- aspx
- aspx-vb
extensions:
- - ".asp"
- ".asax"
- ".ascx"
- ".ashx"
@@ -139,7 +164,7 @@ ASP:
ace_mode: text
codemirror_mode: htmlembedded
codemirror_mime_type: application/x-aspx
- language_id: 8
+ language_id: 564186416
ATS:
type: programming
color: "#1ac620"
@@ -174,6 +199,7 @@ Ada:
aliases:
- ada95
- ada2005
+ tm_scope: source.ada
ace_mode: ada
language_id: 11
Adobe Font Metrics:
@@ -193,6 +219,7 @@ Agda:
color: "#315665"
extensions:
- ".agda"
+ tm_scope: source.agda
ace_mode: text
language_id: 12
Alloy:
@@ -200,6 +227,7 @@ Alloy:
color: "#64C800"
extensions:
- ".als"
+ tm_scope: source.alloy
ace_mode: text
language_id: 13
Alpine Abuild:
@@ -215,6 +243,18 @@ Alpine Abuild:
codemirror_mode: shell
codemirror_mime_type: text/x-sh
language_id: 14
+Altium Designer:
+ type: data
+ aliases:
+ - altium
+ extensions:
+ - ".OutJob"
+ - ".PcbDoc"
+ - ".PrjPCB"
+ - ".SchDoc"
+ tm_scope: source.ini
+ ace_mode: ini
+ language_id: 187772328
AngelScript:
type: programming
color: "#C7D7DC"
@@ -253,6 +293,7 @@ ApacheConf:
language_id: 16
Apex:
type: programming
+ color: "#1797c0"
extensions:
- ".cls"
tm_scope: source.java
@@ -277,6 +318,7 @@ AppleScript:
- ".scpt"
interpreters:
- osascript
+ tm_scope: source.applescript
ace_mode: applescript
color: "#101F1F"
language_id: 19
@@ -315,11 +357,24 @@ Assembly:
extensions:
- ".asm"
- ".a51"
+ - ".i"
- ".inc"
- ".nasm"
tm_scope: source.assembly
ace_mode: assembly_x86
language_id: 24
+Asymptote:
+ type: programming
+ color: "#ff0000"
+ extensions:
+ - ".asy"
+ interpreters:
+ - asy
+ tm_scope: source.c++
+ ace_mode: c_cpp
+ codemirror_mode: clike
+ codemirror_mime_type: text/x-kotlin
+ language_id: 591605007
Augeas:
type: programming
extensions:
@@ -350,6 +405,13 @@ AutoIt:
tm_scope: source.autoit
ace_mode: autohotkey
language_id: 27
+Avro IDL:
+ type: data
+ extensions:
+ - ".avdl"
+ tm_scope: source.avro
+ ace_mode: text
+ language_id: 785497837
Awk:
type: programming
extensions:
@@ -363,6 +425,7 @@ Awk:
- gawk
- mawk
- nawk
+ tm_scope: source.awk
ace_mode: text
language_id: 28
Ballerina:
@@ -391,12 +454,24 @@ Befunge:
type: programming
extensions:
- ".befunge"
+ tm_scope: source.befunge
ace_mode: text
language_id: 30
+BibTeX:
+ type: markup
+ group: TeX
+ extensions:
+ - ".bib"
+ - ".bibtex"
+ tm_scope: text.bibtex
+ ace_mode: tex
+ codemirror_mode: stex
+ codemirror_mime_type: text/x-stex
+ language_id: 982188347
Bison:
type: programming
group: Yacc
- tm_scope: source.bison
+ tm_scope: source.yacc
extensions:
- ".bison"
ace_mode: text
@@ -410,7 +485,7 @@ BitBake:
language_id: 32
Blade:
type: markup
- group: HTML
+ color: "#f7523f"
extensions:
- ".blade"
- ".blade.php"
@@ -437,6 +512,7 @@ BlitzMax:
- ".bmx"
aliases:
- bmax
+ tm_scope: source.blitzmax
ace_mode: text
language_id: 35
Bluespec:
@@ -472,12 +548,6 @@ Brightscript:
tm_scope: source.brightscript
ace_mode: text
language_id: 39
-Bro:
- type: programming
- extensions:
- - ".bro"
- ace_mode: text
- language_id: 40
C:
type: programming
color: "#555555"
@@ -488,6 +558,7 @@ C:
- ".idc"
interpreters:
- tcc
+ tm_scope: source.c
ace_mode: c_cpp
codemirror_mode: clike
codemirror_mime_type: text/x-csrc
@@ -504,11 +575,12 @@ C#:
extensions:
- ".cs"
- ".cake"
- - ".cshtml"
- ".csx"
+ - ".linq"
language_id: 42
C++:
type: programming
+ tm_scope: source.c++
ace_mode: c_cpp
codemirror_mode: clike
codemirror_mime_type: text/x-c++src
@@ -567,6 +639,7 @@ CMake:
- ".cmake.in"
filenames:
- CMakeLists.txt
+ tm_scope: source.cmake
ace_mode: text
codemirror_mode: cmake
codemirror_mime_type: text/x-cmake
@@ -579,6 +652,7 @@ COBOL:
- ".ccp"
- ".cobol"
- ".cpy"
+ tm_scope: source.cobol
ace_mode: cobol
codemirror_mode: cobol
codemirror_mime_type: text/x-cobol
@@ -594,12 +668,11 @@ COLLADA:
language_id: 49
CSON:
type: data
- group: CoffeeScript
+ color: "#244776"
tm_scope: source.coffee
ace_mode: coffee
codemirror_mode: coffeescript
codemirror_mime_type: text/x-coffeescript
- searchable: false
extensions:
- ".cson"
language_id: 424
@@ -627,6 +700,20 @@ CWeb:
tm_scope: none
ace_mode: text
language_id: 657332628
+Cabal Config:
+ type: data
+ aliases:
+ - Cabal
+ extensions:
+ - ".cabal"
+ filenames:
+ - cabal.config
+ - cabal.project
+ ace_mode: haskell
+ codemirror_mode: haskell
+ codemirror_mime_type: text/x-haskell
+ tm_scope: source.cabal
+ language_id: 677095381
Cap'n Proto:
type: programming
tm_scope: source.capnp
@@ -658,6 +745,7 @@ Chapel:
- chpl
extensions:
- ".chpl"
+ tm_scope: source.chapel
ace_mode: text
language_id: 55
Charity:
@@ -679,6 +767,7 @@ ChucK:
Cirru:
type: programming
color: "#ccccff"
+ tm_scope: source.cirru
ace_mode: cirru
extensions:
- ".cirru"
@@ -691,6 +780,16 @@ Clarion:
- ".clw"
tm_scope: source.clarion
language_id: 59
+Classic ASP:
+ type: programming
+ color: "#6a40fd"
+ tm_scope: text.html.asp
+ aliases:
+ - asp
+ extensions:
+ - ".asp"
+ ace_mode: text
+ language_id: 8
Clean:
type: programming
color: "#3F85AF"
@@ -710,6 +809,7 @@ Click:
language_id: 61
Clojure:
type: programming
+ tm_scope: source.clojure
ace_mode: clojure
codemirror_mode: clojure
codemirror_mime_type: text/x-clojure
@@ -759,6 +859,16 @@ CoNLL-U:
- CoNLL
- CoNLL-X
language_id: 421026389
+CodeQL:
+ type: programming
+ extensions:
+ - ".ql"
+ - ".qll"
+ tm_scope: source.ql
+ ace_mode: text
+ language_id: 424259634
+ aliases:
+ - ql
CoffeeScript:
type: programming
tm_scope: source.coffee
@@ -868,6 +978,7 @@ Coq:
extensions:
- ".coq"
- ".v"
+ tm_scope: source.coq
ace_mode: text
language_id: 69
Cpp-ObjDump:
@@ -893,7 +1004,7 @@ Creole:
language_id: 71
Crystal:
type: programming
- color: "#776791"
+ color: "#000100"
extensions:
- ".cr"
ace_mode: ruby
@@ -960,6 +1071,7 @@ Cython:
- ".pxi"
aliases:
- pyrex
+ tm_scope: source.cython
ace_mode: text
codemirror_mode: python
codemirror_mime_type: text/x-cython
@@ -970,6 +1082,7 @@ D:
extensions:
- ".d"
- ".di"
+ tm_scope: source.d
ace_mode: d
codemirror_mode: d
codemirror_mime_type: text/x-d
@@ -1021,6 +1134,16 @@ DTrace:
codemirror_mode: clike
codemirror_mime_type: text/x-csrc
language_id: 85
+Dafny:
+ type: programming
+ color: "#FFEC25"
+ extensions:
+ - ".dfy"
+ interpreters:
+ - dafny
+ tm_scope: text.dfy.dafny
+ ace_mode: text
+ language_id: 969323346
Darcs Patch:
type: data
aliases:
@@ -1038,6 +1161,7 @@ Dart:
- ".dart"
interpreters:
- dart
+ tm_scope: source.dart
ace_mode: dart
codemirror_mode: dart
codemirror_mime_type: application/dart
@@ -1050,6 +1174,16 @@ DataWeave:
ace_mode: text
tm_scope: source.data-weave
language_id: 974514097
+Dhall:
+ type: programming
+ color: "#dfafff"
+ extensions:
+ - ".dhall"
+ tm_scope: source.haskell
+ ace_mode: haskell
+ codemirror_mode: haskell
+ codemirror_mime_type: text/x-haskell
+ language_id: 793969321
Diff:
type: data
extensions:
@@ -1062,9 +1196,16 @@ Diff:
codemirror_mode: diff
codemirror_mime_type: text/x-diff
language_id: 88
+DirectX 3D File:
+ type: data
+ extensions:
+ - ".x"
+ ace_mode: text
+ tm_scope: none
+ language_id: 201049282
Dockerfile:
type: programming
- color: "#0db7ed"
+ color: "#384d54"
tm_scope: source.dockerfile
extensions:
- ".dockerfile"
@@ -1090,6 +1231,7 @@ Dylan:
- ".dyl"
- ".intr"
- ".lid"
+ tm_scope: source.dylan
ace_mode: text
codemirror_mode: dylan
codemirror_mime_type: text/x-dylan
@@ -1137,9 +1279,19 @@ EJS:
group: HTML
extensions:
- ".ejs"
+ - ".ect"
+ - ".jst"
tm_scope: text.html.js
ace_mode: ejs
language_id: 95
+EML:
+ type: data
+ extensions:
+ - ".eml"
+ - ".mbox"
+ tm_scope: text.eml.basic
+ ace_mode: text
+ language_id: 529653389
EQ:
type: programming
color: "#a78649"
@@ -1180,20 +1332,33 @@ Ecere Projects:
codemirror_mode: javascript
codemirror_mime_type: application/json
language_id: 98
+EditorConfig:
+ type: data
+ group: INI
+ filenames:
+ - ".editorconfig"
+ aliases:
+ - editor-config
+ ace_mode: ini
+ codemirror_mode: properties
+ codemirror_mime_type: text/x-properties
+ tm_scope: source.editorconfig
+ language_id: 96139566
Edje Data Collection:
type: data
extensions:
- ".edc"
- tm_scope: source.json
- ace_mode: json
- codemirror_mode: javascript
- codemirror_mime_type: application/json
+ tm_scope: source.c++
+ ace_mode: c_cpp
+ codemirror_mode: clike
+ codemirror_mime_type: text/x-c++src
language_id: 342840478
Eiffel:
type: programming
- color: "#946d57"
+ color: "#4d6977"
extensions:
- ".e"
+ tm_scope: source.eiffel
ace_mode: eiffel
codemirror_mode: eiffel
codemirror_mime_type: text/x-eiffel
@@ -1204,6 +1369,7 @@ Elixir:
extensions:
- ".ex"
- ".exs"
+ tm_scope: source.elixir
ace_mode: elixir
filenames:
- mix.lock
@@ -1273,6 +1439,7 @@ Erlang:
- rebar.config
- rebar.config.lock
- rebar.lock
+ tm_scope: source.erlang
ace_mode: erlang
codemirror_mode: erlang
codemirror_mime_type: text/x-erlang
@@ -1293,6 +1460,26 @@ F#:
codemirror_mode: mllike
codemirror_mime_type: text/x-fsharp
language_id: 105
+F*:
+ fs_name: Fstar
+ type: programming
+ color: "#572e30"
+ aliases:
+ - fstar
+ extensions:
+ - ".fst"
+ tm_scope: source.fstar
+ ace_mode: text
+ language_id: 336943375
+FIGlet Font:
+ type: data
+ aliases:
+ - FIGfont
+ extensions:
+ - ".flf"
+ tm_scope: source.figfont
+ ace_mode: text
+ language_id: 686129783
FLUX:
type: programming
color: "#88ccff"
@@ -1310,6 +1497,7 @@ Factor:
filenames:
- ".factor-boot-rc"
- ".factor-rc"
+ tm_scope: source.factor
ace_mode: text
codemirror_mode: factor
codemirror_mime_type: text/x-factor
@@ -1322,6 +1510,7 @@ Fancy:
- ".fancypack"
filenames:
- Fakefile
+ tm_scope: source.fancy
ace_mode: text
language_id: 109
Fantom:
@@ -1332,6 +1521,14 @@ Fantom:
tm_scope: source.fan
ace_mode: text
language_id: 110
+Faust:
+ type: programming
+ color: "#c37240"
+ extensions:
+ - ".dsp"
+ tm_scope: source.faust
+ ace_mode: text
+ language_id: 622529198
Filebench WML:
type: programming
extensions:
@@ -1367,27 +1564,38 @@ Forth:
- ".fr"
- ".frt"
- ".fs"
+ tm_scope: source.forth
ace_mode: forth
codemirror_mode: forth
codemirror_mime_type: text/x-forth
language_id: 114
Fortran:
+ group: Fortran
type: programming
color: "#4d41b1"
extensions:
- - ".f90"
- ".f"
- - ".f03"
- - ".f08"
- ".f77"
- - ".f95"
- ".for"
- ".fpp"
- tm_scope: source.fortran.modern
+ tm_scope: source.fortran
ace_mode: text
codemirror_mode: fortran
codemirror_mime_type: text/x-fortran
language_id: 107
+Fortran Free Form:
+ group: Fortran
+ type: programming
+ extensions:
+ - ".f90"
+ - ".f03"
+ - ".f08"
+ - ".f95"
+ tm_scope: source.fortran.modern
+ ace_mode: text
+ codemirror_mode: fortran
+ codemirror_mime_type: text/x-fortran
+ language_id: 761352333
FreeMarker:
type: programming
color: "#0050b2"
@@ -1406,15 +1614,33 @@ Frege:
tm_scope: source.haskell
ace_mode: haskell
language_id: 116
+Futhark:
+ type: programming
+ color: "#5f021f"
+ extensions:
+ - ".fut"
+ tm_scope: source.futhark
+ ace_mode: text
+ language_id: 97358117
G-code:
- type: data
+ type: programming
+ color: "#D08CF2"
extensions:
- ".g"
+ - ".cnc"
- ".gco"
- ".gcode"
tm_scope: source.gcode
ace_mode: gcode
language_id: 117
+GAML:
+ type: programming
+ color: "#FFC766"
+ extensions:
+ - ".gaml"
+ tm_scope: none
+ ace_mode: text
+ language_id: 290345951
GAMS:
type: programming
extensions:
@@ -1458,6 +1684,13 @@ GDScript:
tm_scope: source.gdscript
ace_mode: text
language_id: 123
+GEDCOM:
+ type: data
+ ace_mode: text
+ extensions:
+ - ".ged"
+ tm_scope: source.gedcom
+ language_id: 459577965
GLSL:
type: programming
extensions:
@@ -1470,7 +1703,9 @@ GLSL:
- ".fshader"
- ".geo"
- ".geom"
+ - ".glslf"
- ".glslv"
+ - ".gs"
- ".gshader"
- ".shader"
- ".tesc"
@@ -1479,6 +1714,7 @@ GLSL:
- ".vrx"
- ".vsh"
- ".vshader"
+ tm_scope: source.glsl
ace_mode: glsl
language_id: 124
GN:
@@ -1497,7 +1733,7 @@ GN:
language_id: 302957008
Game Maker Language:
type: programming
- color: "#8fb200"
+ color: "#71b417"
extensions:
- ".gml"
tm_scope: source.c++
@@ -1556,12 +1792,14 @@ Gerber Image:
- ".gbp"
- ".gbs"
- ".gko"
+ - ".gml"
- ".gpb"
- ".gpt"
- ".gtl"
- ".gto"
- ".gtp"
- ".gts"
+ - ".sol"
interpreters:
- gerbv
- gerbview
@@ -1583,12 +1821,41 @@ Gherkin:
type: programming
extensions:
- ".feature"
+ - ".story"
tm_scope: text.gherkin.feature
aliases:
- cucumber
ace_mode: text
color: "#5B2063"
language_id: 76
+Git Attributes:
+ type: data
+ group: INI
+ aliases:
+ - gitattributes
+ filenames:
+ - ".gitattributes"
+ tm_scope: source.gitattributes
+ ace_mode: gitignore
+ codemirror_mode: shell
+ codemirror_mime_type: text/x-sh
+ language_id: 956324166
+Git Config:
+ type: data
+ group: INI
+ aliases:
+ - gitconfig
+ - gitmodules
+ extensions:
+ - ".gitconfig"
+ filenames:
+ - ".gitconfig"
+ - ".gitmodules"
+ ace_mode: ini
+ codemirror_mode: properties
+ codemirror_mime_type: text/x-properties
+ tm_scope: source.gitconfig
+ language_id: 807968997
Glyph:
type: programming
color: "#c1ac7f"
@@ -1599,6 +1866,13 @@ Glyph:
codemirror_mode: tcl
codemirror_mime_type: text/x-tcl
language_id: 130
+Glyph Bitmap Distribution Format:
+ type: data
+ extensions:
+ - ".bdf"
+ tm_scope: source.bdf
+ ace_mode: text
+ language_id: 997665271
Gnuplot:
type: programming
color: "#f0a9f0"
@@ -1606,19 +1880,22 @@ Gnuplot:
- ".gp"
- ".gnu"
- ".gnuplot"
+ - ".p"
- ".plot"
- ".plt"
interpreters:
- gnuplot
+ tm_scope: source.gnuplot
ace_mode: text
language_id: 131
Go:
type: programming
- color: "#375eab"
+ color: "#00ADD8"
aliases:
- golang
extensions:
- ".go"
+ tm_scope: source.go
ace_mode: golang
codemirror_mode: go
codemirror_mime_type: text/x-go
@@ -1660,12 +1937,10 @@ Grammatical Framework:
type: programming
aliases:
- gf
- wrap: false
extensions:
- ".gf"
- searchable: true
- color: "#79aa7a"
- tm_scope: source.haskell
+ color: "#ff0000"
+ tm_scope: source.gf
ace_mode: haskell
codemirror_mode: haskell
codemirror_mime_type: text/x-haskell
@@ -1682,6 +1957,7 @@ GraphQL:
extensions:
- ".graphql"
- ".gql"
+ - ".graphqls"
tm_scope: source.graphql
ace_mode: text
language_id: 139
@@ -1695,6 +1971,7 @@ Graphviz (DOT):
language_id: 140
Groovy:
type: programming
+ tm_scope: source.groovy
ace_mode: groovy
codemirror_mode: groovy
codemirror_mime_type: text/x-groovy
@@ -1722,12 +1999,25 @@ Groovy Server Pages:
codemirror_mode: htmlembedded
codemirror_mime_type: application/x-jsp
language_id: 143
+HAProxy:
+ type: data
+ extensions:
+ - ".cfg"
+ filenames:
+ - haproxy.cfg
+ tm_scope: source.haproxy-config
+ ace_mode: text
+ language_id: 366607477
HCL:
type: programming
extensions:
- ".hcl"
+ - ".nomad"
- ".tf"
- ".tfvars"
+ - ".workflow"
+ aliases:
+ - terraform
ace_mode: ruby
codemirror_mode: ruby
codemirror_mime_type: text/x-ruby
@@ -1768,8 +2058,8 @@ HTML+Django:
group: HTML
extensions:
- ".jinja"
+ - ".j2"
- ".jinja2"
- - ".mustache"
- ".njk"
aliases:
- django
@@ -1812,9 +2102,12 @@ HTML+ERB:
group: HTML
aliases:
- erb
+ - rhtml
+ - html+ruby
extensions:
- ".erb"
- ".erb.deface"
+ - ".rhtml"
ace_mode: text
codemirror_mode: htmlembedded
codemirror_mime_type: application/x-erb
@@ -1829,6 +2122,19 @@ HTML+PHP:
codemirror_mode: php
codemirror_mime_type: application/x-httpd-php
language_id: 151
+HTML+Razor:
+ type: markup
+ tm_scope: text.html.cshtml
+ group: HTML
+ aliases:
+ - razor
+ extensions:
+ - ".cshtml"
+ - ".razor"
+ ace_mode: razor
+ codemirror_mode: htmlmixed
+ codemirror_mime_type: text/html
+ language_id: 479039817
HTTP:
type: data
extensions:
@@ -1851,24 +2157,27 @@ Hack:
codemirror_mode: php
codemirror_mime_type: application/x-httpd-php
extensions:
+ - ".hack"
- ".hh"
+ - ".hhi"
- ".php"
- tm_scope: text.html.php
+ tm_scope: source.hack
color: "#878787"
language_id: 153
Haml:
- group: HTML
type: markup
+ color: "#ece2a9"
extensions:
- ".haml"
- ".haml.deface"
+ tm_scope: text.haml
ace_mode: haml
codemirror_mode: haml
codemirror_mime_type: text/x-haml
language_id: 154
Handlebars:
type: markup
- group: HTML
+ color: "#f7931e"
aliases:
- hbs
- htmlbars
@@ -1891,9 +2200,11 @@ Haskell:
color: "#5e5086"
extensions:
- ".hs"
+ - ".hs-boot"
- ".hsc"
interpreters:
- runhaskell
+ tm_scope: source.haskell
ace_mode: haskell
codemirror_mode: haskell
codemirror_mime_type: text/x-haskell
@@ -1913,10 +2224,21 @@ HiveQL:
type: programming
extensions:
- ".q"
+ - ".hql"
color: "#dce200"
tm_scope: source.hql
ace_mode: sql
language_id: 931814087
+HolyC:
+ type: programming
+ color: "#ffefaf"
+ extensions:
+ - ".hc"
+ tm_scope: source.hc
+ ace_mode: c_cpp
+ codemirror_mode: clike
+ codemirror_mime_type: text/x-csrc
+ language_id: 928121743
Hy:
type: programming
ace_mode: text
@@ -1924,10 +2246,10 @@ Hy:
extensions:
- ".hy"
interpreters:
- - "hy"
+ - hy
aliases:
- hylang
- tm_scope: none
+ tm_scope: source.hy
language_id: 159
HyPhy:
type: programming
@@ -1942,18 +2264,20 @@ IDL:
extensions:
- ".pro"
- ".dlm"
+ tm_scope: source.idl
ace_mode: text
codemirror_mode: idl
codemirror_mime_type: text/x-idl
language_id: 161
IGOR Pro:
type: programming
+ color: "#0000cc"
extensions:
- ".ipf"
aliases:
- igor
- igorpro
- tm_scope: none
+ tm_scope: source.igor
ace_mode: text
language_id: 162
INI:
@@ -1961,12 +2285,12 @@ INI:
extensions:
- ".ini"
- ".cfg"
+ - ".dof"
+ - ".lektorproject"
- ".prefs"
- ".pro"
- ".properties"
filenames:
- - ".editorconfig"
- - ".gitconfig"
- buildozer.spec
tm_scope: source.ini
aliases:
@@ -1997,6 +2321,36 @@ Idris:
ace_mode: text
tm_scope: source.idris
language_id: 165
+Ignore List:
+ type: data
+ group: INI
+ aliases:
+ - ignore
+ - gitignore
+ - git-ignore
+ extensions:
+ - ".gitignore"
+ filenames:
+ - ".atomignore"
+ - ".babelignore"
+ - ".bzrignore"
+ - ".coffeelintignore"
+ - ".cvsignore"
+ - ".dockerignore"
+ - ".eslintignore"
+ - ".gitignore"
+ - ".nodemonignore"
+ - ".npmignore"
+ - ".prettierignore"
+ - ".stylelintignore"
+ - ".vscodeignore"
+ - gitignore-global
+ - gitignore_global
+ ace_mode: gitignore
+ tm_scope: source.gitignore
+ codemirror_mode: shell
+ codemirror_mime_type: text/x-sh
+ language_id: 74444240
Inform 7:
type: programming
wrap: true
@@ -2013,7 +2367,8 @@ Inno Setup:
type: programming
extensions:
- ".iss"
- tm_scope: none
+ - ".isl"
+ tm_scope: source.inno
ace_mode: text
language_id: 167
Io:
@@ -2023,6 +2378,7 @@ Io:
- ".io"
interpreters:
- io
+ tm_scope: source.io
ace_mode: io
language_id: 168
Ioke:
@@ -2032,6 +2388,7 @@ Ioke:
- ".ik"
interpreters:
- ioke
+ tm_scope: source.ioke
ace_mode: text
language_id: 169
Isabelle:
@@ -2072,7 +2429,6 @@ JFlex:
JSON:
type: data
tm_scope: source.json
- group: JavaScript
ace_mode: json
codemirror_mode: javascript
codemirror_mime_type: application/json
@@ -2082,18 +2438,24 @@ JSON:
- ".avsc"
- ".geojson"
- ".gltf"
+ - ".har"
+ - ".ice"
- ".JSON-tmLanguage"
- ".jsonl"
+ - ".mcmeta"
- ".tfstate"
- ".tfstate.backup"
- ".topojson"
- ".webapp"
- ".webmanifest"
+ - ".yy"
+ - ".yyp"
filenames:
- ".arcconfig"
- ".htmlhintrc"
- ".tern-config"
- ".tern-project"
+ - ".watchmanconfig"
- composer.lock
- mcmod.info
language_id: 174
@@ -2107,6 +2469,7 @@ JSON with Comments:
aliases:
- jsonc
extensions:
+ - ".jsonc"
- ".sublime-build"
- ".sublime-commands"
- ".sublime-completions"
@@ -2126,7 +2489,10 @@ JSON with Comments:
- ".jscsrc"
- ".jshintrc"
- ".jslintrc"
+ - jsconfig.json
+ - language-configuration.json
- tsconfig.json
+ - tslint.json
language_id: 423
JSON5:
type: data
@@ -2139,11 +2505,12 @@ JSON5:
language_id: 175
JSONLD:
type: data
- group: JavaScript
- ace_mode: javascript
extensions:
- ".jsonld"
tm_scope: source.js
+ ace_mode: javascript
+ codemirror_mode: javascript
+ codemirror_mime_type: application/json
language_id: 176
JSONiq:
color: "#40d47e"
@@ -2174,6 +2541,7 @@ Jasmin:
language_id: 180
Java:
type: programming
+ tm_scope: source.java
ace_mode: java
codemirror_mode: clike
codemirror_mime_type: text/x-java
@@ -2181,6 +2549,15 @@ Java:
extensions:
- ".java"
language_id: 181
+Java Properties:
+ type: data
+ extensions:
+ - ".properties"
+ tm_scope: source.java-properties
+ ace_mode: properties
+ codemirror_mode: properties
+ codemirror_mime_type: text/x-properties
+ language_id: 519377561
Java Server Pages:
type: programming
group: Java
@@ -2207,6 +2584,7 @@ JavaScript:
- ".js"
- "._js"
- ".bones"
+ - ".cjs"
- ".es"
- ".es6"
- ".frag"
@@ -2227,8 +2605,27 @@ JavaScript:
filenames:
- Jakefile
interpreters:
+ - chakra
+ - d8
+ - gjs
+ - js
- node
+ - nodejs
+ - qjs
+ - rhino
+ - v8
+ - v8-shell
language_id: 183
+JavaScript+ERB:
+ type: programming
+ tm_scope: source.js
+ group: JavaScript
+ extensions:
+ - ".js.erb"
+ ace_mode: javascript
+ codemirror_mode: javascript
+ codemirror_mime_type: application/javascript
+ language_id: 914318960
Jison:
type: programming
group: Yacc
@@ -2256,6 +2653,15 @@ Jolie:
ace_mode: text
tm_scope: source.jolie
language_id: 998078858
+Jsonnet:
+ color: "#0064bd"
+ type: programming
+ ace_mode: text
+ extensions:
+ - ".jsonnet"
+ - ".libsonnet"
+ tm_scope: source.jsonnet
+ language_id: 664885656
Julia:
type: programming
extensions:
@@ -2263,6 +2669,7 @@ Julia:
interpreters:
- julia
color: "#a270ba"
+ tm_scope: source.julia
ace_mode: julia
codemirror_mode: julia
codemirror_mime_type: text/x-julia
@@ -2289,6 +2696,18 @@ KRL:
tm_scope: none
ace_mode: text
language_id: 186
+Kaitai Struct:
+ type: programming
+ aliases:
+ - ksy
+ ace_mode: yaml
+ codemirror_mode: yaml
+ codemirror_mime_type: text/x-yaml
+ color: "#773b37"
+ extensions:
+ - ".ksy"
+ tm_scope: source.yaml
+ language_id: 818804755
KiCad Layout:
type: data
aliases:
@@ -2355,6 +2774,7 @@ LLVM:
type: programming
extensions:
- ".ll"
+ tm_scope: source.llvm
ace_mode: text
color: "#185619"
language_id: 191
@@ -2368,6 +2788,7 @@ LOLCODE:
language_id: 192
LSL:
type: programming
+ tm_scope: source.lsl
ace_mode: lsl
extensions:
- ".lsl"
@@ -2376,6 +2797,15 @@ LSL:
- lsl
color: "#3d9970"
language_id: 193
+LTspice Symbol:
+ type: data
+ extensions:
+ - ".asy"
+ tm_scope: source.ltspice.symbol
+ ace_mode: text
+ codemirror_mode: spreadsheet
+ codemirror_mime_type: text/x-spreadsheet
+ language_id: 1013566805
LabVIEW:
type: programming
extensions:
@@ -2393,7 +2823,6 @@ Lasso:
- ".las"
- ".lasso8"
- ".lasso9"
- - ".ldml"
tm_scope: file.lasso
aliases:
- lassoscript
@@ -2401,7 +2830,7 @@ Lasso:
language_id: 195
Latte:
type: markup
- group: HTML
+ color: "#f2a542"
extensions:
- ".latte"
tm_scope: text.html.smarty
@@ -2414,11 +2843,12 @@ Lean:
extensions:
- ".lean"
- ".hlean"
+ tm_scope: source.lean
ace_mode: text
language_id: 197
Less:
type: markup
- group: CSS
+ color: "#1d365d"
extensions:
- ".less"
tm_scope: source.css.less
@@ -2434,7 +2864,10 @@ Lex:
extensions:
- ".l"
- ".lex"
- tm_scope: none
+ filenames:
+ - Lexer.x
+ - lexer.x
+ tm_scope: source.lex
ace_mode: text
language_id: 199
LilyPond:
@@ -2442,6 +2875,7 @@ LilyPond:
extensions:
- ".ly"
- ".ily"
+ tm_scope: source.lilypond
ace_mode: text
language_id: 200
Limbo:
@@ -2495,6 +2929,7 @@ Literate CoffeeScript:
- litcoffee
extensions:
- ".litcoffee"
+ - ".coffee.md"
language_id: 206
Literate Haskell:
type: programming
@@ -2520,6 +2955,7 @@ LiveScript:
- "._ls"
filenames:
- Slakefile
+ tm_scope: source.livescript
ace_mode: livescript
codemirror_mode: livescript
codemirror_mime_type: text/x-livescript
@@ -2538,6 +2974,7 @@ Logtalk:
extensions:
- ".lgt"
- ".logtalk"
+ tm_scope: source.logtalk
ace_mode: text
language_id: 210
LookML:
@@ -2561,6 +2998,7 @@ LoomScript:
language_id: 212
Lua:
type: programming
+ tm_scope: source.lua
ace_mode: lua
codemirror_mode: lua
codemirror_mime_type: text/x-lua
@@ -2572,7 +3010,10 @@ Lua:
- ".p8"
- ".pd_lua"
- ".rbxs"
+ - ".rockspec"
- ".wlua"
+ filenames:
+ - ".luacheckrc"
interpreters:
- lua
language_id: 213
@@ -2592,7 +3033,7 @@ M4:
type: programming
extensions:
- ".m4"
- tm_scope: none
+ tm_scope: source.m4
ace_mode: text
language_id: 215
M4Sugar:
@@ -2604,9 +3045,22 @@ M4Sugar:
- ".m4"
filenames:
- configure.ac
- tm_scope: none
+ tm_scope: source.m4
ace_mode: text
language_id: 216
+MATLAB:
+ type: programming
+ color: "#e16737"
+ aliases:
+ - octave
+ extensions:
+ - ".matlab"
+ - ".m"
+ tm_scope: source.matlab
+ ace_mode: matlab
+ codemirror_mode: octave
+ codemirror_mime_type: text/x-octave
+ language_id: 225
MAXScript:
type: programming
color: "#00a6a6"
@@ -2616,6 +3070,14 @@ MAXScript:
tm_scope: source.maxscript
ace_mode: text
language_id: 217
+MLIR:
+ type: programming
+ color: "#5EC8DB"
+ extensions:
+ - ".mlir"
+ tm_scope: source.mlir
+ ace_mode: text
+ language_id: 448253929
MQL4:
type: programming
color: "#62A8D6"
@@ -2655,6 +3117,18 @@ MUF:
codemirror_mode: forth
codemirror_mime_type: text/x-forth
language_id: 219
+Macaulay2:
+ type: programming
+ extensions:
+ - ".m2"
+ aliases:
+ - m2
+ interpreters:
+ - M2
+ ace_mode: text
+ tm_scope: source.m2
+ color: "#d8ffff"
+ language_id: 34167825
Makefile:
type: programming
color: "#427819"
@@ -2684,6 +3158,7 @@ Makefile:
- mkfile
interpreters:
- make
+ tm_scope: source.makefile
ace_mode: makefile
codemirror_mode: cmake
codemirror_mime_type: text/x-cmake
@@ -2698,6 +3173,7 @@ Mako:
language_id: 221
Markdown:
type: prose
+ color: "#083fa1"
aliases:
- pandoc
ace_mode: markdown
@@ -2709,16 +3185,19 @@ Markdown:
- ".markdown"
- ".mdown"
- ".mdwn"
+ - ".mdx"
- ".mkd"
- ".mkdn"
- ".mkdown"
- ".ronn"
- ".workbook"
+ filenames:
+ - contents.lr
tm_scope: source.gfm
language_id: 222
Marko:
- group: HTML
type: markup
+ color: "#42bff2"
tm_scope: text.marko
extensions:
- ".marko"
@@ -2750,22 +3229,11 @@ Mathematica:
- ".wlt"
aliases:
- mma
+ tm_scope: source.mathematica
ace_mode: text
codemirror_mode: mathematica
codemirror_mime_type: text/x-mathematica
language_id: 224
-Matlab:
- type: programming
- color: "#e16737"
- aliases:
- - octave
- extensions:
- - ".matlab"
- - ".m"
- ace_mode: matlab
- codemirror_mode: octave
- codemirror_mime_type: text/x-octave
- language_id: 225
Maven POM:
type: data
tm_scope: text.xml.pom
@@ -2831,6 +3299,13 @@ Metal:
codemirror_mode: clike
codemirror_mime_type: text/x-c++src
language_id: 230
+Microsoft Developer Studio Project:
+ type: data
+ extensions:
+ - ".dsp"
+ tm_scope: none
+ ace_mode: text
+ language_id: 800983837
MiniD:
type: programming
searchable: false
@@ -2910,8 +3385,44 @@ MoonScript:
- ".moon"
interpreters:
- moon
+ tm_scope: source.moonscript
ace_mode: text
language_id: 238
+Motorola 68K Assembly:
+ type: programming
+ group: Assembly
+ aliases:
+ - m68k
+ extensions:
+ - ".asm"
+ - ".i"
+ - ".inc"
+ - ".s"
+ - ".x68"
+ tm_scope: source.m68k
+ ace_mode: assembly_x86
+ language_id: 477582706
+Muse:
+ type: prose
+ extensions:
+ - ".muse"
+ tm_scope: text.muse
+ ace_mode: text
+ wrap: true
+ language_id: 474864066
+ aliases:
+ - amusewiki
+ - emacs muse
+Mustache:
+ type: markup
+ group: HTML
+ extensions:
+ - ".mustache"
+ tm_scope: text.html.smarty
+ ace_mode: smarty
+ codemirror_mode: smarty
+ codemirror_mime_type: text/x-smarty
+ language_id: 638334590
Myghty:
type: programming
extensions:
@@ -2919,6 +3430,14 @@ Myghty:
tm_scope: none
ace_mode: text
language_id: 239
+NASL:
+ type: programming
+ extensions:
+ - ".nasl"
+ - ".inc"
+ tm_scope: source.nasl
+ ace_mode: text
+ language_id: 171666519
NCL:
type: programming
color: "#28431f"
@@ -2927,6 +3446,16 @@ NCL:
tm_scope: source.ncl
ace_mode: text
language_id: 240
+NEON:
+ type: data
+ extensions:
+ - ".neon"
+ tm_scope: source.neon
+ ace_mode: text
+ aliases:
+ - nette object notation
+ - ne-on
+ language_id: 481192983
NL:
type: data
extensions:
@@ -2934,11 +3463,22 @@ NL:
tm_scope: none
ace_mode: text
language_id: 241
+NPM Config:
+ type: data
+ group: INI
+ aliases:
+ - npmrc
+ filenames:
+ - ".npmrc"
+ tm_scope: source.ini.npmrc
+ ace_mode: text
+ language_id: 685022663
NSIS:
type: programming
extensions:
- ".nsi"
- ".nsh"
+ tm_scope: source.nsis
ace_mode: text
codemirror_mode: nsis
codemirror_mime_type: text/x-nsis
@@ -2957,6 +3497,7 @@ Nemerle:
color: "#3d3c6e"
extensions:
- ".n"
+ tm_scope: source.nemerle
ace_mode: text
language_id: 243
NetLinx:
@@ -3016,6 +3557,7 @@ Nextflow:
Nginx:
type: data
extensions:
+ - ".nginx"
- ".nginxconf"
- ".vhost"
filenames:
@@ -3029,10 +3571,15 @@ Nginx:
language_id: 248
Nim:
type: programming
- color: "#37775b"
+ color: "#ffc200"
extensions:
- ".nim"
+ - ".nim.cfg"
+ - ".nimble"
- ".nimrod"
+ - ".nims"
+ filenames:
+ - nim.cfg
ace_mode: text
tm_scope: source.nim
language_id: 249
@@ -3116,6 +3663,21 @@ ObjDump:
tm_scope: objdump.x86asm
ace_mode: assembly_x86
language_id: 256
+Object Data Instance Notation:
+ type: data
+ extensions:
+ - ".odin"
+ tm_scope: source.odin-ehr
+ ace_mode: text
+ language_id: 985227236
+ObjectScript:
+ type: programming
+ extensions:
+ - ".cls"
+ language_id: 202735509
+ tm_scope: source.objectscript
+ color: "#424893"
+ ace_mode: text
Objective-C:
type: programming
tm_scope: source.objc
@@ -3158,6 +3720,17 @@ Objective-J:
tm_scope: source.js.objj
ace_mode: text
language_id: 259
+Odin:
+ type: programming
+ color: "#60AFFE"
+ aliases:
+ - odinlang
+ - odin-lang
+ extensions:
+ - ".odin"
+ tm_scope: source.odin
+ ace_mode: text
+ language_id: 889244082
Omgrofl:
type: programming
extensions:
@@ -3170,6 +3743,7 @@ Opa:
type: programming
extensions:
- ".opa"
+ tm_scope: source.opa
ace_mode: text
language_id: 261
Opal:
@@ -3180,6 +3754,13 @@ Opal:
tm_scope: source.opal
ace_mode: text
language_id: 262
+Open Policy Agent:
+ type: programming
+ ace_mode: text
+ extensions:
+ - ".rego"
+ language_id: 840483232
+ tm_scope: source.rego
OpenCL:
type: programming
group: C
@@ -3204,6 +3785,14 @@ OpenEdge ABL:
tm_scope: source.abl
ace_mode: text
language_id: 264
+OpenQASM:
+ type: programming
+ extensions:
+ - ".qasm"
+ color: "#AA70FF"
+ tm_scope: source.qasm
+ ace_mode: text
+ language_id: 153739399
OpenRC runscript:
type: programming
group: Shell
@@ -3223,6 +3812,13 @@ OpenSCAD:
tm_scope: source.scad
ace_mode: scad
language_id: 266
+OpenStep Property List:
+ type: data
+ extensions:
+ - ".plist"
+ tm_scope: source.plist
+ ace_mode: text
+ language_id: 598917541
OpenType Feature File:
type: data
aliases:
@@ -3275,15 +3871,6 @@ P4:
tm_scope: source.p4
ace_mode: text
language_id: 348895984
-PAWN:
- type: programming
- color: "#dbb284"
- extensions:
- - ".pwn"
- - ".inc"
- tm_scope: source.pawn
- ace_mode: text
- language_id: 271
PHP:
type: programming
tm_scope: text.html.php
@@ -3344,6 +3931,7 @@ PLpgSQL:
codemirror_mime_type: text/x-sql
tm_scope: source.sql
extensions:
+ - ".pgsql"
- ".sql"
language_id: 274
POV-Ray SDL:
@@ -3354,6 +3942,7 @@ POV-Ray SDL:
extensions:
- ".pov"
- ".inc"
+ tm_scope: source.pov-ray sdl
ace_mode: text
language_id: 275
Pan:
@@ -3417,10 +4006,21 @@ Pascal:
- ".pp"
interpreters:
- instantfpc
+ tm_scope: source.pascal
ace_mode: pascal
codemirror_mode: pascal
codemirror_mime_type: text/x-pascal
language_id: 281
+Pawn:
+ type: programming
+ color: "#dbb284"
+ extensions:
+ - ".pwn"
+ - ".inc"
+ - ".sma"
+ tm_scope: source.pawn
+ ace_mode: text
+ language_id: 271
Pep8:
type: programming
color: "#C76F5B"
@@ -3458,30 +4058,6 @@ Perl:
aliases:
- cperl
language_id: 282
-Perl 6:
- type: programming
- color: "#0000fb"
- extensions:
- - ".6pl"
- - ".6pm"
- - ".nqp"
- - ".p6"
- - ".p6l"
- - ".p6m"
- - ".pl"
- - ".pl6"
- - ".pm"
- - ".pm6"
- - ".t"
- interpreters:
- - perl6
- aliases:
- - perl6
- tm_scope: source.perl6fe
- ace_mode: perl
- codemirror_mode: perl
- codemirror_mime_type: text/x-perl
- language_id: 283
Pic:
type: markup
group: Roff
@@ -3526,8 +4102,18 @@ Pike:
- ".pmod"
interpreters:
- pike
+ tm_scope: source.pike
ace_mode: text
language_id: 287
+PlantUML:
+ type: data
+ extensions:
+ - ".puml"
+ - ".iuml"
+ - ".plantuml"
+ tm_scope: source.wsd
+ ace_mode: text
+ language_id: 833504686
Pod:
type: prose
ace_mode: perl
@@ -3540,6 +4126,17 @@ Pod:
- perl
tm_scope: none
language_id: 288
+Pod 6:
+ type: prose
+ ace_mode: perl
+ tm_scope: source.perl6fe
+ wrap: true
+ extensions:
+ - ".pod"
+ - ".pod6"
+ interpreters:
+ - perl6
+ language_id: 155357471
PogoScript:
type: programming
color: "#d80074"
@@ -3561,6 +4158,7 @@ PostCSS:
group: CSS
extensions:
- ".pcss"
+ - ".postcss"
ace_mode: text
language_id: 262764437
PostScript:
@@ -3569,6 +4167,7 @@ PostScript:
extensions:
- ".ps"
- ".eps"
+ - ".epsi"
- ".pfa"
tm_scope: source.postscript
aliases:
@@ -3589,6 +4188,7 @@ PowerBuilder:
PowerShell:
type: programming
color: "#012456"
+ tm_scope: source.powershell
ace_mode: powershell
codemirror_mode: powershell
codemirror_mime_type: application/x-powershell
@@ -3602,13 +4202,29 @@ PowerShell:
interpreters:
- pwsh
language_id: 293
+Prisma:
+ type: data
+ color: "#0c344b"
+ extensions:
+ - ".prisma"
+ tm_scope: source.prisma
+ ace_mode: text
+ language_id: 499933428
Processing:
type: programming
color: "#0096D8"
extensions:
- ".pde"
+ tm_scope: source.processing
ace_mode: text
language_id: 294
+Proguard:
+ type: data
+ extensions:
+ - ".pro"
+ tm_scope: none
+ ace_mode: text
+ language_id: 716513858
Prolog:
type: programming
color: "#74283c"
@@ -3654,8 +4270,8 @@ Public Key:
codemirror_mime_type: application/pgp
language_id: 298
Pug:
- group: HTML
type: markup
+ color: "#a86454"
extensions:
- ".jade"
- ".pug"
@@ -3704,13 +4320,13 @@ PureScript:
language_id: 302
Python:
type: programming
+ tm_scope: source.python
ace_mode: python
codemirror_mode: python
codemirror_mime_type: text/x-python
color: "#3572A5"
extensions:
- ".py"
- - ".bzl"
- ".cgi"
- ".fcgi"
- ".gyp"
@@ -3723,27 +4339,25 @@ Python:
- ".pyt"
- ".pyw"
- ".rpy"
+ - ".smk"
- ".spec"
- ".tac"
- ".wsgi"
- ".xpy"
filenames:
- ".gclient"
- - BUCK
- - BUILD
- - BUILD.bazel
+ - DEPS
- SConscript
- SConstruct
- Snakefile
- - WORKSPACE
- wscript
interpreters:
- python
- python2
- python3
aliases:
- - rusthon
- python3
+ - rusthon
language_id: 303
Python console:
type: programming
@@ -3763,6 +4377,16 @@ Python traceback:
tm_scope: text.python.traceback
ace_mode: text
language_id: 304
+Q#:
+ type: programming
+ extensions:
+ - ".qs"
+ aliases:
+ - qsharp
+ color: "#fed659"
+ ace_mode: text
+ tm_scope: source.qsharp
+ language_id: 697448245
QML:
type: programming
color: "#44a51c"
@@ -3779,8 +4403,22 @@ QMake:
- ".pri"
interpreters:
- qmake
+ tm_scope: source.qmake
ace_mode: text
language_id: 306
+Qt Script:
+ type: programming
+ ace_mode: javascript
+ codemirror_mode: javascript
+ codemirror_mime_type: text/javascript
+ extensions:
+ - ".qs"
+ filenames:
+ - installscript.qs
+ - toolchain_installscript.qs
+ color: "#00b841"
+ tm_scope: source.js
+ language_id: 558193693
Quake:
type: programming
filenames:
@@ -3806,6 +4444,7 @@ R:
- expr-dist
interpreters:
- Rscript
+ tm_scope: source.r
ace_mode: r
codemirror_mode: r
codemirror_mime_type: text/x-rsrc
@@ -3854,18 +4493,6 @@ REXX:
tm_scope: source.rexx
ace_mode: text
language_id: 311
-RHTML:
- type: markup
- group: HTML
- extensions:
- - ".rhtml"
- tm_scope: text.html.erb
- aliases:
- - html+ruby
- ace_mode: rhtml
- codemirror_mode: htmlembedded
- codemirror_mime_type: application/x-erb
- language_id: 312
RMarkdown:
type: prose
wrap: true
@@ -3904,12 +4531,13 @@ RUNOFF:
extensions:
- ".rnh"
- ".rno"
+ wrap: true
tm_scope: text.runoff
ace_mode: text
language_id: 315
Racket:
type: programming
- color: "#22228f"
+ color: "#3c5caa"
extensions:
- ".rkt"
- ".rktd"
@@ -3931,6 +4559,33 @@ Ragel:
tm_scope: none
ace_mode: text
language_id: 317
+Raku:
+ type: programming
+ color: "#0000fb"
+ extensions:
+ - ".6pl"
+ - ".6pm"
+ - ".nqp"
+ - ".p6"
+ - ".p6l"
+ - ".p6m"
+ - ".pl"
+ - ".pl6"
+ - ".pm"
+ - ".pm6"
+ - ".t"
+ interpreters:
+ - perl6
+ - raku
+ - rakudo
+ aliases:
+ - perl6
+ - perl-6
+ tm_scope: source.perl6fe
+ ace_mode: perl
+ codemirror_mode: perl
+ codemirror_mime_type: text/x-perl
+ language_id: 283
Rascal:
type: programming
color: "#fffaa0"
@@ -3948,9 +4603,21 @@ Raw token data:
tm_scope: none
ace_mode: text
language_id: 318
+Readline Config:
+ type: data
+ group: INI
+ aliases:
+ - inputrc
+ - readline
+ filenames:
+ - ".inputrc"
+ - inputrc
+ tm_scope: source.inputrc
+ ace_mode: text
+ language_id: 538732839
Reason:
type: programming
- group: OCaml
+ color: "#ff5847"
ace_mode: rust
codemirror_mode: rust
codemirror_mime_type: text/x-rustsrc
@@ -4020,6 +4687,13 @@ RenderScript:
tm_scope: none
ace_mode: text
language_id: 323
+Rich Text Format:
+ type: markup
+ extensions:
+ - ".rtf"
+ tm_scope: text.rtf
+ ace_mode: text
+ language_id: 51601661
Ring:
type: programming
color: "#2D54CB"
@@ -4028,6 +4702,14 @@ Ring:
tm_scope: source.ring
ace_mode: text
language_id: 431
+Riot:
+ type: markup
+ color: "#A71E49"
+ ace_mode: html
+ extensions:
+ - ".riot"
+ tm_scope: text.html.riot
+ language_id: 878396783
RobotFramework:
type: programming
extensions:
@@ -4039,7 +4721,7 @@ Roff:
type: markup
color: "#ecdebe"
extensions:
- - ".man"
+ - ".roff"
- ".1"
- ".1in"
- ".1m"
@@ -4048,6 +4730,8 @@ Roff:
- ".3"
- ".3in"
- ".3m"
+ - ".3p"
+ - ".3pm"
- ".3qt"
- ".3x"
- ".4"
@@ -4057,23 +4741,65 @@ Roff:
- ".8"
- ".9"
- ".l"
+ - ".man"
+ - ".mdoc"
- ".me"
- ".ms"
- ".n"
- ".nr"
- ".rno"
- - ".roff"
- ".tmac"
filenames:
+ - eqnrc
- mmn
- mmt
+ - troffrc
+ - troffrc-end
tm_scope: text.roff
aliases:
+ - groff
+ - man
+ - manpage
+ - man page
+ - man-page
+ - mdoc
- nroff
+ - troff
+ wrap: true
ace_mode: text
codemirror_mode: troff
codemirror_mime_type: text/troff
language_id: 141
+Roff Manpage:
+ type: markup
+ group: Roff
+ extensions:
+ - ".1"
+ - ".1in"
+ - ".1m"
+ - ".1x"
+ - ".2"
+ - ".3"
+ - ".3in"
+ - ".3m"
+ - ".3p"
+ - ".3pm"
+ - ".3qt"
+ - ".3x"
+ - ".4"
+ - ".5"
+ - ".6"
+ - ".7"
+ - ".8"
+ - ".9"
+ - ".man"
+ - ".mdoc"
+ wrap: true
+ tm_scope: text.roff
+ ace_mode: text
+ codemirror_mode: troff
+ codemirror_mime_type: text/troff
+ language_id: 612669833
Rouge:
type: programming
ace_mode: clojure
@@ -4086,6 +4812,7 @@ Rouge:
language_id: 325
Ruby:
type: programming
+ tm_scope: source.ruby
ace_mode: ruby
codemirror_mode: ruby
codemirror_mime_type: text/x-ruby
@@ -4109,6 +4836,7 @@ Ruby:
- ".podspec"
- ".rabl"
- ".rake"
+ - ".rbi"
- ".rbuild"
- ".rbw"
- ".rbx"
@@ -4126,6 +4854,7 @@ Ruby:
filenames:
- ".irbrc"
- ".pryrc"
+ - ".simplecov"
- Appraisals
- Berksfile
- Brewfile
@@ -4153,6 +4882,7 @@ Rust:
extensions:
- ".rs"
- ".rs.in"
+ tm_scope: source.rust
ace_mode: rust
codemirror_mode: rust
codemirror_mime_type: text/x-rustsrc
@@ -4169,8 +4899,8 @@ SAS:
language_id: 328
SCSS:
type: markup
- tm_scope: source.scss
- group: CSS
+ color: "#c6538c"
+ tm_scope: source.css.scss
ace_mode: scss
codemirror_mode: css
codemirror_mime_type: text/x-scss
@@ -4252,6 +4982,19 @@ SRecode Template:
extensions:
- ".srt"
language_id: 335
+SSH Config:
+ type: data
+ group: INI
+ filenames:
+ - ssh-config
+ - ssh_config
+ - sshconfig
+ - sshconfig.snip
+ - sshd-config
+ - sshd_config
+ ace_mode: text
+ tm_scope: source.ssh-config
+ language_id: 554920715
STON:
type: data
group: Smalltalk
@@ -4262,16 +5005,25 @@ STON:
language_id: 336
SVG:
type: data
+ color: "#ff9900"
extensions:
- ".svg"
- tm_scope: text.xml
+ tm_scope: text.xml.svg
ace_mode: xml
codemirror_mode: xml
codemirror_mime_type: text/xml
language_id: 337
+SWIG:
+ type: programming
+ extensions:
+ - ".i"
+ tm_scope: source.c++
+ ace_mode: c_cpp
+ codemirror_mode: clike
+ codemirror_mime_type: text/x-c++src
+ language_id: 1066250075
Sage:
type: programming
- group: Python
extensions:
- ".sage"
- ".sagews"
@@ -4295,8 +5047,8 @@ SaltStack:
language_id: 339
Sass:
type: markup
+ color: "#a53b70"
tm_scope: source.sass
- group: CSS
extensions:
- ".sass"
ace_mode: sass
@@ -4305,6 +5057,7 @@ Sass:
language_id: 340
Scala:
type: programming
+ tm_scope: source.scala
ace_mode: scala
codemirror_mode: clike
codemirror_mime_type: text/x-scala
@@ -4336,12 +5089,14 @@ Scheme:
- ".sps"
- ".ss"
interpreters:
+ - scheme
- guile
- bigloo
- chicken
- csi
- gosh
- r6rs
+ tm_scope: source.scheme
ace_mode: scheme
codemirror_mode: scheme
codemirror_mime_type: text/x-scheme
@@ -4352,6 +5107,7 @@ Scilab:
- ".sci"
- ".sce"
- ".tst"
+ tm_scope: source.scilab
ace_mode: text
language_id: 344
Self:
@@ -4383,6 +5139,7 @@ Shell:
- ".bats"
- ".cgi"
- ".command"
+ - ".env"
- ".fcgi"
- ".ksh"
- ".sh.in"
@@ -4390,11 +5147,15 @@ Shell:
- ".tool"
- ".zsh"
filenames:
+ - ".bash_aliases"
- ".bash_history"
- ".bash_logout"
- ".bash_profile"
- ".bashrc"
- ".cshrc"
+ - ".env"
+ - ".env.example"
+ - ".flaskenv"
- ".login"
- ".profile"
- ".zlogin"
@@ -4404,6 +5165,7 @@ Shell:
- ".zshrc"
- 9fs
- PKGBUILD
+ - bash_aliases
- bash_logout
- bash_profile
- bashrc
@@ -4427,6 +5189,7 @@ Shell:
- rc
- sh
- zsh
+ tm_scope: source.shell
ace_mode: sh
codemirror_mode: shell
codemirror_mime_type: text/x-sh
@@ -4451,6 +5214,15 @@ Shen:
tm_scope: source.shen
ace_mode: text
language_id: 348
+Sieve:
+ type: programming
+ tm_scope: source.sieve
+ ace_mode: text
+ extensions:
+ - ".sieve"
+ codemirror_mode: sieve
+ codemirror_mime_type: application/sieve
+ language_id: 208976687
Slash:
type: programming
color: "#007eff"
@@ -4459,9 +5231,17 @@ Slash:
tm_scope: text.html.slash
ace_mode: text
language_id: 349
+Slice:
+ type: programming
+ color: "#003fa2"
+ tm_scope: source.slice
+ ace_mode: text
+ extensions:
+ - ".ice"
+ language_id: 894641667
Slim:
- group: HTML
type: markup
+ color: "#2b2b2b"
extensions:
- ".slim"
tm_scope: text.slim
@@ -4469,6 +5249,16 @@ Slim:
codemirror_mode: slim
codemirror_mime_type: text/x-slim
language_id: 350
+SmPL:
+ type: programming
+ extensions:
+ - ".cocci"
+ aliases:
+ - coccinelle
+ ace_mode: text
+ tm_scope: source.smpl
+ color: "#c94949"
+ language_id: 164123055
Smali:
type: programming
extensions:
@@ -4484,6 +5274,7 @@ Smalltalk:
- ".cs"
aliases:
- squeak
+ tm_scope: source.smalltalk
ace_mode: text
codemirror_mode: smalltalk
codemirror_mime_type: text/x-stsrc
@@ -4502,17 +5293,18 @@ Solidity:
color: "#AA6746"
ace_mode: text
tm_scope: source.solidity
+ extensions:
+ - ".sol"
language_id: 237469032
SourcePawn:
type: programming
- color: "#5c7611"
+ color: "#f69e1d"
aliases:
- sourcemod
extensions:
- ".sp"
- ".inc"
- - ".sma"
- tm_scope: source.sp
+ tm_scope: source.sourcepawn
ace_mode: text
language_id: 354
Spline Font Database:
@@ -4546,7 +5338,7 @@ Standard ML:
aliases:
- sml
extensions:
- - ".ML"
+ - ".ml"
- ".fun"
- ".sig"
- ".sml"
@@ -4555,6 +5347,25 @@ Standard ML:
codemirror_mode: mllike
codemirror_mime_type: text/x-ocaml
language_id: 357
+Starlark:
+ type: programming
+ tm_scope: source.python
+ ace_mode: python
+ codemirror_mode: python
+ codemirror_mime_type: text/x-python
+ color: "#76d275"
+ extensions:
+ - ".bzl"
+ filenames:
+ - BUCK
+ - BUILD
+ - BUILD.bazel
+ - Tiltfile
+ - WORKSPACE
+ aliases:
+ - bazel
+ - bzl
+ language_id: 960266174
Stata:
type: programming
extensions:
@@ -4565,11 +5376,12 @@ Stata:
- ".mata"
- ".matah"
- ".sthlp"
+ tm_scope: source.stata
ace_mode: text
language_id: 358
Stylus:
type: markup
- group: CSS
+ color: "#ff6347"
extensions:
- ".styl"
tm_scope: source.stylus
@@ -4602,11 +5414,22 @@ SuperCollider:
tm_scope: source.supercollider
ace_mode: text
language_id: 361
+Svelte:
+ type: markup
+ color: "#ff3e00"
+ tm_scope: source.svelte
+ ace_mode: html
+ codemirror_mode: htmlmixed
+ codemirror_mime_type: text/html
+ extensions:
+ - ".svelte"
+ language_id: 928734530
Swift:
type: programming
color: "#ffac45"
extensions:
- ".swift"
+ tm_scope: source.swift
ace_mode: text
codemirror_mode: swift
codemirror_mime_type: text/x-swift
@@ -4618,6 +5441,7 @@ SystemVerilog:
- ".sv"
- ".svh"
- ".vh"
+ tm_scope: source.systemverilog
ace_mode: verilog
codemirror_mode: verilog
codemirror_mime_type: text/x-systemverilog
@@ -4647,11 +5471,36 @@ TOML:
filenames:
- Cargo.lock
- Gopkg.lock
+ - poetry.lock
tm_scope: source.toml
ace_mode: toml
codemirror_mode: toml
codemirror_mime_type: text/x-toml
language_id: 365
+TSQL:
+ type: programming
+ extensions:
+ - ".sql"
+ ace_mode: sql
+ tm_scope: source.tsql
+ language_id: 918334941
+TSV:
+ type: data
+ ace_mode: text
+ tm_scope: source.generic-db
+ extensions:
+ - ".tsv"
+ language_id: 1035892117
+TSX:
+ type: programming
+ group: TypeScript
+ extensions:
+ - ".tsx"
+ tm_scope: source.tsx
+ ace_mode: javascript
+ codemirror_mode: jsx
+ codemirror_mime_type: text/jsx
+ language_id: 94901924
TXL:
type: programming
extensions:
@@ -4672,6 +5521,7 @@ Tcl:
interpreters:
- tclsh
- wish
+ tm_scope: source.tcl
ace_mode: tcl
codemirror_mode: tcl
codemirror_mime_type: text/x-tcl
@@ -4682,6 +5532,9 @@ Tcsh:
extensions:
- ".tcsh"
- ".csh"
+ interpreters:
+ - tcsh
+ - csh
tm_scope: source.shell
ace_mode: sh
codemirror_mode: shell
@@ -4693,6 +5546,7 @@ TeX:
ace_mode: tex
codemirror_mode: stex
codemirror_mime_type: text/x-stex
+ tm_scope: text.tex.latex
wrap: true
aliases:
- latex
@@ -4700,7 +5554,6 @@ TeX:
- ".tex"
- ".aux"
- ".bbx"
- - ".bib"
- ".cbx"
- ".cls"
- ".dtx"
@@ -4725,12 +5578,25 @@ Terra:
extensions:
- ".t"
color: "#00004c"
+ tm_scope: source.terra
ace_mode: lua
codemirror_mode: lua
codemirror_mime_type: text/x-lua
interpreters:
- lua
language_id: 371
+Texinfo:
+ type: prose
+ wrap: true
+ extensions:
+ - ".texinfo"
+ - ".texi"
+ - ".txi"
+ ace_mode: text
+ tm_scope: text.texinfo
+ interpreters:
+ - makeinfo
+ language_id: 988020015
Text:
type: prose
wrap: true
@@ -4757,10 +5623,17 @@ Text:
- README.mysql
- click.me
- delete.me
+ - go.mod
+ - go.sum
- keep.me
+ - package.mask
+ - package.use.mask
+ - package.use.stable.mask
- read.me
- readme.1st
- test.me
+ - use.mask
+ - use.stable.mask
tm_scope: none
ace_mode: text
language_id: 372
@@ -4801,7 +5674,7 @@ Turtle:
language_id: 376
Twig:
type: markup
- group: HTML
+ color: "#c1d026"
extensions:
- ".twig"
tm_scope: text.html.twig
@@ -4823,9 +5696,11 @@ TypeScript:
color: "#2b7489"
aliases:
- ts
+ interpreters:
+ - deno
+ - ts-node
extensions:
- ".ts"
- - ".tsx"
tm_scope: source.ts
ace_mode: typescript
codemirror_mode: javascript
@@ -4849,6 +5724,7 @@ Unity3D Asset:
extensions:
- ".anim"
- ".asset"
+ - ".mask"
- ".mat"
- ".meta"
- ".prefab"
@@ -4866,6 +5742,7 @@ Unix Assembly:
language_id: 120
Uno:
type: programming
+ color: "#9933cc"
extensions:
- ".uno"
ace_mode: csharp
@@ -4894,6 +5771,46 @@ UrWeb:
tm_scope: source.ur
ace_mode: text
language_id: 383
+V:
+ type: programming
+ color: "#4f87c4"
+ aliases:
+ - vlang
+ extensions:
+ - ".v"
+ tm_scope: source.v
+ ace_mode: golang
+ codemirror_mode: go
+ codemirror_mime_type: text/x-go
+ language_id: 603371597
+VBA:
+ type: programming
+ color: "#867db1"
+ extensions:
+ - ".bas"
+ - ".cls"
+ - ".frm"
+ - ".frx"
+ - ".vba"
+ tm_scope: source.vbnet
+ aliases:
+ - vb6
+ - visual basic 6
+ - visual basic for applications
+ ace_mode: text
+ codemirror_mode: vb
+ codemirror_mime_type: text/x-vb
+ language_id: 399230729
+VBScript:
+ type: programming
+ color: "#15dcdc"
+ extensions:
+ - ".vbs"
+ tm_scope: source.vbnet
+ ace_mode: text
+ codemirror_mode: vbscript
+ codemirror_mime_type: text/vbscript
+ language_id: 408016005
VCL:
type: programming
color: "#148AA8"
@@ -4914,6 +5831,7 @@ VHDL:
- ".vhs"
- ".vht"
- ".vhw"
+ tm_scope: source.vhdl
ace_mode: vhdl
codemirror_mode: vhdl
codemirror_mime_type: text/x-vhdl
@@ -4924,6 +5842,7 @@ Vala:
extensions:
- ".vala"
- ".vapi"
+ tm_scope: source.vala
ace_mode: vala
language_id: 386
Verilog:
@@ -4932,10 +5851,34 @@ Verilog:
extensions:
- ".v"
- ".veo"
+ tm_scope: source.verilog
ace_mode: verilog
codemirror_mode: verilog
codemirror_mime_type: text/x-verilog
language_id: 387
+Vim Help File:
+ type: prose
+ aliases:
+ - vimhelp
+ extensions:
+ - ".txt"
+ tm_scope: text.vim-help
+ ace_mode: text
+ language_id: 508563686
+Vim Snippet:
+ type: markup
+ aliases:
+ - SnipMate
+ - UltiSnip
+ - UltiSnips
+ - NeoSnippet
+ extensions:
+ - ".snip"
+ - ".snippet"
+ - ".snippets"
+ tm_scope: source.vim-snippet
+ ace_mode: text
+ language_id: 81265970
Vim script:
type: programming
color: "#199f4b"
@@ -4946,7 +5889,10 @@ Vim script:
- nvim
extensions:
- ".vim"
+ - ".vba"
+ - ".vmb"
filenames:
+ - ".exrc"
- ".gvimrc"
- ".nvimrc"
- ".vimrc"
@@ -4956,22 +5902,18 @@ Vim script:
- vimrc
ace_mode: text
language_id: 388
-Visual Basic:
+Visual Basic .NET:
type: programming
color: "#945db7"
extensions:
- ".vb"
- - ".bas"
- - ".cls"
- - ".frm"
- - ".frx"
- - ".vba"
- ".vbhtml"
- - ".vbs"
- tm_scope: source.vbnet
aliases:
- - vb.net
+ - visual basic
- vbnet
+ - vb .net
+ - vb.net
+ tm_scope: source.vbnet
ace_mode: text
codemirror_mode: vb
codemirror_mime_type: text/x-vb
@@ -5038,6 +5980,41 @@ WebIDL:
codemirror_mode: webidl
codemirror_mime_type: text/x-webidl
language_id: 395
+WebVTT:
+ type: data
+ wrap: true
+ extensions:
+ - ".vtt"
+ tm_scope: source.vtt
+ ace_mode: text
+ language_id: 658679714
+Wget Config:
+ type: data
+ group: INI
+ aliases:
+ - wgetrc
+ filenames:
+ - ".wgetrc"
+ tm_scope: source.wgetrc
+ ace_mode: text
+ language_id: 668457123
+Windows Registry Entries:
+ type: data
+ extensions:
+ - ".reg"
+ tm_scope: source.reg
+ ace_mode: ini
+ codemirror_mode: properties
+ codemirror_mime_type: text/x-properties
+ language_id: 969674868
+Wollok:
+ type: programming
+ color: "#a23738"
+ extensions:
+ - ".wlk"
+ ace_mode: text
+ tm_scope: source.wollok
+ language_id: 632745969
World of Warcraft Addon Data:
type: data
extensions:
@@ -5057,6 +6034,16 @@ X BitMap:
codemirror_mode: clike
codemirror_mime_type: text/x-csrc
language_id: 782911107
+X Font Directory Index:
+ type: data
+ filenames:
+ - encodings.dir
+ - fonts.alias
+ - fonts.dir
+ - fonts.scale
+ tm_scope: source.fontdir
+ ace_mode: text
+ language_id: 208700028
X PixMap:
type: data
group: C
@@ -5101,6 +6088,7 @@ XCompose:
language_id: 225167241
XML:
type: data
+ tm_scope: text.xml
ace_mode: xml
codemirror_mode: xml
codemirror_mime_type: text/xml
@@ -5135,7 +6123,9 @@ XML:
- ".fxml"
- ".glade"
- ".gml"
+ - ".gmx"
- ".grxml"
+ - ".gst"
- ".iml"
- ".ivy"
- ".jelly"
@@ -5155,7 +6145,6 @@ XML:
- ".odd"
- ".osm"
- ".pkgproj"
- - ".plist"
- ".pluginspec"
- ".proj"
- ".props"
@@ -5171,15 +6160,9 @@ XML:
- ".shproj"
- ".srdf"
- ".storyboard"
- - ".stTheme"
- ".sublime-snippet"
- ".targets"
- - ".tmCommand"
- ".tml"
- - ".tmLanguage"
- - ".tmPreferences"
- - ".tmSnippet"
- - ".tmTheme"
- ".ts"
- ".tsx"
- ".ui"
@@ -5192,6 +6175,7 @@ XML:
- ".vstemplate"
- ".vxml"
- ".wixproj"
+ - ".workflow"
- ".wsdl"
- ".wsf"
- ".wxi"
@@ -5222,6 +6206,22 @@ XML:
- Web.config
- packages.config
language_id: 399
+XML Property List:
+ type: data
+ group: XML
+ extensions:
+ - ".plist"
+ - ".stTheme"
+ - ".tmCommand"
+ - ".tmLanguage"
+ - ".tmPreferences"
+ - ".tmSnippet"
+ - ".tmTheme"
+ tm_scope: text.xml.plist
+ ace_mode: xml
+ codemirror_mode: xml
+ codemirror_mime_type: text/xml
+ language_id: 75622871
XPages:
type: data
extensions:
@@ -5287,17 +6287,19 @@ Xojo:
- ".xojo_script"
- ".xojo_toolbar"
- ".xojo_window"
- tm_scope: source.vbnet
+ tm_scope: source.xojo
ace_mode: text
language_id: 405
Xtend:
type: programming
extensions:
- ".xtend"
+ tm_scope: source.xtend
ace_mode: text
language_id: 406
YAML:
type: data
+ color: "#cb171e"
tm_scope: source.yaml
aliases:
- yml
@@ -5310,12 +6312,14 @@ YAML:
- ".syntax"
- ".yaml"
- ".yaml-tmlanguage"
+ - ".yaml.sed"
- ".yml.mysql"
filenames:
- ".clang-format"
- ".clang-tidy"
- ".gemrc"
- glide.lock
+ - yarn.lock
ace_mode: yaml
codemirror_mode: yaml
codemirror_mime_type: text/x-yaml
@@ -5328,23 +6332,71 @@ YANG:
ace_mode: text
language_id: 408
YARA:
- type: data
+ type: programming
+ color: "#220000"
ace_mode: text
extensions:
- ".yar"
- ".yara"
tm_scope: source.yara
language_id: 805122868
+YASnippet:
+ type: markup
+ aliases:
+ - snippet
+ - yas
+ color: "#32AB90"
+ extensions:
+ - ".yasnippet"
+ tm_scope: source.yasnippet
+ ace_mode: text
+ language_id: 378760102
Yacc:
type: programming
extensions:
- ".y"
- ".yacc"
- ".yy"
- tm_scope: source.bison
+ tm_scope: source.yacc
ace_mode: text
color: "#4B6C4B"
language_id: 409
+ZAP:
+ type: programming
+ color: "#0d665e"
+ extensions:
+ - ".zap"
+ - ".xzap"
+ tm_scope: source.zap
+ ace_mode: text
+ language_id: 952972794
+ZIL:
+ type: programming
+ color: "#dc75e5"
+ extensions:
+ - ".zil"
+ - ".mud"
+ tm_scope: source.zil
+ ace_mode: text
+ language_id: 973483626
+Zeek:
+ type: programming
+ aliases:
+ - bro
+ extensions:
+ - ".zeek"
+ - ".bro"
+ tm_scope: source.zeek
+ ace_mode: text
+ language_id: 40
+ZenScript:
+ type: programming
+ color: "#00BCD1"
+ extensions:
+ - ".zs"
+ tm_scope: source.zenscript
+ ace_mode: text
+ language_id: 494938890
Zephir:
type: programming
color: "#118f9e"
@@ -5353,6 +6405,14 @@ Zephir:
tm_scope: source.php.zephir
ace_mode: php
language_id: 410
+Zig:
+ type: programming
+ color: "#ec915c"
+ extensions:
+ - ".zig"
+ tm_scope: source.zig
+ ace_mode: text
+ language_id: 646424281
Zimpl:
type: programming
extensions:
@@ -5362,6 +6422,17 @@ Zimpl:
tm_scope: none
ace_mode: text
language_id: 411
+cURL Config:
+ type: data
+ group: INI
+ aliases:
+ - curlrc
+ filenames:
+ - ".curlrc"
+ - _curlrc
+ tm_scope: source.curlrc
+ ace_mode: text
+ language_id: 992375436
desktop:
type: data
extensions:
@@ -5370,6 +6441,20 @@ desktop:
tm_scope: source.desktop
ace_mode: text
language_id: 412
+dircolors:
+ type: data
+ extensions:
+ - ".dircolors"
+ filenames:
+ - ".dir_colors"
+ - ".dircolors"
+ - DIR_COLORS
+ - _dir_colors
+ - _dircolors
+ - dir_colors
+ tm_scope: source.dircolors
+ ace_mode: text
+ language_id: 691605112
eC:
type: programming
color: "#913960"
@@ -5398,12 +6483,40 @@ fish:
tm_scope: source.fish
ace_mode: text
language_id: 415
+mIRC Script:
+ type: programming
+ color: "#3d57c3"
+ extensions:
+ - ".mrc"
+ tm_scope: source.msl
+ ace_mode: text
+ language_id: 517654727
+mcfunction:
+ type: programming
+ color: "#E22837"
+ extensions:
+ - ".mcfunction"
+ tm_scope: source.mcfunction
+ ace_mode: text
+ language_id: 462488745
mupad:
type: programming
extensions:
- ".mu"
+ tm_scope: source.mupad
ace_mode: text
language_id: 416
+nanorc:
+ type: data
+ group: INI
+ extensions:
+ - ".nanorc"
+ filenames:
+ - ".nanorc"
+ - nanorc
+ tm_scope: source.nanorc
+ ace_mode: text
+ language_id: 775996197
nesC:
type: programming
color: "#94B0C7"
@@ -5417,6 +6530,7 @@ ooc:
color: "#b0b77e"
extensions:
- ".ooc"
+ tm_scope: source.ooc
ace_mode: text
language_id: 418
q:
@@ -5437,6 +6551,7 @@ reStructuredText:
- ".rest"
- ".rest.txt"
- ".rst.txt"
+ tm_scope: text.restructuredtext
ace_mode: text
codemirror_mode: rst
codemirror_mime_type: text/x-rst
diff --git a/yarn.lock b/yarn.lock
index 99080bca1c8..93a686f947f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5586,16 +5586,6 @@ graphql@^14.7.0:
dependencies:
iterall "^1.2.2"
-gray-matter@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454"
- integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==
- dependencies:
- js-yaml "^3.11.0"
- kind-of "^6.0.2"
- section-matter "^1.0.0"
- strip-bom-string "^1.0.0"
-
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -7114,7 +7104,7 @@ js-cookie@^2.2.1:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@~3.13.1:
+js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@~3.13.1:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -10500,14 +10490,6 @@ scss-tokenizer@^0.2.3:
js-base64 "^2.1.8"
source-map "^0.4.2"
-section-matter@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167"
- integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==
- dependencies:
- extend-shallow "^2.0.1"
- kind-of "^6.0.0"
-
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@@ -11170,11 +11152,6 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
-strip-bom-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
- integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=
-
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"