@riboseinc/anafero-cli 0.0.55 → 0.0.57

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/build-site.mjs CHANGED
@@ -313300,7 +313300,9 @@ var ResourceMetadataSchema = mutable3(Struct({
313300
313300
  // TODO: rich ProseMirror labels?
313301
313301
  labelInPlainText: String$2.pipe(nonEmptyString4()),
313302
313302
  // TODO: proper schema for ISO language IDs
313303
- primaryLanguageID: String$2.pipe(optional)
313303
+ primaryLanguageID: String$2.pipe(optional),
313304
+ /** License/copyright for the resource in question. */
313305
+ license: Any.pipe(optional)
313304
313306
  }));
313305
313307
  function gatherDescribedResourcesFromJsonifiedProseMirrorNode(jsonifiedNode, _accum) {
313306
313308
  const accumulator = _accum ?? /* @__PURE__ */ new Set();
@@ -317391,12 +317393,7 @@ var lunrLanguageSupport = {
317391
317393
  };
317392
317394
  var encoder = new TextEncoder();
317393
317395
  var decoder = new TextDecoder();
317394
- function* generateResourceAssets(resourceURI, relations, parentChain, directDescendants, resourceProps, expandVersionedPath, getDOMStub, inject, workspaceTitle, primaryLanguageID, generateContent) {
317395
- const generatedContent = generateContent(relations, resourceURI);
317396
- if (!generatedContent) {
317397
- console.warn("Resource has no content", resourceURI);
317398
- return;
317399
- }
317396
+ function* generateResourceAssets(resourceURI, relations, parentChain, directDescendants, resourceProps, expandVersionedPath, getDOMStub, inject, workspaceTitle, primaryLanguageID, generatedContent) {
317400
317397
  const generateNavLink = function generateNavLink2(path3, uri, meta) {
317401
317398
  return {
317402
317399
  path: expandVersionedPath(path3),
@@ -317549,7 +317546,7 @@ ${inject.head ?? ""}`;
317549
317546
  const rootMeta = reader.describeRoot();
317550
317547
  const maybePrimaryLanguageID = rootMeta.primaryLanguageID ?? "en";
317551
317548
  const maybeMainTitle = rootMeta.labelInPlainText ?? "Document";
317552
- const allLanguages = /* @__PURE__ */ new Set();
317549
+ const allLanguages = /* @__PURE__ */ new Set(["en"]);
317553
317550
  function getReverseResourceMap() {
317554
317551
  return Object.fromEntries(Object.entries(resourceMap).map(([k, v]) => [v, k]));
317555
317552
  }
@@ -317575,110 +317572,115 @@ ${inject.head ?? ""}`;
317575
317572
  throw new Error("Malformed resource URL while processing resources: hash fragment");
317576
317573
  }
317577
317574
  const [pathProgress] = pathSubtask(`${resourceURI.replaceAll("|", ":")}`, { state: "resolving relations" });
317578
- const relations = reader.resolve(resourceURI);
317579
- resourceMap[path3] = resourceURI;
317580
- resourceGraph.push([resourceURI, "isDefinedBy", `${path3}/resource.json`]);
317581
317575
  const resourceMeta = meta;
317582
- resourceDescriptions[resourceURI] = resourceMeta;
317583
- pathProgress({ state: "processing referenced files" });
317584
- for (const [, , o2] of relations) {
317585
- if (o2.startsWith("file:")) {
317586
- const filePath = o2.split("file:")[1];
317587
- const filename = o2.replaceAll("/", "_").replaceAll(":", "_");
317588
- if (!assetsToWrite[filename]) {
317576
+ const relations = reader.resolve(resourceURI);
317577
+ pathProgress({ state: "generating resource page content" });
317578
+ const content = function generateContent(graph, metadata, uri, cache4) {
317579
+ if (!cache4[uri]) {
317580
+ let content2;
317581
+ const maybeAdapter = findContentAdapter(uri);
317582
+ if (maybeAdapter) {
317589
317583
  try {
317590
- assetsToWrite[filename] = await fetchBlobAtThisVersion(filePath);
317591
- resourceGraph.push([
317592
- o2,
317593
- "isDownloadableAt",
317594
- filename
317595
- ]);
317596
- resourceMap[filename] = o2;
317597
- resourceDescriptions[o2] = {
317598
- labelInPlainText: filePath
317599
- };
317584
+ content2 = maybeAdapter[1].generateContent(graph) ?? null;
317600
317585
  } catch (e3) {
317601
- console.error("Failed to fetch asset", filePath);
317586
+ console.error(
317587
+ "Failed to generate resource content",
317588
+ path3,
317589
+ uri,
317590
+ graph.slice(0, 40).join("\n")
317591
+ );
317592
+ throw e3;
317602
317593
  }
317594
+ if (content2) {
317595
+ contentCache[uri] = {
317596
+ adapterID: maybeAdapter[0],
317597
+ content: { ...metadata, ...content2 }
317598
+ };
317599
+ if (metadata.primaryLanguageID) {
317600
+ allLanguages.add(metadata.primaryLanguageID);
317601
+ }
317602
+ const describedResourceIDs = gatherDescribedResourcesFromJsonifiedProseMirrorNode(content2.contentDoc);
317603
+ for (const inPageResourceID of describedResourceIDs) {
317604
+ if (reader.exists(inPageResourceID)) {
317605
+ const pathWithFragment = `${path3}#${encodeURIComponent(inPageResourceID)}`;
317606
+ resourceMap[pathWithFragment] = inPageResourceID;
317607
+ resourceGraph.push([inPageResourceID, "isDefinedBy", `${path3}/resource.json`]);
317608
+ resourceDescriptions[inPageResourceID] = reader.describe(inPageResourceID);
317609
+ } else {
317610
+ console.warn(
317611
+ "Subresource on page does not exist in the graph",
317612
+ path3,
317613
+ inPageResourceID
317614
+ );
317615
+ }
317616
+ }
317617
+ }
317618
+ } else {
317619
+ console.warn("No adapter found to render", uri);
317620
+ return null;
317603
317621
  }
317622
+ } else {
317623
+ console.debug("contentCache hit", uri);
317604
317624
  }
317605
- }
317625
+ return cache4[uri];
317626
+ }(relations, meta, resourceURI, contentCache);
317606
317627
  pathProgress({ state: "generating page content & assets" });
317607
- const resourceAssetGenerator = generateResourceAssets(
317608
- resourceURI,
317609
- relations,
317610
- parentChain,
317611
- directDescendants,
317612
- {
317613
- useDependency: getDependency,
317614
- selectedLayout: layouts[0],
317615
- getResourcePlainTitle: (uri) => resourceDescriptions[uri]?.labelInPlainText ?? uri,
317616
- onIntegrityViolation: console.warn,
317617
- reverseResource: (path4) => getReverseResourceMap()[path4],
317618
- uri: resourceURI,
317619
- // TODO: Consider slash-prepending the outcome of findURL,
317620
- // if it’s reliably not slash-prepended
317621
- locateResource: (uri) => expandVersionedPath(reader.findURL(uri))
317622
- },
317623
- expandVersionedPath,
317624
- getDOMStub,
317625
- { head: extraHead, tail: inject.tail, htmlAttrs: inject.htmlAttrs },
317626
- maybeMainTitle,
317627
- resourceMeta.primaryLanguageID ?? maybePrimaryLanguageID,
317628
- function generateContent(relations2, uri) {
317629
- if (!contentCache[uri]) {
317630
- let content;
317631
- const maybeAdapter = findContentAdapter(uri);
317632
- if (maybeAdapter) {
317628
+ if (content !== null) {
317629
+ resourceMap[path3] = resourceURI;
317630
+ resourceGraph.push([resourceURI, "isDefinedBy", `${path3}/resource.json`]);
317631
+ resourceDescriptions[resourceURI] = resourceMeta;
317632
+ pathProgress({ state: "processing resource assets" });
317633
+ for (const [, , o2] of relations) {
317634
+ if (o2.startsWith("file:")) {
317635
+ const filePath = o2.split("file:")[1];
317636
+ const filename = o2.replaceAll("/", "_").replaceAll(":", "_");
317637
+ if (!assetsToWrite[filename]) {
317633
317638
  try {
317634
- content = maybeAdapter[1].generateContent(
317635
- relations2
317636
- ) ?? null;
317639
+ assetsToWrite[filename] = await fetchBlobAtThisVersion(filePath);
317640
+ resourceGraph.push([
317641
+ o2,
317642
+ "isDownloadableAt",
317643
+ filename
317644
+ ]);
317645
+ resourceMap[filename] = o2;
317646
+ resourceDescriptions[o2] = {
317647
+ labelInPlainText: filePath
317648
+ };
317637
317649
  } catch (e3) {
317638
- console.error(
317639
- "Failed to generate resource content",
317640
- path3,
317641
- resourceMeta,
317642
- uri,
317643
- relations2.slice(0, 40).join("\n")
317644
- );
317645
- throw e3;
317650
+ console.error("Failed to fetch asset", filePath);
317646
317651
  }
317647
- const primaryLanguageID = resourceMeta.primaryLanguageID ?? maybePrimaryLanguageID;
317648
- contentCache[uri] = {
317649
- adapterID: maybeAdapter[0],
317650
- content: content ? { primaryLanguageID, ...content } : null
317651
- };
317652
- if (content) {
317653
- const describedResourceIDs = gatherDescribedResourcesFromJsonifiedProseMirrorNode(content.contentDoc);
317654
- for (const inPageResourceID of describedResourceIDs) {
317655
- if (reader.exists(inPageResourceID)) {
317656
- const pathWithFragment = `${path3}#${encodeURIComponent(inPageResourceID)}`;
317657
- resourceMap[pathWithFragment] = inPageResourceID;
317658
- resourceGraph.push([inPageResourceID, "isDefinedBy", `${path3}/resource.json`]);
317659
- resourceDescriptions[inPageResourceID] = reader.describe(inPageResourceID);
317660
- } else {
317661
- console.warn(
317662
- "Subresource on page does not exist in the graph",
317663
- path3,
317664
- inPageResourceID
317665
- );
317666
- }
317667
- }
317668
- }
317669
- } else {
317670
- console.warn("No adapter found to render", uri);
317671
- return null;
317672
317652
  }
317673
317653
  }
317674
- return contentCache[uri];
317675
317654
  }
317676
- );
317677
- for (const blobChunk of resourceAssetGenerator) {
317678
- yield Object.entries(blobChunk).map(([subpath, blob]) => {
317679
- const assetBlobPath = `/${path3}${subpath}`;
317680
- return { [assetBlobPath]: blob };
317681
- }).reduce((prev, curr) => ({ ...prev, ...curr }));
317655
+ const resourceAssetGenerator = generateResourceAssets(
317656
+ resourceURI,
317657
+ relations,
317658
+ parentChain,
317659
+ directDescendants,
317660
+ {
317661
+ useDependency: getDependency,
317662
+ selectedLayout: layouts[0],
317663
+ getResourcePlainTitle: (uri) => resourceDescriptions[uri]?.labelInPlainText ?? uri,
317664
+ onIntegrityViolation: console.warn,
317665
+ reverseResource: (path4) => getReverseResourceMap()[path4],
317666
+ uri: resourceURI,
317667
+ // TODO: Consider slash-prepending the outcome of findURL,
317668
+ // if it’s reliably not slash-prepended
317669
+ locateResource: (uri) => expandVersionedPath(reader.findURL(uri))
317670
+ },
317671
+ expandVersionedPath,
317672
+ getDOMStub,
317673
+ { head: extraHead, tail: inject.tail, htmlAttrs: inject.htmlAttrs },
317674
+ maybeMainTitle,
317675
+ resourceMeta.primaryLanguageID ?? maybePrimaryLanguageID,
317676
+ content
317677
+ );
317678
+ for (const blobChunk of resourceAssetGenerator) {
317679
+ yield Object.entries(blobChunk).map(([subpath, blob]) => {
317680
+ const assetBlobPath = `/${path3}${subpath}`;
317681
+ return { [assetBlobPath]: blob };
317682
+ }).reduce((prev, curr) => ({ ...prev, ...curr }));
317683
+ }
317682
317684
  }
317683
317685
  pathProgress(null);
317684
317686
  }
@@ -317693,54 +317695,54 @@ ${inject.head ?? ""}`;
317693
317695
  };
317694
317696
  const [indexProgress] = reportProgress("build search index");
317695
317697
  import_lunr.default.utils.warn = console.warn;
317698
+ const supportedLanguages = [...allLanguages].filter((lang) => lang === "en" || !!lunrLanguageSupport[lang]);
317699
+ console.debug(`Search index: primary language is \u201C${maybePrimaryLanguageID}\u201D, enabling ${supportedLanguages.join(", ")}`);
317700
+ const nonDefaultLanguages = supportedLanguages.filter((lang) => lang !== "en");
317701
+ if (supportedLanguages.length > 1) {
317702
+ for (const lang of nonDefaultLanguages) {
317703
+ lunrLanguageSupport[lang](import_lunr.default);
317704
+ }
317705
+ (0, import_lunr4.default)(import_lunr.default);
317706
+ }
317696
317707
  const lunrIndex = (0, import_lunr.default)(function() {
317697
- console.debug(`Search index: primary language is \u201C${maybePrimaryLanguageID}\u201D`);
317698
- const supportedLanguages = [...allLanguages].filter((lang) => !!lunrLanguageSupport[lang]);
317699
- const supportedNonDefaultLanguages = supportedLanguages.filter((lang) => lang !== "en");
317700
317708
  if (supportedLanguages.length > 1) {
317701
- (0, import_lunr4.default)(import_lunr.default);
317702
- }
317703
- if (maybePrimaryLanguageID) {
317704
- if (supportedLanguages.length > 1) {
317705
- for (const lang of supportedNonDefaultLanguages) {
317706
- lunrLanguageSupport[lang](import_lunr.default);
317707
- }
317708
- for (const lang of supportedNonDefaultLanguages) {
317709
- this.use(import_lunr.default[lang]);
317709
+ this.use(import_lunr.default.multiLanguage(...["en", ...nonDefaultLanguages]));
317710
+ console.debug(
317711
+ "Search index: enabling multi-language Lunr mode & mixed tokenizer",
317712
+ supportedLanguages.join(", ")
317713
+ );
317714
+ const lunrTokenizer = import_lunr.default.tokenizer;
317715
+ this.tokenizer = function(x2) {
317716
+ const baseLunrTokens = lunrTokenizer(x2);
317717
+ const tokens = [...baseLunrTokens];
317718
+ for (const lang of nonDefaultLanguages) {
317719
+ const tokenizer = import_lunr.default[lang].tokenizer;
317720
+ if (tokenizer) {
317721
+ const langTokens = tokenizer(x2);
317722
+ tokens.push(...langTokens.filter(
317723
+ (t3) => !baseLunrTokens.find((bt) => bt.toString() === t3.toString())
317724
+ ));
317725
+ } else {
317726
+ }
317710
317727
  }
317711
- console.debug(
317712
- "Search index: enabling multi-language Lunr mode & mixed tokenizer",
317713
- supportedLanguages.join(", ")
317714
- );
317715
- this.use(import_lunr.default.multiLanguage(...supportedLanguages));
317716
- this.tokenizer = function(x2) {
317717
- return import_lunr.default.tokenizer(x2).concat(...supportedNonDefaultLanguages.map((lang) => import_lunr.default[lang].tokenizer(x2)));
317718
- };
317719
- } else if (maybePrimaryLanguageID !== "en") {
317720
- this.use(import_lunr.default[maybePrimaryLanguageID]);
317721
- }
317728
+ return tokens;
317729
+ };
317730
+ const lunrStopWordFilter = import_lunr.default.stopWordFilter;
317731
+ this.stopWordFilter = function(token) {
317732
+ return lunrStopWordFilter(token) && !nonDefaultLanguages.map(
317733
+ (lang) => !!this[lang].stopWordFilter(token)
317734
+ ).includes(false) ? token : void 0;
317735
+ };
317722
317736
  }
317723
317737
  this.ref("name");
317738
+ this.field("title", { boost: 2 });
317724
317739
  this.field("body");
317725
317740
  let done12 = 0;
317726
317741
  const total = Object.keys(contentCache).length + Object.keys(resourceDescriptions).length;
317727
317742
  console.debug("Index pipeline functions during", this.pipeline._stack.map((f3) => f3.label));
317728
317743
  console.debug("Index search pipeline functions during", this.searchPipeline._stack.map((f3) => f3.label));
317729
- for (const [uri, content] of Object.entries(contentCache)) {
317730
- done12 += 1;
317731
- indexProgress({ state: `adding entry for ${uri}`, total, done: done12 });
317732
- const label = content?.content?.labelInPlainText?.normalize("NFKD").replace(/\p{Diacritic}/gu, "").trim();
317733
- if (label) {
317734
- const entry = {
317735
- name: uri,
317736
- body: label
317737
- };
317738
- this.add(entry, { boost: 5 });
317739
- } else {
317740
- console.warn("No label for", uri);
317741
- }
317742
- }
317743
- for (const [uri] of Object.entries(resourceDescriptions)) {
317744
+ const searchableResources = { pages: [], resources: [] };
317745
+ for (const [uri, meta] of Object.entries(resourceDescriptions)) {
317744
317746
  done12 += 1;
317745
317747
  indexProgress({ state: "adding entries for subresources", total, done: done12 });
317746
317748
  const rels = reader.resolve(uri);
@@ -317748,15 +317750,28 @@ ${inject.head ?? ""}`;
317748
317750
  ([s2, p3, o2]) => p3 === "hasPart" && (s2 === ROOT_SUBJECT || s2 === uri) && !o2.startsWith("data:") && (!isURIString(o2) || !reader.exists(o2))
317749
317751
  );
317750
317752
  const body = relationsExcludingReferences.map(([, , o2]) => o2).join("").trim().normalize("NFKD").replace(/\p{Diacritic}/gu, "").trim();
317751
- if (body) {
317753
+ const title = meta.labelInPlainText.normalize("NFKD").replace(/\p{Diacritic}/gu, "").trim();
317754
+ if (body || title) {
317752
317755
  const entry = {
317753
317756
  name: uri,
317754
- body
317757
+ body,
317758
+ title,
317759
+ lang: meta.primaryLanguageID ?? ""
317755
317760
  };
317756
- this.add(entry);
317761
+ if (contentCache[uri]) {
317762
+ searchableResources.pages.push(entry);
317763
+ } else {
317764
+ searchableResources.resources.push(entry);
317765
+ }
317757
317766
  } else {
317758
317767
  }
317759
317768
  }
317769
+ for (const entry of searchableResources.pages) {
317770
+ this.add(entry, { boost: 2 });
317771
+ }
317772
+ for (const entry of searchableResources.resources) {
317773
+ this.add(entry);
317774
+ }
317760
317775
  });
317761
317776
  console.debug("Index pipeline functions after", lunrIndex.pipeline._stack.map((f3) => f3.label));
317762
317777
  console.debug("Index search pipeline functions after", lunrIndex.searchPipeline?._stack?.map((f3) => f3.label));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@riboseinc/anafero-cli",
3
3
  "type": "module",
4
- "version": "0.0.55",
4
+ "version": "0.0.57",
5
5
  "packageManager": "yarn@4.5.0",
6
6
  "bin": {
7
7
  "build-site": "build-site.mjs"