@publish.os/cli 0.0.1-alpha.1
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/README.md +13 -0
- package/dist/assets/nextjs/defaults/app/globals.css +6 -0
- package/dist/assets/nextjs/defaults/app/providers.tsx +1 -0
- package/dist/assets/nextjs/defaults/group/layout.tsx +13 -0
- package/dist/assets/nextjs/defaults/group/leaf.tsx +29 -0
- package/dist/assets/nextjs/defaults/group/page.tsx +50 -0
- package/dist/assets/nextjs/defaults/project/next.config.mjs +49 -0
- package/dist/assets/nextjs/defaults/project/package.json +10 -0
- package/dist/assets/nextjs/defaults/project/postcss.config.mjs +5 -0
- package/dist/assets/nextjs/defaults/project/tsconfig.json +32 -0
- package/dist/assets/nextjs/defaults/root/css/radius.css +34 -0
- package/dist/assets/nextjs/defaults/root/css/scaling.css +50 -0
- package/dist/assets/nextjs/defaults/root/css/typography.css +487 -0
- package/dist/assets/nextjs/defaults/root/css/zindex.css +29 -0
- package/dist/assets/nextjs/defaults/root/globals.css +122 -0
- package/dist/assets/nextjs/defaults/root/layout.tsx +15 -0
- package/dist/assets/nextjs/defaults/root/page.tsx +66 -0
- package/dist/assets/nextjs/defaults/root/theme.css +248 -0
- package/dist/assets/nextjs/defaults/source/_internal/logger.ts +20 -0
- package/dist/assets/nextjs/shims/global-layout.tsx +28 -0
- package/dist/assets/nextjs/shims/group-layout.tsx +7 -0
- package/dist/assets/nextjs/shims/group-page.tsx +12 -0
- package/dist/assets/nextjs/shims/leaf-page.tsx +13 -0
- package/dist/assets/nextjs/shims/metadata-route.tmpl +4 -0
- package/dist/assets/nextjs/shims/root-page.tsx +12 -0
- package/dist/publish.os.d.mts +1 -0
- package/dist/publish.os.mjs +10133 -0
- package/package.json +24 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import ColorPalette from "@publish.os/nextjs/components/color-palette";
|
|
2
|
+
import type {
|
|
3
|
+
LinkNode,
|
|
4
|
+
RootPageProps,
|
|
5
|
+
SectionNode,
|
|
6
|
+
TreeNode,
|
|
7
|
+
} from "@publish.os/nextjs/types";
|
|
8
|
+
import { log } from "@source/_internal/logger";
|
|
9
|
+
import Link from "next/link";
|
|
10
|
+
|
|
11
|
+
type RootNavNode = LinkNode | (SectionNode & { path: string });
|
|
12
|
+
|
|
13
|
+
function rootNavNodes(nodes: TreeNode[]): RootNavNode[] {
|
|
14
|
+
return nodes.filter((node): node is RootNavNode => {
|
|
15
|
+
if (node.type === "link") return true;
|
|
16
|
+
return node.type === "section" && typeof node.path === "string";
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function HomePage(props: RootPageProps) {
|
|
21
|
+
log.debug("[default:root-page]", props);
|
|
22
|
+
const { site, tree } = props;
|
|
23
|
+
const navNodes = rootNavNodes(tree);
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<main className="mx-auto w-full max-w-3xl px-6 py-10 text-foreground-1 lg:px-10">
|
|
27
|
+
<h1 className="text-3xl font-semibold tracking-tight text-foreground-1">
|
|
28
|
+
{site.title}
|
|
29
|
+
</h1>
|
|
30
|
+
{site.description && (
|
|
31
|
+
<p className="mt-3 max-w-2xl text-base leading-7 text-foreground-2">
|
|
32
|
+
{site.description}
|
|
33
|
+
</p>
|
|
34
|
+
)}
|
|
35
|
+
|
|
36
|
+
<ColorPalette />
|
|
37
|
+
|
|
38
|
+
{navNodes.length > 0 && (
|
|
39
|
+
<nav className="mt-8">
|
|
40
|
+
<h2 className="text-lg font-medium text-foreground-1">Sections</h2>
|
|
41
|
+
<ul className="mt-4 space-y-2 text-sm">
|
|
42
|
+
{navNodes.map((node) => (
|
|
43
|
+
<li key={node.id}>
|
|
44
|
+
{node.type === "link" ? (
|
|
45
|
+
<a
|
|
46
|
+
className="text-accent-1 underline-offset-4 hover:underline"
|
|
47
|
+
href={node.href}
|
|
48
|
+
>
|
|
49
|
+
{node.title}
|
|
50
|
+
</a>
|
|
51
|
+
) : (
|
|
52
|
+
<Link
|
|
53
|
+
className="text-accent-1 underline-offset-4 hover:underline"
|
|
54
|
+
href={node.path}
|
|
55
|
+
>
|
|
56
|
+
{node.title}
|
|
57
|
+
</Link>
|
|
58
|
+
)}
|
|
59
|
+
</li>
|
|
60
|
+
))}
|
|
61
|
+
</ul>
|
|
62
|
+
</nav>
|
|
63
|
+
)}
|
|
64
|
+
</main>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: light;
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Fonts
|
|
6
|
+
* Keep system defaults for now. Replace these when tenant fonts are added.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
--font-sans:
|
|
10
|
+
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
11
|
+
sans-serif;
|
|
12
|
+
--font-mono:
|
|
13
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
|
|
14
|
+
monospace;
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
* Global shape controls
|
|
18
|
+
* --theme-scaling multiplies platform spacing/radius helpers.
|
|
19
|
+
* --theme-radius accepts one of the radius preset vars below.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
--theme-scaling: 1;
|
|
23
|
+
--theme-radius: var(--theme-radius-md);
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* Raw color scales
|
|
27
|
+
* 1 is lightest / quietest. 12 is darkest / highest contrast.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
--gray-1: #fcfcfc;
|
|
31
|
+
--gray-2: #f9f9f9;
|
|
32
|
+
--gray-3: #f0f0f0;
|
|
33
|
+
--gray-4: #e8e8e8;
|
|
34
|
+
--gray-5: #e0e0e0;
|
|
35
|
+
--gray-6: #d9d9d9;
|
|
36
|
+
--gray-7: #cecece;
|
|
37
|
+
--gray-8: #bbbbbb;
|
|
38
|
+
--gray-9: #8d8d8d;
|
|
39
|
+
--gray-10: #838383;
|
|
40
|
+
--gray-11: #646464;
|
|
41
|
+
--gray-12: #202020;
|
|
42
|
+
|
|
43
|
+
--gray-dark-1: #111111;
|
|
44
|
+
--gray-dark-2: #191919;
|
|
45
|
+
--gray-dark-3: #222222;
|
|
46
|
+
--gray-dark-4: #2a2a2a;
|
|
47
|
+
--gray-dark-5: #313131;
|
|
48
|
+
--gray-dark-6: #3a3a3a;
|
|
49
|
+
--gray-dark-7: #484848;
|
|
50
|
+
--gray-dark-8: #606060;
|
|
51
|
+
--gray-dark-9: #6e6e6e;
|
|
52
|
+
--gray-dark-10: #7b7b7b;
|
|
53
|
+
--gray-dark-11: #b4b4b4;
|
|
54
|
+
--gray-dark-12: #eeeeee;
|
|
55
|
+
|
|
56
|
+
--blue-1: oklch(98% 0.015 255);
|
|
57
|
+
--blue-2: oklch(96% 0.025 255);
|
|
58
|
+
--blue-3: oklch(92% 0.055 255);
|
|
59
|
+
--blue-4: oklch(88% 0.08 255);
|
|
60
|
+
--blue-5: oklch(82% 0.11 255);
|
|
61
|
+
--blue-6: oklch(76% 0.14 255);
|
|
62
|
+
--blue-7: oklch(68% 0.17 255);
|
|
63
|
+
--blue-8: oklch(60% 0.19 255);
|
|
64
|
+
--blue-9: oklch(52% 0.2 255);
|
|
65
|
+
--blue-10: oklch(46% 0.18 255);
|
|
66
|
+
--blue-11: oklch(40% 0.16 255);
|
|
67
|
+
--blue-12: oklch(28% 0.1 255);
|
|
68
|
+
|
|
69
|
+
--blue-dark-1: #0d1520;
|
|
70
|
+
--blue-dark-2: #111927;
|
|
71
|
+
--blue-dark-3: #0d2847;
|
|
72
|
+
--blue-dark-4: #003362;
|
|
73
|
+
--blue-dark-5: #004074;
|
|
74
|
+
--blue-dark-6: #104d87;
|
|
75
|
+
--blue-dark-7: #205d9e;
|
|
76
|
+
--blue-dark-8: #2870bd;
|
|
77
|
+
--blue-dark-9: #0090ff;
|
|
78
|
+
--blue-dark-10: #3b9eff;
|
|
79
|
+
--blue-dark-11: #70b8ff;
|
|
80
|
+
--blue-dark-12: #c2e6ff;
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* Palette aliases
|
|
84
|
+
* Swap these to use a different neutral or accent scale without changing
|
|
85
|
+
* the semantic variables below.
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
--palette-neutral-1: var(--gray-1);
|
|
89
|
+
--palette-neutral-2: var(--gray-2);
|
|
90
|
+
--palette-neutral-3: var(--gray-3);
|
|
91
|
+
--palette-neutral-4: var(--gray-4);
|
|
92
|
+
--palette-neutral-5: var(--gray-5);
|
|
93
|
+
--palette-neutral-6: var(--gray-6);
|
|
94
|
+
--palette-neutral-7: var(--gray-7);
|
|
95
|
+
--palette-neutral-8: var(--gray-8);
|
|
96
|
+
--palette-neutral-9: var(--gray-9);
|
|
97
|
+
--palette-neutral-10: var(--gray-10);
|
|
98
|
+
--palette-neutral-11: var(--gray-11);
|
|
99
|
+
--palette-neutral-12: var(--gray-12);
|
|
100
|
+
|
|
101
|
+
--palette-accent-1: var(--blue-10);
|
|
102
|
+
--palette-accent-2: var(--blue-9);
|
|
103
|
+
--palette-accent-3: var(--blue-3);
|
|
104
|
+
--palette-accent-4: var(--blue-5);
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* Foreground
|
|
108
|
+
* Text and icons. Use stronger values for headings and important controls.
|
|
109
|
+
*/
|
|
110
|
+
|
|
111
|
+
--foreground-1: var(--palette-neutral-12);
|
|
112
|
+
--foreground-2: var(--palette-neutral-11);
|
|
113
|
+
--foreground-3: var(--palette-neutral-10);
|
|
114
|
+
--foreground-4: var(--palette-neutral-8);
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
* Surfaces
|
|
118
|
+
* App backgrounds and interaction states. Menu tokens are paired because
|
|
119
|
+
* menus often sit above overlays and need their own readable foregrounds.
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
--surface-background: var(--palette-neutral-1);
|
|
123
|
+
--surface-1: var(--palette-neutral-1);
|
|
124
|
+
--surface-2: var(--palette-neutral-2);
|
|
125
|
+
--surface-3: var(--palette-neutral-3);
|
|
126
|
+
--surface-4: var(--palette-neutral-4);
|
|
127
|
+
--surface-hover: var(--surface-3);
|
|
128
|
+
--surface-active: var(--surface-4);
|
|
129
|
+
--surface-overlay: var(--surface-3);
|
|
130
|
+
--surface-menu: var(--palette-neutral-12);
|
|
131
|
+
--surface-menu-foreground: var(--palette-neutral-1);
|
|
132
|
+
--surface-menu-hover: var(--palette-neutral-11);
|
|
133
|
+
--surface-menu-hover-foreground: var(--palette-neutral-1);
|
|
134
|
+
--surface-menu-active: var(--palette-neutral-10);
|
|
135
|
+
--surface-menu-active-foreground: var(--palette-neutral-1);
|
|
136
|
+
--surface-menu-disabled: var(--palette-neutral-10);
|
|
137
|
+
--surface-menu-disabled-foreground: var(--palette-neutral-4);
|
|
138
|
+
|
|
139
|
+
/*
|
|
140
|
+
* Accent
|
|
141
|
+
* Brand emphasis, links, selected states, and primary actions.
|
|
142
|
+
*/
|
|
143
|
+
|
|
144
|
+
--accent-1: var(--palette-accent-1);
|
|
145
|
+
--accent-2: var(--palette-accent-2);
|
|
146
|
+
--accent-3: var(--palette-accent-3);
|
|
147
|
+
--accent-4: var(--palette-accent-4);
|
|
148
|
+
--accent-foreground: white;
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* Strokes
|
|
152
|
+
* Borders, dividers, outlines, and low-emphasis separators.
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
--stroke-1: var(--palette-neutral-8);
|
|
156
|
+
--stroke-2: var(--palette-neutral-7);
|
|
157
|
+
--stroke-3: var(--palette-neutral-5);
|
|
158
|
+
--stroke-4: var(--palette-neutral-4);
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* Typography
|
|
162
|
+
* These affect markdown/MDX prose only.
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
--typography-body: var(--palette-neutral-11);
|
|
166
|
+
--typography-headings: var(--palette-neutral-12);
|
|
167
|
+
--typography-lead: var(--palette-neutral-8);
|
|
168
|
+
--typography-links: var(--accent-1);
|
|
169
|
+
--typography-bold: var(--palette-neutral-11);
|
|
170
|
+
--typography-counters: var(--palette-neutral-8);
|
|
171
|
+
--typography-bullets: var(--palette-neutral-6);
|
|
172
|
+
--typography-hr: var(--palette-neutral-4);
|
|
173
|
+
--typography-quotes: var(--palette-neutral-11);
|
|
174
|
+
--typography-quote-borders: var(--palette-neutral-4);
|
|
175
|
+
--typography-captions: var(--palette-neutral-7);
|
|
176
|
+
--typography-code: var(--palette-neutral-11);
|
|
177
|
+
--typography-variable: var(--accent-1);
|
|
178
|
+
--typography-pre-code: var(--palette-neutral-11);
|
|
179
|
+
--typography-pre-bg: var(--palette-neutral-3);
|
|
180
|
+
--typography-pre-border: var(--palette-neutral-6);
|
|
181
|
+
--typography-th-borders: var(--palette-neutral-5);
|
|
182
|
+
--typography-td-borders: var(--palette-neutral-4);
|
|
183
|
+
--typography-base-size: 1rem;
|
|
184
|
+
--typography-line-height: 1.6;
|
|
185
|
+
--typography-size-factor: 1;
|
|
186
|
+
--typography-spacing-factor: 1;
|
|
187
|
+
|
|
188
|
+
/*
|
|
189
|
+
* Focus
|
|
190
|
+
* Keyboard and accessibility focus indicators.
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
--focus-ring: var(--accent-2);
|
|
194
|
+
|
|
195
|
+
/*
|
|
196
|
+
* Selection
|
|
197
|
+
* Native text selection colors.
|
|
198
|
+
*/
|
|
199
|
+
|
|
200
|
+
--selection-background: var(--accent-3);
|
|
201
|
+
--selection-foreground: var(--accent-1);
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
* Progress bar
|
|
205
|
+
* Route transition / loading indicator.
|
|
206
|
+
*/
|
|
207
|
+
|
|
208
|
+
--progress-bar-fill: var(--accent-2);
|
|
209
|
+
--progress-bar-background: transparent;
|
|
210
|
+
--progress-bar-height: 2px;
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* Z-index
|
|
214
|
+
* Layering scale used by platform layout and components.
|
|
215
|
+
*/
|
|
216
|
+
|
|
217
|
+
--z-content: 10;
|
|
218
|
+
--z-nav: 100;
|
|
219
|
+
--z-overlay: 110;
|
|
220
|
+
--z-modal: 120;
|
|
221
|
+
--z-search: 125;
|
|
222
|
+
--z-toast: 130;
|
|
223
|
+
--z-progress: 140;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.dark {
|
|
227
|
+
color-scheme: dark;
|
|
228
|
+
|
|
229
|
+
--palette-neutral-1: var(--gray-dark-1);
|
|
230
|
+
--palette-neutral-2: var(--gray-dark-2);
|
|
231
|
+
--palette-neutral-3: var(--gray-dark-3);
|
|
232
|
+
--palette-neutral-4: var(--gray-dark-4);
|
|
233
|
+
--palette-neutral-5: var(--gray-dark-5);
|
|
234
|
+
--palette-neutral-6: var(--gray-dark-6);
|
|
235
|
+
--palette-neutral-7: var(--gray-dark-7);
|
|
236
|
+
--palette-neutral-8: var(--gray-dark-8);
|
|
237
|
+
--palette-neutral-9: var(--gray-dark-9);
|
|
238
|
+
--palette-neutral-10: var(--gray-dark-10);
|
|
239
|
+
--palette-neutral-11: var(--gray-dark-11);
|
|
240
|
+
--palette-neutral-12: var(--gray-dark-12);
|
|
241
|
+
|
|
242
|
+
--palette-accent-1: var(--blue-dark-11);
|
|
243
|
+
--palette-accent-2: var(--blue-dark-9);
|
|
244
|
+
--palette-accent-3: var(--blue-dark-3);
|
|
245
|
+
--palette-accent-4: var(--blue-dark-5);
|
|
246
|
+
|
|
247
|
+
--accent-foreground: black;
|
|
248
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
2
|
+
|
|
3
|
+
export const log = {
|
|
4
|
+
debug(...args: unknown[]) {
|
|
5
|
+
// biome-ignore lint/suspicious/noConsole: generated runtime logger intentionally writes render diagnostics.
|
|
6
|
+
if (isDev) console.debug("[publish.os:debug]", ...args);
|
|
7
|
+
},
|
|
8
|
+
info(...args: unknown[]) {
|
|
9
|
+
// biome-ignore lint/suspicious/noConsole: generated runtime logger intentionally writes render diagnostics.
|
|
10
|
+
console.log("[publish.os]", ...args);
|
|
11
|
+
},
|
|
12
|
+
warn(...args: unknown[]) {
|
|
13
|
+
// biome-ignore lint/suspicious/noConsole: generated runtime logger intentionally writes render diagnostics.
|
|
14
|
+
console.warn("[publish.os:warn]", ...args);
|
|
15
|
+
},
|
|
16
|
+
error(...args: unknown[]) {
|
|
17
|
+
// biome-ignore lint/suspicious/noConsole: generated runtime logger intentionally writes render diagnostics.
|
|
18
|
+
console.error("[publish.os:error]", ...args);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import manifest from "@manifest";
|
|
2
|
+
import RootLayout from "@source/layout";
|
|
3
|
+
import type { Metadata } from "next";
|
|
4
|
+
import type { ReactNode } from "react";
|
|
5
|
+
import { Providers } from "./providers";
|
|
6
|
+
import "./globals.css";
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: {
|
|
10
|
+
default: manifest.site.title,
|
|
11
|
+
template: `%s · ${manifest.site.title}`,
|
|
12
|
+
},
|
|
13
|
+
description: manifest.site.description,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default function AppRootLayout({ children }: { children: ReactNode }) {
|
|
17
|
+
return (
|
|
18
|
+
<html lang="en" suppressHydrationWarning>
|
|
19
|
+
<body>
|
|
20
|
+
<Providers>
|
|
21
|
+
<RootLayout site={manifest.site} tree={manifest.tree}>
|
|
22
|
+
{children}
|
|
23
|
+
</RootLayout>
|
|
24
|
+
</Providers>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import manifest from "@manifest";
|
|
2
|
+
import { createGroupLayout } from "@publish.os/nextjs/layouts/group";
|
|
3
|
+
import Layout from "@source/{{GROUP}}/layout";
|
|
4
|
+
|
|
5
|
+
const route = { group: "{{GROUP}}", manifest, Layout } as const;
|
|
6
|
+
|
|
7
|
+
export default createGroupLayout(route);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import manifest from "@manifest";
|
|
2
|
+
import {
|
|
3
|
+
createGroupMetadata,
|
|
4
|
+
createGroupPage,
|
|
5
|
+
} from "@publish.os/nextjs/pages/group";
|
|
6
|
+
import IndexPage from "@source/{{GROUP}}/page";
|
|
7
|
+
import type { Metadata } from "next";
|
|
8
|
+
|
|
9
|
+
const route = { group: "{{GROUP}}", manifest, IndexPage } as const;
|
|
10
|
+
|
|
11
|
+
export default createGroupPage(route);
|
|
12
|
+
export const metadata: Metadata = createGroupMetadata(route);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import manifest from "@manifest";
|
|
2
|
+
import {
|
|
3
|
+
createLeafMetadata,
|
|
4
|
+
createLeafPage,
|
|
5
|
+
createLeafStaticParams,
|
|
6
|
+
} from "@publish.os/nextjs/pages/leaf";
|
|
7
|
+
import Leaf from "@source/{{GROUP}}/leaf";
|
|
8
|
+
|
|
9
|
+
const route = { group: "{{GROUP}}", manifest, Leaf } as const;
|
|
10
|
+
|
|
11
|
+
export default createLeafPage(route);
|
|
12
|
+
export const generateMetadata = createLeafMetadata(route);
|
|
13
|
+
export const generateStaticParams = createLeafStaticParams(route);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import manifest from "@manifest";
|
|
2
|
+
import {
|
|
3
|
+
createRootMetadata,
|
|
4
|
+
createRootPage,
|
|
5
|
+
} from "@publish.os/nextjs/pages/root";
|
|
6
|
+
import RootPage from "@source/page";
|
|
7
|
+
import type { Metadata } from "next";
|
|
8
|
+
|
|
9
|
+
const route = { manifest, RootPage } as const;
|
|
10
|
+
|
|
11
|
+
export default createRootPage(route);
|
|
12
|
+
export const metadata: Metadata = createRootMetadata(route);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|