@forumulate/cli 0.8.0 → 0.9.0

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.
Files changed (94) hide show
  1. package/README.md +8 -0
  2. package/dist/api/operations.json +1 -1
  3. package/dist/commands/completion.d.ts.map +1 -1
  4. package/dist/commands/completion.js +16 -0
  5. package/dist/commands/completion.js.map +1 -1
  6. package/dist/commands/groups-site.d.ts.map +1 -1
  7. package/dist/commands/groups-site.js +15 -8
  8. package/dist/commands/groups-site.js.map +1 -1
  9. package/dist/dev/command.d.ts +41 -0
  10. package/dist/dev/command.d.ts.map +1 -0
  11. package/dist/dev/command.js +158 -0
  12. package/dist/dev/command.js.map +1 -0
  13. package/dist/help.d.ts +1 -1
  14. package/dist/help.d.ts.map +1 -1
  15. package/dist/help.js +17 -0
  16. package/dist/help.js.map +1 -1
  17. package/dist/publish/api.d.ts +30 -12
  18. package/dist/publish/api.d.ts.map +1 -1
  19. package/dist/publish/api.js +62 -10
  20. package/dist/publish/api.js.map +1 -1
  21. package/dist/publish/client.d.ts +19 -0
  22. package/dist/publish/client.d.ts.map +1 -0
  23. package/dist/publish/client.js +3 -0
  24. package/dist/publish/client.js.map +1 -0
  25. package/dist/publish/command.d.ts +31 -2
  26. package/dist/publish/command.d.ts.map +1 -1
  27. package/dist/publish/command.js +62 -15
  28. package/dist/publish/command.js.map +1 -1
  29. package/dist/publish/context.d.ts +4 -1
  30. package/dist/publish/context.d.ts.map +1 -1
  31. package/dist/publish/context.js.map +1 -1
  32. package/dist/publish/diff.d.ts +21 -0
  33. package/dist/publish/diff.d.ts.map +1 -0
  34. package/dist/publish/diff.js +96 -0
  35. package/dist/publish/diff.js.map +1 -0
  36. package/dist/publish/docs-apply.d.ts +8 -1
  37. package/dist/publish/docs-apply.d.ts.map +1 -1
  38. package/dist/publish/docs-apply.js +37 -10
  39. package/dist/publish/docs-apply.js.map +1 -1
  40. package/dist/publish/docs-plan.d.ts +16 -3
  41. package/dist/publish/docs-plan.d.ts.map +1 -1
  42. package/dist/publish/docs-plan.js +57 -6
  43. package/dist/publish/docs-plan.js.map +1 -1
  44. package/dist/publish/frontmatter.d.ts +1 -1
  45. package/dist/publish/frontmatter.d.ts.map +1 -1
  46. package/dist/publish/frontmatter.js +1 -0
  47. package/dist/publish/frontmatter.js.map +1 -1
  48. package/dist/publish/index.d.ts +12 -0
  49. package/dist/publish/index.d.ts.map +1 -0
  50. package/dist/publish/index.js +17 -0
  51. package/dist/publish/index.js.map +1 -0
  52. package/dist/publish/manifest.d.ts.map +1 -1
  53. package/dist/publish/manifest.js +23 -3
  54. package/dist/publish/manifest.js.map +1 -1
  55. package/dist/publish/names.d.ts +28 -0
  56. package/dist/publish/names.d.ts.map +1 -0
  57. package/dist/publish/names.js +80 -0
  58. package/dist/publish/names.js.map +1 -0
  59. package/dist/publish/posts.d.ts.map +1 -1
  60. package/dist/publish/posts.js +46 -13
  61. package/dist/publish/posts.js.map +1 -1
  62. package/dist/publish/reserved.d.ts +49 -0
  63. package/dist/publish/reserved.d.ts.map +1 -0
  64. package/dist/publish/reserved.js +118 -0
  65. package/dist/publish/reserved.js.map +1 -0
  66. package/dist/publish/rewrite.d.ts +12 -0
  67. package/dist/publish/rewrite.d.ts.map +1 -1
  68. package/dist/publish/rewrite.js +22 -0
  69. package/dist/publish/rewrite.js.map +1 -1
  70. package/dist/publish/scan-docs.d.ts +10 -0
  71. package/dist/publish/scan-docs.d.ts.map +1 -0
  72. package/dist/publish/scan-docs.js +160 -0
  73. package/dist/publish/scan-docs.js.map +1 -0
  74. package/dist/publish/scan.d.ts +21 -17
  75. package/dist/publish/scan.d.ts.map +1 -1
  76. package/dist/publish/scan.js +99 -232
  77. package/dist/publish/scan.js.map +1 -1
  78. package/dist/publish/slots.d.ts +39 -0
  79. package/dist/publish/slots.d.ts.map +1 -0
  80. package/dist/publish/slots.js +64 -0
  81. package/dist/publish/slots.js.map +1 -0
  82. package/dist/publish/tags.d.ts +9 -0
  83. package/dist/publish/tags.d.ts.map +1 -0
  84. package/dist/publish/tags.js +194 -0
  85. package/dist/publish/tags.js.map +1 -0
  86. package/dist/publish/types.d.ts +62 -0
  87. package/dist/publish/types.d.ts.map +1 -1
  88. package/dist/publish/types.js +0 -10
  89. package/dist/publish/types.js.map +1 -1
  90. package/dist/run.d.ts +1 -1
  91. package/dist/run.d.ts.map +1 -1
  92. package/dist/run.js +79 -32
  93. package/dist/run.js.map +1 -1
  94. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../src/publish/rewrite.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAcnF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ1E"}
