podlite 0.0.53 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.podlite +9 -0
- package/esm/cli.js +107 -5
- package/esm/cli.js.map +1 -1
- package/esm/lint/engine.d.ts +3 -0
- package/esm/lint/engine.js +4 -0
- package/esm/lint/engine.js.map +1 -0
- package/esm/lint/index.d.ts +1 -0
- package/esm/lint/index.js +13 -0
- package/esm/lint/index.js.map +1 -0
- package/esm/lint/types.d.ts +20 -0
- package/esm/lint/types.js +2 -0
- package/esm/lint/types.js.map +1 -0
- package/esm/query.d.ts +15 -0
- package/esm/query.js +67 -0
- package/esm/query.js.map +1 -0
- package/lib/cli.js +107 -5
- package/lib/cli.js.map +1 -1
- package/lib/lint/engine.d.ts +3 -0
- package/lib/lint/engine.js +8 -0
- package/lib/lint/engine.js.map +1 -0
- package/lib/lint/index.d.ts +1 -0
- package/lib/lint/index.js +17 -0
- package/lib/lint/index.js.map +1 -0
- package/lib/lint/types.d.ts +20 -0
- package/lib/lint/types.js +3 -0
- package/lib/lint/types.js.map +1 -0
- package/lib/query.d.ts +15 -0
- package/lib/query.js +90 -0
- package/lib/query.js.map +1 -0
- package/package.json +8 -7
package/CHANGELOG.podlite
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
=head1 Upcoming
|
|
4
4
|
|
|
5
|
+
=head1 0.0.55
|
|
6
|
+
|
|
7
|
+
=item add C<< podlite query <selector> <files...> >> subcommand. Extracts blocks matching a selector. C<--to> selects C<podlite> (default, raw source), C<md>, C<html>, C<json>. C<--fail-on-empty> sets exit 1 on empty result. Match count on stderr unless C<--quiet>. Reads stdin when piped or when C<-> is given as a file argument
|
|
8
|
+
=item C<parseSelector> accepts bare pattern-list without a leading pipe (e.g. C<head1, code[:lang<python>]>); behaviour unchanged when the selector contains a C<|>
|
|
9
|
+
|
|
10
|
+
=head1 0.0.54
|
|
11
|
+
|
|
12
|
+
=item add C<< podlite lint <files...> >> subcommand (stub; rules land in upcoming releases)
|
|
13
|
+
|
|
5
14
|
=head1 0.0.47
|
|
6
15
|
|
|
7
16
|
=item added CLI entrypoint C<bin/podlite.js>
|
package/esm/cli.js
CHANGED
|
@@ -1,26 +1,44 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { parse, toMarkdown, toHtml } from '@podlite/schema';
|
|
4
|
+
import { runLint } from './lint';
|
|
5
|
+
import { runQuery } from './query';
|
|
4
6
|
const FORMATS = {
|
|
5
7
|
md: '.md',
|
|
6
8
|
markdown: '.md',
|
|
7
9
|
html: '.html',
|
|
8
10
|
};
|
|
11
|
+
const QUERY_FORMATS = ['podlite', 'md', 'html', 'json'];
|
|
9
12
|
function usage() {
|
|
10
|
-
console.log(`Usage:
|
|
13
|
+
console.log(`Usage:
|
|
14
|
+
podlite convert <files...> --to <format> [-o <output>]
|
|
15
|
+
podlite lint <files...>
|
|
16
|
+
podlite query <selector> <files...> [--to <format>] [--fail-on-empty] [--quiet]
|
|
11
17
|
|
|
12
18
|
Commands:
|
|
13
19
|
convert Convert Podlite files to another format
|
|
20
|
+
lint Check Podlite/Markdown files for issues (work in progress)
|
|
21
|
+
query Extract blocks matching a selector
|
|
14
22
|
|
|
15
23
|
Options:
|
|
16
|
-
--to Output format
|
|
24
|
+
--to Output format
|
|
25
|
+
convert: md (markdown), html
|
|
26
|
+
query: podlite (default), md, html, json
|
|
17
27
|
-o Output file or directory (default: same dir, new extension)
|
|
28
|
+
--fail-on-empty query: exit 1 if no blocks matched
|
|
29
|
+
--quiet query: suppress match count on stderr
|
|
18
30
|
--help Show this help
|
|
19
31
|
|
|
20
32
|
Examples:
|
|
21
33
|
podlite convert doc.pod6 --to md
|
|
22
34
|
podlite convert *.pod6 --to md -o output/
|
|
23
|
-
podlite
|
|
35
|
+
podlite query 'head1' docs/api.podlite
|
|
36
|
+
podlite query 'head1, head2' manual.podlite --to md
|
|
37
|
+
podlite query 'code[:lang<python>]' tutorials/*.podlite --to json
|
|
38
|
+
podlite query '*[:applies-nfr~<N004>]' rules/*.podlite --fail-on-empty
|
|
39
|
+
cat doc.podlite | podlite query 'head1'
|
|
40
|
+
podlite query 'table' --to json - < report.podlite
|
|
41
|
+
podlite lint docs/*.podlite`);
|
|
24
42
|
}
|
|
25
43
|
function parseArgs(argv) {
|
|
26
44
|
const args = {
|
|
@@ -28,20 +46,28 @@ function parseArgs(argv) {
|
|
|
28
46
|
files: [],
|
|
29
47
|
to: '',
|
|
30
48
|
output: '',
|
|
49
|
+
failOnEmpty: false,
|
|
50
|
+
quiet: false,
|
|
31
51
|
};
|
|
32
|
-
let i = 0;
|
|
33
52
|
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
34
53
|
return null;
|
|
35
54
|
}
|
|
55
|
+
let i = 0;
|
|
36
56
|
args.command = argv[i++];
|
|
37
57
|
while (i < argv.length) {
|
|
38
58
|
const arg = argv[i];
|
|
39
|
-
if (arg === '--to') {
|
|
59
|
+
if (arg === '--to' || arg === '-t') {
|
|
40
60
|
args.to = argv[++i] || '';
|
|
41
61
|
}
|
|
42
62
|
else if (arg === '-o') {
|
|
43
63
|
args.output = argv[++i] || '';
|
|
44
64
|
}
|
|
65
|
+
else if (arg === '--fail-on-empty') {
|
|
66
|
+
args.failOnEmpty = true;
|
|
67
|
+
}
|
|
68
|
+
else if (arg === '--quiet') {
|
|
69
|
+
args.quiet = true;
|
|
70
|
+
}
|
|
45
71
|
else if (arg === '--help' || arg === '-h') {
|
|
46
72
|
return null;
|
|
47
73
|
}
|
|
@@ -91,12 +117,88 @@ function convertFile(inputPath, format, outputPath) {
|
|
|
91
117
|
console.log(`${inputPath} → ${outFile}`);
|
|
92
118
|
}
|
|
93
119
|
}
|
|
120
|
+
function readStdinSync() {
|
|
121
|
+
return fs.readFileSync(0, 'utf-8');
|
|
122
|
+
}
|
|
123
|
+
function runQueryCommand(args) {
|
|
124
|
+
if (!args)
|
|
125
|
+
process.exit(1);
|
|
126
|
+
// First positional arg is the selector, rest are files
|
|
127
|
+
if (args.files.length === 0) {
|
|
128
|
+
console.error('podlite query: missing selector');
|
|
129
|
+
usage();
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const selector = args.files[0];
|
|
133
|
+
const positional = args.files.slice(1);
|
|
134
|
+
// '-' is explicit stdin marker. Piped input (stdin not a TTY) is also treated as input.
|
|
135
|
+
const stdinIsPiped = !process.stdin.isTTY;
|
|
136
|
+
const hasDashMarker = positional.includes('-');
|
|
137
|
+
const files = positional.filter(f => f !== '-');
|
|
138
|
+
let stdinContent;
|
|
139
|
+
if (hasDashMarker || (stdinIsPiped && files.length === 0)) {
|
|
140
|
+
stdinContent = readStdinSync();
|
|
141
|
+
}
|
|
142
|
+
if (files.length === 0 && stdinContent === undefined) {
|
|
143
|
+
console.error('podlite query: missing input files (and no stdin)');
|
|
144
|
+
usage();
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
const format = (args.to || 'podlite');
|
|
148
|
+
if (!QUERY_FORMATS.includes(format)) {
|
|
149
|
+
console.error(`podlite query: unknown --to format "${format}". Supported: ${QUERY_FORMATS.join(', ')}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
for (const f of files) {
|
|
153
|
+
if (!fs.existsSync(f)) {
|
|
154
|
+
console.error(`File not found: ${f}`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const result = runQuery({
|
|
160
|
+
selector,
|
|
161
|
+
files,
|
|
162
|
+
format,
|
|
163
|
+
failOnEmpty: args.failOnEmpty,
|
|
164
|
+
quiet: args.quiet,
|
|
165
|
+
stdinContent,
|
|
166
|
+
});
|
|
167
|
+
if (args.output) {
|
|
168
|
+
fs.writeFileSync(args.output, result.output);
|
|
169
|
+
}
|
|
170
|
+
else if (result.output) {
|
|
171
|
+
process.stdout.write(result.output);
|
|
172
|
+
if (!result.output.endsWith('\n'))
|
|
173
|
+
process.stdout.write('\n');
|
|
174
|
+
}
|
|
175
|
+
if (!args.quiet) {
|
|
176
|
+
console.error(`${result.matchCount} match${result.matchCount === 1 ? '' : 'es'}`);
|
|
177
|
+
}
|
|
178
|
+
process.exit(result.exitCode);
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
console.error(`podlite query: ${e.message}`);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
94
185
|
function main() {
|
|
95
186
|
const args = parseArgs(process.argv.slice(2));
|
|
96
187
|
if (!args) {
|
|
97
188
|
usage();
|
|
98
189
|
process.exit(0);
|
|
99
190
|
}
|
|
191
|
+
if (args.command === 'query') {
|
|
192
|
+
runQueryCommand(args);
|
|
193
|
+
}
|
|
194
|
+
if (args.command === 'lint') {
|
|
195
|
+
if (args.files.length === 0) {
|
|
196
|
+
console.error('No input files specified');
|
|
197
|
+
usage();
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
process.exit(runLint(args.files));
|
|
201
|
+
}
|
|
100
202
|
if (args.command !== 'convert') {
|
|
101
203
|
console.error(`Unknown command: ${args.command}`);
|
|
102
204
|
usage();
|
package/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/lint/engine.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,QAAQ,CAAC,GAAoB,EAAE,KAAa,EAAE,GAAgB;IAC5E,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runLint(files: string[]): number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* =begin pod
|
|
2
|
+
=head2 C<runLint>
|
|
3
|
+
|
|
4
|
+
Stub entry point for the C<podlite lint> subcommand. Returns the exit code
|
|
5
|
+
the CLI should propagate. Until rules land (Track 7 phase 2), it logs a
|
|
6
|
+
placeholder and exits cleanly.
|
|
7
|
+
|
|
8
|
+
=end pod */
|
|
9
|
+
export function runLint(files) {
|
|
10
|
+
console.log(`lint: stub — received ${files.length} file(s); rules not yet implemented`);
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;WAOW;AACX,MAAM,UAAU,OAAO,CAAC,KAAe;IACrC,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,MAAM,qCAAqC,CAAC,CAAA;IACvF,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Location, PodliteDocument } from '@podlite/schema';
|
|
2
|
+
export declare type Severity = 'error' | 'warning' | 'info';
|
|
3
|
+
export declare type FileType = 'md' | 'podlite';
|
|
4
|
+
export declare type LintConfig = Record<string, never>;
|
|
5
|
+
export declare type LintContext = {
|
|
6
|
+
filePath: string;
|
|
7
|
+
fileType: FileType;
|
|
8
|
+
config: LintConfig;
|
|
9
|
+
};
|
|
10
|
+
export declare type Violation = {
|
|
11
|
+
rule: string;
|
|
12
|
+
severity: Severity;
|
|
13
|
+
message: string;
|
|
14
|
+
location?: Location;
|
|
15
|
+
};
|
|
16
|
+
export declare type Rule = {
|
|
17
|
+
id: string;
|
|
18
|
+
severity: Severity;
|
|
19
|
+
check: (ast: PodliteDocument, ctx: LintContext) => Violation[];
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lint/types.ts"],"names":[],"mappings":""}
|
package/esm/query.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare type QueryFormat = 'podlite' | 'md' | 'html' | 'json';
|
|
2
|
+
export declare type QueryOptions = {
|
|
3
|
+
selector: string;
|
|
4
|
+
files: string[];
|
|
5
|
+
format: QueryFormat;
|
|
6
|
+
failOnEmpty: boolean;
|
|
7
|
+
quiet: boolean;
|
|
8
|
+
stdinContent?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare type QueryResult = {
|
|
11
|
+
output: string;
|
|
12
|
+
matchCount: number;
|
|
13
|
+
exitCode: number;
|
|
14
|
+
};
|
|
15
|
+
export declare const runQuery: (opts: QueryOptions) => QueryResult;
|
package/esm/query.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { parse, parseSelector, runSelector, toHtml, toMarkdown } from '@podlite/schema';
|
|
3
|
+
const loadSource = (file) => {
|
|
4
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
5
|
+
return { file, text, node: parse(text) };
|
|
6
|
+
};
|
|
7
|
+
const sliceBlock = (text, block) => {
|
|
8
|
+
const loc = block?.location;
|
|
9
|
+
if (!loc || typeof loc.start?.offset !== 'number' || typeof loc.end?.offset !== 'number') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
return text.slice(loc.start.offset, loc.end.offset);
|
|
13
|
+
};
|
|
14
|
+
// Each block is rendered through its own pod-block invocation. Wrapping
|
|
15
|
+
// multiple matches into one synthetic container triggers serializer
|
|
16
|
+
// warnings on some exporters; per-block keeps output clean.
|
|
17
|
+
const renderViaRoot = (block, serializer) => {
|
|
18
|
+
const root = { type: 'block', name: 'pod', margin: '', content: [block] };
|
|
19
|
+
const out = serializer === 'md' ? toMarkdown({}).run(root) : toHtml({}).run(root);
|
|
20
|
+
return out.toString();
|
|
21
|
+
};
|
|
22
|
+
const formatBlocks = (format, matches) => {
|
|
23
|
+
if (format === 'json') {
|
|
24
|
+
return JSON.stringify(matches.map(m => m.block), null, 2);
|
|
25
|
+
}
|
|
26
|
+
if (format === 'podlite') {
|
|
27
|
+
return matches
|
|
28
|
+
.map(m => sliceBlock(m.source.text, m.block).trimEnd())
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.join('\n\n');
|
|
31
|
+
}
|
|
32
|
+
if (format === 'md' || format === 'html') {
|
|
33
|
+
return matches.map(m => renderViaRoot(m.block, format).trimEnd()).filter(Boolean).join('\n\n');
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`Unknown output format: ${format}`);
|
|
36
|
+
};
|
|
37
|
+
export const runQuery = (opts) => {
|
|
38
|
+
const parsed = parseSelector(opts.selector);
|
|
39
|
+
if (!parsed) {
|
|
40
|
+
throw new Error(`Invalid selector: ${opts.selector}`);
|
|
41
|
+
}
|
|
42
|
+
const sources = [];
|
|
43
|
+
if (opts.stdinContent !== undefined) {
|
|
44
|
+
sources.push({ file: '<stdin>', text: opts.stdinContent, node: parse(opts.stdinContent) });
|
|
45
|
+
}
|
|
46
|
+
for (const f of opts.files) {
|
|
47
|
+
sources.push(loadSource(f));
|
|
48
|
+
}
|
|
49
|
+
if (sources.length === 0) {
|
|
50
|
+
throw new Error('No input files (and no stdin)');
|
|
51
|
+
}
|
|
52
|
+
// Per-source invocation preserves file context for source-slicing in podlite output
|
|
53
|
+
const matches = [];
|
|
54
|
+
for (const src of sources) {
|
|
55
|
+
const docs = [{ file: src.file, node: src.node }];
|
|
56
|
+
const result = runSelector(opts.selector, docs);
|
|
57
|
+
for (const item of result) {
|
|
58
|
+
if (item && typeof item === 'object' && !('file' in item)) {
|
|
59
|
+
matches.push({ source: src, block: item });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const output = formatBlocks(opts.format, matches);
|
|
64
|
+
const exitCode = opts.failOnEmpty && matches.length === 0 ? 1 : 0;
|
|
65
|
+
return { output, matchCount: matches.length, exitCode };
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=query.js.map
|
package/esm/query.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/lib/cli.js
CHANGED
|
@@ -22,26 +22,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
22
22
|
const fs = __importStar(require("fs"));
|
|
23
23
|
const path = __importStar(require("path"));
|
|
24
24
|
const schema_1 = require("@podlite/schema");
|
|
25
|
+
const lint_1 = require("./lint");
|
|
26
|
+
const query_1 = require("./query");
|
|
25
27
|
const FORMATS = {
|
|
26
28
|
md: '.md',
|
|
27
29
|
markdown: '.md',
|
|
28
30
|
html: '.html',
|
|
29
31
|
};
|
|
32
|
+
const QUERY_FORMATS = ['podlite', 'md', 'html', 'json'];
|
|
30
33
|
function usage() {
|
|
31
|
-
console.log(`Usage:
|
|
34
|
+
console.log(`Usage:
|
|
35
|
+
podlite convert <files...> --to <format> [-o <output>]
|
|
36
|
+
podlite lint <files...>
|
|
37
|
+
podlite query <selector> <files...> [--to <format>] [--fail-on-empty] [--quiet]
|
|
32
38
|
|
|
33
39
|
Commands:
|
|
34
40
|
convert Convert Podlite files to another format
|
|
41
|
+
lint Check Podlite/Markdown files for issues (work in progress)
|
|
42
|
+
query Extract blocks matching a selector
|
|
35
43
|
|
|
36
44
|
Options:
|
|
37
|
-
--to Output format
|
|
45
|
+
--to Output format
|
|
46
|
+
convert: md (markdown), html
|
|
47
|
+
query: podlite (default), md, html, json
|
|
38
48
|
-o Output file or directory (default: same dir, new extension)
|
|
49
|
+
--fail-on-empty query: exit 1 if no blocks matched
|
|
50
|
+
--quiet query: suppress match count on stderr
|
|
39
51
|
--help Show this help
|
|
40
52
|
|
|
41
53
|
Examples:
|
|
42
54
|
podlite convert doc.pod6 --to md
|
|
43
55
|
podlite convert *.pod6 --to md -o output/
|
|
44
|
-
podlite
|
|
56
|
+
podlite query 'head1' docs/api.podlite
|
|
57
|
+
podlite query 'head1, head2' manual.podlite --to md
|
|
58
|
+
podlite query 'code[:lang<python>]' tutorials/*.podlite --to json
|
|
59
|
+
podlite query '*[:applies-nfr~<N004>]' rules/*.podlite --fail-on-empty
|
|
60
|
+
cat doc.podlite | podlite query 'head1'
|
|
61
|
+
podlite query 'table' --to json - < report.podlite
|
|
62
|
+
podlite lint docs/*.podlite`);
|
|
45
63
|
}
|
|
46
64
|
function parseArgs(argv) {
|
|
47
65
|
const args = {
|
|
@@ -49,20 +67,28 @@ function parseArgs(argv) {
|
|
|
49
67
|
files: [],
|
|
50
68
|
to: '',
|
|
51
69
|
output: '',
|
|
70
|
+
failOnEmpty: false,
|
|
71
|
+
quiet: false,
|
|
52
72
|
};
|
|
53
|
-
let i = 0;
|
|
54
73
|
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
55
74
|
return null;
|
|
56
75
|
}
|
|
76
|
+
let i = 0;
|
|
57
77
|
args.command = argv[i++];
|
|
58
78
|
while (i < argv.length) {
|
|
59
79
|
const arg = argv[i];
|
|
60
|
-
if (arg === '--to') {
|
|
80
|
+
if (arg === '--to' || arg === '-t') {
|
|
61
81
|
args.to = argv[++i] || '';
|
|
62
82
|
}
|
|
63
83
|
else if (arg === '-o') {
|
|
64
84
|
args.output = argv[++i] || '';
|
|
65
85
|
}
|
|
86
|
+
else if (arg === '--fail-on-empty') {
|
|
87
|
+
args.failOnEmpty = true;
|
|
88
|
+
}
|
|
89
|
+
else if (arg === '--quiet') {
|
|
90
|
+
args.quiet = true;
|
|
91
|
+
}
|
|
66
92
|
else if (arg === '--help' || arg === '-h') {
|
|
67
93
|
return null;
|
|
68
94
|
}
|
|
@@ -112,12 +138,88 @@ function convertFile(inputPath, format, outputPath) {
|
|
|
112
138
|
console.log(`${inputPath} → ${outFile}`);
|
|
113
139
|
}
|
|
114
140
|
}
|
|
141
|
+
function readStdinSync() {
|
|
142
|
+
return fs.readFileSync(0, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
function runQueryCommand(args) {
|
|
145
|
+
if (!args)
|
|
146
|
+
process.exit(1);
|
|
147
|
+
// First positional arg is the selector, rest are files
|
|
148
|
+
if (args.files.length === 0) {
|
|
149
|
+
console.error('podlite query: missing selector');
|
|
150
|
+
usage();
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
const selector = args.files[0];
|
|
154
|
+
const positional = args.files.slice(1);
|
|
155
|
+
// '-' is explicit stdin marker. Piped input (stdin not a TTY) is also treated as input.
|
|
156
|
+
const stdinIsPiped = !process.stdin.isTTY;
|
|
157
|
+
const hasDashMarker = positional.includes('-');
|
|
158
|
+
const files = positional.filter(f => f !== '-');
|
|
159
|
+
let stdinContent;
|
|
160
|
+
if (hasDashMarker || (stdinIsPiped && files.length === 0)) {
|
|
161
|
+
stdinContent = readStdinSync();
|
|
162
|
+
}
|
|
163
|
+
if (files.length === 0 && stdinContent === undefined) {
|
|
164
|
+
console.error('podlite query: missing input files (and no stdin)');
|
|
165
|
+
usage();
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
const format = (args.to || 'podlite');
|
|
169
|
+
if (!QUERY_FORMATS.includes(format)) {
|
|
170
|
+
console.error(`podlite query: unknown --to format "${format}". Supported: ${QUERY_FORMATS.join(', ')}`);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
for (const f of files) {
|
|
174
|
+
if (!fs.existsSync(f)) {
|
|
175
|
+
console.error(`File not found: ${f}`);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const result = (0, query_1.runQuery)({
|
|
181
|
+
selector,
|
|
182
|
+
files,
|
|
183
|
+
format,
|
|
184
|
+
failOnEmpty: args.failOnEmpty,
|
|
185
|
+
quiet: args.quiet,
|
|
186
|
+
stdinContent,
|
|
187
|
+
});
|
|
188
|
+
if (args.output) {
|
|
189
|
+
fs.writeFileSync(args.output, result.output);
|
|
190
|
+
}
|
|
191
|
+
else if (result.output) {
|
|
192
|
+
process.stdout.write(result.output);
|
|
193
|
+
if (!result.output.endsWith('\n'))
|
|
194
|
+
process.stdout.write('\n');
|
|
195
|
+
}
|
|
196
|
+
if (!args.quiet) {
|
|
197
|
+
console.error(`${result.matchCount} match${result.matchCount === 1 ? '' : 'es'}`);
|
|
198
|
+
}
|
|
199
|
+
process.exit(result.exitCode);
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
console.error(`podlite query: ${e.message}`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
115
206
|
function main() {
|
|
116
207
|
const args = parseArgs(process.argv.slice(2));
|
|
117
208
|
if (!args) {
|
|
118
209
|
usage();
|
|
119
210
|
process.exit(0);
|
|
120
211
|
}
|
|
212
|
+
if (args.command === 'query') {
|
|
213
|
+
runQueryCommand(args);
|
|
214
|
+
}
|
|
215
|
+
if (args.command === 'lint') {
|
|
216
|
+
if (args.files.length === 0) {
|
|
217
|
+
console.error('No input files specified');
|
|
218
|
+
usage();
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
process.exit((0, lint_1.runLint)(args.files));
|
|
222
|
+
}
|
|
121
223
|
if (args.command !== 'convert') {
|
|
122
224
|
console.error(`Unknown command: ${args.command}`);
|
|
123
225
|
usage();
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB,2CAA4B;AAC5B,4CAA2D;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runRules = void 0;
|
|
4
|
+
function runRules(ast, rules, ctx) {
|
|
5
|
+
return rules.flatMap(rule => rule.check(ast, ctx));
|
|
6
|
+
}
|
|
7
|
+
exports.runRules = runRules;
|
|
8
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/lint/engine.ts"],"names":[],"mappings":";;;AAGA,SAAgB,QAAQ,CAAC,GAAoB,EAAE,KAAa,EAAE,GAAgB;IAC5E,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AACpD,CAAC;AAFD,4BAEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runLint(files: string[]): number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runLint = void 0;
|
|
4
|
+
/* =begin pod
|
|
5
|
+
=head2 C<runLint>
|
|
6
|
+
|
|
7
|
+
Stub entry point for the C<podlite lint> subcommand. Returns the exit code
|
|
8
|
+
the CLI should propagate. Until rules land (Track 7 phase 2), it logs a
|
|
9
|
+
placeholder and exits cleanly.
|
|
10
|
+
|
|
11
|
+
=end pod */
|
|
12
|
+
function runLint(files) {
|
|
13
|
+
console.log(`lint: stub — received ${files.length} file(s); rules not yet implemented`);
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
exports.runLint = runLint;
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;WAOW;AACX,SAAgB,OAAO,CAAC,KAAe;IACrC,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,MAAM,qCAAqC,CAAC,CAAA;IACvF,OAAO,CAAC,CAAA;AACV,CAAC;AAHD,0BAGC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Location, PodliteDocument } from '@podlite/schema';
|
|
2
|
+
export declare type Severity = 'error' | 'warning' | 'info';
|
|
3
|
+
export declare type FileType = 'md' | 'podlite';
|
|
4
|
+
export declare type LintConfig = Record<string, never>;
|
|
5
|
+
export declare type LintContext = {
|
|
6
|
+
filePath: string;
|
|
7
|
+
fileType: FileType;
|
|
8
|
+
config: LintConfig;
|
|
9
|
+
};
|
|
10
|
+
export declare type Violation = {
|
|
11
|
+
rule: string;
|
|
12
|
+
severity: Severity;
|
|
13
|
+
message: string;
|
|
14
|
+
location?: Location;
|
|
15
|
+
};
|
|
16
|
+
export declare type Rule = {
|
|
17
|
+
id: string;
|
|
18
|
+
severity: Severity;
|
|
19
|
+
check: (ast: PodliteDocument, ctx: LintContext) => Violation[];
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lint/types.ts"],"names":[],"mappings":""}
|
package/lib/query.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare type QueryFormat = 'podlite' | 'md' | 'html' | 'json';
|
|
2
|
+
export declare type QueryOptions = {
|
|
3
|
+
selector: string;
|
|
4
|
+
files: string[];
|
|
5
|
+
format: QueryFormat;
|
|
6
|
+
failOnEmpty: boolean;
|
|
7
|
+
quiet: boolean;
|
|
8
|
+
stdinContent?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare type QueryResult = {
|
|
11
|
+
output: string;
|
|
12
|
+
matchCount: number;
|
|
13
|
+
exitCode: number;
|
|
14
|
+
};
|
|
15
|
+
export declare const runQuery: (opts: QueryOptions) => QueryResult;
|
package/lib/query.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.runQuery = void 0;
|
|
23
|
+
const fs = __importStar(require("fs"));
|
|
24
|
+
const schema_1 = require("@podlite/schema");
|
|
25
|
+
const loadSource = (file) => {
|
|
26
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
27
|
+
return { file, text, node: (0, schema_1.parse)(text) };
|
|
28
|
+
};
|
|
29
|
+
const sliceBlock = (text, block) => {
|
|
30
|
+
const loc = block?.location;
|
|
31
|
+
if (!loc || typeof loc.start?.offset !== 'number' || typeof loc.end?.offset !== 'number') {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
return text.slice(loc.start.offset, loc.end.offset);
|
|
35
|
+
};
|
|
36
|
+
// Each block is rendered through its own pod-block invocation. Wrapping
|
|
37
|
+
// multiple matches into one synthetic container triggers serializer
|
|
38
|
+
// warnings on some exporters; per-block keeps output clean.
|
|
39
|
+
const renderViaRoot = (block, serializer) => {
|
|
40
|
+
const root = { type: 'block', name: 'pod', margin: '', content: [block] };
|
|
41
|
+
const out = serializer === 'md' ? (0, schema_1.toMarkdown)({}).run(root) : (0, schema_1.toHtml)({}).run(root);
|
|
42
|
+
return out.toString();
|
|
43
|
+
};
|
|
44
|
+
const formatBlocks = (format, matches) => {
|
|
45
|
+
if (format === 'json') {
|
|
46
|
+
return JSON.stringify(matches.map(m => m.block), null, 2);
|
|
47
|
+
}
|
|
48
|
+
if (format === 'podlite') {
|
|
49
|
+
return matches
|
|
50
|
+
.map(m => sliceBlock(m.source.text, m.block).trimEnd())
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.join('\n\n');
|
|
53
|
+
}
|
|
54
|
+
if (format === 'md' || format === 'html') {
|
|
55
|
+
return matches.map(m => renderViaRoot(m.block, format).trimEnd()).filter(Boolean).join('\n\n');
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`Unknown output format: ${format}`);
|
|
58
|
+
};
|
|
59
|
+
const runQuery = (opts) => {
|
|
60
|
+
const parsed = (0, schema_1.parseSelector)(opts.selector);
|
|
61
|
+
if (!parsed) {
|
|
62
|
+
throw new Error(`Invalid selector: ${opts.selector}`);
|
|
63
|
+
}
|
|
64
|
+
const sources = [];
|
|
65
|
+
if (opts.stdinContent !== undefined) {
|
|
66
|
+
sources.push({ file: '<stdin>', text: opts.stdinContent, node: (0, schema_1.parse)(opts.stdinContent) });
|
|
67
|
+
}
|
|
68
|
+
for (const f of opts.files) {
|
|
69
|
+
sources.push(loadSource(f));
|
|
70
|
+
}
|
|
71
|
+
if (sources.length === 0) {
|
|
72
|
+
throw new Error('No input files (and no stdin)');
|
|
73
|
+
}
|
|
74
|
+
// Per-source invocation preserves file context for source-slicing in podlite output
|
|
75
|
+
const matches = [];
|
|
76
|
+
for (const src of sources) {
|
|
77
|
+
const docs = [{ file: src.file, node: src.node }];
|
|
78
|
+
const result = (0, schema_1.runSelector)(opts.selector, docs);
|
|
79
|
+
for (const item of result) {
|
|
80
|
+
if (item && typeof item === 'object' && !('file' in item)) {
|
|
81
|
+
matches.push({ source: src, block: item });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const output = formatBlocks(opts.format, matches);
|
|
86
|
+
const exitCode = opts.failOnEmpty && matches.length === 0 ? 1 : 0;
|
|
87
|
+
return { output, matchCount: matches.length, exitCode };
|
|
88
|
+
};
|
|
89
|
+
exports.runQuery = runQuery;
|
|
90
|
+
//# sourceMappingURL=query.js.map
|
package/lib/query.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB,4CAA6G;AAe7G,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAA,cAAK,EAAC,IAAI,CAAC,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAU,EAAU,EAAE;IACtD,MAAM,GAAG,GAAG,KAAK,EAAE,QAAQ,CAAA;IAC3B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,QAAQ,EAAE;QACxF,OAAO,EAAE,CAAA;KACV;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,wEAAwE;AACxE,oEAAoE;AACpE,4DAA4D;AAC5D,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,UAAyB,EAAU,EAAE;IAC1E,MAAM,IAAI,GAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9E,MAAM,GAAG,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAA,mBAAU,EAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,eAAM,EAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,MAAmB,EACnB,OAAkD,EAC1C,EAAE;IACV,IAAI,MAAM,KAAK,MAAM,EAAE;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;KAC1D;IACD,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACtD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,MAAM,CAAC,CAAA;KAChB;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;KAC/F;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAA;AACrD,CAAC,CAAA;AAQM,MAAM,QAAQ,GAAG,CAAC,IAAkB,EAAe,EAAE;IAC1D,MAAM,MAAM,GAAG,IAAA,sBAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;KACtD;IAED,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAA,cAAK,EAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;KAC3F;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;QAC1B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;KAC5B;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;KACjD;IAED,oFAAoF;IACpF,MAAM,OAAO,GAA8C,EAAE,CAAA;IAC7D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACzB,MAAM,IAAI,GAAkB,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;YACzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAK,IAAe,CAAC,EAAE;gBACrE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAe,EAAE,CAAC,CAAA;aACtD;SACF;KACF;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;AACzD,CAAC,CAAA;AAjCY,QAAA,QAAQ,YAiCpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "podlite",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"description": "Podlite markup language parser — Markdown-compatible, with native support for diagrams, formulas, and custom blocks",
|
|
5
5
|
"homepage": "https://podlite.org",
|
|
6
6
|
"repository": {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"scripts": {
|
|
17
17
|
"test": "yarn g:jest --passWithNoTests",
|
|
18
18
|
"build": "yarn g:build",
|
|
19
|
+
"typecheck:lint": "tsc -p src/lint/tsconfig.json --noEmit",
|
|
19
20
|
"watch": "run-p -r watch:*",
|
|
20
21
|
"watch:ts": "tsc -w --pretty",
|
|
21
22
|
"watch:tests": "jest --watch -t \"test\""
|
|
@@ -49,12 +50,12 @@
|
|
|
49
50
|
"url": "https://github.com/podlite/podlite/issues"
|
|
50
51
|
},
|
|
51
52
|
"dependencies": {
|
|
52
|
-
"@podlite/diagram": "^0.0.
|
|
53
|
-
"@podlite/formula": "0.0.
|
|
54
|
-
"@podlite/image": "^0.0.
|
|
55
|
-
"@podlite/markdown": "0.0.
|
|
56
|
-
"@podlite/schema": "^0.0.
|
|
57
|
-
"@podlite/toc": "0.0.
|
|
53
|
+
"@podlite/diagram": "^0.0.46",
|
|
54
|
+
"@podlite/formula": "0.0.24",
|
|
55
|
+
"@podlite/image": "^0.0.41",
|
|
56
|
+
"@podlite/markdown": "0.0.35",
|
|
57
|
+
"@podlite/schema": "^0.0.42",
|
|
58
|
+
"@podlite/toc": "0.0.35",
|
|
58
59
|
"nanoid": "3.1.30"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|