@mapsight/vite-count-aggregator-embed 0.0.0 → 0.2.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/README.md +56 -1
- package/dist/finalize.d.ts +5 -0
- package/dist/finalize.d.ts.map +1 -0
- package/dist/finalize.js +43 -0
- package/dist/finalize.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/snippets.d.ts +4 -0
- package/dist/snippets.d.ts.map +1 -0
- package/dist/snippets.js +35 -0
- package/dist/snippets.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -5
package/README.md
CHANGED
|
@@ -1,3 +1,58 @@
|
|
|
1
1
|
# @mapsight/vite-count-aggregator-embed
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Vite plugin for **count-aggregator app-shell** CMS embed production builds: rewrites asset paths, extracts a paste-ready HTML snippet from the built page, and writes an assets-only deploy tree with Apache `.htaccess`.
|
|
4
|
+
|
|
5
|
+
Use with [`@mapsight/count-aggregator-ui`](https://github.com/open-mapsight/mapsight/blob/main/packages/count-aggregator-ui/README.md) and [`mapsightSnippetHtmlEntryPlugin`](https://github.com/open-mapsight/mapsight/tree/main/packages/vite-host-embed) from `@mapsight/vite-host-embed`.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @mapsight/vite-count-aggregator-embed @mapsight/vite-host-embed vite
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
Mark the paste-ready region in your app HTML entry:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<!-- mapsight:snippet:start -->
|
|
19
|
+
<div id="count-aggregator-root"></div>
|
|
20
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
21
|
+
<!-- mapsight:snippet:end -->
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Wire Vite plugins:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import {finalizeCountAggregatorAppShellPlugin} from "@mapsight/vite-count-aggregator-embed";
|
|
28
|
+
import {mapsightSnippetHtmlEntryPlugin} from "@mapsight/vite-host-embed";
|
|
29
|
+
|
|
30
|
+
export default defineConfig({
|
|
31
|
+
plugins: [
|
|
32
|
+
mapsightSnippetHtmlEntryPlugin(appRoot, {
|
|
33
|
+
entryFile: "count-aggregator/index.html",
|
|
34
|
+
}),
|
|
35
|
+
finalizeCountAggregatorAppShellPlugin(appRoot, {
|
|
36
|
+
outDir: "dist/count-aggregator",
|
|
37
|
+
snippetsDir: "dist/snippets",
|
|
38
|
+
snippetName: "count-aggregator",
|
|
39
|
+
builtHtmlRelativePath: "count-aggregator/index.html",
|
|
40
|
+
removeFromDeployRelativePath: "count-aggregator",
|
|
41
|
+
assetsRewriteBase: "/mapsight-assets",
|
|
42
|
+
htaccessBase: "/count-aggregator",
|
|
43
|
+
cacheConfig: {
|
|
44
|
+
runtimeEntry: "embed",
|
|
45
|
+
appStylesheet: "mapsight.css",
|
|
46
|
+
embedTypeEntries: {},
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
After `vite build`, deploy only `dist/count-aggregator/assets/` and `.htaccess`. Paste `dist/snippets/count-aggregator.html` into the host CMS page.
|
|
54
|
+
|
|
55
|
+
## Related docs
|
|
56
|
+
|
|
57
|
+
- [`@mapsight/count-aggregator-ui` README](https://github.com/open-mapsight/mapsight/blob/main/packages/count-aggregator-ui/README.md)
|
|
58
|
+
- [`@mapsight/vite-host-embed` README](https://github.com/open-mapsight/mapsight/tree/main/packages/vite-host-embed)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import type { CountAggregatorAppShellEmbedConfig } from "./types.ts";
|
|
3
|
+
/** Finalize a count-aggregator app-shell build: assets-only deploy + CMS snippet. */
|
|
4
|
+
export declare function finalizeCountAggregatorAppShellPlugin(appRoot: string, config: CountAggregatorAppShellEmbedConfig): Plugin;
|
|
5
|
+
//# sourceMappingURL=finalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../src/finalize.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,MAAM,CAAC;AAMjC,OAAO,KAAK,EAAC,kCAAkC,EAAC,MAAM,YAAY,CAAC;AAgBnE,qFAAqF;AACrF,wBAAgB,qCAAqC,CACpD,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kCAAkC,GACxC,MAAM,CA+CR"}
|
package/dist/finalize.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { buildCacheControlBlock, rewriteAbsoluteAssetPaths, } from "@mapsight/vite-host-embed";
|
|
4
|
+
import { renderAppShellSnippetDocument, stripBuiltHtmlShell, } from "./snippets.js";
|
|
5
|
+
function buildAppShellHtaccess(config) {
|
|
6
|
+
return `# Mapsight count-aggregator static assets under ${config.htaccessBase}/.
|
|
7
|
+
# Page HTML comes from the host CMS (paste ${config.snippetsDir}/${config.snippetName}.html).
|
|
8
|
+
<IfModule mod_rewrite.c>
|
|
9
|
+
RewriteEngine On
|
|
10
|
+
RewriteBase ${config.htaccessBase}/
|
|
11
|
+
|
|
12
|
+
RewriteRule ^assets/ - [L]
|
|
13
|
+
</IfModule>
|
|
14
|
+
|
|
15
|
+
${buildCacheControlBlock(config.cacheConfig)}
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
/** Finalize a count-aggregator app-shell build: assets-only deploy + CMS snippet. */
|
|
19
|
+
export function finalizeCountAggregatorAppShellPlugin(appRoot, config) {
|
|
20
|
+
const outDir = path.join(appRoot, config.outDir);
|
|
21
|
+
const snippetsDir = path.join(appRoot, config.snippetsDir);
|
|
22
|
+
const builtHtmlPath = path.join(outDir, config.builtHtmlRelativePath);
|
|
23
|
+
const description = config.snippetDescription ?? "Mapsight count-aggregator CMS embed";
|
|
24
|
+
return {
|
|
25
|
+
name: "mapsight-count-aggregator-app-shell-finalize",
|
|
26
|
+
apply: "build",
|
|
27
|
+
async closeBundle() {
|
|
28
|
+
await rewriteAbsoluteAssetPaths(path.join(outDir, "assets"), config.assetsRewriteBase);
|
|
29
|
+
const html = await fs.readFile(builtHtmlPath, "utf8");
|
|
30
|
+
const bodyMarkup = stripBuiltHtmlShell(html);
|
|
31
|
+
await fs.mkdir(snippetsDir, { recursive: true });
|
|
32
|
+
await fs.writeFile(path.join(snippetsDir, `${config.snippetName}.html`), renderAppShellSnippetDocument(description, config.htaccessBase, bodyMarkup), "utf8");
|
|
33
|
+
if (config.removeFromDeployRelativePath) {
|
|
34
|
+
await fs.rm(path.join(outDir, config.removeFromDeployRelativePath), {
|
|
35
|
+
recursive: true,
|
|
36
|
+
force: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
await fs.writeFile(path.join(outDir, ".htaccess"), buildAppShellHtaccess(config), "utf8");
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=finalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.js","sourceRoot":"","sources":["../src/finalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACN,sBAAsB,EACtB,yBAAyB,GACzB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACN,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,eAAe,CAAC;AAGvB,SAAS,qBAAqB,CAAC,MAA0C;IACxE,OAAO,mDAAmD,MAAM,CAAC,YAAY;6CACjC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW;;;eAGtE,MAAM,CAAC,YAAY;;;;;EAKhC,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC;CAC3C,CAAC;AACF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,qCAAqC,CACpD,OAAe,EACf,MAA0C;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACtE,MAAM,WAAW,GAChB,MAAM,CAAC,kBAAkB,IAAI,qCAAqC,CAAC;IAEpE,OAAO;QACN,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,OAAO;QACd,KAAK,CAAC,WAAW;YAChB,MAAM,yBAAyB,CAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3B,MAAM,CAAC,iBAAiB,CACxB,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,SAAS,CACjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,OAAO,CAAC,EACpD,6BAA6B,CAC5B,WAAW,EACX,MAAM,CAAC,YAAY,EACnB,UAAU,CACV,EACD,MAAM,CACN,CAAC;YAEF,IAAI,MAAM,CAAC,4BAA4B,EAAE,CAAC;gBACzC,MAAM,EAAE,CAAC,EAAE,CACV,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,4BAA4B,CAAC,EACtD;oBACC,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,IAAI;iBACX,CACD,CAAC;YACH,CAAC;YAED,MAAM,EAAE,CAAC,SAAS,CACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,qBAAqB,CAAC,MAAM,CAAC,EAC7B,MAAM,CACN,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qCAAqC,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EACN,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAC,kCAAkC,EAAC,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qCAAqC,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EACN,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Strip Vite HTML shell noise after a production app-shell build. */
|
|
2
|
+
export declare function stripBuiltHtmlShell(html: string): string;
|
|
3
|
+
export declare function renderAppShellSnippetDocument(description: string, deployBase: string, bodyMarkup: string): string;
|
|
4
|
+
//# sourceMappingURL=snippets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets.d.ts","sourceRoot":"","sources":["../src/snippets.ts"],"names":[],"mappings":"AAOA,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAwBD,wBAAgB,6BAA6B,CAC5C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAChB,MAAM,CAQR"}
|
package/dist/snippets.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const DOCTYPE_HTML = "<!doctype html>";
|
|
2
|
+
const META_CHARSET_START = "<meta charset";
|
|
3
|
+
function startsWithIgnoreCase(value, prefix) {
|
|
4
|
+
return value.slice(0, prefix.length).toLowerCase() === prefix;
|
|
5
|
+
}
|
|
6
|
+
/** Strip Vite HTML shell noise after a production app-shell build. */
|
|
7
|
+
export function stripBuiltHtmlShell(html) {
|
|
8
|
+
return stripLeadingMetaCharset(stripLeadingDoctype(html)).trim();
|
|
9
|
+
}
|
|
10
|
+
function stripLeadingDoctype(html) {
|
|
11
|
+
if (!startsWithIgnoreCase(html, DOCTYPE_HTML)) {
|
|
12
|
+
return html;
|
|
13
|
+
}
|
|
14
|
+
return html.slice(DOCTYPE_HTML.length).trimStart();
|
|
15
|
+
}
|
|
16
|
+
function stripLeadingMetaCharset(html) {
|
|
17
|
+
if (!startsWithIgnoreCase(html, META_CHARSET_START)) {
|
|
18
|
+
return html;
|
|
19
|
+
}
|
|
20
|
+
const tagEnd = html.indexOf(">");
|
|
21
|
+
if (tagEnd === -1) {
|
|
22
|
+
return html;
|
|
23
|
+
}
|
|
24
|
+
return html.slice(tagEnd + 1).trimStart();
|
|
25
|
+
}
|
|
26
|
+
export function renderAppShellSnippetDocument(description, deployBase, bodyMarkup) {
|
|
27
|
+
return `<!--
|
|
28
|
+
${description}
|
|
29
|
+
|
|
30
|
+
Deploy app assets under ${deployBase}/. Script and stylesheet URLs below are from the latest build — regenerate after rebuild.
|
|
31
|
+
Paste into a CMS page that can host a full app shell (module script + stylesheet).
|
|
32
|
+
-->
|
|
33
|
+
${bodyMarkup}`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=snippets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets.js","sourceRoot":"","sources":["../src/snippets.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC;AACvC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAE3C,SAAS,oBAAoB,CAAC,KAAa,EAAE,MAAc;IAC1D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,OAAO,uBAAuB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACxC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,WAAmB,EACnB,UAAkB,EAClB,UAAkB;IAElB,OAAO;EACN,WAAW;;0BAEa,UAAU;;;EAGlC,UAAU,EAAE,CAAC;AACf,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HostEmbedConfig } from "@mapsight/vite-host-embed";
|
|
2
|
+
export type CountAggregatorAppShellEmbedConfig = {
|
|
3
|
+
/** Build output directory relative to the app root. */
|
|
4
|
+
outDir: string;
|
|
5
|
+
/** Snippet output directory relative to the app root. */
|
|
6
|
+
snippetsDir: string;
|
|
7
|
+
/** Snippet filename without `.html`. */
|
|
8
|
+
snippetName: string;
|
|
9
|
+
/** Built HTML path relative to `outDir`. */
|
|
10
|
+
builtHtmlRelativePath: string;
|
|
11
|
+
/** Optional deploy subtree to remove after snippet extraction. */
|
|
12
|
+
removeFromDeployRelativePath?: string;
|
|
13
|
+
/** Deploy prefix for rewritten asset URLs in built CSS/JS. */
|
|
14
|
+
assetsRewriteBase: string;
|
|
15
|
+
/** Apache rewrite base for generated `.htaccess`. */
|
|
16
|
+
htaccessBase: string;
|
|
17
|
+
/** Cache header config for stable entry files. */
|
|
18
|
+
cacheConfig: Pick<HostEmbedConfig, "runtimeEntry" | "appStylesheet" | "embedTypeEntries">;
|
|
19
|
+
/** Snippet file header description. */
|
|
20
|
+
snippetDescription?: string;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,kCAAkC,GAAG;IAChD,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,WAAW,EAAE,IAAI,CAChB,eAAe,EACf,cAAc,GAAG,eAAe,GAAG,kBAAkB,CACrD,CAAC;IACF,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapsight/vite-count-aggregator-embed",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"description": "Vite plugin for Mapsight count-aggregator app-shell CMS embed builds",
|
|
4
|
+
"version": "0.2.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@mapsight/vite-host-embed": "^1.1.0"
|
|
8
|
+
},
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"@types/node": "^24.13.2",
|
|
11
|
+
"typescript": "^6.0.3",
|
|
12
|
+
"vite": "^8.0.14",
|
|
13
|
+
"vitest": "^4.1.6"
|
|
14
|
+
},
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"vite": "^8.0.14"
|
|
27
|
+
},
|
|
6
28
|
"repository": {
|
|
7
|
-
"
|
|
8
|
-
|
|
29
|
+
"url": "https://github.com/open-mapsight/mapsight"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc --project tsconfig.build.json",
|
|
33
|
+
"clean": "rm -rf dist",
|
|
34
|
+
"clean-build": "npm-run-all clean build",
|
|
35
|
+
"lint": "eslint",
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"typecheck": "tsc --noEmit"
|
|
9
38
|
}
|
|
10
39
|
}
|