routie dev init since i didn't adhere to any proper guidance up until now

This commit is contained in:
2026-04-29 22:27:29 -06:00
commit e1dabb71e2
15301 changed files with 3562618 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getParser;
const reTag = /^@[^\s/]+(?=\s|$)/;
/**
* Creates configured `Parser`
* @param {Partial<Options>} options
*/
function getParser({
fence = '```'
} = {}) {
const fencer = getFencer(fence);
const toggleFence = (source, isFenced) => fencer(source) ? !isFenced : isFenced;
return function parseBlock(source) {
// start with description section
const sections = [[]];
let isFenced = false;
for (const line of source) {
if (reTag.test(line.tokens.description) && !isFenced) {
sections.push([line]);
} else {
sections[sections.length - 1].push(line);
}
isFenced = toggleFence(line.tokens.description, isFenced);
}
return sections;
};
}
function getFencer(fence) {
if (typeof fence === 'string') return source => source.split(fence).length % 2 === 0;
return fence;
}
//# sourceMappingURL=block-parser.cjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"block-parser.cjs","names":["Object","defineProperty","exports","value","default","getParser","reTag","fence","fencer","getFencer","toggleFence","source","isFenced","parseBlock","sections","line","test","tokens","description","push","length","split"],"sources":["block-parser.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = getParser;\nconst reTag = /^@[^\\s/]+(?=\\s|$)/;\n/**\n * Creates configured `Parser`\n * @param {Partial<Options>} options\n */\nfunction getParser({ fence = '```', } = {}) {\n const fencer = getFencer(fence);\n const toggleFence = (source, isFenced) => fencer(source) ? !isFenced : isFenced;\n return function parseBlock(source) {\n // start with description section\n const sections = [[]];\n let isFenced = false;\n for (const line of source) {\n if (reTag.test(line.tokens.description) && !isFenced) {\n sections.push([line]);\n }\n else {\n sections[sections.length - 1].push(line);\n }\n isFenced = toggleFence(line.tokens.description, isFenced);\n }\n return sections;\n };\n}\nfunction getFencer(fence) {\n if (typeof fence === 'string')\n return (source) => source.split(fence).length % 2 === 0;\n return fence;\n}\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC;AAC7DD,OAAO,CAACE,OAAO,GAAGC,SAAS;AAC3B,MAAMC,KAAK,GAAG,mBAAmB;AACjC;AACA;AACA;AACA;AACA,SAASD,SAASA,CAAC;EAAEE,KAAK,GAAG;AAAO,CAAC,GAAG,CAAC,CAAC,EAAE;EACxC,MAAMC,MAAM,GAAGC,SAAS,CAACF,KAAK,CAAC;EAC/B,MAAMG,WAAW,GAAGA,CAACC,MAAM,EAAEC,QAAQ,KAAKJ,MAAM,CAACG,MAAM,CAAC,GAAG,CAACC,QAAQ,GAAGA,QAAQ;EAC/E,OAAO,SAASC,UAAUA,CAACF,MAAM,EAAE;IAC/B;IACA,MAAMG,QAAQ,GAAG,CAAC,EAAE,CAAC;IACrB,IAAIF,QAAQ,GAAG,KAAK;IACpB,KAAK,MAAMG,IAAI,IAAIJ,MAAM,EAAE;MACvB,IAAIL,KAAK,CAACU,IAAI,CAACD,IAAI,CAACE,MAAM,CAACC,WAAW,CAAC,IAAI,CAACN,QAAQ,EAAE;QAClDE,QAAQ,CAACK,IAAI,CAAC,CAACJ,IAAI,CAAC,CAAC;MACzB,CAAC,MACI;QACDD,QAAQ,CAACA,QAAQ,CAACM,MAAM,GAAG,CAAC,CAAC,CAACD,IAAI,CAACJ,IAAI,CAAC;MAC5C;MACAH,QAAQ,GAAGF,WAAW,CAACK,IAAI,CAACE,MAAM,CAACC,WAAW,EAAEN,QAAQ,CAAC;IAC7D;IACA,OAAOE,QAAQ;EACnB,CAAC;AACL;AACA,SAASL,SAASA,CAACF,KAAK,EAAE;EACtB,IAAI,OAAOA,KAAK,KAAK,QAAQ,EACzB,OAAQI,MAAM,IAAKA,MAAM,CAACU,KAAK,CAACd,KAAK,CAAC,CAACa,MAAM,GAAG,CAAC,KAAK,CAAC;EAC3D,OAAOb,KAAK;AAChB","ignoreList":[]}
+24
View File
@@ -0,0 +1,24 @@
import { Line } from '../primitives.js';
/**
* Groups source lines in sections representing tags.
* First section is a block description if present. Last section captures lines starting with
* the last tag to the end of the block, including dangling closing marker.
* @param {Line[]} block source lines making a single comment block
*/
export type Parser = (block: Line[]) => Line[][];
/**
* Predicate telling if string contains opening/closing escaping sequence
* @param {string} source raw source line
*/
export type Fencer = (source: string) => boolean;
/**
* `Parser` configuration options
*/
export interface Options {
fence: string | Fencer;
}
/**
* Creates configured `Parser`
* @param {Partial<Options>} options
*/
export default function getParser({ fence, }?: Partial<Options>): Parser;
+52
View File
@@ -0,0 +1,52 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getParser;
const primitives_js_1 = require("../primitives.cjs");
const util_js_1 = require("../util.cjs");
const block_parser_js_1 = require("./block-parser.cjs");
const source_parser_js_1 = require("./source-parser.cjs");
const spec_parser_js_1 = require("./spec-parser.cjs");
const tag_js_1 = require("./tokenizers/tag.cjs");
const type_js_1 = require("./tokenizers/type.cjs");
const name_js_1 = require("./tokenizers/name.cjs");
const description_js_1 = require("./tokenizers/description.cjs");
function getParser({
startLine = 0,
fence = '```',
spacing = 'compact',
markers = primitives_js_1.Markers,
tokenizers = [(0, tag_js_1.default)(), (0, type_js_1.default)(spacing), (0, name_js_1.default)(), (0, description_js_1.default)(spacing)]
} = {}) {
if (startLine < 0 || startLine % 1 > 0) throw new Error('Invalid startLine');
const parseSource = (0, source_parser_js_1.default)({
startLine,
markers
});
const parseBlock = (0, block_parser_js_1.default)({
fence
});
const parseSpec = (0, spec_parser_js_1.default)({
tokenizers
});
const joinDescription = (0, description_js_1.getJoiner)(spacing);
return function (source) {
const blocks = [];
for (const line of (0, util_js_1.splitLines)(source)) {
const lines = parseSource(line);
if (lines === null) continue;
const sections = parseBlock(lines);
const specs = sections.slice(1).map(parseSpec);
blocks.push({
description: joinDescription(sections[0], markers),
tags: specs,
source: lines,
problems: specs.reduce((acc, spec) => acc.concat(spec.problems), [])
});
}
return blocks;
};
}
//# sourceMappingURL=index.cjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.cjs","names":["Object","defineProperty","exports","value","default","getParser","primitives_js_1","require","util_js_1","block_parser_js_1","source_parser_js_1","spec_parser_js_1","tag_js_1","type_js_1","name_js_1","description_js_1","startLine","fence","spacing","markers","Markers","tokenizers","Error","parseSource","parseBlock","parseSpec","joinDescription","getJoiner","source","blocks","line","splitLines","lines","sections","specs","slice","map","push","description","tags","problems","reduce","acc","spec","concat"],"sources":["index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = getParser;\nconst primitives_js_1 = require(\"../primitives.js\");\nconst util_js_1 = require(\"../util.js\");\nconst block_parser_js_1 = require(\"./block-parser.js\");\nconst source_parser_js_1 = require(\"./source-parser.js\");\nconst spec_parser_js_1 = require(\"./spec-parser.js\");\nconst tag_js_1 = require(\"./tokenizers/tag.js\");\nconst type_js_1 = require(\"./tokenizers/type.js\");\nconst name_js_1 = require(\"./tokenizers/name.js\");\nconst description_js_1 = require(\"./tokenizers/description.js\");\nfunction getParser({ startLine = 0, fence = '```', spacing = 'compact', markers = primitives_js_1.Markers, tokenizers = [\n (0, tag_js_1.default)(),\n (0, type_js_1.default)(spacing),\n (0, name_js_1.default)(),\n (0, description_js_1.default)(spacing),\n], } = {}) {\n if (startLine < 0 || startLine % 1 > 0)\n throw new Error('Invalid startLine');\n const parseSource = (0, source_parser_js_1.default)({ startLine, markers });\n const parseBlock = (0, block_parser_js_1.default)({ fence });\n const parseSpec = (0, spec_parser_js_1.default)({ tokenizers });\n const joinDescription = (0, description_js_1.getJoiner)(spacing);\n return function (source) {\n const blocks = [];\n for (const line of (0, util_js_1.splitLines)(source)) {\n const lines = parseSource(line);\n if (lines === null)\n continue;\n const sections = parseBlock(lines);\n const specs = sections.slice(1).map(parseSpec);\n blocks.push({\n description: joinDescription(sections[0], markers),\n tags: specs,\n source: lines,\n problems: specs.reduce((acc, spec) => acc.concat(spec.problems), []),\n });\n }\n return blocks;\n };\n}\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC;AAC7DD,OAAO,CAACE,OAAO,GAAGC,SAAS;AAC3B,MAAMC,eAAe,GAAGC,OAAO,qBAAoB;AACnD,MAAMC,SAAS,GAAGD,OAAO,eAAc;AACvC,MAAME,iBAAiB,GAAGF,OAAO,sBAAqB;AACtD,MAAMG,kBAAkB,GAAGH,OAAO,uBAAsB;AACxD,MAAMI,gBAAgB,GAAGJ,OAAO,qBAAoB;AACpD,MAAMK,QAAQ,GAAGL,OAAO,wBAAuB;AAC/C,MAAMM,SAAS,GAAGN,OAAO,yBAAwB;AACjD,MAAMO,SAAS,GAAGP,OAAO,yBAAwB;AACjD,MAAMQ,gBAAgB,GAAGR,OAAO,gCAA+B;AAC/D,SAASF,SAASA,CAAC;EAAEW,SAAS,GAAG,CAAC;EAAEC,KAAK,GAAG,KAAK;EAAEC,OAAO,GAAG,SAAS;EAAEC,OAAO,GAAGb,eAAe,CAACc,OAAO;EAAEC,UAAU,GAAG,CACpH,CAAC,CAAC,EAAET,QAAQ,CAACR,OAAO,EAAE,CAAC,EACvB,CAAC,CAAC,EAAES,SAAS,CAACT,OAAO,EAAEc,OAAO,CAAC,EAC/B,CAAC,CAAC,EAAEJ,SAAS,CAACV,OAAO,EAAE,CAAC,EACxB,CAAC,CAAC,EAAEW,gBAAgB,CAACX,OAAO,EAAEc,OAAO,CAAC;AACvC,CAAC,GAAG,CAAC,CAAC,EAAE;EACP,IAAIF,SAAS,GAAG,CAAC,IAAIA,SAAS,GAAG,CAAC,GAAG,CAAC,EAClC,MAAM,IAAIM,KAAK,CAAC,mBAAmB,CAAC;EACxC,MAAMC,WAAW,GAAG,CAAC,CAAC,EAAEb,kBAAkB,CAACN,OAAO,EAAE;IAAEY,SAAS;IAAEG;EAAQ,CAAC,CAAC;EAC3E,MAAMK,UAAU,GAAG,CAAC,CAAC,EAAEf,iBAAiB,CAACL,OAAO,EAAE;IAAEa;EAAM,CAAC,CAAC;EAC5D,MAAMQ,SAAS,GAAG,CAAC,CAAC,EAAEd,gBAAgB,CAACP,OAAO,EAAE;IAAEiB;EAAW,CAAC,CAAC;EAC/D,MAAMK,eAAe,GAAG,CAAC,CAAC,EAAEX,gBAAgB,CAACY,SAAS,EAAET,OAAO,CAAC;EAChE,OAAO,UAAUU,MAAM,EAAE;IACrB,MAAMC,MAAM,GAAG,EAAE;IACjB,KAAK,MAAMC,IAAI,IAAI,CAAC,CAAC,EAAEtB,SAAS,CAACuB,UAAU,EAAEH,MAAM,CAAC,EAAE;MAClD,MAAMI,KAAK,GAAGT,WAAW,CAACO,IAAI,CAAC;MAC/B,IAAIE,KAAK,KAAK,IAAI,EACd;MACJ,MAAMC,QAAQ,GAAGT,UAAU,CAACQ,KAAK,CAAC;MAClC,MAAME,KAAK,GAAGD,QAAQ,CAACE,KAAK,CAAC,CAAC,CAAC,CAACC,GAAG,CAACX,SAAS,CAAC;MAC9CI,MAAM,CAACQ,IAAI,CAAC;QACRC,WAAW,EAAEZ,eAAe,CAACO,QAAQ,CAAC,CAAC,CAAC,EAAEd,OAAO,CAAC;QAClDoB,IAAI,EAAEL,KAAK;QACXN,MAAM,EAAEI,KAAK;QACbQ,QAAQ,EAAEN,KAAK,CAACO,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAKD,GAAG,CAACE,MAAM,CAACD,IAAI,CAACH,QAAQ,CAAC,EAAE,EAAE;MACvE,CAAC,CAAC;IACN;IACA,OAAOX,MAAM;EACjB,CAAC;AACL","ignoreList":[]}
+11
View File
@@ -0,0 +1,11 @@
import { Block, BlockMarkers } from '../primitives.js';
import { Tokenizer } from './tokenizers/index.js';
export interface Options {
startLine: number;
fence: string;
spacing: 'compact' | 'preserve';
markers: BlockMarkers;
tokenizers: Tokenizer[];
}
export type Parser = (source: string) => Block[];
export default function getParser({ startLine, fence, spacing, markers, tokenizers, }?: Partial<Options>): Parser;
+56
View File
@@ -0,0 +1,56 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getParser;
const primitives_js_1 = require("../primitives.cjs");
const util_js_1 = require("../util.cjs");
function getParser({
startLine = 0,
markers = primitives_js_1.Markers
} = {}) {
let block = null;
let num = startLine;
return function parseSource(source) {
let rest = source;
const tokens = (0, util_js_1.seedTokens)();
[tokens.lineEnd, rest] = (0, util_js_1.splitCR)(rest);
[tokens.start, rest] = (0, util_js_1.splitSpace)(rest);
if (block === null && rest.startsWith(markers.start) && !rest.startsWith(markers.nostart)) {
block = [];
tokens.delimiter = rest.slice(0, markers.start.length);
rest = rest.slice(markers.start.length);
[tokens.postDelimiter, rest] = (0, util_js_1.splitSpace)(rest);
}
if (block === null) {
num++;
return null;
}
const isClosed = rest.trimRight().endsWith(markers.end);
if (tokens.delimiter === '' && rest.startsWith(markers.delim) && !rest.startsWith(markers.end)) {
tokens.delimiter = markers.delim;
rest = rest.slice(markers.delim.length);
[tokens.postDelimiter, rest] = (0, util_js_1.splitSpace)(rest);
}
if (isClosed) {
const trimmed = rest.trimRight();
tokens.end = rest.slice(trimmed.length - markers.end.length);
rest = trimmed.slice(0, -markers.end.length);
}
tokens.description = rest;
block.push({
number: num,
source,
tokens
});
num++;
if (isClosed) {
const result = block.slice();
block = null;
return result;
}
return null;
};
}
//# sourceMappingURL=source-parser.cjs.map
@@ -0,0 +1 @@
{"version":3,"file":"source-parser.cjs","names":["Object","defineProperty","exports","value","default","getParser","primitives_js_1","require","util_js_1","startLine","markers","Markers","block","num","parseSource","source","rest","tokens","seedTokens","lineEnd","splitCR","start","splitSpace","startsWith","nostart","delimiter","slice","length","postDelimiter","isClosed","trimRight","endsWith","end","delim","trimmed","description","push","number","result"],"sources":["source-parser.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = getParser;\nconst primitives_js_1 = require(\"../primitives.js\");\nconst util_js_1 = require(\"../util.js\");\nfunction getParser({ startLine = 0, markers = primitives_js_1.Markers, } = {}) {\n let block = null;\n let num = startLine;\n return function parseSource(source) {\n let rest = source;\n const tokens = (0, util_js_1.seedTokens)();\n [tokens.lineEnd, rest] = (0, util_js_1.splitCR)(rest);\n [tokens.start, rest] = (0, util_js_1.splitSpace)(rest);\n if (block === null &&\n rest.startsWith(markers.start) &&\n !rest.startsWith(markers.nostart)) {\n block = [];\n tokens.delimiter = rest.slice(0, markers.start.length);\n rest = rest.slice(markers.start.length);\n [tokens.postDelimiter, rest] = (0, util_js_1.splitSpace)(rest);\n }\n if (block === null) {\n num++;\n return null;\n }\n const isClosed = rest.trimRight().endsWith(markers.end);\n if (tokens.delimiter === '' &&\n rest.startsWith(markers.delim) &&\n !rest.startsWith(markers.end)) {\n tokens.delimiter = markers.delim;\n rest = rest.slice(markers.delim.length);\n [tokens.postDelimiter, rest] = (0, util_js_1.splitSpace)(rest);\n }\n if (isClosed) {\n const trimmed = rest.trimRight();\n tokens.end = rest.slice(trimmed.length - markers.end.length);\n rest = trimmed.slice(0, -markers.end.length);\n }\n tokens.description = rest;\n block.push({ number: num, source, tokens });\n num++;\n if (isClosed) {\n const result = block.slice();\n block = null;\n return result;\n }\n return null;\n };\n}\n"],"mappings":"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","ignoreList":[]}
+7
View File
@@ -0,0 +1,7 @@
import { Line, BlockMarkers } from '../primitives.js';
export interface Options {
startLine: number;
markers: BlockMarkers;
}
export type Parser = (source: string) => Line[] | null;
export default function getParser({ startLine, markers, }?: Partial<Options>): Parser;
+23
View File
@@ -0,0 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getParser;
const util_js_1 = require("../util.cjs");
function getParser({
tokenizers
}) {
return function parseSpec(source) {
var _a;
let spec = (0, util_js_1.seedSpec)({
source
});
for (const tokenize of tokenizers) {
spec = tokenize(spec);
if ((_a = spec.problems[spec.problems.length - 1]) === null || _a === void 0 ? void 0 : _a.critical) break;
}
return spec;
};
}
//# sourceMappingURL=spec-parser.cjs.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"spec-parser.cjs","names":["Object","defineProperty","exports","value","default","getParser","util_js_1","require","tokenizers","parseSpec","source","_a","spec","seedSpec","tokenize","problems","length","critical"],"sources":["spec-parser.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = getParser;\nconst util_js_1 = require(\"../util.js\");\nfunction getParser({ tokenizers }) {\n return function parseSpec(source) {\n var _a;\n let spec = (0, util_js_1.seedSpec)({ source });\n for (const tokenize of tokenizers) {\n spec = tokenize(spec);\n if ((_a = spec.problems[spec.problems.length - 1]) === null || _a === void 0 ? void 0 : _a.critical)\n break;\n }\n return spec;\n };\n}\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC;AAC7DD,OAAO,CAACE,OAAO,GAAGC,SAAS;AAC3B,MAAMC,SAAS,GAAGC,OAAO,eAAc;AACvC,SAASF,SAASA,CAAC;EAAEG;AAAW,CAAC,EAAE;EAC/B,OAAO,SAASC,SAASA,CAACC,MAAM,EAAE;IAC9B,IAAIC,EAAE;IACN,IAAIC,IAAI,GAAG,CAAC,CAAC,EAAEN,SAAS,CAACO,QAAQ,EAAE;MAAEH;IAAO,CAAC,CAAC;IAC9C,KAAK,MAAMI,QAAQ,IAAIN,UAAU,EAAE;MAC/BI,IAAI,GAAGE,QAAQ,CAACF,IAAI,CAAC;MACrB,IAAI,CAACD,EAAE,GAAGC,IAAI,CAACG,QAAQ,CAACH,IAAI,CAACG,QAAQ,CAACC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,IAAIL,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAGA,EAAE,CAACM,QAAQ,EAC/F;IACR;IACA,OAAOL,IAAI;EACf,CAAC;AACL","ignoreList":[]}
+7
View File
@@ -0,0 +1,7 @@
import { Line, Spec } from '../primitives.js';
import { Tokenizer } from './tokenizers/index.js';
export type Parser = (source: Line[]) => Spec;
export interface Options {
tokenizers: Tokenizer[];
}
export default function getParser({ tokenizers }: Options): Parser;
@@ -0,0 +1,51 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = descriptionTokenizer;
exports.getJoiner = getJoiner;
const primitives_js_1 = require("../../primitives.cjs");
/**
* Makes no changes to `spec.lines[].tokens` but joins them into `spec.description`
* following given spacing srtategy
* @param {Spacing} spacing tells how to handle the whitespace
* @param {BlockMarkers} markers tells how to handle comment block delimitation
*/
function descriptionTokenizer(spacing = 'compact', markers = primitives_js_1.Markers) {
const join = getJoiner(spacing);
return spec => {
spec.description = join(spec.source, markers);
return spec;
};
}
function getJoiner(spacing) {
if (spacing === 'compact') return compactJoiner;
if (spacing === 'preserve') return preserveJoiner;
return spacing;
}
function compactJoiner(lines, markers = primitives_js_1.Markers) {
return lines.map(({
tokens: {
description
}
}) => description.trim()).filter(description => description !== '').join(' ');
}
const lineNo = (num, {
tokens
}, i) => tokens.type === '' ? num : i;
const getDescription = ({
tokens
}) => (tokens.delimiter === '' ? tokens.start : tokens.postDelimiter.slice(1)) + tokens.description;
function preserveJoiner(lines, markers = primitives_js_1.Markers) {
if (lines.length === 0) return '';
// skip the opening line with no description
if (lines[0].tokens.description === '' && lines[0].tokens.delimiter === markers.start) lines = lines.slice(1);
// skip the closing line with no description
const lastLine = lines[lines.length - 1];
if (lastLine !== undefined && lastLine.tokens.description === '' && lastLine.tokens.end.endsWith(markers.end)) lines = lines.slice(0, -1);
// description starts at the last line of type definition
lines = lines.slice(lines.reduce(lineNo, 0));
return lines.map(getDescription).join('\n');
}
//# sourceMappingURL=description.cjs.map
@@ -0,0 +1 @@
{"version":3,"file":"description.cjs","names":["Object","defineProperty","exports","value","default","descriptionTokenizer","getJoiner","primitives_js_1","require","spacing","markers","Markers","join","spec","description","source","compactJoiner","preserveJoiner","lines","map","tokens","trim","filter","lineNo","num","i","type","getDescription","delimiter","start","postDelimiter","slice","length","lastLine","undefined","end","endsWith","reduce"],"sources":["description.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = descriptionTokenizer;\nexports.getJoiner = getJoiner;\nconst primitives_js_1 = require(\"../../primitives.js\");\n/**\n * Makes no changes to `spec.lines[].tokens` but joins them into `spec.description`\n * following given spacing srtategy\n * @param {Spacing} spacing tells how to handle the whitespace\n * @param {BlockMarkers} markers tells how to handle comment block delimitation\n */\nfunction descriptionTokenizer(spacing = 'compact', markers = primitives_js_1.Markers) {\n const join = getJoiner(spacing);\n return (spec) => {\n spec.description = join(spec.source, markers);\n return spec;\n };\n}\nfunction getJoiner(spacing) {\n if (spacing === 'compact')\n return compactJoiner;\n if (spacing === 'preserve')\n return preserveJoiner;\n return spacing;\n}\nfunction compactJoiner(lines, markers = primitives_js_1.Markers) {\n return lines\n .map(({ tokens: { description } }) => description.trim())\n .filter((description) => description !== '')\n .join(' ');\n}\nconst lineNo = (num, { tokens }, i) => tokens.type === '' ? num : i;\nconst getDescription = ({ tokens }) => (tokens.delimiter === '' ? tokens.start : tokens.postDelimiter.slice(1)) +\n tokens.description;\nfunction preserveJoiner(lines, markers = primitives_js_1.Markers) {\n if (lines.length === 0)\n return '';\n // skip the opening line with no description\n if (lines[0].tokens.description === '' &&\n lines[0].tokens.delimiter === markers.start)\n lines = lines.slice(1);\n // skip the closing line with no description\n const lastLine = lines[lines.length - 1];\n if (lastLine !== undefined &&\n lastLine.tokens.description === '' &&\n lastLine.tokens.end.endsWith(markers.end))\n lines = lines.slice(0, -1);\n // description starts at the last line of type definition\n lines = lines.slice(lines.reduce(lineNo, 0));\n return lines.map(getDescription).join('\\n');\n}\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC;AAC7DD,OAAO,CAACE,OAAO,GAAGC,oBAAoB;AACtCH,OAAO,CAACI,SAAS,GAAGA,SAAS;AAC7B,MAAMC,eAAe,GAAGC,OAAO,wBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,SAASH,oBAAoBA,CAACI,OAAO,GAAG,SAAS,EAAEC,OAAO,GAAGH,eAAe,CAACI,OAAO,EAAE;EAClF,MAAMC,IAAI,GAAGN,SAAS,CAACG,OAAO,CAAC;EAC/B,OAAQI,IAAI,IAAK;IACbA,IAAI,CAACC,WAAW,GAAGF,IAAI,CAACC,IAAI,CAACE,MAAM,EAAEL,OAAO,CAAC;IAC7C,OAAOG,IAAI;EACf,CAAC;AACL;AACA,SAASP,SAASA,CAACG,OAAO,EAAE;EACxB,IAAIA,OAAO,KAAK,SAAS,EACrB,OAAOO,aAAa;EACxB,IAAIP,OAAO,KAAK,UAAU,EACtB,OAAOQ,cAAc;EACzB,OAAOR,OAAO;AAClB;AACA,SAASO,aAAaA,CAACE,KAAK,EAAER,OAAO,GAAGH,eAAe,CAACI,OAAO,EAAE;EAC7D,OAAOO,KAAK,CACPC,GAAG,CAAC,CAAC;IAAEC,MAAM,EAAE;MAAEN;IAAY;EAAE,CAAC,KAAKA,WAAW,CAACO,IAAI,CAAC,CAAC,CAAC,CACxDC,MAAM,CAAER,WAAW,IAAKA,WAAW,KAAK,EAAE,CAAC,CAC3CF,IAAI,CAAC,GAAG,CAAC;AAClB;AACA,MAAMW,MAAM,GAAGA,CAACC,GAAG,EAAE;EAAEJ;AAAO,CAAC,EAAEK,CAAC,KAAKL,MAAM,CAACM,IAAI,KAAK,EAAE,GAAGF,GAAG,GAAGC,CAAC;AACnE,MAAME,cAAc,GAAGA,CAAC;EAAEP;AAAO,CAAC,KAAK,CAACA,MAAM,CAACQ,SAAS,KAAK,EAAE,GAAGR,MAAM,CAACS,KAAK,GAAGT,MAAM,CAACU,aAAa,CAACC,KAAK,CAAC,CAAC,CAAC,IAC1GX,MAAM,CAACN,WAAW;AACtB,SAASG,cAAcA,CAACC,KAAK,EAAER,OAAO,GAAGH,eAAe,CAACI,OAAO,EAAE;EAC9D,IAAIO,KAAK,CAACc,MAAM,KAAK,CAAC,EAClB,OAAO,EAAE;EACb;EACA,IAAId,KAAK,CAAC,CAAC,CAAC,CAACE,MAAM,CAACN,WAAW,KAAK,EAAE,IAClCI,KAAK,CAAC,CAAC,CAAC,CAACE,MAAM,CAACQ,SAAS,KAAKlB,OAAO,CAACmB,KAAK,EAC3CX,KAAK,GAAGA,KAAK,CAACa,KAAK,CAAC,CAAC,CAAC;EAC1B;EACA,MAAME,QAAQ,GAAGf,KAAK,CAACA,KAAK,CAACc,MAAM,GAAG,CAAC,CAAC;EACxC,IAAIC,QAAQ,KAAKC,SAAS,IACtBD,QAAQ,CAACb,MAAM,CAACN,WAAW,KAAK,EAAE,IAClCmB,QAAQ,CAACb,MAAM,CAACe,GAAG,CAACC,QAAQ,CAAC1B,OAAO,CAACyB,GAAG,CAAC,EACzCjB,KAAK,GAAGA,KAAK,CAACa,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC9B;EACAb,KAAK,GAAGA,KAAK,CAACa,KAAK,CAACb,KAAK,CAACmB,MAAM,CAACd,MAAM,EAAE,CAAC,CAAC,CAAC;EAC5C,OAAOL,KAAK,CAACC,GAAG,CAACQ,cAAc,CAAC,CAACf,IAAI,CAAC,IAAI,CAAC;AAC/C","ignoreList":[]}
@@ -0,0 +1,20 @@
import { Line, BlockMarkers, Markers } from '../../primitives.js';
import { Tokenizer } from './index.js';
/**
* Walks over provided lines joining description token into a single string.
* */
export type Joiner = (lines: Line[], markers?: BlockMarkers) => string;
/**
* Shortcut for standard Joiners
* compact - strip surrounding whitespace and concat lines using a single string
* preserve - preserves original whitespace and line breaks as is
*/
export type Spacing = 'compact' | 'preserve' | Joiner;
/**
* Makes no changes to `spec.lines[].tokens` but joins them into `spec.description`
* following given spacing srtategy
* @param {Spacing} spacing tells how to handle the whitespace
* @param {BlockMarkers} markers tells how to handle comment block delimitation
*/
export default function descriptionTokenizer(spacing?: Spacing, markers?: typeof Markers): Tokenizer;
export declare function getJoiner(spacing: Spacing): Joiner;
+6
View File
@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
{"version":3,"file":"index.cjs","names":["Object","defineProperty","exports","value"],"sources":["index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,7 @@
import { Spec } from '../../primitives.js';
/**
* Splits `spect.lines[].token.description` into other tokens,
* and populates the spec.{tag, name, type, description}. Invoked in a chaing
* with other tokens, operations listed above can be moved to separate tokenizers
*/
export type Tokenizer = (spec: Spec) => Spec;
+143
View File
@@ -0,0 +1,143 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = nameTokenizer;
const util_js_1 = require("../../util.cjs");
const isQuoted = s => s && s.startsWith('"') && s.endsWith('"');
/**
* Splits remaining `spec.lines[].tokens.description` into `name` and `descriptions` tokens,
* and populates the `spec.name`
*/
function nameTokenizer() {
const typeEnd = (num, {
tokens
}, i) => tokens.type === '' ? num : i;
return spec => {
// look for the name starting in the line where {type} ends
let finalTypeLine = spec.source.reduce(typeEnd, 0);
let tokens;
if (spec.type) {
do {
({
tokens
} = spec.source[finalTypeLine]);
if (tokens.description.trim()) {
break;
}
finalTypeLine++;
} while (spec.source[finalTypeLine]);
} else {
({
tokens
} = spec.source[finalTypeLine]);
}
const source = tokens.description.trimStart();
const quotedGroups = source.split('"');
// if it starts with quoted group, assume it is a literal
if (quotedGroups.length > 1 && quotedGroups[0] === '' && quotedGroups.length % 2 === 1) {
spec.name = quotedGroups[1];
tokens.name = `"${quotedGroups[1]}"`;
[tokens.postName, tokens.description] = (0, util_js_1.splitSpace)(source.slice(tokens.name.length));
return spec;
}
let brackets = 0;
let name = '';
let optional = false;
let defaultValue;
// assume name is non-space string or anything wrapped into brackets
for (const ch of source) {
if (brackets === 0 && (0, util_js_1.isSpace)(ch)) break;
if (ch === '[') brackets++;
if (ch === ']') brackets--;
name += ch;
}
if (brackets !== 0) {
spec.problems.push({
code: 'spec:name:unpaired-brackets',
message: 'unpaired brackets',
line: spec.source[0].number,
critical: true
});
return spec;
}
const nameToken = name;
if (name[0] === '[' && name[name.length - 1] === ']') {
optional = true;
name = name.slice(1, -1);
const parts = name.split('=');
name = parts[0].trim();
if (parts[1] !== undefined) defaultValue = parts.slice(1).join('=').trim();
if (name === '') {
spec.problems.push({
code: 'spec:name:empty-name',
message: 'empty name',
line: spec.source[0].number,
critical: true
});
return spec;
}
if (defaultValue === '') {
spec.problems.push({
code: 'spec:name:empty-default',
message: 'empty default value',
line: spec.source[0].number,
critical: true
});
return spec;
}
// has "=" and is not a string, except for "=>"
if (!isQuoted(defaultValue) && /=(?!>)/.test(defaultValue)) {
spec.problems.push({
code: 'spec:name:invalid-default',
message: 'invalid default value syntax',
line: spec.source[0].number,
critical: true
});
return spec;
}
}
if (!optional) {
const eqIndex = name.search(/=(?!>)/);
if (eqIndex !== -1) {
defaultValue = name.slice(eqIndex + 1).trim();
name = name.slice(0, eqIndex).trim();
if (name === '') {
spec.problems.push({
code: 'spec:name:empty-name',
message: 'empty name',
line: spec.source[0].number,
critical: true
});
return spec;
}
if (defaultValue === '') {
spec.problems.push({
code: 'spec:name:empty-default',
message: 'empty default value',
line: spec.source[0].number,
critical: true
});
return spec;
}
if (!isQuoted(defaultValue) && /=(?!>)/.test(defaultValue)) {
spec.problems.push({
code: 'spec:name:invalid-default',
message: 'invalid default value syntax',
line: spec.source[0].number,
critical: true
});
return spec;
}
}
}
spec.optional = optional;
spec.name = name;
tokens.name = nameToken;
if (defaultValue !== undefined) spec.default = defaultValue;
[tokens.postName, tokens.description] = (0, util_js_1.splitSpace)(source.slice(tokens.name.length));
return spec;
};
}
//# sourceMappingURL=name.cjs.map
File diff suppressed because one or more lines are too long
+6
View File
@@ -0,0 +1,6 @@
import { Tokenizer } from './index.js';
/**
* Splits remaining `spec.lines[].tokens.description` into `name` and `descriptions` tokens,
* and populates the `spec.name`
*/
export default function nameTokenizer(): Tokenizer;
+36
View File
@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = tagTokenizer;
/**
* Splits the `@prefix` from remaining `Spec.lines[].token.description` into the `tag` token,
* and populates `spec.tag`
*/
function tagTokenizer() {
return spec => {
const {
tokens
} = spec.source[0];
const match = tokens.description.match(/\s*(@(\S+))(\s*)/);
if (match === null) {
spec.problems.push({
code: 'spec:tag:prefix',
message: 'tag should start with "@" symbol',
line: spec.source[0].number,
critical: true
});
return spec;
}
if (match[1].includes('/')) {
return spec;
}
tokens.tag = match[1];
tokens.postTag = match[3];
tokens.description = tokens.description.slice(match[0].length);
spec.tag = match[2];
return spec;
};
}
//# sourceMappingURL=tag.cjs.map
@@ -0,0 +1 @@
{"version":3,"file":"tag.cjs","names":["Object","defineProperty","exports","value","default","tagTokenizer","spec","tokens","source","match","description","problems","push","code","message","line","number","critical","includes","tag","postTag","slice","length"],"sources":["tag.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = tagTokenizer;\n/**\n * Splits the `@prefix` from remaining `Spec.lines[].token.description` into the `tag` token,\n * and populates `spec.tag`\n */\nfunction tagTokenizer() {\n return (spec) => {\n const { tokens } = spec.source[0];\n const match = tokens.description.match(/\\s*(@(\\S+))(\\s*)/);\n if (match === null) {\n spec.problems.push({\n code: 'spec:tag:prefix',\n message: 'tag should start with \"@\" symbol',\n line: spec.source[0].number,\n critical: true,\n });\n return spec;\n }\n if (match[1].includes('/')) {\n return spec;\n }\n tokens.tag = match[1];\n tokens.postTag = match[3];\n tokens.description = tokens.description.slice(match[0].length);\n spec.tag = match[2];\n return spec;\n };\n}\n"],"mappings":"AAAA,YAAY;;AACZA,MAAM,CAACC,cAAc,CAACC,OAAO,EAAE,YAAY,EAAE;EAAEC,KAAK,EAAE;AAAK,CAAC,CAAC;AAC7DD,OAAO,CAACE,OAAO,GAAGC,YAAY;AAC9B;AACA;AACA;AACA;AACA,SAASA,YAAYA,CAAA,EAAG;EACpB,OAAQC,IAAI,IAAK;IACb,MAAM;MAAEC;IAAO,CAAC,GAAGD,IAAI,CAACE,MAAM,CAAC,CAAC,CAAC;IACjC,MAAMC,KAAK,GAAGF,MAAM,CAACG,WAAW,CAACD,KAAK,CAAC,kBAAkB,CAAC;IAC1D,IAAIA,KAAK,KAAK,IAAI,EAAE;MAChBH,IAAI,CAACK,QAAQ,CAACC,IAAI,CAAC;QACfC,IAAI,EAAE,iBAAiB;QACvBC,OAAO,EAAE,kCAAkC;QAC3CC,IAAI,EAAET,IAAI,CAACE,MAAM,CAAC,CAAC,CAAC,CAACQ,MAAM;QAC3BC,QAAQ,EAAE;MACd,CAAC,CAAC;MACF,OAAOX,IAAI;IACf;IACA,IAAIG,KAAK,CAAC,CAAC,CAAC,CAACS,QAAQ,CAAC,GAAG,CAAC,EAAE;MACxB,OAAOZ,IAAI;IACf;IACAC,MAAM,CAACY,GAAG,GAAGV,KAAK,CAAC,CAAC,CAAC;IACrBF,MAAM,CAACa,OAAO,GAAGX,KAAK,CAAC,CAAC,CAAC;IACzBF,MAAM,CAACG,WAAW,GAAGH,MAAM,CAACG,WAAW,CAACW,KAAK,CAACZ,KAAK,CAAC,CAAC,CAAC,CAACa,MAAM,CAAC;IAC9DhB,IAAI,CAACa,GAAG,GAAGV,KAAK,CAAC,CAAC,CAAC;IACnB,OAAOH,IAAI;EACf,CAAC;AACL","ignoreList":[]}
+6
View File
@@ -0,0 +1,6 @@
import { Tokenizer } from './index.js';
/**
* Splits the `@prefix` from remaining `Spec.lines[].token.description` into the `tag` token,
* and populates `spec.tag`
*/
export default function tagTokenizer(): Tokenizer;
+75
View File
@@ -0,0 +1,75 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = typeTokenizer;
const util_js_1 = require("../../util.cjs");
/**
* Sets splits remaining `Spec.lines[].tokens.description` into `type` and `description`
* tokens and populates Spec.type`
*
* @param {Spacing} spacing tells how to deal with a whitespace
* for type values going over multiple lines
*/
function typeTokenizer(spacing = 'compact') {
const join = getJoiner(spacing);
return spec => {
let curlies = 0;
let lines = [];
let descriptionBegun = false;
let firstTypeIteration = true;
for (const {
tokens
} of spec.source.values()) {
let type = '';
if (!descriptionBegun && tokens.description.trim()) {
descriptionBegun = true;
} else if (!descriptionBegun) {
continue;
}
if (firstTypeIteration && tokens.description[0] !== '{') return spec;
firstTypeIteration = false;
for (const ch of tokens.description) {
if (ch === '{') curlies++;
if (ch === '}') curlies--;
type += ch;
if (curlies === 0) break;
}
lines.push([tokens, type]);
if (curlies === 0) break;
}
if (!descriptionBegun) {
return spec;
}
if (curlies !== 0) {
spec.problems.push({
code: 'spec:type:unpaired-curlies',
message: 'unpaired curlies',
line: spec.source[0].number,
critical: true
});
return spec;
}
const parts = [];
const offset = lines[0][0].postDelimiter.length;
for (const [i, [tokens, type]] of lines.entries()) {
tokens.type = type;
if (i > 0) {
tokens.type = tokens.postDelimiter.slice(offset) + type;
tokens.postDelimiter = tokens.postDelimiter.slice(0, offset);
}
[tokens.postType, tokens.description] = (0, util_js_1.splitSpace)(tokens.description.slice(type.length));
parts.push(tokens.type);
}
parts[0] = parts[0].slice(1);
parts[parts.length - 1] = parts[parts.length - 1].slice(0, -1);
spec.type = join(parts);
return spec;
};
}
const trim = x => x.trim();
function getJoiner(spacing) {
if (spacing === 'compact') return t => t.map(trim).join('');else if (spacing === 'preserve') return t => t.join('\n');else return spacing;
}
//# sourceMappingURL=type.cjs.map
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
import { Tokenizer } from './index.js';
/**
* Joiner is a function taking collected type token string parts,
* and joining them together. In most of the cases this will be
* a single piece like {type-name}, but type may go over multipe line
* ```
* @tag {function(
* number,
* string
* )}
* ```
*/
export type Joiner = (parts: string[]) => string;
/**
* Shortcut for standard Joiners
* compact - trim surrounding space, replace line breaks with a single space
* preserve - concat as is
*/
export type Spacing = 'compact' | 'preserve' | Joiner;
/**
* Sets splits remaining `Spec.lines[].tokens.description` into `type` and `description`
* tokens and populates Spec.type`
*
* @param {Spacing} spacing tells how to deal with a whitespace
* for type values going over multiple lines
*/
export default function typeTokenizer(spacing?: Spacing): Tokenizer;