@inizioevoke/veeva-astroclm-core 1.0.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/.editorconfig +12 -0
- package/build.ts +38 -0
- package/dist/apps/index.d.ts +2 -0
- package/dist/apps/index.js +2 -0
- package/dist/apps/page-manager/bulk-create.d.ts +1 -0
- package/dist/apps/page-manager/bulk-create.js +120 -0
- package/dist/apps/page-manager/index.d.ts +5 -0
- package/dist/apps/page-manager/index.js +24 -0
- package/dist/apps/page-manager/single-create.d.ts +1 -0
- package/dist/apps/page-manager/single-create.js +78 -0
- package/dist/apps/page-manager/templates/contents.astro.txt +12 -0
- package/dist/apps/page-manager/templates/page.astro.txt +4 -0
- package/dist/apps/page-manager/utils.d.ts +10 -0
- package/dist/apps/page-manager/utils.js +57 -0
- package/dist/apps/utils.d.ts +5 -0
- package/dist/apps/utils.js +43 -0
- package/dist/apps/veeva-config-manager/create.d.ts +1 -0
- package/dist/apps/veeva-config-manager/create.js +136 -0
- package/dist/apps/veeva-config-manager/index.d.ts +3 -0
- package/dist/apps/veeva-config-manager/index.js +16 -0
- package/dist/apps/veeva-config-manager/templates/config.ts.txt +60 -0
- package/dist/env/schema.d.ts +15 -0
- package/dist/env/schema.js +28 -0
- package/dist/lib/const.d.ts +15 -0
- package/dist/lib/const.js +14 -0
- package/dist/lib/env.d.ts +8 -0
- package/dist/lib/env.js +17 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/logger.d.ts +9 -0
- package/dist/lib/logger.js +72 -0
- package/dist/lib/parse-argv.d.ts +31 -0
- package/dist/lib/parse-argv.js +109 -0
- package/dist/lib/parse-env.d.ts +45 -0
- package/dist/lib/parse-env.js +124 -0
- package/dist/lib/utils.d.ts +8 -0
- package/dist/lib/utils.js +37 -0
- package/dist/tasks/copy-files.d.ts +9 -0
- package/dist/tasks/copy-files.js +15 -0
- package/dist/tasks/create-csv.d.ts +15 -0
- package/dist/tasks/create-csv.js +186 -0
- package/dist/tasks/create-zips.d.ts +5 -0
- package/dist/tasks/create-zips.js +16 -0
- package/dist/tasks/deploy.d.ts +10 -0
- package/dist/tasks/deploy.js +49 -0
- package/dist/tasks/generate-thumbs.d.ts +12 -0
- package/dist/tasks/generate-thumbs.js +152 -0
- package/dist/tasks/index.d.ts +1 -0
- package/dist/tasks/index.js +1 -0
- package/dist/tasks/update-shared.d.ts +5 -0
- package/dist/tasks/update-shared.js +41 -0
- package/dist/types/config.d.ts +52 -0
- package/dist/types/env.d.ts +7 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/veeva.d.ts +58 -0
- package/dist/veeva/slideManager.d.ts +33 -0
- package/dist/veeva/slideManager.js +120 -0
- package/package.json +39 -0
- package/src/apps/index.ts +2 -0
- package/src/apps/page-manager/bulk-create.ts +131 -0
- package/src/apps/page-manager/index.ts +31 -0
- package/src/apps/page-manager/single-create.ts +97 -0
- package/src/apps/page-manager/templates/contents.astro.txt +12 -0
- package/src/apps/page-manager/templates/page.astro.txt +4 -0
- package/src/apps/page-manager/utils.ts +70 -0
- package/src/apps/utils.ts +47 -0
- package/src/apps/veeva-config-manager/create.ts +153 -0
- package/src/apps/veeva-config-manager/index.ts +20 -0
- package/src/apps/veeva-config-manager/templates/config.ts.txt +60 -0
- package/src/env/schema.ts +43 -0
- package/src/lib/const.ts +17 -0
- package/src/lib/env.ts +27 -0
- package/src/lib/index.ts +5 -0
- package/src/lib/logger.ts +84 -0
- package/src/lib/parse-argv.ts +125 -0
- package/src/lib/parse-env.ts +147 -0
- package/src/lib/utils.ts +37 -0
- package/src/tasks/copy-files.ts +29 -0
- package/src/tasks/create-csv.ts +259 -0
- package/src/tasks/create-zips.ts +21 -0
- package/src/tasks/deploy.ts +72 -0
- package/src/tasks/generate-thumbs.ts +179 -0
- package/src/tasks/index.ts +1 -0
- package/src/tasks/update-shared.ts +49 -0
- package/src/types/config.d.ts +52 -0
- package/src/types/env.d.ts +7 -0
- package/src/types/index.d.ts +9 -0
- package/src/types/veeva.d.ts +58 -0
- package/src/veeva/readme.md +77 -0
- package/src/veeva/slideManager.ts +139 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { IVeevaClmPresentation, IVeevaClmSlide, IVeevaClmSharedResource, IVeevaClmSlideSettings, Actions } from "./veeva";
|
|
2
|
+
|
|
3
|
+
export type ThumbnailNameHandler = (config: IVeevaConfig, slide: IVeevaClmSlide, settings: IScreenshotSettings) => string;
|
|
4
|
+
|
|
5
|
+
export interface IDimensions {
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IScreenshotSettings extends IDimensions {
|
|
11
|
+
filename?: string | ThumbnailNameHandler;
|
|
12
|
+
delay?: number;
|
|
13
|
+
queryStringParams?: Record<string, boolean | number | string>;
|
|
14
|
+
outDir?: string | string[] | ThumbnailNameHandler;
|
|
15
|
+
}
|
|
16
|
+
export interface IThumbnailSettings {
|
|
17
|
+
strategy?: 'append' | 'merge' | 'replace',
|
|
18
|
+
default?: IScreenshotSettings;
|
|
19
|
+
settings?: IScreenshotSettings[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IVeevaConfigSlide extends IVeevaClmSlide {
|
|
23
|
+
path: string;
|
|
24
|
+
enableActions?: Actions[];
|
|
25
|
+
thumbnails?: IThumbnailSettings;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface IVeevaConfigPresentation extends IVeevaClmPresentation {
|
|
29
|
+
shared?: IVeevaClmSharedResource & {
|
|
30
|
+
path?: string;
|
|
31
|
+
},
|
|
32
|
+
slides: IVeevaConfigSlide[]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export interface IVeevaConfig {
|
|
38
|
+
dimensions: { width: number, height: number };
|
|
39
|
+
slideSettings?: IVeevaClmSlideSettings; // legacy support
|
|
40
|
+
thumbnails?: Omit<IThumbnailSettings, 'strategy'>;
|
|
41
|
+
|
|
42
|
+
presentation: IVeevaConfigPresentation & {
|
|
43
|
+
name: string;
|
|
44
|
+
presentationId: string;
|
|
45
|
+
slideSettings?: IVeevaClmSlideSettings;
|
|
46
|
+
};
|
|
47
|
+
externalPresentations?: {
|
|
48
|
+
name: string;
|
|
49
|
+
slide: string;
|
|
50
|
+
presentationId: string;
|
|
51
|
+
}[]
|
|
52
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type BuildTarget = 'veeva' | 'web';
|
|
2
|
+
export type WebEnv = 'development' | 'production';
|
|
3
|
+
export type VeevaEnv = 'client' | 'evoke';
|
|
4
|
+
export type VeevaPlatform = 'salesforce' | 'vault';
|
|
5
|
+
export type LogLevel = 'disabled' | 'error' | 'debug';
|
|
6
|
+
export type LogTime = 'none' | 'date' | 'time' | 'datetime' | 'performance';
|
|
7
|
+
export type LogOutput = 'console' | 'screen';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type MediaType = "HTML" | "Image" | "Video" | "PPTX" | "PDF";
|
|
2
|
+
export type iOSResolution = "Default For Device" | "Scale To 1024x768" | "Scale To Fit";
|
|
3
|
+
export type Actions = "Swipe" | "Pinch to Exit" | "Zoom" | "Rotation Lock" | "History Buttons" | "Navigation Bar" | "Reactions";
|
|
4
|
+
export type CrmTarget = 'Salesforce' | 'Vault';
|
|
5
|
+
|
|
6
|
+
export interface VeevaIdField {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export interface VeevaCrmIdField<T = string> {
|
|
10
|
+
crmId: T;
|
|
11
|
+
}
|
|
12
|
+
export interface VeevaExternalIdField {
|
|
13
|
+
externalId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IVeevaClmBinderFields {
|
|
17
|
+
language?: 'English' & (string & {});
|
|
18
|
+
crmTarget?: CrmTarget;
|
|
19
|
+
crmOrg?: VeevaCrmIdField<string[]>;
|
|
20
|
+
crmProduct?: VeevaIdField;
|
|
21
|
+
crmContentGroup?: VeevaIdField | VeevaIdField[];
|
|
22
|
+
crmDetailGroup?: VeevaIdField;
|
|
23
|
+
detailGroup?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export interface IVeevaClmItem {
|
|
28
|
+
externalId: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
title?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface IVeevaClmMedia {
|
|
34
|
+
mediaType?: MediaType;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface IVeevaClmSlideSettings extends IVeevaClmMedia, IVeevaClmBinderFields {
|
|
38
|
+
disableActions?: Actions[];
|
|
39
|
+
iosResolution?: iOSResolution;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface IVeevaClmSlide extends IVeevaClmItem, IVeevaClmMedia, IVeevaClmSlideSettings {}
|
|
43
|
+
export interface IVeevaClmSharedResource extends IVeevaClmItem, IVeevaClmMedia, IVeevaClmBinderFields {}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export interface IVeevaClmPresentation extends IVeevaClmItem, IVeevaClmBinderFields {
|
|
47
|
+
presentationId?: string;
|
|
48
|
+
product: string;
|
|
49
|
+
country?: 'United States' & (string & {});
|
|
50
|
+
startDate?: string;
|
|
51
|
+
endDate?: string;
|
|
52
|
+
isTraining?: boolean;
|
|
53
|
+
isHidden?: boolean;
|
|
54
|
+
|
|
55
|
+
shared?: IVeevaClmSharedResource;
|
|
56
|
+
|
|
57
|
+
slides: IVeevaClmSlide[]
|
|
58
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Veeva Configuration
|
|
2
|
+
|
|
3
|
+
This document describes the structure and usage of the `veeva/config.ts` module.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`veeva/config.ts` exports a default factory function that returns an object conforming to `IVeevaConfig` used throughout the build and deployment process for Veeva-enabled presentations.
|
|
8
|
+
|
|
9
|
+
The configuration object includes settings for dimensions, slide behaviour, thumbnail generation, presentation metadata, and references to external content.
|
|
10
|
+
|
|
11
|
+
The factory accepts an optional arguments object allowing callers to specify environment-specific details.
|
|
12
|
+
|
|
13
|
+
## Factory Function
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
export default function ({ veevaEnv = 'client', isTraining = false }: IVeevaConfigArgs): IVeevaConfig
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Parameters
|
|
20
|
+
|
|
21
|
+
- `veevaEnv` *(optional)*: (`VeevaEnv`) Indicates the running environment. Typical values are `'client'` for the Veeva Client application, or another value when building/testing.
|
|
22
|
+
- `isTraining` *(optional)*: (`boolean`) When set to `true`, the configuration uses training-specific identifiers and appends `[Training]` to the presentation name.
|
|
23
|
+
|
|
24
|
+
### Returns
|
|
25
|
+
|
|
26
|
+
An `IVeevaConfig` object with all the required properties for Veeva workflows.
|
|
27
|
+
|
|
28
|
+
## Key Concepts
|
|
29
|
+
|
|
30
|
+
### EXT_ID and Naming
|
|
31
|
+
|
|
32
|
+
- `EXT_ID` is a base external identifier for the presentation. When training mode is enabled, `'_TRN'` is appended.
|
|
33
|
+
- `PRESENTATION_NAME` is a constant string, altered by the training flag when necessary.
|
|
34
|
+
- `formatExtId` is a local helper wrapping `lib/utils`'s `formatExtId` utility to produce unique external IDs for slides and shared content.
|
|
35
|
+
|
|
36
|
+
### Structure of the Returned Configuration
|
|
37
|
+
|
|
38
|
+
| Property | Description |
|
|
39
|
+
|-------------------------|-------------|
|
|
40
|
+
| `dimensions` | Width/height for the content display. |
|
|
41
|
+
| `slideSettings` | Global slide defaults (media type, disabled actions, iOS resolution). |
|
|
42
|
+
| `thumbnails` | Instructions for generating thumbnails; query params applied globally. |
|
|
43
|
+
| `presentation` | Metadata describing the presentation itself. |
|
|
44
|
+
| `externalPresentations` | Array of additional presentations (name, slide, id) included in the package. |
|
|
45
|
+
|
|
46
|
+
### Presentation Metadata
|
|
47
|
+
|
|
48
|
+
Within `presentation`, the object includes:
|
|
49
|
+
|
|
50
|
+
- `externalId`, `presentationId`, `product`, `name`, `country`, `language` (conditional on environment), `isTraining`.
|
|
51
|
+
- `shared.externalId` used for shared resources.
|
|
52
|
+
- `slides`: an array of slide descriptors, each with:
|
|
53
|
+
- `path`, `title`, `externalId`
|
|
54
|
+
- optional `disableActions`, `enableActions`, and extra thumbnails config per slide.
|
|
55
|
+
|
|
56
|
+
## Example Usage
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import createConfig from './veeva/config';
|
|
60
|
+
|
|
61
|
+
const config = createConfig({ veevaEnv: 'client', isTraining: true });
|
|
62
|
+
// pass `config` to build/deploy tasks
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Dependencies
|
|
66
|
+
|
|
67
|
+
- `IVeevaConfig` and `VeevaEnv` types are imported from `./types`.
|
|
68
|
+
- Utility `formatExtId` comes from `./lib/utils`.
|
|
69
|
+
|
|
70
|
+
## Notes
|
|
71
|
+
|
|
72
|
+
- Adjust the constants `EXT_ID` and `PRESENTATION_NAME` to match actual project values.
|
|
73
|
+
- Modification of slides, external presentations, or other properties should maintain the shape defined by `IVeevaConfig`.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
This file is intended as a reference for developers working on Veeva-related tooling and should be updated if the configuration schema changes.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
const configPath = path.resolve(__dirname, 'config.ts');
|
|
5
|
+
|
|
6
|
+
function readConfig(): string {
|
|
7
|
+
return fs.readFileSync(configPath, 'utf8');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function writeConfig(text: string): void {
|
|
11
|
+
fs.writeFileSync(configPath, text, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function mutateSlides(mutate: (current: string) => string): void {
|
|
15
|
+
const content = readConfig();
|
|
16
|
+
const slidesSection = /slides\s*:\s*\[([\s\S]*?)\]/m;
|
|
17
|
+
const match = content.match(slidesSection);
|
|
18
|
+
if (!match) {
|
|
19
|
+
throw new Error('Unable to locate slides array in config.ts');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const before = content.slice(0, match.index);
|
|
23
|
+
const after = content.slice((match.index ?? 0) + match[0].length);
|
|
24
|
+
const current = match[1];
|
|
25
|
+
const updated = mutate(current);
|
|
26
|
+
const newSection = `slides: [${updated}]`;
|
|
27
|
+
writeConfig(before + newSection + after);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Create an editor instance that loads the slides section once and allows
|
|
32
|
+
* multiple mutations before committing the change back to disk.
|
|
33
|
+
*/
|
|
34
|
+
export function createEditor() {
|
|
35
|
+
const slidesSection = /slides\s*:\s*\[([\s\S]*?)\]/m;
|
|
36
|
+
let content = readConfig();
|
|
37
|
+
const match = content.match(slidesSection);
|
|
38
|
+
if (!match) {
|
|
39
|
+
throw new Error('Unable to locate slides array in config.ts');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const prefix = content.slice(0, match.index);
|
|
43
|
+
const suffix = content.slice((match.index ?? 0) + match[0].length);
|
|
44
|
+
let current = match[1];
|
|
45
|
+
|
|
46
|
+
function commit() {
|
|
47
|
+
const newSection = `slides: [${current}]`;
|
|
48
|
+
writeConfig(prefix + newSection + suffix);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function removePaths(targetPaths: string[]) {
|
|
52
|
+
if (targetPaths.length === 0) return;
|
|
53
|
+
for (const p of targetPaths) {
|
|
54
|
+
const esc = p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
55
|
+
const re = new RegExp(`\{[\s\S]*?path:\s*['"]${esc}['"][\s\S]*?\}(,?)`, 'm');
|
|
56
|
+
current = current.replace(re, '');
|
|
57
|
+
}
|
|
58
|
+
current = current.replace(/,\s*,/g, ',');
|
|
59
|
+
current = current.replace(/,\s*$/m, '');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function insert(slide: { path: string; title: string; externalId: string }) {
|
|
63
|
+
const trimmed = current.trim();
|
|
64
|
+
const formatted = `
|
|
65
|
+
{ path: '${slide.path}', title: '${slide.title}', externalId: '${slide.externalId}' }`;
|
|
66
|
+
if (trimmed === '') {
|
|
67
|
+
current = formatted + '\n';
|
|
68
|
+
} else {
|
|
69
|
+
current = trimmed.replace(/\s*$/, '') + ',' + formatted + '\n';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function updatePath(oldPath: string, newPath: string) {
|
|
74
|
+
const escOld = oldPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
75
|
+
current = current.replace(
|
|
76
|
+
new RegExp(`(path:\s*['"])${escOld}(['"])`),
|
|
77
|
+
`$1${newPath}$2`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
removePaths,
|
|
83
|
+
insert,
|
|
84
|
+
updatePath,
|
|
85
|
+
commit,
|
|
86
|
+
// expose current for inspection/testing
|
|
87
|
+
getCurrent: () => current
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Remove every slide whose `path` matches one of the provided keys.
|
|
93
|
+
*/
|
|
94
|
+
export function removeSlides(targetPaths: string[]): void {
|
|
95
|
+
if (targetPaths.length === 0) return;
|
|
96
|
+
mutateSlides(current => {
|
|
97
|
+
let txt = current;
|
|
98
|
+
for (const p of targetPaths) {
|
|
99
|
+
const esc = p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
100
|
+
const re = new RegExp(`\{[\s\S]*?path:\s*['"]${esc}['"][\s\S]*?\}(,?)`, 'm');
|
|
101
|
+
txt = txt.replace(re, '');
|
|
102
|
+
}
|
|
103
|
+
// clean up extra commas
|
|
104
|
+
txt = txt.replace(/,\s*,/g, ',');
|
|
105
|
+
txt = txt.replace(/,\s*$/m, '');
|
|
106
|
+
return txt;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Append a slide object to the end of the slides array. The caller should
|
|
112
|
+
* provide values already formatted as they should appear in the file (quotes
|
|
113
|
+
* around strings, etc.). We simply ensure there is a comma between entries.
|
|
114
|
+
*/
|
|
115
|
+
export function insertSlide(slide: { path: string; title: string; externalId: string }): void {
|
|
116
|
+
mutateSlides(current => {
|
|
117
|
+
const trimmed = current.trim();
|
|
118
|
+
const formatted = `
|
|
119
|
+
{ path: '${slide.path}', title: '${slide.title}', externalId: '${slide.externalId}' }`;
|
|
120
|
+
if (trimmed === '') {
|
|
121
|
+
return formatted + '\n';
|
|
122
|
+
}
|
|
123
|
+
return trimmed.replace(/\s*$/, '') + ',' + formatted + '\n';
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Change the `path` value of the first slide object that has `oldPath`.
|
|
129
|
+
*/
|
|
130
|
+
export function updateSlidePath(oldPath: string, newPath: string): void {
|
|
131
|
+
mutateSlides(current => {
|
|
132
|
+
const escOld = oldPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
133
|
+
return current.replace(
|
|
134
|
+
new RegExp(`(path:\s*['"])${escOld}(['"])`),
|
|
135
|
+
`$1${newPath}$2`
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"skipLibCheck": true,
|
|
4
|
+
"target": "esnext",
|
|
5
|
+
"module": "esnext",
|
|
6
|
+
"moduleResolution": "bundler",
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"types": [
|
|
9
|
+
"node"
|
|
10
|
+
],
|
|
11
|
+
"outDir": "./dist",
|
|
12
|
+
"rootDir": "./src",
|
|
13
|
+
"paths": {
|
|
14
|
+
"@/*": ["./src/*"]
|
|
15
|
+
},
|
|
16
|
+
"plugins": [{
|
|
17
|
+
"name": "@astrojs/ts-plugin"
|
|
18
|
+
}]
|
|
19
|
+
},
|
|
20
|
+
"include": [
|
|
21
|
+
"./src/**/*.ts"
|
|
22
|
+
],
|
|
23
|
+
"exclude": [
|
|
24
|
+
"./dist",
|
|
25
|
+
"./node_modules"
|
|
26
|
+
]
|
|
27
|
+
}
|