Skip to content

Commit a3096be

Browse files
authored
fix(lynxtron-go): unblock packaged-app showcase install & rename deep link scheme (#19)
* fix(lynxtron-go): include @lynx-js/lynxtron in packaged app.asar lynxtron-builder's app-builder-lib patch uses the outer lynxtron-go/package.json#dependencies as the allowlist when collecting node_modules into app.asar. Having @lynx-js/lynxtron in devDependencies caused it to be filtered out, so preload.js failed at runtime with "Cannot find module '@lynx-js/lynxtron'" after install. * feat(lynxtron-go): rename deep link scheme to lynxtron-go:// Aligns the URL scheme with the app name so it doesn't collide with the underlying @lynx-js/lynxtron runtime namespace. Updates the shared scheme constant, macOS CFBundleURLSchemes, in-app help page, and tests. * chore(config): bump to 0.0.2 to republish with expanded catalog deps The previously published @lynxtron-examples/config@0.0.1 tarball still carried `catalog:` refs in its `dependencies` (pnpm publish did not expand them). That caused ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER when the Lynxtron GO app ran `pnpm install` inside the workspace after fetching a showcase. Republishing from a pnpm workspace produces a clean tarball with real version specifiers. * feat(lynxtron-go): add lynxtron-go://open?url= short deep link alias Accept `open` as an alternate host to `lynxview_page` for the bundle URL intent, and let both hosts read either `url=` or `bundle=`. Same http(s)-only guard, same bundle-url-open intent, so downstream dispatch does not change. Updates help page and tests. Also folds in the changeset for the earlier packaged-app fixes (asar runtime dep + deep link scheme rename to lynxtron-go://). * chore(deps): sync pnpm-lock.yaml after moving @lynx-js/lynxtron to dependencies CI failed with ERR_PNPM_OUTDATED_LOCKFILE because the earlier commit that moved @lynx-js/lynxtron from devDependencies to dependencies did not regenerate the lockfile. Only pnpm-lock.yaml changes here: the @lynx-js/lynxtron entry moves between the two importer sections; no version bump.
1 parent 031085c commit a3096be

11 files changed

Lines changed: 109 additions & 49 deletions

File tree

.changeset/bright-tigers-run.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@lynxtron-examples/config": patch
3+
---
4+
5+
Republish so `package.json` `dependencies` carry real version specifiers instead of the `catalog:` protocol. The previously published `0.0.1` tarball still contained `catalog:` refs, which caused `pnpm install` to fail with `ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER` when the Lynxtron GO app tried to install a fetched showcase.

.changeset/silent-lions-jump.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"lynxtron-go": patch
3+
---
4+
5+
- Move `@lynx-js/lynxtron` from `devDependencies` to `dependencies` so `electron-builder` (via the `lynxtron-builder` patch that uses the app's own `package.json#dependencies` as the app.asar allowlist) actually includes it in the packaged app. Fixes `Cannot find module '@lynx-js/lynxtron'` at showcase-run time.
6+
- Rename the deep link URL scheme from `lynxtron://` to `lynxtron-go://` to avoid overlapping with the underlying `@lynx-js/lynxtron` runtime namespace. Covers the shared scheme constant, macOS `CFBundleURLSchemes`, in-app help page, and tests.
7+
- Add `lynxtron-go://open?url=<bundle-url>` as a short alias for `lynxtron-go://lynxview_page?bundle=<bundle-url>` so external tools can hand out a shorter deep link when previewing a hosted `.lynx.bundle`. Both hosts accept `url=` and `bundle=` interchangeably and enforce the same http(s)-only guard.

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,6 @@ See [docs/showcase-development.md](docs/showcase-development.md).
152152
- Dev mode (watch + hot reload)
153153
- Global search (Search panel)
154154
- Debug panel (run status, process management)
155-
- URL scheme (`lynxtron://`) handler
155+
- URL scheme (`lynxtron-go://`) handler
156156
- Pure Lynx UI showcases (no main.ts)
157157
- `GITHUB_TOKEN` auth — remove when repo is public

lynxtron-go/electron-builder.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ mac:
3939
CFBundleURLTypes:
4040
- CFBundleURLName: Lynxtron Go
4141
CFBundleURLSchemes:
42-
- lynxtron
43-
- Lynxtron
42+
- lynxtron-go
43+
- Lynxtron-Go
44+
identity: null
4445
win:
4546
target:
4647
- target: nsis

lynxtron-go/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
},
4343
"dependencies": {
4444
"@isaacs/fs-minipass": "^4.0.0",
45+
"@lynx-js/lynxtron": "catalog:",
4546
"@lynxtron-examples/cli": "workspace:*",
4647
"chownr": "^3.0.0",
4748
"lynxtron-http-service": "workspace:*",
@@ -60,7 +61,6 @@
6061
"__commented_out_dependencies": {
6162
},
6263
"devDependencies": {
63-
"@lynx-js/lynxtron": "catalog:",
6464
"@lynx-js/lynxtron-builder": "catalog:",
6565
"@lynx-js/lynxtron-dev-plugins": "catalog:",
6666
"@lynx-js/config-rsbuild-plugin": "catalog:",

lynxtron-go/src/app/shared/deep-link-dispatch.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('resolveDeepLinkDispatchAction', () => {
1717
const payload: HostDeepLinkPayload = {
1818
kind: 'intent',
1919
intent: { kind: 'home' },
20-
rawUrl: 'lynxtron://home',
20+
rawUrl: 'lynxtron-go://home',
2121
source: 'test',
2222
};
2323
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({ kind: 'home' });
@@ -35,7 +35,7 @@ describe('resolveDeepLinkDispatchAction', () => {
3535
column: 4,
3636
},
3737
},
38-
rawUrl: 'lynxtron://showcase/open?id=benchmark',
38+
rawUrl: 'lynxtron-go://showcase/open?id=benchmark',
3939
source: 'test',
4040
};
4141
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({
@@ -53,7 +53,7 @@ describe('resolveDeepLinkDispatchAction', () => {
5353
const payload: HostDeepLinkPayload = {
5454
kind: 'intent',
5555
intent: { kind: 'showcase-open', showcaseId: 'unknown' },
56-
rawUrl: 'lynxtron://showcase/open?id=unknown',
56+
rawUrl: 'lynxtron-go://showcase/open?id=unknown',
5757
source: 'test',
5858
};
5959
const action = resolveDeepLinkDispatchAction(payload, registry);
@@ -73,7 +73,7 @@ describe('resolveDeepLinkDispatchAction', () => {
7373
filePath: 'src/App.tsx',
7474
},
7575
},
76-
rawUrl: 'lynxtron://example/open?path=view',
76+
rawUrl: 'lynxtron-go://example/open?path=view',
7777
source: 'test',
7878
};
7979
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({
@@ -91,14 +91,14 @@ describe('resolveDeepLinkDispatchAction', () => {
9191
error: {
9292
code: 'MISSING_PARAM',
9393
message: 'Missing showcase id in deep link',
94-
detail: 'Use lynxtron://showcase/open?id=<showcase-id>',
94+
detail: 'Use lynxtron-go://showcase/open?id=<showcase-id>',
9595
},
96-
rawUrl: 'lynxtron://showcase/open',
96+
rawUrl: 'lynxtron-go://showcase/open',
9797
source: 'test',
9898
};
9999
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({
100100
kind: 'error',
101-
message: 'Deep link rejected: Missing showcase id in deep link (Use lynxtron://showcase/open?id=<showcase-id>)',
101+
message: 'Deep link rejected: Missing showcase id in deep link (Use lynxtron-go://showcase/open?id=<showcase-id>)',
102102
});
103103
});
104104

@@ -109,7 +109,7 @@ describe('resolveDeepLinkDispatchAction', () => {
109109
kind: 'bundle-url-open',
110110
url: 'https://example.com/bundle.lynx',
111111
},
112-
rawUrl: 'lynxtron://lynxview_page?bundle=https://example.com/bundle.lynx',
112+
rawUrl: 'lynxtron-go://lynxview_page?bundle=https://example.com/bundle.lynx',
113113
source: 'test',
114114
};
115115
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({
@@ -126,7 +126,7 @@ describe('resolveDeepLinkDispatchAction', () => {
126126
url: 'https://example.com/bundle.lynx',
127127
title: 'My App',
128128
},
129-
rawUrl: 'lynxtron://lynxview_page?bundle=https://example.com/bundle.lynx&title=My%20App',
129+
rawUrl: 'lynxtron-go://lynxview_page?bundle=https://example.com/bundle.lynx&title=My%20App',
130130
source: 'test',
131131
};
132132
expect(resolveDeepLinkDispatchAction(payload, registry)).toEqual({

lynxtron-go/src/main/desktop/help.html

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,12 +276,14 @@ <h2><span class="L-en">Deep links</span><span class="L-zh">深链</span></h2>
276276
<div class="card wide">
277277
<p class="L-en">Other tools (and the docs site) can drive the Fiddle through its URL scheme:</p>
278278
<p class="L-zh">其他工具(以及文档站)可以通过 URL scheme 驱动 Fiddle:</p>
279-
<pre class="L-en"><b>lynxtron://showcase/open?id=</b>counter open a showcase in the Fiddle
280-
<b>lynxtron://showcase/open?id=</b>counter<b>&amp;target=ide</b> …in a separate IDE window
281-
<b>lynxtron://lynxview_page?bundle=</b>https://…/x.lynx.bundle preview a hosted bundle</pre>
282-
<pre class="L-zh"><b>lynxtron://showcase/open?id=</b>counter 在 Fiddle 中打开 showcase
283-
<b>lynxtron://showcase/open?id=</b>counter<b>&amp;target=ide</b> ……在独立 IDE 窗口中打开
284-
<b>lynxtron://lynxview_page?bundle=</b>https://…/x.lynx.bundle 预览托管的 bundle</pre>
279+
<pre class="L-en"><b>lynxtron-go://showcase/open?id=</b>counter open a showcase in the Fiddle
280+
<b>lynxtron-go://showcase/open?id=</b>counter<b>&amp;target=ide</b> …in a separate IDE window
281+
<b>lynxtron-go://lynxview_page?bundle=</b>https://…/x.lynx.bundle preview a hosted bundle
282+
<b>lynxtron-go://open?url=</b>https://…/x.lynx.bundle short alias of the form above</pre>
283+
<pre class="L-zh"><b>lynxtron-go://showcase/open?id=</b>counter 在 Fiddle 中打开 showcase
284+
<b>lynxtron-go://showcase/open?id=</b>counter<b>&amp;target=ide</b> ……在独立 IDE 窗口中打开
285+
<b>lynxtron-go://lynxview_page?bundle=</b>https://…/x.lynx.bundle 预览托管的 bundle
286+
<b>lynxtron-go://open?url=</b>https://…/x.lynx.bundle 上一条的短别名</pre>
285287
</div>
286288

287289
<div class="note">

lynxtron-go/src/shared/deep-link.test.ts

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@ import { extractDeepLinkUrlFromArgv, parseDeepLinkUrl } from './deep-link';
33

44
describe('parseDeepLinkUrl', () => {
55
it('parses home deep link', () => {
6-
const result = parseDeepLinkUrl('lynxtron://home');
6+
const result = parseDeepLinkUrl('lynxtron-go://home');
77
expect(result).toEqual({
88
ok: true,
99
intent: { kind: 'home' },
1010
});
1111
});
1212

1313
it('parses showcase deep link', () => {
14-
const result = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark');
14+
const result = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark');
1515
expect(result).toEqual({
1616
ok: true,
1717
intent: { kind: 'showcase-open', showcaseId: 'benchmark' },
1818
});
1919
});
2020

2121
it('parses example deep link and normalizes path', () => {
22-
const result = parseDeepLinkUrl('lynxtron://example/open?path=/view/');
22+
const result = parseDeepLinkUrl('lynxtron-go://example/open?path=/view/');
2323
expect(result).toEqual({
2424
ok: true,
2525
intent: { kind: 'example-open', examplePath: 'view' },
@@ -28,7 +28,7 @@ describe('parseDeepLinkUrl', () => {
2828

2929
it('parses optional file navigation for showcase and normalizes the relative path', () => {
3030
const result = parseDeepLinkUrl(
31-
'lynxtron://showcase/open?id=benchmark&file=src/./app/../app/App.tsx&line=42&column=7',
31+
'lynxtron-go://showcase/open?id=benchmark&file=src/./app/../app/App.tsx&line=42&column=7',
3232
);
3333
expect(result).toEqual({
3434
ok: true,
@@ -45,7 +45,7 @@ describe('parseDeepLinkUrl', () => {
4545
});
4646

4747
it('parses file-only navigation for example deep link', () => {
48-
const result = parseDeepLinkUrl('lynxtron://example/open?path=view&file=src/App.tsx');
48+
const result = parseDeepLinkUrl('lynxtron-go://example/open?path=view&file=src/App.tsx');
4949
expect(result).toEqual({
5050
ok: true,
5151
intent: {
@@ -59,80 +59,112 @@ describe('parseDeepLinkUrl', () => {
5959
});
6060

6161
it('rejects unsupported routes', () => {
62-
const result = parseDeepLinkUrl('lynxtron://folder/open?path=/tmp/demo');
62+
const result = parseDeepLinkUrl('lynxtron-go://folder/open?path=/tmp/demo');
6363
expect(result.ok).toBe(false);
6464
if (result.ok) return;
6565
expect(result.error.code).toBe('UNSUPPORTED_ROUTE');
6666
});
6767

6868
it('rejects missing required parameters', () => {
69-
const result = parseDeepLinkUrl('lynxtron://showcase/open');
69+
const result = parseDeepLinkUrl('lynxtron-go://showcase/open');
7070
expect(result.ok).toBe(false);
7171
if (result.ok) return;
7272
expect(result.error.code).toBe('MISSING_PARAM');
7373
});
7474

7575
it('rejects absolute and escaping file paths', () => {
76-
const absolute = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark&file=/tmp/App.tsx');
76+
const absolute = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark&file=/tmp/App.tsx');
7777
expect(absolute.ok).toBe(false);
7878
if (absolute.ok) return;
7979
expect(absolute.error.code).toBe('INVALID_PARAM');
8080

81-
const escaping = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark&file=../../App.tsx');
81+
const escaping = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark&file=../../App.tsx');
8282
expect(escaping.ok).toBe(false);
8383
if (escaping.ok) return;
8484
expect(escaping.error.code).toBe('INVALID_PARAM');
8585
});
8686

8787
it('rejects line and column without file', () => {
88-
const lineOnly = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark&line=9');
88+
const lineOnly = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark&line=9');
8989
expect(lineOnly.ok).toBe(false);
9090
if (lineOnly.ok) return;
9191
expect(lineOnly.error.code).toBe('INVALID_PARAM');
9292

93-
const columnOnly = parseDeepLinkUrl('lynxtron://example/open?path=view&column=3');
93+
const columnOnly = parseDeepLinkUrl('lynxtron-go://example/open?path=view&column=3');
9494
expect(columnOnly.ok).toBe(false);
9595
if (columnOnly.ok) return;
9696
expect(columnOnly.error.code).toBe('INVALID_PARAM');
9797
});
9898

9999
it('rejects column without line and non-positive coordinates', () => {
100-
const missingLine = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark&file=src/App.tsx&column=3');
100+
const missingLine = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark&file=src/App.tsx&column=3');
101101
expect(missingLine.ok).toBe(false);
102102
if (missingLine.ok) return;
103103
expect(missingLine.error.code).toBe('INVALID_PARAM');
104104

105-
const invalidLine = parseDeepLinkUrl('lynxtron://showcase/open?id=benchmark&file=src/App.tsx&line=0');
105+
const invalidLine = parseDeepLinkUrl('lynxtron-go://showcase/open?id=benchmark&file=src/App.tsx&line=0');
106106
expect(invalidLine.ok).toBe(false);
107107
if (invalidLine.ok) return;
108108
expect(invalidLine.error.code).toBe('INVALID_PARAM');
109109
});
110110

111111
it('parses bundle URL deep link', () => {
112-
const result = parseDeepLinkUrl('lynxtron://lynxview_page?bundle=https://example.com/bundle.lynx');
112+
const result = parseDeepLinkUrl('lynxtron-go://lynxview_page?bundle=https://example.com/bundle.lynx');
113113
expect(result).toEqual({
114114
ok: true,
115115
intent: { kind: 'bundle-url-open', url: 'https://example.com/bundle.lynx' },
116116
});
117117
});
118118

119119
it('parses bundle URL deep link with title', () => {
120-
const result = parseDeepLinkUrl('lynxtron://lynxview_page?bundle=https://example.com/bundle.lynx&title=My%20App');
120+
const result = parseDeepLinkUrl('lynxtron-go://lynxview_page?bundle=https://example.com/bundle.lynx&title=My%20App');
121121
expect(result).toEqual({
122122
ok: true,
123123
intent: { kind: 'bundle-url-open', url: 'https://example.com/bundle.lynx', title: 'My App' },
124124
});
125125
});
126126

127127
it('rejects bundle URL deep link with missing URL', () => {
128-
const result = parseDeepLinkUrl('lynxtron://lynxview_page');
128+
const result = parseDeepLinkUrl('lynxtron-go://lynxview_page');
129129
expect(result.ok).toBe(false);
130130
if (result.ok) return;
131131
expect(result.error.code).toBe('MISSING_PARAM');
132132
});
133133

134134
it('rejects bundle URL deep link with invalid URL', () => {
135-
const result = parseDeepLinkUrl('lynxtron://lynxview_page?bundle=not-a-valid-url');
135+
const result = parseDeepLinkUrl('lynxtron-go://lynxview_page?bundle=not-a-valid-url');
136+
expect(result.ok).toBe(false);
137+
if (result.ok) return;
138+
expect(result.error.code).toBe('INVALID_PARAM');
139+
});
140+
141+
it('parses bundle URL deep link via short open?url= form', () => {
142+
const result = parseDeepLinkUrl('lynxtron-go://open?url=https%3A%2F%2Fexample.com%2Fbundle.lynx');
143+
expect(result).toEqual({
144+
ok: true,
145+
intent: { kind: 'bundle-url-open', url: 'https://example.com/bundle.lynx' },
146+
});
147+
});
148+
149+
it('parses open?url= with title', () => {
150+
const result = parseDeepLinkUrl(
151+
'lynxtron-go://open?url=https%3A%2F%2Fexample.com%2Fbundle.lynx&title=My%20App',
152+
);
153+
expect(result).toEqual({
154+
ok: true,
155+
intent: { kind: 'bundle-url-open', url: 'https://example.com/bundle.lynx', title: 'My App' },
156+
});
157+
});
158+
159+
it('rejects open route with missing url', () => {
160+
const result = parseDeepLinkUrl('lynxtron-go://open');
161+
expect(result.ok).toBe(false);
162+
if (result.ok) return;
163+
expect(result.error.code).toBe('MISSING_PARAM');
164+
});
165+
166+
it('rejects open?url= with non-http(s) scheme', () => {
167+
const result = parseDeepLinkUrl('lynxtron-go://open?url=file%3A%2F%2F%2Ftmp%2Fbundle.lynx');
136168
expect(result.ok).toBe(false);
137169
if (result.ok) return;
138170
expect(result.error.code).toBe('INVALID_PARAM');
@@ -144,9 +176,9 @@ describe('extractDeepLinkUrlFromArgv', () => {
144176
const result = extractDeepLinkUrlFromArgv([
145177
'/Applications/Lynxtron GO.app/Contents/MacOS/lynxtron-go',
146178
'--inspect=9222',
147-
'lynxtron://example/open?path=view',
179+
'lynxtron-go://example/open?path=view',
148180
]);
149-
expect(result).toBe('lynxtron://example/open?path=view');
181+
expect(result).toBe('lynxtron-go://example/open?path=view');
150182
});
151183

152184
it('returns null when argv has no deep link', () => {

lynxtron-go/src/shared/deep-link.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const PUBLIC_DEEP_LINK_SCHEME = 'lynxtron';
1+
export const PUBLIC_DEEP_LINK_SCHEME = 'lynxtron-go';
22

33
export interface DeepLinkFileNavigation {
44
filePath: string;
@@ -211,7 +211,7 @@ export function parseDeepLinkUrl(rawUrl: string): DeepLinkParseResult {
211211
return fail({
212212
code: 'MISSING_PARAM',
213213
message: 'Missing showcase id in deep link',
214-
detail: 'Use lynxtron://showcase/open?id=<showcase-id>',
214+
detail: 'Use lynxtron-go://showcase/open?id=<showcase-id>',
215215
});
216216
}
217217
const navigationResult = parseOptionalFileNavigation(parsed);
@@ -236,7 +236,7 @@ export function parseDeepLinkUrl(rawUrl: string): DeepLinkParseResult {
236236
return fail({
237237
code: 'MISSING_PARAM',
238238
message: 'Missing example path in deep link',
239-
detail: 'Use lynxtron://example/open?path=<example-relative-path>',
239+
detail: 'Use lynxtron-go://example/open?path=<example-relative-path>',
240240
});
241241
}
242242
if (rawPath.includes('://')) {
@@ -267,13 +267,26 @@ export function parseDeepLinkUrl(rawUrl: string): DeepLinkParseResult {
267267
};
268268
}
269269

270-
if (host === 'lynxview_page' && (routePath === '' || routePath === '/')) {
271-
const url = parsed.searchParams.get('bundle')?.trim() || '';
270+
if (
271+
(host === 'lynxview_page' && (routePath === '' || routePath === '/'))
272+
|| (host === 'open' && (routePath === '' || routePath === '/'))
273+
) {
274+
// `bundle=` is the original param name; `url=` is the shorter alias used
275+
// by the `open` host. Accept either on both hosts so the two forms stay
276+
// interchangeable.
277+
const paramName = host === 'open' ? 'url' : 'bundle';
278+
const url =
279+
parsed.searchParams.get(paramName)?.trim()
280+
|| parsed.searchParams.get(paramName === 'url' ? 'bundle' : 'url')?.trim()
281+
|| '';
272282
if (!url) {
273283
return fail({
274284
code: 'MISSING_PARAM',
275-
message: 'Missing bundle URL in deep link',
276-
detail: 'Use lynxtron://lynxview_page?bundle=<bundle-url>',
285+
message: `Missing bundle URL in deep link`,
286+
detail:
287+
host === 'open'
288+
? 'Use lynxtron-go://open?url=<bundle-url>'
289+
: 'Use lynxtron-go://lynxview_page?bundle=<bundle-url>',
277290
});
278291
}
279292
// http(s) ONLY. Deep links arrive from arbitrary external sources — a

packages/config/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lynxtron-examples/config",
3-
"version": "0.0.2-alpha.0",
3+
"version": "0.0.2",
44
"publishConfig": {
55
"access": "public"
66
},

0 commit comments

Comments
 (0)