@directory-builder/core 0.1.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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/bin/cli.js +38 -0
- package/example/README.md +64 -0
- package/example/config/federation.ttl +136 -0
- package/example/config/match-knowledge.ttl +8 -0
- package/example/sources/cityopen/clean.sparql +17 -0
- package/example/sources/cityopen/fetch.js +14 -0
- package/example/sources/cityopen/static/libraries.json +32 -0
- package/example/sources/civichub/clean.sparql +34 -0
- package/example/sources/civichub/fetch.js +14 -0
- package/example/sources/civichub/static/libraries.json +38 -0
- package/package.json +38 -0
- package/src/federate.js +571 -0
- package/src/index.js +6 -0
- package/src/ingest.js +158 -0
- package/src/lift/html.sparql +12 -0
- package/src/lift/json.sparql +12 -0
- package/src/pipeline.js +16 -0
- package/src/utils.js +152 -0
- package/src/webapp.js +41 -0
- package/webapp/index.html +11 -0
- package/webapp/src/About.jsx +24 -0
- package/webapp/src/App.jsx +96 -0
- package/webapp/src/Card.jsx +32 -0
- package/webapp/src/ColumnGraph.jsx +290 -0
- package/webapp/src/Directory.jsx +15 -0
- package/webapp/src/Download.jsx +174 -0
- package/webapp/src/MapGraph.jsx +244 -0
- package/webapp/src/MatchGraph.jsx +137 -0
- package/webapp/src/MergeTables.jsx +61 -0
- package/webapp/src/OrgCard.jsx +126 -0
- package/webapp/src/Pipeline.jsx +41 -0
- package/webapp/src/Query.jsx +165 -0
- package/webapp/src/Sources.jsx +52 -0
- package/webapp/src/instanceData.js +35 -0
- package/webapp/src/loadMap.js +276 -0
- package/webapp/src/loadMatch.js +228 -0
- package/webapp/src/loadMerge.js +93 -0
- package/webapp/src/loadPipeline.js +130 -0
- package/webapp/src/loadSources.js +102 -0
- package/webapp/src/main.jsx +9 -0
- package/webapp/src/mergeOrgs.js +15 -0
- package/webapp/src/sourceMeta.js +81 -0
- package/webapp/src/styles.css +23 -0
- package/webapp/vite.config.js +14 -0
- package/webapp/vite.js +28 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* App-wide styles (extracted from the former inline <style> in index.html
|
|
2
|
+
so they ship with the app source, not with each shell's index.html). */
|
|
3
|
+
|
|
4
|
+
* { font-family: Arial, sans-serif; }
|
|
5
|
+
body { margin: 0 }
|
|
6
|
+
nav { padding: 0.5rem 0.75rem; background: #f5f5f5; border-bottom: 1px solid #ddd; font-size: 14px; display: flex; align-items: center; justify-content: space-between }
|
|
7
|
+
nav a { color: #666; text-decoration: none }
|
|
8
|
+
nav a:hover { color: #000 }
|
|
9
|
+
nav a.active { font-weight: bold; color: #000 }
|
|
10
|
+
main { flex: 1; min-height: 0 }
|
|
11
|
+
.page { padding: 1rem }
|
|
12
|
+
.org-card { margin: 0 0 1rem 0; padding: 0.6rem 0.9rem; border: 1px solid #ddd; border-radius: 4px; background: #fff }
|
|
13
|
+
.org-card-header { font-size: 14px; margin-bottom: 0.4rem; color: #444 }
|
|
14
|
+
.org-card-header code { background: #f5f5f5; padding: 2px 4px; border-radius: 2px; font-size: 12px }
|
|
15
|
+
.org-card table { border-collapse: collapse; font-size: 13px }
|
|
16
|
+
.org-card td { padding: 3px 8px 3px 0; vertical-align: middle }
|
|
17
|
+
.org-card td:first-child { color: #666; white-space: nowrap; padding-right: 1rem }
|
|
18
|
+
.value-text { display: inline-block; max-width: 60ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle }
|
|
19
|
+
.source-tag { display: inline-block; padding: 1px 6px; margin-left: 4px; border-radius: 3px; background: #eee; color: #666; font-size: 11px; vertical-align: middle }
|
|
20
|
+
.flip { margin-right: 8px; white-space: nowrap }
|
|
21
|
+
.flip-btn { background: none; border: none; cursor: pointer; padding: 0 2px; color: #bbb; font-size: 12px }
|
|
22
|
+
.flip-btn:hover { color: #666 }
|
|
23
|
+
.flip-counter { font-size: 11px; color: #aaa; margin: 0 2px }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { serveInstanceData } from "./vite.js"
|
|
2
|
+
import react from "@vitejs/plugin-react"
|
|
3
|
+
import { defineConfig } from "vite"
|
|
4
|
+
import path from "path"
|
|
5
|
+
|
|
6
|
+
// Core's own dev shell: serves the webapp against an instance directory —
|
|
7
|
+
// example/ by default, any other via INSTANCE (path relative to cwd):
|
|
8
|
+
// INSTANCE=../sosuse-directory-builder npm run webapp
|
|
9
|
+
const instance = path.resolve(process.env.INSTANCE ?? path.join(import.meta.dirname, "../example"))
|
|
10
|
+
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
plugins: [react(), serveInstanceData({ root: instance })],
|
|
13
|
+
build: { target: "es2022" }, // top-level await in instanceData.js
|
|
14
|
+
})
|
package/webapp/vite.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs"
|
|
2
|
+
import path from "path"
|
|
3
|
+
|
|
4
|
+
// instanceData.js fetches config/ and data/ at runtime relative to BASE_URL,
|
|
5
|
+
// and Download.jsx dynamic-imports declared exporters/ the same way. A deploy
|
|
6
|
+
// publishes them next to the bundle; in dev (and preview) this middleware
|
|
7
|
+
// serves them from the instance directory instead. `root` is the instance dir
|
|
8
|
+
// holding config/, data/ and (optionally) webapp/{content,exporters}/.
|
|
9
|
+
export function serveInstanceData({ root = process.cwd() } = {}) {
|
|
10
|
+
let base = "/"
|
|
11
|
+
const middleware = (req, res, next) => {
|
|
12
|
+
const url = req.url.split("?")[0]
|
|
13
|
+
const rel = url.startsWith(base) ? url.slice(base.length) : null
|
|
14
|
+
if (!rel || !/^(config|data|webapp\/(content|exporters))\//.test(rel)) return next()
|
|
15
|
+
const file = path.join(root, rel)
|
|
16
|
+
// Own the 404: falling through would hit the SPA fallback, which
|
|
17
|
+
// serves index.html with 200 — instanceData would parse HTML as TTL.
|
|
18
|
+
if (!existsSync(file)) { res.statusCode = 404; return res.end() }
|
|
19
|
+
res.setHeader("Content-Type", { js: "text/javascript", md: "text/markdown" }[rel.split(".").pop()] ?? "text/turtle")
|
|
20
|
+
res.end(readFileSync(file))
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
name: "serve-instance-data",
|
|
24
|
+
configResolved(c) { base = c.base },
|
|
25
|
+
configureServer(server) { server.middlewares.use(middleware) },
|
|
26
|
+
configurePreviewServer(server) { server.middlewares.use(middleware) },
|
|
27
|
+
}
|
|
28
|
+
}
|