@_linked/cli 1.8.1 → 1.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.
- package/CHANGELOG.md +41 -0
- package/defaults/setup-publish/dual-branch/github/workflows/publish.yml +3 -0
- package/defaults/setup-publish/github/workflows/publish.yml +3 -0
- package/defaults/shape.ts +8 -2
- package/jest.config.cjs +8 -4
- package/lib/esm/cli-methods.d.ts +11 -3
- package/lib/esm/cli-methods.d.ts.map +1 -1
- package/lib/esm/cli-methods.js +51 -105
- package/lib/esm/cli-methods.js.map +1 -1
- package/lib/esm/cli.js +32 -8
- package/lib/esm/cli.js.map +1 -1
- package/lib/esm/commands/start.d.ts +6 -0
- package/lib/esm/commands/start.d.ts.map +1 -0
- package/lib/esm/commands/start.js +311 -0
- package/lib/esm/commands/start.js.map +1 -0
- package/lib/esm/config-webpack-app.d.ts +1 -1
- package/lib/esm/config-webpack-app.d.ts.map +1 -1
- package/lib/esm/config-webpack-app.js +1 -1
- package/lib/esm/config-webpack-app.js.map +1 -1
- package/lib/esm/config-webpack.d.ts +1 -1
- package/lib/esm/config-webpack.d.ts.map +1 -1
- package/lib/esm/config-webpack.js +4 -4
- package/lib/esm/config-webpack.js.map +1 -1
- package/lib/esm/defineConfig.d.ts +1 -1
- package/lib/esm/defineConfig.d.ts.map +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/interfaces.d.ts +9 -0
- package/lib/esm/interfaces.d.ts.map +1 -1
- package/lib/esm/lifecycle.d.ts +24 -0
- package/lib/esm/lifecycle.d.ts.map +1 -0
- package/lib/esm/lifecycle.js +156 -0
- package/lib/esm/lifecycle.js.map +1 -0
- package/lib/esm/loaders/ts-loader.d.mts.map +1 -1
- package/lib/esm/loaders/ts-loader.mjs +11 -2
- package/lib/esm/loaders/ts-loader.mjs.map +1 -1
- package/lib/esm/utils.d.ts +1 -1
- package/lib/esm/utils.d.ts.map +1 -1
- package/lib/esm/utils.js +9 -3
- package/lib/esm/utils.js.map +1 -1
- package/lib/esm/vite-config.d.ts +20 -0
- package/lib/esm/vite-config.d.ts.map +1 -0
- package/lib/esm/vite-config.js +410 -0
- package/lib/esm/vite-config.js.map +1 -0
- package/package.json +13 -14
- package/test-results/.last-run.json +6 -0
- package/test-results/create-app-Person-fixture-add-/342/206/222-edit-/342/206/222-delete-round-trip/error-context.md +16 -0
- package/test-results/create-app-Person-fixture-add-/342/206/222-edit-/342/206/222-delete-round-trip/trace.zip +0 -0
- package/tests/unit/safeYarn.test.ts +1 -1
- package/tsconfig-esm.json +1 -1
- package/defaults/app-with-backend/.env-cmdrc.json +0 -19
- package/defaults/app-with-backend/.eslintignore +0 -5
- package/defaults/app-with-backend/.eslintrc.json +0 -40
- package/defaults/app-with-backend/.prettierignore +0 -4
- package/defaults/app-with-backend/.prettierrc.json +0 -27
- package/defaults/app-with-backend/.vscode/launch.json +0 -12
- package/defaults/app-with-backend/.yarn/plugins/@yarnpkg/plugin-version.cjs +0 -550
- package/defaults/app-with-backend/.yarn/releases/yarn-3.6.1.cjs +0 -874
- package/defaults/app-with-backend/gitignore.template +0 -25
- package/defaults/app-with-backend/linked.backend.datasets.example.json +0 -17
- package/defaults/app-with-backend/linked.backend.storage.ts +0 -35
- package/defaults/app-with-backend/linked.config.js +0 -5
- package/defaults/app-with-backend/package.json +0 -70
- package/defaults/app-with-backend/pm2-staging.config.js +0 -12
- package/defaults/app-with-backend/pm2.config.js +0 -12
- package/defaults/app-with-backend/public/favicon-144x144.png +0 -0
- package/defaults/app-with-backend/public/favicon-57x57.png +0 -0
- package/defaults/app-with-backend/public/favicon-72x72.png +0 -0
- package/defaults/app-with-backend/public/favicon.ico +0 -0
- package/defaults/app-with-backend/readme.md +0 -93
- package/defaults/app-with-backend/src/App.module.css +0 -83
- package/defaults/app-with-backend/src/App.tsx +0 -30
- package/defaults/app-with-backend/src/backend.ts +0 -9
- package/defaults/app-with-backend/src/components/Error.module.css +0 -9
- package/defaults/app-with-backend/src/components/Error.tsx +0 -11
- package/defaults/app-with-backend/src/components/PersonOverview.module.css +0 -100
- package/defaults/app-with-backend/src/components/PersonOverview.tsx +0 -97
- package/defaults/app-with-backend/src/components/PersonOverviewContext.tsx +0 -12
- package/defaults/app-with-backend/src/components/PersonPreview.module.css +0 -97
- package/defaults/app-with-backend/src/components/PersonPreview.tsx +0 -109
- package/defaults/app-with-backend/src/components/Spinner.module.css +0 -17
- package/defaults/app-with-backend/src/components/Spinner.tsx +0 -12
- package/defaults/app-with-backend/src/index.tsx +0 -34
- package/defaults/app-with-backend/src/layout/DefaultLayout.module.css +0 -15
- package/defaults/app-with-backend/src/layout/DefaultLayout.tsx +0 -12
- package/defaults/app-with-backend/src/layout/Header.module.css +0 -46
- package/defaults/app-with-backend/src/layout/Header.tsx +0 -27
- package/defaults/app-with-backend/src/linked.frontend.datasets.json +0 -12
- package/defaults/app-with-backend/src/linked.frontend.storage.ts +0 -36
- package/defaults/app-with-backend/src/package.ts +0 -16
- package/defaults/app-with-backend/src/pages/Home.module.css +0 -23
- package/defaults/app-with-backend/src/pages/Home.tsx +0 -14
- package/defaults/app-with-backend/src/pages/Page1.module.css +0 -111
- package/defaults/app-with-backend/src/pages/Page1.tsx +0 -196
- package/defaults/app-with-backend/src/pages/PageNotFound.module.css +0 -19
- package/defaults/app-with-backend/src/pages/PageNotFound.tsx +0 -14
- package/defaults/app-with-backend/src/pages/Signin.module.css +0 -20
- package/defaults/app-with-backend/src/pages/Signin.tsx +0 -16
- package/defaults/app-with-backend/src/routes.tsx +0 -78
- package/defaults/app-with-backend/src/theme.css +0 -91
- package/defaults/app-with-backend/src/types.ts +0 -14
- package/defaults/app-with-backend/src/utils/lazyWithPreload.tsx +0 -42
- package/defaults/app-with-backend/src/utils/preloadRoutes.ts +0 -38
- package/defaults/app-with-backend/tsconfig.json +0 -24
- package/defaults/app-with-backend/yarnrc.yml.template +0 -8
- package/lib/cjs/cli-methods.d.ts +0 -67
- package/lib/cjs/cli-methods.d.ts.map +0 -1
- package/lib/cjs/cli-methods.js +0 -2718
- package/lib/cjs/cli-methods.js.map +0 -1
- package/lib/cjs/cli.d.ts +0 -3
- package/lib/cjs/cli.d.ts.map +0 -1
- package/lib/cjs/cli.js +0 -315
- package/lib/cjs/cli.js.map +0 -1
- package/lib/cjs/commands/build-package.d.ts +0 -9
- package/lib/cjs/commands/build-package.d.ts.map +0 -1
- package/lib/cjs/commands/build-package.js +0 -55
- package/lib/cjs/commands/build-package.js.map +0 -1
- package/lib/cjs/commands/safe-yarn.d.ts +0 -10
- package/lib/cjs/commands/safe-yarn.d.ts.map +0 -1
- package/lib/cjs/commands/safe-yarn.js +0 -66
- package/lib/cjs/commands/safe-yarn.js.map +0 -1
- package/lib/cjs/commands/setup-publish.d.ts +0 -23
- package/lib/cjs/commands/setup-publish.d.ts.map +0 -1
- package/lib/cjs/commands/setup-publish.js +0 -369
- package/lib/cjs/commands/setup-publish.js.map +0 -1
- package/lib/cjs/config-webpack-app.d.ts +0 -112
- package/lib/cjs/config-webpack-app.d.ts.map +0 -1
- package/lib/cjs/config-webpack-app.js +0 -427
- package/lib/cjs/config-webpack-app.js.map +0 -1
- package/lib/cjs/config-webpack.d.ts +0 -55
- package/lib/cjs/config-webpack.d.ts.map +0 -1
- package/lib/cjs/config-webpack.js +0 -417
- package/lib/cjs/config-webpack.js.map +0 -1
- package/lib/cjs/defineConfig.d.ts +0 -8
- package/lib/cjs/defineConfig.d.ts.map +0 -1
- package/lib/cjs/defineConfig.js +0 -12
- package/lib/cjs/defineConfig.js.map +0 -1
- package/lib/cjs/index.d.ts +0 -12
- package/lib/cjs/index.d.ts.map +0 -1
- package/lib/cjs/index.js +0 -43
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/interfaces.d.ts +0 -131
- package/lib/cjs/interfaces.d.ts.map +0 -1
- package/lib/cjs/interfaces.js +0 -3
- package/lib/cjs/interfaces.js.map +0 -1
- package/lib/cjs/loaders/css-loader.d.mts +0 -2
- package/lib/cjs/loaders/css-loader.d.mts.map +0 -1
- package/lib/cjs/loaders/css-loader.mjs +0 -86
- package/lib/cjs/loaders/css-loader.mjs.map +0 -1
- package/lib/cjs/loaders/register-css-only.d.ts +0 -2
- package/lib/cjs/loaders/register-css-only.d.ts.map +0 -1
- package/lib/cjs/loaders/register-css-only.js +0 -11
- package/lib/cjs/loaders/register-css-only.js.map +0 -1
- package/lib/cjs/loaders/register.d.ts +0 -2
- package/lib/cjs/loaders/register.d.ts.map +0 -1
- package/lib/cjs/loaders/register.js +0 -11
- package/lib/cjs/loaders/register.js.map +0 -1
- package/lib/cjs/loaders/ts-loader.d.mts +0 -3
- package/lib/cjs/loaders/ts-loader.d.mts.map +0 -1
- package/lib/cjs/loaders/ts-loader.mjs +0 -116
- package/lib/cjs/loaders/ts-loader.mjs.map +0 -1
- package/lib/cjs/metadata.d.ts +0 -1
- package/lib/cjs/metadata.d.ts.map +0 -1
- package/lib/cjs/metadata.js +0 -155
- package/lib/cjs/metadata.js.map +0 -1
- package/lib/cjs/package.json +0 -139
- package/lib/cjs/plugins/check-imports.d.ts +0 -2
- package/lib/cjs/plugins/check-imports.d.ts.map +0 -1
- package/lib/cjs/plugins/check-imports.js +0 -68
- package/lib/cjs/plugins/check-imports.js.map +0 -1
- package/lib/cjs/plugins/declaration-plugin.d.ts +0 -15
- package/lib/cjs/plugins/declaration-plugin.d.ts.map +0 -1
- package/lib/cjs/plugins/declaration-plugin.js +0 -285
- package/lib/cjs/plugins/declaration-plugin.js.map +0 -1
- package/lib/cjs/plugins/externalise-modules.d.ts +0 -7
- package/lib/cjs/plugins/externalise-modules.d.ts.map +0 -1
- package/lib/cjs/plugins/externalise-modules.js +0 -190
- package/lib/cjs/plugins/externalise-modules.js.map +0 -1
- package/lib/cjs/plugins/lincd-tailwind-sources.d.ts +0 -3
- package/lib/cjs/plugins/lincd-tailwind-sources.d.ts.map +0 -1
- package/lib/cjs/plugins/lincd-tailwind-sources.js +0 -32
- package/lib/cjs/plugins/lincd-tailwind-sources.js.map +0 -1
- package/lib/cjs/plugins/watch-run.d.ts +0 -5
- package/lib/cjs/plugins/watch-run.d.ts.map +0 -1
- package/lib/cjs/plugins/watch-run.js +0 -45
- package/lib/cjs/plugins/watch-run.js.map +0 -1
- package/lib/cjs/preflight.css +0 -137
- package/lib/cjs/tailwind.config.d.ts +0 -8
- package/lib/cjs/tailwind.config.d.ts.map +0 -1
- package/lib/cjs/tailwind.config.js +0 -17
- package/lib/cjs/tailwind.config.js.map +0 -1
- package/lib/cjs/utils.d.ts +0 -77
- package/lib/cjs/utils.d.ts.map +0 -1
- package/lib/cjs/utils.js +0 -585
- package/lib/cjs/utils.js.map +0 -1
- package/lib/esm/loaders/register-css-only.d.ts +0 -2
- package/lib/esm/loaders/register-css-only.d.ts.map +0 -1
- package/lib/esm/loaders/register-css-only.js +0 -9
- package/lib/esm/loaders/register-css-only.js.map +0 -1
- package/lib/esm/loaders/register.d.ts +0 -2
- package/lib/esm/loaders/register.d.ts.map +0 -1
- package/lib/esm/loaders/register.js +0 -9
- package/lib/esm/loaders/register.js.map +0 -1
- package/lib/esm/package.json +0 -139
- /package/{babel.config.js → babel.config.cjs} +0 -0
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
@import '@_linked/css/package.css';
|
|
2
|
-
|
|
3
|
-
.Row {
|
|
4
|
-
display: flex;
|
|
5
|
-
align-items: center;
|
|
6
|
-
justify-content: space-between;
|
|
7
|
-
gap: --spacing(2);
|
|
8
|
-
flex-wrap: wrap;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.Name {
|
|
12
|
-
font-weight: 500;
|
|
13
|
-
color: var(--color-gray-900);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.Actions {
|
|
17
|
-
display: flex;
|
|
18
|
-
gap: --spacing(2);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
.EditButton,
|
|
22
|
-
.SaveButton,
|
|
23
|
-
.CancelButton,
|
|
24
|
-
.DeleteButton {
|
|
25
|
-
padding: --spacing(1) --spacing(3);
|
|
26
|
-
font: inherit;
|
|
27
|
-
font-size: 0.85rem;
|
|
28
|
-
border-radius: var(--radius-element);
|
|
29
|
-
border: 1px solid transparent;
|
|
30
|
-
cursor: pointer;
|
|
31
|
-
transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.EditButton,
|
|
35
|
-
.CancelButton {
|
|
36
|
-
background: transparent;
|
|
37
|
-
color: var(--color-gray-700);
|
|
38
|
-
border-color: var(--color-gray-300);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.EditButton:hover:not(:disabled),
|
|
42
|
-
.CancelButton:hover:not(:disabled) {
|
|
43
|
-
background: var(--color-gray-100);
|
|
44
|
-
color: var(--color-gray-900);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.SaveButton {
|
|
48
|
-
background: var(--color-primary-500);
|
|
49
|
-
color: var(--color-white);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.SaveButton:hover:not(:disabled) {
|
|
53
|
-
background: var(--color-primary-600);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.DeleteButton {
|
|
57
|
-
background: transparent;
|
|
58
|
-
color: var(--color-red-600);
|
|
59
|
-
border-color: transparent;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.DeleteButton:hover:not(:disabled) {
|
|
63
|
-
color: var(--color-red-700);
|
|
64
|
-
background: var(--color-red-50);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.EditButton:disabled,
|
|
68
|
-
.SaveButton:disabled,
|
|
69
|
-
.CancelButton:disabled,
|
|
70
|
-
.DeleteButton:disabled {
|
|
71
|
-
opacity: 0.5;
|
|
72
|
-
cursor: not-allowed;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.EditRow {
|
|
76
|
-
display: flex;
|
|
77
|
-
align-items: center;
|
|
78
|
-
gap: --spacing(2);
|
|
79
|
-
flex-wrap: wrap;
|
|
80
|
-
width: 100%;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.EditRow input {
|
|
84
|
-
flex: 1 1 140px;
|
|
85
|
-
padding: --spacing(2) --spacing(3);
|
|
86
|
-
border: 1px solid var(--color-gray-300);
|
|
87
|
-
border-radius: var(--radius-element);
|
|
88
|
-
background: var(--bg-card);
|
|
89
|
-
color: var(--color-gray-900);
|
|
90
|
-
font: inherit;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.EditRow input:focus {
|
|
94
|
-
outline: none;
|
|
95
|
-
border-color: var(--color-primary-500);
|
|
96
|
-
box-shadow: 0 0 0 2px var(--color-primary-200);
|
|
97
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
// Example PersonPreview — single-Person row. Demonstrates @_linked/react's
|
|
2
|
-
// linkedComponent: the wrapper runs the per-row query and injects query
|
|
3
|
-
// result keys + `source` + `_refresh` into the render function. _refresh
|
|
4
|
-
// patches local query state for optimistic UI; on delete, the parent
|
|
5
|
-
// list re-runs via the PersonListRefresh context.
|
|
6
|
-
import React, { useState } from 'react';
|
|
7
|
-
import { linkedComponent } from '@_linked/react';
|
|
8
|
-
import { Person } from '@_linked/schema/shapes/Person';
|
|
9
|
-
import { usePersonListRefresh } from './PersonOverviewContext';
|
|
10
|
-
import style from './PersonPreview.module.css';
|
|
11
|
-
|
|
12
|
-
export const PersonPreview = linkedComponent(
|
|
13
|
-
Person.select((p) => [p.givenName, p.familyName]),
|
|
14
|
-
({ givenName, familyName, source, _refresh }) => {
|
|
15
|
-
const refreshList = usePersonListRefresh();
|
|
16
|
-
const [editing, setEditing] = useState(false);
|
|
17
|
-
const [draftGiven, setDraftGiven] = useState(givenName ?? '');
|
|
18
|
-
const [draftFamily, setDraftFamily] = useState(familyName ?? '');
|
|
19
|
-
const [busy, setBusy] = useState(false);
|
|
20
|
-
|
|
21
|
-
async function save() {
|
|
22
|
-
if (!source.id) return;
|
|
23
|
-
setBusy(true);
|
|
24
|
-
try {
|
|
25
|
-
await Person.update({
|
|
26
|
-
givenName: draftGiven,
|
|
27
|
-
familyName: draftFamily,
|
|
28
|
-
}).for({ id: source.id });
|
|
29
|
-
// Optimistic patch — no extra network round-trip needed.
|
|
30
|
-
_refresh({ givenName: draftGiven, familyName: draftFamily });
|
|
31
|
-
setEditing(false);
|
|
32
|
-
} finally {
|
|
33
|
-
setBusy(false);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function remove() {
|
|
38
|
-
if (!source.id) return;
|
|
39
|
-
setBusy(true);
|
|
40
|
-
try {
|
|
41
|
-
await Person.delete({ id: source.id });
|
|
42
|
-
refreshList();
|
|
43
|
-
} finally {
|
|
44
|
-
setBusy(false);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function startEdit() {
|
|
49
|
-
setDraftGiven(givenName ?? '');
|
|
50
|
-
setDraftFamily(familyName ?? '');
|
|
51
|
-
setEditing(true);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (editing) {
|
|
55
|
-
return (
|
|
56
|
-
<span className={style.EditRow} data-testid="person-edit">
|
|
57
|
-
<input
|
|
58
|
-
value={draftGiven}
|
|
59
|
-
onChange={(e) => setDraftGiven(e.target.value)}
|
|
60
|
-
aria-label="First name"
|
|
61
|
-
/>
|
|
62
|
-
<input
|
|
63
|
-
value={draftFamily}
|
|
64
|
-
onChange={(e) => setDraftFamily(e.target.value)}
|
|
65
|
-
aria-label="Last name"
|
|
66
|
-
/>
|
|
67
|
-
<button
|
|
68
|
-
className={style.SaveButton}
|
|
69
|
-
onClick={save}
|
|
70
|
-
disabled={busy}
|
|
71
|
-
>
|
|
72
|
-
Save
|
|
73
|
-
</button>
|
|
74
|
-
<button
|
|
75
|
-
className={style.CancelButton}
|
|
76
|
-
onClick={() => setEditing(false)}
|
|
77
|
-
disabled={busy}
|
|
78
|
-
>
|
|
79
|
-
Cancel
|
|
80
|
-
</button>
|
|
81
|
-
</span>
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<span className={style.Row} data-testid="person-row">
|
|
87
|
-
<span className={style.Name} data-testid="person-name">
|
|
88
|
-
{givenName} {familyName}
|
|
89
|
-
</span>
|
|
90
|
-
<span className={style.Actions}>
|
|
91
|
-
<button
|
|
92
|
-
className={style.EditButton}
|
|
93
|
-
onClick={startEdit}
|
|
94
|
-
disabled={busy}
|
|
95
|
-
>
|
|
96
|
-
Edit
|
|
97
|
-
</button>
|
|
98
|
-
<button
|
|
99
|
-
className={style.DeleteButton}
|
|
100
|
-
onClick={remove}
|
|
101
|
-
disabled={busy}
|
|
102
|
-
>
|
|
103
|
-
Delete
|
|
104
|
-
</button>
|
|
105
|
-
</span>
|
|
106
|
-
</span>
|
|
107
|
-
);
|
|
108
|
-
},
|
|
109
|
-
);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
.spinner.active {
|
|
2
|
-
border: 4px solid transparent;
|
|
3
|
-
border-top: 4px solid #474545;
|
|
4
|
-
border-radius: 50%;
|
|
5
|
-
width: 16px;
|
|
6
|
-
height: 16px;
|
|
7
|
-
animation: spin 1s linear infinite;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
@keyframes spin {
|
|
11
|
-
0% {
|
|
12
|
-
transform: rotate(0deg);
|
|
13
|
-
}
|
|
14
|
-
100% {
|
|
15
|
-
transform: rotate(360deg);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import style from './Spinner.module.css';
|
|
3
|
-
|
|
4
|
-
export function Spinner({ active = true }) {
|
|
5
|
-
return (
|
|
6
|
-
<div
|
|
7
|
-
className={[style.spinner, active && style.active].join(' ')}
|
|
8
|
-
role="progressbar"
|
|
9
|
-
aria-busy={active ? 'true' : 'false'}
|
|
10
|
-
/>
|
|
11
|
-
);
|
|
12
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { AppContextProvider } from '@_linked/server-utils/components/AppContext';
|
|
2
|
-
import { initFrontend } from '@_linked/server-utils/utils/Frontend';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { hydrateRoot } from 'react-dom/client';
|
|
5
|
-
import { BrowserRouter } from 'react-router-dom';
|
|
6
|
-
import App from './App';
|
|
7
|
-
import { preloadMatchedRoute } from './utils/preloadRoutes';
|
|
8
|
-
|
|
9
|
-
//import the storage & file configuration for the frontend
|
|
10
|
-
import './linked.frontend.storage';
|
|
11
|
-
|
|
12
|
-
//to avoid errors with react-refresh-webpack-plugin
|
|
13
|
-
window['$RefreshReg$'] = () => {};
|
|
14
|
-
window['$RefreshSig$'] = () => () => {};
|
|
15
|
-
|
|
16
|
-
initFrontend().then(async () => {
|
|
17
|
-
// Preload matched route before hydration to avoid Suspense mismatch
|
|
18
|
-
await preloadMatchedRoute();
|
|
19
|
-
|
|
20
|
-
hydrateRoot(
|
|
21
|
-
document.getElementById('root'), // Target the #root div for hydration
|
|
22
|
-
<React.StrictMode>
|
|
23
|
-
<BrowserRouter>
|
|
24
|
-
<AppContextProvider
|
|
25
|
-
assets={window['assetManifest']}
|
|
26
|
-
requestLD={document.getElementById('request-ld')?.innerText}
|
|
27
|
-
requestObject={JSON.parse(document.getElementById('request-json')?.innerText || '{}')}
|
|
28
|
-
>
|
|
29
|
-
<App />
|
|
30
|
-
</AppContextProvider>
|
|
31
|
-
</BrowserRouter>
|
|
32
|
-
</React.StrictMode>,
|
|
33
|
-
);
|
|
34
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
@import '@_linked/css/package.css';
|
|
2
|
-
|
|
3
|
-
.main {
|
|
4
|
-
font-family: var(--font-sans);
|
|
5
|
-
max-width: 960px;
|
|
6
|
-
margin: 0 auto;
|
|
7
|
-
padding: --spacing(6) --spacing(4);
|
|
8
|
-
|
|
9
|
-
@media (max-width: 1024px) {
|
|
10
|
-
max-width: 90%;
|
|
11
|
-
}
|
|
12
|
-
@media (max-width: 768px) {
|
|
13
|
-
padding: --spacing(4) --spacing(3);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
@import '@_linked/css/package.css';
|
|
2
|
-
|
|
3
|
-
.header {
|
|
4
|
-
display: flex;
|
|
5
|
-
align-items: center;
|
|
6
|
-
justify-content: space-between;
|
|
7
|
-
gap: --spacing(4);
|
|
8
|
-
padding: --spacing(4) 0 --spacing(6);
|
|
9
|
-
flex-wrap: wrap;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.header h1 {
|
|
13
|
-
color: var(--color-primary-700);
|
|
14
|
-
margin: 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.menu {
|
|
18
|
-
display: flex;
|
|
19
|
-
gap: --spacing(1);
|
|
20
|
-
flex-wrap: wrap;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.menu > a {
|
|
24
|
-
font-weight: 500;
|
|
25
|
-
font-size: 0.95rem;
|
|
26
|
-
color: var(--color-gray-700);
|
|
27
|
-
padding: --spacing(2) --spacing(3);
|
|
28
|
-
border-radius: var(--radius-element);
|
|
29
|
-
text-decoration: none;
|
|
30
|
-
transition: background 120ms ease, color 120ms ease;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.menu > a:hover {
|
|
34
|
-
background: var(--color-gray-100);
|
|
35
|
-
color: var(--color-gray-900);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
.menu > a.active {
|
|
39
|
-
background: var(--color-primary-500);
|
|
40
|
-
color: var(--color-white);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.menu > a.active:hover {
|
|
44
|
-
background: var(--color-primary-600);
|
|
45
|
-
color: var(--color-white);
|
|
46
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Link, useLocation } from 'react-router-dom';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import style from './Header.module.css';
|
|
4
|
-
import { ROUTES } from '../routes';
|
|
5
|
-
|
|
6
|
-
export function Header() {
|
|
7
|
-
let path = useLocation();
|
|
8
|
-
return (
|
|
9
|
-
<header className={style.header}>
|
|
10
|
-
<h1>${name}</h1>
|
|
11
|
-
<nav className={style.menu}>
|
|
12
|
-
{Object.keys(ROUTES).map((key) => {
|
|
13
|
-
if (ROUTES[key].excludeFromMenu) return null;
|
|
14
|
-
return (
|
|
15
|
-
<Link
|
|
16
|
-
key={key}
|
|
17
|
-
to={ROUTES[key].path}
|
|
18
|
-
className={ROUTES[key].path === path.pathname ? style.active : ''}
|
|
19
|
-
>
|
|
20
|
-
{ROUTES[key].label || key}
|
|
21
|
-
</Link>
|
|
22
|
-
);
|
|
23
|
-
})}
|
|
24
|
-
</nav>
|
|
25
|
-
</header>
|
|
26
|
-
);
|
|
27
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_note": "Frontend datasets config. Public values only — this file ships in the browser bundle. Each entry: `store` (npm import path to the IDataset class) + `config` (a single JSON object passed verbatim to `new StoreClass(config)`). The default BackendAPIStore entry proxies queries to this app's own backend; swap in a different store class (e.g. @_linked/fuseki/shapes/FusekiStore) to talk directly to a public SPARQL endpoint.",
|
|
3
|
-
|
|
4
|
-
"datasets": {
|
|
5
|
-
"appData": {
|
|
6
|
-
"store": "@_linked/server/shapes/quadstores/BackendAPIStore",
|
|
7
|
-
"config": {
|
|
8
|
-
"name": "appData"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// Frontend storage for ${name}.
|
|
2
|
-
//
|
|
3
|
-
// Reads linked.frontend.datasets.json and instantiates one store per
|
|
4
|
-
// alias. Webpack can't bundle dynamic imports of arbitrary npm paths,
|
|
5
|
-
// so on the frontend we import each store class explicitly and
|
|
6
|
-
// construct it per-alias here.
|
|
7
|
-
//
|
|
8
|
-
// Aliases on this side are independent from backend aliases — the
|
|
9
|
-
// framework re-routes by shape on each side.
|
|
10
|
-
import datasetsConfig from './linked.frontend.datasets.json' with { type: 'json' };
|
|
11
|
-
import { parseDatasetsConfig } from '@_linked/core/utils/parseDatasetsConfig';
|
|
12
|
-
import { LinkedFileStorage } from '@_linked/core/utils/LinkedFileStorage';
|
|
13
|
-
import { LinkedStorage } from '@_linked/core/utils/LinkedStorage';
|
|
14
|
-
import { BackendAPIStore } from '@_linked/server/shapes/quadstores/BackendAPIStore';
|
|
15
|
-
import { getAccessUrlLocalFileStore } from '@_linked/server/utils/accessUrl';
|
|
16
|
-
// Direct-to-Fuseki on the frontend? Uncomment:
|
|
17
|
-
// import { FusekiStore } from '@_linked/fuseki/shapes/FusekiStore';
|
|
18
|
-
|
|
19
|
-
// Parse JSON; pass empty env since the browser has no runtime process.env.
|
|
20
|
-
// Per-env values for the frontend should be hardcoded `process.env.X`
|
|
21
|
-
// references (webpack inlines them at build time).
|
|
22
|
-
const config = parseDatasetsConfig(datasetsConfig, {});
|
|
23
|
-
|
|
24
|
-
// One store per alias. Each line imports the class above and constructs it
|
|
25
|
-
// with the alias's `config`. Adding a new alias = add an import + a line.
|
|
26
|
-
const appData = new BackendAPIStore(config.datasets.appData.config);
|
|
27
|
-
// Direct-to-Fuseki alternative (no creds in browser):
|
|
28
|
-
// const appData = new FusekiStore(config.datasets.appData.config);
|
|
29
|
-
|
|
30
|
-
// Shape → alias. For multi-alias setups add per-shape pins, e.g.:
|
|
31
|
-
// import { PageView } from './shapes/PageView';
|
|
32
|
-
// LinkedStorage.setDatasetForShapes(analytics, [PageView]);
|
|
33
|
-
LinkedStorage.setDefaultDataset(appData);
|
|
34
|
-
|
|
35
|
-
// File asset URLs.
|
|
36
|
-
LinkedFileStorage.setDefaultAccessURL(getAccessUrlLocalFileStore());
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Imports from `@_linked/react/package` (not `@_linked/core/utils/Package`)
|
|
2
|
-
// because `linkedComponent` / `linkedSetComponent` are React-only — they
|
|
3
|
-
// don't exist on core's LinkedPackageObject. The react helper composes
|
|
4
|
-
// React-only fns on top of everything core's linkedPackage provides.
|
|
5
|
-
import { linkedPackage } from '@_linked/react/package';
|
|
6
|
-
|
|
7
|
-
export const {
|
|
8
|
-
linkedComponent,
|
|
9
|
-
linkedSetComponent,
|
|
10
|
-
linkedShape,
|
|
11
|
-
linkedUtil,
|
|
12
|
-
linkedOntology,
|
|
13
|
-
registerPackageExport,
|
|
14
|
-
packageExports,
|
|
15
|
-
packageName,
|
|
16
|
-
} = linkedPackage('${hyphen_name}');
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
@import '@_linked/css/package.css';
|
|
2
|
-
|
|
3
|
-
.Home {
|
|
4
|
-
display: block;
|
|
5
|
-
margin: --spacing(4) 0;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.Home code {
|
|
9
|
-
font-family: var(--font-mono);
|
|
10
|
-
background: var(--bg-section);
|
|
11
|
-
padding: 0 --spacing(1);
|
|
12
|
-
border-radius: var(--radius-element);
|
|
13
|
-
font-size: 0.85em;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.Home pre {
|
|
17
|
-
padding: --spacing(4);
|
|
18
|
-
background: var(--bg-section);
|
|
19
|
-
border-radius: var(--radius-element);
|
|
20
|
-
overflow-x: auto;
|
|
21
|
-
font-family: var(--font-mono);
|
|
22
|
-
margin: --spacing(2) 0;
|
|
23
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { DefaultLayout } from '../layout/DefaultLayout';
|
|
3
|
-
import { PersonOverview } from '../components/PersonOverview';
|
|
4
|
-
import style from './Home.module.css';
|
|
5
|
-
|
|
6
|
-
export default function Home() {
|
|
7
|
-
return (
|
|
8
|
-
<DefaultLayout>
|
|
9
|
-
<div className={style.Home}>
|
|
10
|
-
<PersonOverview />
|
|
11
|
-
</div>
|
|
12
|
-
</DefaultLayout>
|
|
13
|
-
);
|
|
14
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
@import '@_linked/css/package.css';
|
|
2
|
-
|
|
3
|
-
.Page {
|
|
4
|
-
display: flex;
|
|
5
|
-
flex-direction: column;
|
|
6
|
-
gap: --spacing(5);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.Header {
|
|
10
|
-
background: var(--bg-card);
|
|
11
|
-
border-radius: var(--radius-card);
|
|
12
|
-
box-shadow: var(--shadow-card);
|
|
13
|
-
padding: --spacing(6);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.Header h2 {
|
|
17
|
-
margin: 0 0 --spacing(2);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.Header p {
|
|
21
|
-
color: var(--color-gray-700);
|
|
22
|
-
line-height: 1.5;
|
|
23
|
-
margin: 0;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.Header code {
|
|
27
|
-
background: var(--bg-section);
|
|
28
|
-
padding: 0 --spacing(1);
|
|
29
|
-
border-radius: var(--radius-element);
|
|
30
|
-
font-family: var(--font-mono);
|
|
31
|
-
font-size: 0.85em;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.Tabs {
|
|
35
|
-
background: var(--bg-card);
|
|
36
|
-
border-radius: var(--radius-card);
|
|
37
|
-
box-shadow: var(--shadow-card);
|
|
38
|
-
padding: --spacing(5);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.TabPanel {
|
|
42
|
-
display: grid;
|
|
43
|
-
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
44
|
-
gap: --spacing(4);
|
|
45
|
-
margin-top: --spacing(5);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Radix marks inactive Tabs.Content with both the [hidden] attribute and
|
|
49
|
-
data-state="inactive". The display:grid above would otherwise win over
|
|
50
|
-
the user-agent's [hidden] rule and leave inactive panels visible as
|
|
51
|
-
empty grid containers. */
|
|
52
|
-
.TabPanel[hidden],
|
|
53
|
-
.TabPanel[data-state='inactive'] {
|
|
54
|
-
display: none;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.Card {
|
|
58
|
-
background: var(--bg-section);
|
|
59
|
-
border-radius: var(--radius-element);
|
|
60
|
-
padding: --spacing(4);
|
|
61
|
-
display: flex;
|
|
62
|
-
flex-direction: column;
|
|
63
|
-
gap: --spacing(3);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.Card h3 {
|
|
67
|
-
margin: 0;
|
|
68
|
-
font-size: 0.85rem;
|
|
69
|
-
font-weight: 600;
|
|
70
|
-
letter-spacing: 0.04em;
|
|
71
|
-
text-transform: uppercase;
|
|
72
|
-
color: var(--color-gray-600);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.Field {
|
|
76
|
-
display: flex;
|
|
77
|
-
flex-direction: column;
|
|
78
|
-
gap: --spacing(2);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.Stack {
|
|
82
|
-
display: flex;
|
|
83
|
-
flex-direction: column;
|
|
84
|
-
gap: --spacing(2);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.Row {
|
|
88
|
-
display: flex;
|
|
89
|
-
align-items: center;
|
|
90
|
-
gap: --spacing(2);
|
|
91
|
-
flex-wrap: wrap;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.ButtonRow {
|
|
95
|
-
display: flex;
|
|
96
|
-
align-items: center;
|
|
97
|
-
gap: --spacing(2);
|
|
98
|
-
flex-wrap: wrap;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
.AvatarRow {
|
|
102
|
-
display: flex;
|
|
103
|
-
gap: --spacing(3);
|
|
104
|
-
align-items: center;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.Hint {
|
|
108
|
-
color: var(--color-gray-600);
|
|
109
|
-
font-size: 0.875rem;
|
|
110
|
-
margin: 0;
|
|
111
|
-
}
|