1
+ {"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../src/publish/rewrite.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAcnF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAQ1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACrC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAOT"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rewriteLinks = rewriteLinks;
4
4
  exports.rewriteAssets = rewriteAssets;
5
5
  exports.rewriteValue = rewriteValue;
6
+ exports.mediaChanged = mediaChanged;
6
7
  const node_path_1 = require("node:path");
7
8
  /**
8
9
  * What changes between the file on disk and the text the API is sent.
@@ -79,4 +80,25 @@ function rewriteValue(value, urlByRef) {
79
80
  return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, rewriteValue(v, urlByRef)]));
80
81
  return value;
81
82
  }
83
+ /**
84
+ * Does the live text still point at every picture the file's body uses?
85
+ *
86
+ * The word comparison (`compare.ts`) ignores link and image targets on
87
+ * purpose — the importer rewrites them, so they are never the same string
88
+ * twice. That left one change invisible: an image replaced by a new one under
89
+ * the same name uploads under a new content hash, and the post kept pointing
90
+ * at the old picture because its words had not changed. So the targets are
91
+ * checked here instead, by the URL each reference resolves to: one that is
92
+ * not uploaded yet, or not in the live text, means the body must be sent.
93
+ */
94
+ function mediaChanged(body, refs, urls, liveText) {
95
+ for (const ref of refs?.keys() ?? []) {
96
+ if (!body.includes(ref))
97
+ continue; // a front-matter value: compared as a field
98
+ const url = urls.get(ref);
99
+ if (!url || !liveText.includes(url))
100
+ return true;
101
+ }
102
+ return false;
103
+ }
82
104
  //# sourceMappingURL=rewrite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../src/publish/rewrite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../src/publish/rewrite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DocsWalk, Reader, ScanResult, SpaceSpec } from './types';
2
+ /**
3
+ * The docs half of reading a folder: one top-level folder per collection,
4
+ * files at the root in the root collection, nested folders as parent pages
5
+ * (the folder's `index.md` — or `README.md`, unless the space says
6
+ * `readme: skip` — is the parent; a folder without one gets a title-only stub
7
+ * so its children still have somewhere to hang).
8
+ */
9
+ export declare function scanDocs(absDir: string, spec: SpaceSpec, out: ScanResult, read: Reader, w: DocsWalk): void;
10
+ //# sourceMappingURL=scan-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-docs.d.ts","sourceRoot":"","sources":["../../src/publish/scan-docs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAA8B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEnG;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,QAAQ,GACV,IAAI,CA8BN"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanDocs = scanDocs;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const yaml_1 = require("yaml");
7
+ const frontmatter_1 = require("./frontmatter");
8
+ const names_1 = require("./names");
9
+ const slots_1 = require("./slots");
10
+ /**
11
+ * The docs half of reading a folder: one top-level folder per collection,
12
+ * files at the root in the root collection, nested folders as parent pages
13
+ * (the folder's `index.md` — or `README.md`, unless the space says
14
+ * `readme: skip` — is the parent; a folder without one gets a title-only stub
15
+ * so its children still have somewhere to hang).
16
+ */
17
+ function scanDocs(absDir, spec, out, read, w) {
18
+ const rootName = spec.rootCollection ?? '';
19
+ const rootFiles = [];
20
+ const folders = [];
21
+ for (const e of (0, node_fs_1.readdirSync)(absDir).sort()) {
22
+ if (w.skip(absDir, e))
23
+ continue;
24
+ const abs = (0, node_path_1.join)(absDir, e);
25
+ if ((0, node_fs_1.statSync)(abs).isDirectory()) {
26
+ if (w.hasMarkdown(abs))
27
+ folders.push(e);
28
+ }
29
+ else if (names_1.MD.test(e))
30
+ rootFiles.push(e);
31
+ }
32
+ if (rootFiles.length) {
33
+ out.collections.push(collectionOf(absDir, '', rootName ? (0, names_1.slugify)(rootName) : '', rootName, [-1, ''], {}, out, read, w, rootFiles));
34
+ }
35
+ for (const name of folders) {
36
+ const abs = (0, node_path_1.join)(absDir, name);
37
+ const declared = { ...folderMeta(abs), ...(spec.collections?.[name] ?? {}) };
38
+ const [n, key] = (0, names_1.prefixOrder)(name);
39
+ const order = [typeof declared.order === 'number' ? declared.order : n, key];
40
+ const slug = typeof declared.slug === 'string'
41
+ ? (0, names_1.slugify)(declared.slug)
42
+ : (0, names_1.slugify)(name.replace(names_1.NUMERIC, ''));
43
+ const title = typeof declared.name === 'string' ? declared.name : (0, names_1.titleize)(name);
44
+ const nav = (declared.nav ?? undefined);
45
+ out.collections.push(collectionOf(abs, name, slug, title, order, nav, out, read, w));
46
+ }
47
+ out.collections.sort((a, b) => a.order[0] - b.order[0] || a.order[1].localeCompare(b.order[1]));
48
+ }
49
+ /** `_collection.yml` / `.yaml` / `.json` beside a collection's files. */
50
+ function folderMeta(dir) {
51
+ for (const n of ['_collection.yml', '_collection.yaml', '_collection.json']) {
52
+ const p = (0, node_path_1.join)(dir, n);
53
+ if ((0, node_fs_1.existsSync)(p))
54
+ return ((0, yaml_1.parse)((0, node_fs_1.readFileSync)(p, 'utf8')) ?? {});
55
+ }
56
+ return {};
57
+ }
58
+ function collectionOf(abs, dir, slug, name, order, nav, out, read, w, onlyFiles) {
59
+ const col = { dir, slug, name, order, nav, pages: [] };
60
+ /**
61
+ * Walk one folder. `own` is the page that stands for this folder (its files
62
+ * nest under it; null at the collection's top) and `above` is the page that
63
+ * one nests under — which is where the folder's own index file hangs.
64
+ */
65
+ const walk = (folder, rel, own, above) => {
66
+ const entries = (onlyFiles ?? (0, node_fs_1.readdirSync)(folder).sort()).filter((e) => !w.skip(folder, e));
67
+ const files = entries.filter((e) => names_1.MD.test(e) && !(0, node_fs_1.statSync)((0, node_path_1.join)(folder, e)).isDirectory());
68
+ const dirs = onlyFiles
69
+ ? []
70
+ : entries.filter((e) => (0, node_fs_1.statSync)((0, node_path_1.join)(folder, e)).isDirectory() && w.hasMarkdown((0, node_path_1.join)(folder, e)));
71
+ const index = rel ? files.find(w.isIndex) : undefined;
72
+ for (const f of files) {
73
+ const parentSlug = f === index ? above : own;
74
+ const where = { importName: rel ? `${rel}/${f}` : f, rel, isFolderIndex: f === index };
75
+ const page = pageOf((0, node_path_1.join)(folder, f), where, parentSlug, slug, out, read, w);
76
+ if (page)
77
+ col.pages.push(page);
78
+ }
79
+ for (const d of dirs) {
80
+ const sub = (0, node_path_1.join)(folder, d);
81
+ const subRel = rel ? `${rel}/${d}` : d;
82
+ const subFiles = (0, node_fs_1.readdirSync)(sub).filter((e) => !w.skip(sub, e) && names_1.MD.test(e));
83
+ const subIndex = subFiles.find(w.isIndex);
84
+ let folderSlug;
85
+ if (subIndex) {
86
+ // The index decides the folder page's address; read it once for that.
87
+ const { data } = (0, frontmatter_1.splitFront)((0, node_fs_1.readFileSync)((0, node_path_1.join)(sub, subIndex), 'utf8'));
88
+ folderSlug =
89
+ typeof data.slug === 'string' && data.slug.trim()
90
+ ? (0, names_1.slugify)(data.slug)
91
+ : (0, names_1.slugify)(d.replace(names_1.NUMERIC, ''));
92
+ }
93
+ else {
94
+ folderSlug = (0, names_1.slugify)(d.replace(names_1.NUMERIC, ''));
95
+ const title = (0, names_1.titleize)(d);
96
+ col.pages.push({
97
+ file: `${(0, node_path_1.relative)(out.absDir, sub).split(node_path_1.sep).join('/')}/ (no index.md)`,
98
+ importName: `${subRel}/index.md`,
99
+ slug: folderSlug,
100
+ parentSlug: own,
101
+ order: (0, names_1.prefixOrder)(d),
102
+ title,
103
+ source: `---\ntitle: ${JSON.stringify(title)}\nslug: ${folderSlug}\n---\n`,
104
+ body: '',
105
+ meta: {},
106
+ unknown: [],
107
+ sections: {},
108
+ stub: true,
109
+ });
110
+ }
111
+ walk(sub, subRel, folderSlug, own);
112
+ }
113
+ };
114
+ walk(abs, '', null, null);
115
+ return col;
116
+ }
117
+ function pageOf(abs, where, parentSlug, collectionSlug, out, read, w) {
118
+ const { importName, rel, isFolderIndex } = where;
119
+ const f = read(abs);
120
+ const name = (0, node_path_1.basename)(abs);
121
+ const stem = name.replace(names_1.MD, '');
122
+ const declaredSlug = typeof f.data.slug === 'string' && f.data.slug.trim() ? (0, names_1.slugify)(f.data.slug) : '';
123
+ const folder = node_path_1.posix.basename(rel);
124
+ const atCollectionTop = w.isIndex(name) && !rel;
125
+ const slug = declaredSlug ||
126
+ (isFolderIndex
127
+ ? (0, names_1.slugify)(folder.replace(names_1.NUMERIC, ''))
128
+ : atCollectionTop
129
+ ? collectionSlug || (0, names_1.slugify)((0, names_1.titleOf)(f.data, f.body, 'overview'))
130
+ : (0, names_1.slugify)(stem.replace(names_1.NUMERIC, '')));
131
+ if ((0, frontmatter_1.isDraft)(f.data)) {
132
+ // Remembered by slug: a draft is never written, and never pruned either.
133
+ out.drafts.add(slug);
134
+ out.warnings.push(`${f.rel}: draft — left out (and kept if it is live)`);
135
+ return null;
136
+ }
137
+ // Slots first: `short-answer:` on an FAQ question is a slot, not an unknown key.
138
+ const slotted = (0, slots_1.pageSlots)(f.data, f.body, w.slots);
139
+ const { meta, unknown } = (0, frontmatter_1.pageMeta)(slotted.rest, w.fieldKeys);
140
+ const n = (0, frontmatter_1.declaredOrder)(f.data);
141
+ const [prefixN, key] = (0, names_1.prefixOrder)(isFolderIndex ? folder : stem);
142
+ // A folder's index is ordered among the folder's siblings, by the folder's
143
+ // prefix; a collection's own index leads it unless it says otherwise.
144
+ const order = [n ?? (atCollectionTop ? -1 : prefixN), key];
145
+ out.slugByFile.set(f.rel, slug);
146
+ return {
147
+ file: f.rel,
148
+ importName,
149
+ slug,
150
+ parentSlug,
151
+ order,
152
+ title: (0, names_1.titleOf)(f.data, f.body, slug),
153
+ source: f.text,
154
+ body: f.body,
155
+ meta,
156
+ unknown: [...unknown, ...slotted.notes],
157
+ sections: slotted.sections,
158
+ };
159
+ }
160
+ //# sourceMappingURL=scan-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-docs.js","sourceRoot":"","sources":["../../src/publish/scan-docs.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,28 @@
1
- import type { LocalSpace, SpaceSpec } from './types';
2
- export declare const MANIFEST_NAMES: string[];
3
- /** The product's slug rule (packages/shared `slugify`), mirrored: this package ships alone. */
4
- export declare function slugify(input: string, fallback?: string, max?: number): string;
1
+ import { MANIFEST_NAMES } from './reserved';
2
+ import type { Slot } from './slots';
3
+ import type { ScanResult, SpaceSpec } from './types';
5
4
  /**
6
- * The product's TAG rule (apps/api `normalizeTag`), mirrored for the same reason
7
- * as `slugify`. Used to compare a front-matter tag list with the stored one: an
8
- * ASCII-only fold here turned every Japanese or Cyrillic tag into `-`, so two
9
- * different non-Latin tag lists compared equal and the update was skipped.
5
+ * A folder on disk, read into what it would publish.
6
+ *
7
+ * Docs are walked in `scan-docs.ts` (collections, nesting, folder pages).
8
+ * Everything else — blog, changelog, any type whose pieces are posts — is a
9
+ * flat set of posts, folders or not. Both go through the same skip rules
10
+ * (`reserved.ts`) and the same reader, which records the local files each
11
+ * document points at for upload.
10
12
  */
11
- export declare function tagKey(raw: string): string;
12
- /** `02-getting-started` → `Getting Started`. */
13
- export declare function titleize(name: string): string;
14
- export interface ScanResult extends LocalSpace {
15
- /** Per file (relative to the space folder): reference as written → absolute asset path. */
16
- refs: Map<string, Map<string, string>>;
17
- /** Every Markdown file of the space (relative to the space folder) → its slug. */
18
- slugByFile: Map<string, string>;
13
+ export { slugify, tagKey, titleize } from './names';
14
+ export type { ScanResult } from './types';
15
+ export type { ScanShape };
16
+ export { MANIFEST_NAMES };
17
+ /** What the space's type declares, as far as reading a folder needs it. */
18
+ interface ScanShape {
19
+ /** Declared parameters (`audience`, `topic`, …): front matter keys that go to `fields`. */
20
+ fieldKeys: string[];
21
+ /** Declared slots of a page-backed type, for front matter that fills them. */
22
+ slots?: Slot[];
19
23
  }
20
24
  /** Read one space folder. `kind` decides whether its files are pages or posts. */
21
- export declare function scanSpace(root: string, spec: SpaceSpec, kind: 'docs' | 'posts', fieldKeys: string[]): ScanResult;
25
+ export declare function scanSpace(root: string, spec: SpaceSpec, kind: 'docs' | 'posts', shape: ScanShape | string[]): ScanResult;
22
26
  /** Every relative path → posix, for comparing with `importName`s. */
23
27
  export declare const toPosix: (p: string) => string;
24
28
  export declare const extOf: (p: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/publish/scan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA8B,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAejF,eAAO,MAAM,cAAc,UAA2D,CAAC;AAKvF,+FAA+F;AAC/F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,EAAE,GAAG,SAAK,GAAG,MAAM,CAa1E;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAc1C;AAED,gDAAgD;AAChD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAwED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,2FAA2F;IAC3F,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,kFAAkF;IAClF,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB,UAAU,CAgCZ;AAqPD,qEAAqE;AACrE,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC7D,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,WAA6B,CAAC"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/publish/scan.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2B,cAAc,EAAkB,MAAM,YAAY,CAAC;AAErF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAU,UAAU,EAAE,SAAS,EAAW,MAAM,SAAS,CAAC;AAEtE;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;AAkG1B,2EAA2E;AAC3E,UAAU,SAAS;IACjB,2FAA2F;IAC3F,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,GAC1B,UAAU,CAiDZ;AAgDD,qEAAqE;AACrE,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,WAA2B,CAAC;AAC7D,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,WAA6B,CAAC"}