add: SIMD linting (#40)
* Kinda works kinda doesn't * Proof of concept * add: ci for SIMDs updated linter fix: linter fix: ci name --------- Co-authored-by: James Pacheco <jamesrp13@gmail.com>
This commit is contained in:
parent
5b00382f24
commit
1f9a233350
|
@ -0,0 +1,192 @@
|
||||||
|
# Rule details can be found at https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md
|
||||||
|
|
||||||
|
default: false
|
||||||
|
|
||||||
|
# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time
|
||||||
|
MD001: true
|
||||||
|
# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading (deprecated)
|
||||||
|
MD002: false
|
||||||
|
|
||||||
|
# MD003/heading-style/header-style - Heading style
|
||||||
|
MD003:
|
||||||
|
# Heading style
|
||||||
|
style: "atx"
|
||||||
|
|
||||||
|
# MD004/ul-style - Unordered list style
|
||||||
|
MD004:
|
||||||
|
# List style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD005/list-indent - Inconsistent indentation for list items at the same level
|
||||||
|
MD005: true
|
||||||
|
|
||||||
|
# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line (deprecated)
|
||||||
|
MD006: false
|
||||||
|
# MD007/ul-indent - Unordered list indentation
|
||||||
|
MD007: false
|
||||||
|
# MD009/no-trailing-spaces - Trailing spaces
|
||||||
|
MD009: false
|
||||||
|
|
||||||
|
# MD010/no-hard-tabs - Hard tabs
|
||||||
|
MD010: false
|
||||||
|
|
||||||
|
# MD011/no-reversed-links - Reversed link syntax
|
||||||
|
MD011: true
|
||||||
|
|
||||||
|
# MD012/no-multiple-blanks - Multiple consecutive blank lines
|
||||||
|
MD012: false
|
||||||
|
|
||||||
|
# MD013/line-length - Line length
|
||||||
|
# Changed from default so we can allow the paragraphs to be a single line
|
||||||
|
MD013: true
|
||||||
|
|
||||||
|
# MD014/commands-show-output - Dollar signs used before commands without showing output
|
||||||
|
MD014: false
|
||||||
|
|
||||||
|
# MD018/no-missing-space-atx - No space after hash on atx style heading
|
||||||
|
MD018: true
|
||||||
|
|
||||||
|
# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading
|
||||||
|
MD019: true
|
||||||
|
|
||||||
|
# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading
|
||||||
|
MD020: true
|
||||||
|
|
||||||
|
# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading
|
||||||
|
MD021: true
|
||||||
|
|
||||||
|
# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines
|
||||||
|
MD022: true
|
||||||
|
|
||||||
|
# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line
|
||||||
|
MD023: true
|
||||||
|
|
||||||
|
# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content
|
||||||
|
MD024:
|
||||||
|
# Only check sibling headings
|
||||||
|
allow_different_nesting: true
|
||||||
|
|
||||||
|
# MD025/single-title/single-h1 - Multiple top-level headings in the same document
|
||||||
|
MD025:
|
||||||
|
# Heading level
|
||||||
|
level: 1
|
||||||
|
# RegExp for matching title in front matter
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
|
||||||
|
# MD026/no-trailing-punctuation - Trailing punctuation in heading
|
||||||
|
MD026: false
|
||||||
|
|
||||||
|
# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol
|
||||||
|
MD027: false
|
||||||
|
|
||||||
|
# MD028/no-blanks-blockquote - Blank line inside blockquote
|
||||||
|
MD028: true
|
||||||
|
|
||||||
|
# MD029/ol-prefix - Ordered list item prefix
|
||||||
|
MD029: false
|
||||||
|
|
||||||
|
# MD030/list-marker-space - Spaces after list markers
|
||||||
|
MD030:
|
||||||
|
# Spaces for single-line unordered list items
|
||||||
|
ul_single: 1
|
||||||
|
# Spaces for single-line ordered list items
|
||||||
|
ol_single: 1
|
||||||
|
# Spaces for multi-line unordered list items
|
||||||
|
ul_multi: 1
|
||||||
|
# Spaces for multi-line ordered list items
|
||||||
|
ol_multi: 1
|
||||||
|
|
||||||
|
# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines
|
||||||
|
MD031:
|
||||||
|
# Include list items
|
||||||
|
list_items: true
|
||||||
|
|
||||||
|
# MD032/blanks-around-lists - Lists should be surrounded by blank lines
|
||||||
|
MD032: true
|
||||||
|
|
||||||
|
# MD033/no-inline-html - Inline HTML
|
||||||
|
MD033:
|
||||||
|
# Allowed elements
|
||||||
|
allowed_elements: []
|
||||||
|
|
||||||
|
# MD034/no-bare-urls - Bare URL used
|
||||||
|
MD034: false
|
||||||
|
|
||||||
|
# MD035/hr-style - Horizontal rule style
|
||||||
|
MD035:
|
||||||
|
# Horizontal rule style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading
|
||||||
|
MD036: false
|
||||||
|
|
||||||
|
# MD037/no-space-in-emphasis - Spaces inside emphasis markers
|
||||||
|
MD037: false
|
||||||
|
|
||||||
|
# MD038/no-space-in-code - Spaces inside code span elements
|
||||||
|
MD038: true
|
||||||
|
|
||||||
|
# MD039/no-space-in-links - Spaces inside link text
|
||||||
|
MD039: false
|
||||||
|
|
||||||
|
# MD040/fenced-code-language - Fenced code blocks should have a language specified
|
||||||
|
MD040: false
|
||||||
|
|
||||||
|
# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
|
||||||
|
# NOTE: Since this uses Jekyll, this setting only applies to freestanding markdown files, such as those in the assets folder
|
||||||
|
MD041:
|
||||||
|
# Heading level
|
||||||
|
level: 1
|
||||||
|
# RegExp for matching title in front matter
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
|
||||||
|
# MD042/no-empty-links - No empty links
|
||||||
|
MD042: true
|
||||||
|
|
||||||
|
# MD043/required-headings/required-headers - Required heading structure
|
||||||
|
# Handled by EIP Walidator
|
||||||
|
MD043: false
|
||||||
|
|
||||||
|
# MD044/proper-names - Proper names should have the correct capitalization
|
||||||
|
MD044:
|
||||||
|
# List of proper names
|
||||||
|
names: []
|
||||||
|
# Include code blocks
|
||||||
|
code_blocks: true
|
||||||
|
# Include HTML elements
|
||||||
|
html_elements: true
|
||||||
|
|
||||||
|
# MD045/no-alt-text - Images should have alternate text (alt text)
|
||||||
|
MD045: false
|
||||||
|
|
||||||
|
# MD046/code-block-style - Code block style
|
||||||
|
MD046:
|
||||||
|
# Block style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD047/single-trailing-newline - Files should end with a single newline character
|
||||||
|
MD047: false
|
||||||
|
|
||||||
|
# MD048/code-fence-style - Code fence style
|
||||||
|
MD048:
|
||||||
|
# Code fence style
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD049/emphasis-style - Emphasis style should be consistent
|
||||||
|
MD049:
|
||||||
|
# Emphasis style should be consistent
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD050/strong-style - Strong style should be consistent
|
||||||
|
MD050:
|
||||||
|
# Strong style should be consistent
|
||||||
|
style: "consistent"
|
||||||
|
|
||||||
|
# MD051/link-fragments - Link fragments should be valid
|
||||||
|
MD051: true
|
||||||
|
|
||||||
|
# MD052/reference-links-images - Reference links and images should use a label that is defined
|
||||||
|
MD052: true
|
||||||
|
|
||||||
|
# MD053/link-image-reference-definitions - Link and image reference definitions should be needed
|
||||||
|
MD053: true
|
|
@ -0,0 +1,299 @@
|
||||||
|
import { RuleParams, RuleOnError } from "markdownlint"
|
||||||
|
import * as yaml from "js-yaml"
|
||||||
|
|
||||||
|
export const enforceHeaderStructure = {
|
||||||
|
names: ["enforce-header-structure"],
|
||||||
|
description: "Proposal header structure should follow template",
|
||||||
|
tags: ["structure"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const category: string = frontMatter.category
|
||||||
|
if (!category) return
|
||||||
|
|
||||||
|
if (["Meta"].includes(category)) return
|
||||||
|
|
||||||
|
const filtered = params.tokens.filter(function filterToken(token) {
|
||||||
|
return (
|
||||||
|
token.type === "heading_open" &&
|
||||||
|
(token.tag === "h1" || token.tag === "h2")
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
let index = 0
|
||||||
|
|
||||||
|
let tempHeadings = expectedHeadings;
|
||||||
|
|
||||||
|
while (index < expectedHeadings.length) {
|
||||||
|
let token = filtered[index]
|
||||||
|
tempHeadings = tempHeadings.filter(item => item !== token.line)
|
||||||
|
|
||||||
|
if (index + 1 >= filtered.length) {
|
||||||
|
onError({
|
||||||
|
lineNumber: token.lineNumber,
|
||||||
|
detail: `Expected heading \`${expectedHeadings[index]}\` and none exists. Please follow the structure outlined in the Proposal Template.`,
|
||||||
|
context: token.line,
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tempHeadings.forEach(item => {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `Expected heading \`${item}\` and none exists. Please follow the structure outlined in the Proposal Template.`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
if (tempHeadings.length >= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const expectedHeadings = [
|
||||||
|
"## Summary",
|
||||||
|
"## Motivation",
|
||||||
|
"## Alternatives Considered",
|
||||||
|
"## New Terminology",
|
||||||
|
"## Detailed Design",
|
||||||
|
"## Impact",
|
||||||
|
"## Security Considerations",
|
||||||
|
]
|
||||||
|
|
||||||
|
export const enforceMetadataStructure = {
|
||||||
|
names: ["enforce-front-matter-structure"],
|
||||||
|
description:
|
||||||
|
"Proposal front matter should be YAML following template structure",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
|
||||||
|
if (!frontMatter) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `Missing front matter metadata formatted as YAML`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(requiredMetadata).forEach((meta) => {
|
||||||
|
if (!frontMatter[meta]) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `Front matter metadata either doesn't contain \`${meta}\` or isn't formatted correctly`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.keys(frontMatter).forEach((key) => {
|
||||||
|
if (!(requiredMetadata as any)[key] && !(optionalMetadata as any)[key]) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `Front matter contains invalid metadata \`${key}\``,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const requiredMetadata = {
|
||||||
|
simd: {},
|
||||||
|
title: {},
|
||||||
|
authors: {},
|
||||||
|
category: {},
|
||||||
|
type: {},
|
||||||
|
status: {},
|
||||||
|
created: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
const optionalMetadata = {
|
||||||
|
feature: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataSimdIsValid = {
|
||||||
|
names: ["front-matter-has-simd"],
|
||||||
|
description: "Metadata `simd` is a 4 digit numerical string",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const simd: string = frontMatter.simd
|
||||||
|
if (!simd) return
|
||||||
|
|
||||||
|
if (isNaN(Number(simd))) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: "Front matter `simd` must be a numerical string",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (simd.length !== 4) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: "Front matter `simd` must be 4 digits",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataTitleIsValid = {
|
||||||
|
names: ["front-matter-has-title"],
|
||||||
|
description:
|
||||||
|
"Proposal front matter should include a title no longer than 45 characters",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const title: string = frontMatter.title
|
||||||
|
if (!title) return
|
||||||
|
|
||||||
|
if (title.length > 45) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: "Metadata `title` should be no longer than 45 characters",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataAuthorsIsValid = {
|
||||||
|
names: ["front-matter-has-authors"],
|
||||||
|
description: "Proposal front matter should include authors",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const authors: string = frontMatter.authors
|
||||||
|
if (!authors) return
|
||||||
|
|
||||||
|
if (authors.length == 0) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: "Metadata `authors` exists but doesn't include any values",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataCategoryIsValid = {
|
||||||
|
names: ["front-matter-has-valid-category"],
|
||||||
|
description: "Proposal front matter should have a valid category",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const category: string = frontMatter.category
|
||||||
|
if (!category) return
|
||||||
|
|
||||||
|
if (!["Meta", "Standard"].includes(category)) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `\`${category}\` is not supported as a value for category`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataTypeIsValid = {
|
||||||
|
names: ["front-matter-has-valid-type"],
|
||||||
|
description: "Proposal front matter should have a valid type",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const type: string = frontMatter.type
|
||||||
|
if (!type) return
|
||||||
|
|
||||||
|
const validTypes = ["Core", "Networking", "Interface", "Meta"]
|
||||||
|
|
||||||
|
if (!validTypes.some((validType) => type.includes(validType))) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `\`${type}\` is not supported as a value for type. Valid values for type are: ${validTypes.join(
|
||||||
|
", "
|
||||||
|
)}`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const metadataStatusIsValid = {
|
||||||
|
names: ["front-matter-has-valid-status"],
|
||||||
|
description: "Proposal front matter should have a valid status",
|
||||||
|
tags: ["front-matter"],
|
||||||
|
function: function rule(params: RuleParams, onError: RuleOnError) {
|
||||||
|
const string = params.frontMatterLines
|
||||||
|
.join("\n")
|
||||||
|
.trim()
|
||||||
|
.replace(/^-*$/gm, "")
|
||||||
|
|
||||||
|
const frontMatter: any = yaml.load(string)
|
||||||
|
if (!frontMatter) return
|
||||||
|
|
||||||
|
const status: string = frontMatter.status
|
||||||
|
if (!status) return
|
||||||
|
|
||||||
|
const validStatus = [
|
||||||
|
"Idea",
|
||||||
|
"Draft",
|
||||||
|
"Review",
|
||||||
|
"Accepted",
|
||||||
|
"Stagnant",
|
||||||
|
"Withdrawn",
|
||||||
|
"Implemented",
|
||||||
|
]
|
||||||
|
|
||||||
|
if (!validStatus.includes(status)) {
|
||||||
|
onError({
|
||||||
|
lineNumber: 1,
|
||||||
|
detail: `\`${status}\` is not supported as a value for status. Valid values for status are: ${validStatus.join(
|
||||||
|
", "
|
||||||
|
)}`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,149 @@
|
||||||
|
import markdownlint from "markdownlint"
|
||||||
|
import {
|
||||||
|
enforceHeaderStructure,
|
||||||
|
enforceMetadataStructure,
|
||||||
|
metadataSimdIsValid,
|
||||||
|
metadataTitleIsValid,
|
||||||
|
metadataAuthorsIsValid,
|
||||||
|
metadataCategoryIsValid,
|
||||||
|
metadataTypeIsValid,
|
||||||
|
metadataStatusIsValid,
|
||||||
|
} from "./customRules"
|
||||||
|
import fs from "fs"
|
||||||
|
import path from "path"
|
||||||
|
const core = require('@actions/core');
|
||||||
|
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const dir = path.join(__dirname, "../../proposals")
|
||||||
|
|
||||||
|
const files = fs.readdirSync(dir).filter((f) => {
|
||||||
|
if (f.indexOf("0001-simd-process.md")) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}).map((f) => {
|
||||||
|
return path.join(dir, f)
|
||||||
|
})
|
||||||
|
|
||||||
|
//const configuration = markdownlint.readConfigSync('../config/.markdownlint.json')
|
||||||
|
|
||||||
|
const linted = markdownlint.sync({
|
||||||
|
files: files,
|
||||||
|
config: {
|
||||||
|
default: true,
|
||||||
|
MD001: true,
|
||||||
|
MD002: false,
|
||||||
|
MD003: {
|
||||||
|
style: "atx"
|
||||||
|
},
|
||||||
|
MD004: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD005: true,
|
||||||
|
MD006: false,
|
||||||
|
MD007: false,
|
||||||
|
MD009: false,
|
||||||
|
MD010: false,
|
||||||
|
MD011: true,
|
||||||
|
MD012: false,
|
||||||
|
MD013: true,
|
||||||
|
MD014: false,
|
||||||
|
MD018: true,
|
||||||
|
MD019: true,
|
||||||
|
MD020: true,
|
||||||
|
MD021: true,
|
||||||
|
MD022: true,
|
||||||
|
MD023: true,
|
||||||
|
MD024: {
|
||||||
|
allow_different_nesting: true
|
||||||
|
},
|
||||||
|
MD025: {
|
||||||
|
level: 1,
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
},
|
||||||
|
MD026: false,
|
||||||
|
MD027: false,
|
||||||
|
MD028: true,
|
||||||
|
MD029: false,
|
||||||
|
MD030: {
|
||||||
|
ul_single: 1,
|
||||||
|
ol_single: 1,
|
||||||
|
ul_multi: 1,
|
||||||
|
ol_multi: 1
|
||||||
|
},
|
||||||
|
MD031: {
|
||||||
|
list_items: true
|
||||||
|
},
|
||||||
|
MD032: true,
|
||||||
|
MD033: {
|
||||||
|
allowed_elements: []
|
||||||
|
},
|
||||||
|
MD034: false,
|
||||||
|
MD035: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD036: false,
|
||||||
|
MD037: false,
|
||||||
|
MD038: true,
|
||||||
|
MD039: false,
|
||||||
|
MD040: false,
|
||||||
|
MD041: {
|
||||||
|
level: 1,
|
||||||
|
front_matter_title: "^\\s*title\\s*[:=]"
|
||||||
|
},
|
||||||
|
MD042: true,
|
||||||
|
MD043: false,
|
||||||
|
MD044: {
|
||||||
|
names: [],
|
||||||
|
code_blocks: true,
|
||||||
|
html_elements: true
|
||||||
|
},
|
||||||
|
MD045: false,
|
||||||
|
MD046: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD047: false,
|
||||||
|
MD048: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD049: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD050: {
|
||||||
|
style: "consistent"
|
||||||
|
},
|
||||||
|
MD051: true,
|
||||||
|
MD052: true,
|
||||||
|
MD053: true
|
||||||
|
},
|
||||||
|
customRules: [
|
||||||
|
enforceHeaderStructure,
|
||||||
|
enforceMetadataStructure,
|
||||||
|
metadataSimdIsValid,
|
||||||
|
metadataTitleIsValid,
|
||||||
|
metadataAuthorsIsValid,
|
||||||
|
metadataCategoryIsValid,
|
||||||
|
metadataTypeIsValid,
|
||||||
|
metadataStatusIsValid,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
console.log(linted)
|
||||||
|
let errorCount = 0
|
||||||
|
for (let lint in linted) {
|
||||||
|
errorCount += linted[lint].length
|
||||||
|
}
|
||||||
|
if (errorCount > 0) {
|
||||||
|
throw new Error(JSON.stringify(linted))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
|
.then(() => {
|
||||||
|
console.log("Finished Successfully")
|
||||||
|
process.exit(0)
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
core.setFailed(error)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
|
@ -0,0 +1,51 @@
|
||||||
|
name: Continuous Integration
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- reopened
|
||||||
|
- synchronize
|
||||||
|
- ready_for_review
|
||||||
|
- edited
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
markdownlint:
|
||||||
|
name: Markdown Linter
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout SIMD Repository
|
||||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
|
||||||
|
|
||||||
|
- name: Get Changed Files
|
||||||
|
id: changed
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
echo "CHANGED_FILES<<EOF" >> $GITHUB_ENV
|
||||||
|
gh pr diff ${{ github.event.number }} --name-only | grep -E -x '[^/]+\.md|proposals/.+\.md' >> $GITHUB_ENV
|
||||||
|
echo "EOF" >> $GITHUB_ENV
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
uses: DavidAnson/markdownlint-cli2-action@16d9da45919c958a8d1ddccb4bd7028e8848e4f1
|
||||||
|
if: steps.changed.outcome == 'success'
|
||||||
|
with:
|
||||||
|
command: config
|
||||||
|
globs: |
|
||||||
|
.github/config/.markdownlint.yaml
|
||||||
|
${{ env.CHANGED_FILES }}
|
||||||
|
customSIMDLint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run lint
|
|
@ -0,0 +1 @@
|
||||||
|
node_modules/
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
"name": "solana-improvement-documents",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Solana IMprovement Documents (SIMD) describe proposed and accepted changes to the Solana protocol.",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "ts-node .github/linter/index.ts"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/solana-foundation/solana-improvement-documents.git"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/solana-foundation/solana-improvement-documents/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/solana-foundation/solana-improvement-documents#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/js-yaml": "^4.0.5",
|
||||||
|
"markdownlint-cli2": "^0.6.0",
|
||||||
|
"ts-node": "^10.9.1",
|
||||||
|
"typescript": "^4.9.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.10.0",
|
||||||
|
"js-yaml": "^4.1.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es2016",
|
||||||
|
"module": "commonjs",
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"outDir": "dist"
|
||||||
|
},
|
||||||
|
"include": [ "./**/*", ".github/linter/customRules.ts", ".github/linter/index.ts" ]
|
||||||
|
}
|
Loading…
Reference in New Issue