Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@markdoc/markdoc

Package Overview
Dependencies
Maintainers
3
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@markdoc/markdoc - npm Package Compare versions

Comparing version 0.1.6 to 0.1.7

1

dist/src/formatter.d.ts
import type { Node, Value } from './types';
declare type Options = {
allowIndentation?: boolean;
maxTagOpeningWidth?: number;
parent?: Node;

@@ -5,0 +6,0 @@ indent?: number;

2

package.json
{
"name": "@markdoc/markdoc",
"author": "Ryan Paul",
"version": "0.1.6",
"version": "0.1.7",
"description": "A text markup language for documentation",

@@ -6,0 +6,0 @@ "main": "dist/index.js",

@@ -82,4 +82,4 @@ import { diff } from 'jest-diff';

function stable(source) {
return check(source, source);
function stable(source, options?) {
return check(source, source, options);
}

@@ -109,2 +109,5 @@

const source = `
{% if $primary %}
X
{% /if %}
{% $user.name %}

@@ -114,2 +117,6 @@ {% key x=$user.name new=$flag /%}

const expected = `
{% if $primary %}
X
{% /if %}
{% $user.name %}

@@ -134,2 +141,3 @@

check(source, expected);
stable(expected, expected);
});

@@ -140,2 +148,11 @@

{% key /%}
{% a %}{% /a %}
{% a %}
{% /a %}
{% a %}
{% /a %}

@@ -151,2 +168,8 @@ {% checkout %}

{% a /%}
{% a /%}
{% a /%}
{% checkout %}

@@ -177,2 +200,9 @@ {% if true %}

it('long tags with maxTagOpeningWidth=Infinity', () => {
const source = `
{% tag a=true b="My very long text well over 80 characters in total" c=123456789 d=false /%}
`;
check(source, source, { maxTagOpeningWidth: Infinity });
});
it('nested tags — allowIndentation: true', () => {

@@ -196,2 +226,3 @@ const source = `

check(source, expected, { allowIndentation: true });
stable(expected, { allowIndentation: true });
});

@@ -262,2 +293,30 @@

it('tables with tags', () => {
const source = `
{% table %}
* H1
* H2
{% if $var %}
---
* H3
* H4
{% /if %}
{% /table %}
`;
const expected = `
{% table %}
- H1
- H2
{% if $var %}
---
- H3
- H4
{% /if %}
{% /table %}
`;
check(source, expected);
stable(expected);
});
it('lists', () => {

@@ -375,3 +434,9 @@ const source = `

* Set the proxy status to \`off\` to avoid issues during setup.
{% /table %}`;
{% /table %}
1. foo\\
baz
Soft
break
Markdoc uses…`;

@@ -409,2 +474,8 @@ const expected = `

{% /table %}
1. foo\\
baz
Soft
break
Markdoc uses…
`;

@@ -411,0 +482,0 @@

@@ -7,2 +7,3 @@ import Ast from './ast';

allowIndentation?: boolean;
maxTagOpeningWidth?: number;
parent?: Node;

@@ -18,3 +19,3 @@ indent?: number;

const MAX_TAG_HEAD_LENGTH = 80;
const MAX_TAG_OPENING_WIDTH = 80;

@@ -60,3 +61,3 @@ const max = (a: number, b: number) => Math.max(a, b);

function formatAnnotationValue(a: AttributeValue): string {
if (a.name === 'primary') return a.value;
if (a.name === 'primary') return formatScalar(a.value);
if (a.name === 'id' && typeof a.value === 'string') return '#' + a.value;

@@ -202,8 +203,15 @@ if (a.type === 'class') return '.' + a.name;

const inlineTag = tag.join(SPACE);
if (inlineTag.length + open.length * 2 > MAX_TAG_HEAD_LENGTH) {
yield tag.join(NL + SPACE.repeat(open.length) + indent);
} else {
yield inlineTag;
}
yield SPACE + (n.children.length ? '' : '/') + CLOSE;
const isLongTagOpening =
inlineTag.length + open.length * 2 >
(o.maxTagOpeningWidth || MAX_TAG_OPENING_WIDTH);
// {% tag attributes={...} %}
yield (isLongTagOpening
? tag.join(NL + SPACE.repeat(open.length) + indent)
: inlineTag) +
SPACE +
(n.children.length ? '' : '/') +
CLOSE;
if (n.children.length) {

@@ -214,5 +222,4 @@ yield* formatChildren(n, no.allowIndentation ? increment(no) : no);

}
yield OPEN + SPACE + '/';
yield n.tag;
yield SPACE + CLOSE;
// {% /tag %}
yield OPEN + SPACE + '/' + n.tag + SPACE + CLOSE;
}

@@ -274,21 +281,32 @@ if (!n.inline) {

case 'table': {
const table = [...formatChildren(n, increment(no))] as any as string[][];
const table = [...formatChildren(n, increment(no))] as any as any[];
if (o.parent && o.parent.type === 'tag' && o.parent.tag === 'table') {
for (const row of table) {
yield NL;
for (const d of row) {
// TODO see if we should move trim() to `td`
yield indent + UL + d.trim();
yield NL;
for (let i = 0; i < table.length; i++) {
const row = table[i];
// format tags like "if" in the middle of a table list
if (typeof row === 'string') {
if (row.trim().length) {
yield NL;
yield row;
}
} else {
if (i !== 0) {
yield NL;
yield indent + '---';
}
for (let j = 0; j < row.length; j++) {
const d = row[j];
yield NL;
// TODO see if we should move trim() to `td`
yield indent + UL + d.trim();
}
}
if (row !== table[table.length - 1]) {
yield indent + '---';
}
}
yield NL;
} else {
yield NL;
const [head, ...rows] = table;
const [head, ...rows] = table as string[][];
const ml = table
.map((arr) => arr.map((s) => s.length).reduce(max))
.map((arr) => arr.map((s: string) => s.length).reduce(max))
.reduce(max);

@@ -378,3 +396,3 @@

for (const s of formatValue(v, options)) doc += s;
return doc;
return doc.trimStart();
}

@@ -229,3 +229,3 @@ import type { Schema } from './types';

export const softbreak: Schema = {
transform(_node, _config) {
transform() {
return ' ';

@@ -232,0 +232,0 @@ },

@@ -235,2 +235,48 @@ import Markdoc from '../index';

describe('attribute validation', () => {
it('should return error on failure to match array', () => {
const example = '{% foo jawn="cat" /%}';
const schema = {
tags: {
foo: {
attributes: {
jawn: {
type: String,
matches: ['bar', 'baz', 'bat'],
},
},
},
},
};
expect(validate(example, schema)).toDeepEqualSubset([
{
type: 'tag',
error: {
id: 'attribute-value-invalid',
message: `Attribute 'jawn' must match one of ["bar","baz","bat"]. Got 'cat' instead.`,
},
},
]);
});
// https://github.com/markdoc/markdoc/issues/122
it('should validate partial file attributes', () => {
const example = `{% partial file="non-existent.md" /%}`;
const output = validate(example, {});
expect(output).toDeepEqualSubset([
{
type: 'tag',
error: {
id: 'attribute-value-invalid',
level: 'error',
message:
"Partial `non-existent.md` not found. The 'file' attribute must be set in `config.partials`",
},
},
]);
});
});
describe('custom type registration example', () => {

@@ -341,20 +387,2 @@ class Link {

});
// https://github.com/markdoc/markdoc/issues/122
it('should validate partial file attributes', () => {
const example = `{% partial file="non-existent.md" /%}`;
const output = validate(example, {});
expect(output).toDeepEqualSubset([
{
type: 'tag',
error: {
id: 'attribute-value-invalid',
level: 'error',
message:
"Partial `non-existent.md` not found. The 'file' attribute must be set in `config.partials`",
},
},
]);
});
});

@@ -223,3 +223,3 @@ import { globalAttributes } from './transformer';

matches
)}`,
)}. Got '${value}' instead.`,
});

@@ -231,3 +231,3 @@

level: errorLevel || 'error',
message: `Attribute '${key}' must match ${matches}`,
message: `Attribute '${key}' must match ${matches}. Got '${value}' instead.`,
});

@@ -234,0 +234,0 @@ }

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc