Compare commits
2 commits
main
...
feat/skip-
Author | SHA1 | Date | |
---|---|---|---|
|
28658936ad | ||
|
a99f5a9301 |
10 changed files with 140 additions and 147 deletions
|
@ -84,6 +84,7 @@ export interface CLIFlags {
|
||||||
port?: number;
|
port?: number;
|
||||||
config?: string;
|
config?: string;
|
||||||
drafts?: boolean;
|
drafts?: boolean;
|
||||||
|
skipSync?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BuildConfig {
|
export interface BuildConfig {
|
||||||
|
|
|
@ -21,7 +21,7 @@ interface Result {
|
||||||
export async function check(settings: AstroSettings, { logging }: { logging: LogOptions }) {
|
export async function check(settings: AstroSettings, { logging }: { logging: LogOptions }) {
|
||||||
console.log(bold('astro check'));
|
console.log(bold('astro check'));
|
||||||
|
|
||||||
const { sync } = await import('../sync/index.js');
|
const { sync } = await import('../../core/sync/index.js');
|
||||||
const syncRet = await sync(settings, { logging, fs });
|
const syncRet = await sync(settings, { logging, fs });
|
||||||
// early exit on sync failure
|
// early exit on sync failure
|
||||||
if (syncRet === 1) return syncRet;
|
if (syncRet === 1) return syncRet;
|
||||||
|
|
|
@ -59,6 +59,7 @@ function printAstroHelp() {
|
||||||
['--base <pathname>', 'Specify your project base.'],
|
['--base <pathname>', 'Specify your project base.'],
|
||||||
['--verbose', 'Enable verbose logging.'],
|
['--verbose', 'Enable verbose logging.'],
|
||||||
['--silent', 'Disable all logging.'],
|
['--silent', 'Disable all logging.'],
|
||||||
|
['--skip-sync', 'Skip automatic content type generation.'],
|
||||||
['--version', 'Show the version number and exit.'],
|
['--version', 'Show the version number and exit.'],
|
||||||
['--help', 'Show this help message.'],
|
['--help', 'Show this help message.'],
|
||||||
],
|
],
|
||||||
|
@ -203,7 +204,12 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
|
||||||
case 'build': {
|
case 'build': {
|
||||||
const { default: build } = await import('../core/build/index.js');
|
const { default: build } = await import('../core/build/index.js');
|
||||||
|
|
||||||
return await build(settings, { ...flags, logging, telemetry });
|
return await build(settings, {
|
||||||
|
mode: flags.mode,
|
||||||
|
skipSync: flags['skip-sync'],
|
||||||
|
logging,
|
||||||
|
telemetry,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'check': {
|
case 'check': {
|
||||||
|
@ -212,7 +218,7 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'sync': {
|
case 'sync': {
|
||||||
const { sync } = await import('./sync/index.js');
|
const { sync } = await import('../core/sync/index.js');
|
||||||
|
|
||||||
const ret = await sync(settings, { logging, fs });
|
const ret = await sync(settings, { logging, fs });
|
||||||
return process.exit(ret);
|
return process.exit(ret);
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
import { dim } from 'kleur/colors';
|
|
||||||
import type fsMod from 'node:fs';
|
|
||||||
import { performance } from 'node:perf_hooks';
|
|
||||||
import { createServer } from 'vite';
|
|
||||||
import type { AstroSettings } from '../../@types/astro';
|
|
||||||
import { createContentTypesGenerator } from '../../content/index.js';
|
|
||||||
import { globalContentConfigObserver } from '../../content/utils.js';
|
|
||||||
import { getTimeStat } from '../../core/build/util.js';
|
|
||||||
import { createVite } from '../../core/create-vite.js';
|
|
||||||
import { AstroError, AstroErrorData } from '../../core/errors/index.js';
|
|
||||||
import { info, LogOptions } from '../../core/logger/core.js';
|
|
||||||
import { setUpEnvTs } from '../../vite-plugin-inject-env-ts/index.js';
|
|
||||||
|
|
||||||
export async function sync(
|
|
||||||
settings: AstroSettings,
|
|
||||||
{ logging, fs }: { logging: LogOptions; fs: typeof fsMod }
|
|
||||||
): Promise<0 | 1> {
|
|
||||||
const timerStart = performance.now();
|
|
||||||
// Needed to load content config
|
|
||||||
const tempViteServer = await createServer(
|
|
||||||
await createVite(
|
|
||||||
{
|
|
||||||
server: { middlewareMode: true, hmr: false },
|
|
||||||
optimizeDeps: { entries: [] },
|
|
||||||
logLevel: 'silent',
|
|
||||||
},
|
|
||||||
{ settings, logging, mode: 'build', fs }
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const contentTypesGenerator = await createContentTypesGenerator({
|
|
||||||
contentConfigObserver: globalContentConfigObserver,
|
|
||||||
logging,
|
|
||||||
fs,
|
|
||||||
settings,
|
|
||||||
viteServer: tempViteServer,
|
|
||||||
});
|
|
||||||
const typesResult = await contentTypesGenerator.init();
|
|
||||||
if (typesResult.typesGenerated === false) {
|
|
||||||
switch (typesResult.reason) {
|
|
||||||
case 'no-content-dir':
|
|
||||||
default:
|
|
||||||
info(logging, 'content', 'No content directory found. Skipping type generation.');
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw new AstroError(AstroErrorData.GenerateContentTypesError);
|
|
||||||
} finally {
|
|
||||||
await tempViteServer.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
info(logging, 'content', `Types generated ${dim(getTimeStat(timerStart, performance.now()))}`);
|
|
||||||
await setUpEnvTs({ settings, logging, fs });
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -5,6 +5,7 @@ import type { ViteDevServer } from 'vite';
|
||||||
import type { AstroSettings } from '../@types/astro.js';
|
import type { AstroSettings } from '../@types/astro.js';
|
||||||
import { info, LogOptions } from '../core/logger/core.js';
|
import { info, LogOptions } from '../core/logger/core.js';
|
||||||
import { appendForwardSlash } from '../core/path.js';
|
import { appendForwardSlash } from '../core/path.js';
|
||||||
|
import { setUpEnvTs } from '../core/sync/index.js';
|
||||||
import { createContentTypesGenerator } from './types-generator.js';
|
import { createContentTypesGenerator } from './types-generator.js';
|
||||||
import { getContentPaths, globalContentConfigObserver } from './utils.js';
|
import { getContentPaths, globalContentConfigObserver } from './utils.js';
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@ export async function attachContentServerListeners({
|
||||||
contentConfigObserver: globalContentConfigObserver,
|
contentConfigObserver: globalContentConfigObserver,
|
||||||
});
|
});
|
||||||
await contentGenerator.init();
|
await contentGenerator.init();
|
||||||
|
await setUpEnvTs({ settings, logging, fs });
|
||||||
info(logging, 'content', 'Types generated');
|
info(logging, 'content', 'Types generated');
|
||||||
|
|
||||||
viteServer.watcher.on('add', (entry) => {
|
viteServer.watcher.on('add', (entry) => {
|
||||||
|
|
|
@ -23,6 +23,7 @@ import { getTimeStat } from './util.js';
|
||||||
|
|
||||||
export interface BuildOptions {
|
export interface BuildOptions {
|
||||||
mode?: RuntimeMode;
|
mode?: RuntimeMode;
|
||||||
|
skipSync?: boolean;
|
||||||
logging: LogOptions;
|
logging: LogOptions;
|
||||||
telemetry: AstroTelemetry;
|
telemetry: AstroTelemetry;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +39,7 @@ class AstroBuilder {
|
||||||
private settings: AstroSettings;
|
private settings: AstroSettings;
|
||||||
private logging: LogOptions;
|
private logging: LogOptions;
|
||||||
private mode: RuntimeMode = 'production';
|
private mode: RuntimeMode = 'production';
|
||||||
|
private skipSync: boolean = false;
|
||||||
private origin: string;
|
private origin: string;
|
||||||
private routeCache: RouteCache;
|
private routeCache: RouteCache;
|
||||||
private manifest: ManifestData;
|
private manifest: ManifestData;
|
||||||
|
@ -47,6 +49,9 @@ class AstroBuilder {
|
||||||
if (options.mode) {
|
if (options.mode) {
|
||||||
this.mode = options.mode;
|
this.mode = options.mode;
|
||||||
}
|
}
|
||||||
|
if (options.skipSync) {
|
||||||
|
this.skipSync = options.skipSync;
|
||||||
|
}
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.logging = options.logging;
|
this.logging = options.logging;
|
||||||
this.routeCache = new RouteCache(this.logging);
|
this.routeCache = new RouteCache(this.logging);
|
||||||
|
@ -81,10 +86,12 @@ class AstroBuilder {
|
||||||
);
|
);
|
||||||
await runHookConfigDone({ settings: this.settings, logging });
|
await runHookConfigDone({ settings: this.settings, logging });
|
||||||
|
|
||||||
const { sync } = await import('../../cli/sync/index.js');
|
if (!this.skipSync) {
|
||||||
const syncRet = await sync(this.settings, { logging, fs });
|
const { sync } = await import('../sync/index.js');
|
||||||
if (syncRet !== 0) {
|
const syncRet = await sync(this.settings, { logging, fs });
|
||||||
return process.exit(syncRet);
|
if (syncRet !== 0) {
|
||||||
|
return process.exit(syncRet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return { viteConfig };
|
return { viteConfig };
|
||||||
|
|
|
@ -17,7 +17,6 @@ import configAliasVitePlugin from '../vite-plugin-config-alias/index.js';
|
||||||
import envVitePlugin from '../vite-plugin-env/index.js';
|
import envVitePlugin from '../vite-plugin-env/index.js';
|
||||||
import astroHeadPropagationPlugin from '../vite-plugin-head-propagation/index.js';
|
import astroHeadPropagationPlugin from '../vite-plugin-head-propagation/index.js';
|
||||||
import htmlVitePlugin from '../vite-plugin-html/index.js';
|
import htmlVitePlugin from '../vite-plugin-html/index.js';
|
||||||
import { astroInjectEnvTsPlugin } from '../vite-plugin-inject-env-ts/index.js';
|
|
||||||
import astroIntegrationsContainerPlugin from '../vite-plugin-integrations-container/index.js';
|
import astroIntegrationsContainerPlugin from '../vite-plugin-integrations-container/index.js';
|
||||||
import jsxVitePlugin from '../vite-plugin-jsx/index.js';
|
import jsxVitePlugin from '../vite-plugin-jsx/index.js';
|
||||||
import astroLoadFallbackPlugin from '../vite-plugin-load-fallback/index.js';
|
import astroLoadFallbackPlugin from '../vite-plugin-load-fallback/index.js';
|
||||||
|
@ -103,7 +102,6 @@ export async function createVite(
|
||||||
astroScriptsPageSSRPlugin({ settings }),
|
astroScriptsPageSSRPlugin({ settings }),
|
||||||
astroHeadPropagationPlugin({ settings }),
|
astroHeadPropagationPlugin({ settings }),
|
||||||
astroScannerPlugin({ settings }),
|
astroScannerPlugin({ settings }),
|
||||||
astroInjectEnvTsPlugin({ settings, logging, fs }),
|
|
||||||
astroContentVirtualModPlugin({ settings }),
|
astroContentVirtualModPlugin({ settings }),
|
||||||
astroContentImportPlugin({ fs, settings }),
|
astroContentImportPlugin({ fs, settings }),
|
||||||
astroContentAssetPropagationPlugin({ mode }),
|
astroContentAssetPropagationPlugin({ mode }),
|
||||||
|
|
|
@ -72,7 +72,9 @@ export default async function dev(
|
||||||
warn(options.logging, null, msg.fsStrictWarning());
|
warn(options.logging, null, msg.fsStrictWarning());
|
||||||
}
|
}
|
||||||
|
|
||||||
await attachContentServerListeners(restart.container);
|
if (!options.flags?.['skip-sync']) {
|
||||||
|
await attachContentServerListeners(restart.container);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
address: devServerAddressInfo,
|
address: devServerAddressInfo,
|
||||||
|
|
114
packages/astro/src/core/sync/index.ts
Normal file
114
packages/astro/src/core/sync/index.ts
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
import { bold, dim } from 'kleur/colors';
|
||||||
|
import type fsMod from 'node:fs';
|
||||||
|
import { performance } from 'node:perf_hooks';
|
||||||
|
import { createServer, normalizePath } from 'vite';
|
||||||
|
import type { AstroSettings } from '../../@types/astro';
|
||||||
|
import { createContentTypesGenerator } from '../../content/index.js';
|
||||||
|
import {
|
||||||
|
getContentPaths,
|
||||||
|
getDotAstroTypeReference,
|
||||||
|
globalContentConfigObserver,
|
||||||
|
} from '../../content/utils.js';
|
||||||
|
import { getTimeStat } from '../build/util.js';
|
||||||
|
import { createVite } from '../create-vite.js';
|
||||||
|
import { AstroError, AstroErrorData } from '../errors/index.js';
|
||||||
|
import { info, LogOptions } from '../logger/core.js';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import path from 'node:path';
|
||||||
|
|
||||||
|
export async function sync(
|
||||||
|
settings: AstroSettings,
|
||||||
|
{ logging, fs }: { logging: LogOptions; fs: typeof fsMod }
|
||||||
|
): Promise<0 | 1> {
|
||||||
|
const timerStart = performance.now();
|
||||||
|
// Needed to load content config
|
||||||
|
const tempViteServer = await createServer(
|
||||||
|
await createVite(
|
||||||
|
{
|
||||||
|
server: { middlewareMode: true, hmr: false },
|
||||||
|
optimizeDeps: { entries: [] },
|
||||||
|
logLevel: 'silent',
|
||||||
|
},
|
||||||
|
{ settings, logging, mode: 'build', fs }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const contentTypesGenerator = await createContentTypesGenerator({
|
||||||
|
contentConfigObserver: globalContentConfigObserver,
|
||||||
|
logging,
|
||||||
|
fs,
|
||||||
|
settings,
|
||||||
|
viteServer: tempViteServer,
|
||||||
|
});
|
||||||
|
const typesResult = await contentTypesGenerator.init();
|
||||||
|
if (typesResult.typesGenerated === false) {
|
||||||
|
switch (typesResult.reason) {
|
||||||
|
case 'no-content-dir':
|
||||||
|
default:
|
||||||
|
info(logging, 'content', 'No content directory found. Skipping type generation.');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
throw new AstroError(AstroErrorData.GenerateContentTypesError);
|
||||||
|
} finally {
|
||||||
|
await tempViteServer.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
info(logging, 'content', `Types generated ${dim(getTimeStat(timerStart, performance.now()))}`);
|
||||||
|
await setUpEnvTs({ settings, logging, fs });
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setUpEnvTs({
|
||||||
|
settings,
|
||||||
|
logging,
|
||||||
|
fs,
|
||||||
|
}: {
|
||||||
|
settings: AstroSettings;
|
||||||
|
logging: LogOptions;
|
||||||
|
fs: typeof fsMod;
|
||||||
|
}) {
|
||||||
|
const envTsPath = getEnvTsPath(settings.config);
|
||||||
|
const dotAstroDir = getContentPaths(settings.config).cacheDir;
|
||||||
|
const dotAstroTypeReference = getDotAstroTypeReference(settings.config);
|
||||||
|
const envTsPathRelativetoRoot = normalizePath(
|
||||||
|
path.relative(fileURLToPath(settings.config.root), fileURLToPath(envTsPath))
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fs.existsSync(envTsPath)) {
|
||||||
|
// Add `.astro` types reference if none exists
|
||||||
|
if (!fs.existsSync(dotAstroDir)) return;
|
||||||
|
|
||||||
|
let typesEnvContents = await fs.promises.readFile(envTsPath, 'utf-8');
|
||||||
|
const expectedTypeReference = getDotAstroTypeReference(settings.config);
|
||||||
|
|
||||||
|
if (!typesEnvContents.includes(expectedTypeReference)) {
|
||||||
|
typesEnvContents = `${expectedTypeReference}\n${typesEnvContents}`;
|
||||||
|
await fs.promises.writeFile(envTsPath, typesEnvContents, 'utf-8');
|
||||||
|
info(logging, 'content', `Added ${bold(envTsPathRelativetoRoot)} types`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Otherwise, inject the `env.d.ts` file
|
||||||
|
let referenceDefs: string[] = [];
|
||||||
|
if (settings.config.integrations.find((i) => i.name === '@astrojs/image')) {
|
||||||
|
referenceDefs.push('/// <reference types="@astrojs/image/client" />');
|
||||||
|
} else {
|
||||||
|
referenceDefs.push('/// <reference types="astro/client" />');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs.existsSync(dotAstroDir)) {
|
||||||
|
referenceDefs.push(dotAstroTypeReference);
|
||||||
|
}
|
||||||
|
|
||||||
|
await fs.promises.mkdir(settings.config.srcDir, { recursive: true });
|
||||||
|
await fs.promises.writeFile(envTsPath, referenceDefs.join('\n'), 'utf-8');
|
||||||
|
info(logging, 'astro', `Added ${bold(envTsPathRelativetoRoot)} types`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEnvTsPath({ srcDir }: { srcDir: URL }) {
|
||||||
|
return new URL('env.d.ts', srcDir);
|
||||||
|
}
|
|
@ -1,79 +0,0 @@
|
||||||
import { bold } from 'kleur/colors';
|
|
||||||
import type fsMod from 'node:fs';
|
|
||||||
import path from 'node:path';
|
|
||||||
import { fileURLToPath } from 'node:url';
|
|
||||||
import { normalizePath, Plugin } from 'vite';
|
|
||||||
import type { AstroSettings } from '../@types/astro.js';
|
|
||||||
import { getContentPaths, getDotAstroTypeReference } from '../content/index.js';
|
|
||||||
import { info, LogOptions } from '../core/logger/core.js';
|
|
||||||
|
|
||||||
export function getEnvTsPath({ srcDir }: { srcDir: URL }) {
|
|
||||||
return new URL('env.d.ts', srcDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function astroInjectEnvTsPlugin({
|
|
||||||
settings,
|
|
||||||
logging,
|
|
||||||
fs,
|
|
||||||
}: {
|
|
||||||
settings: AstroSettings;
|
|
||||||
logging: LogOptions;
|
|
||||||
fs: typeof fsMod;
|
|
||||||
}): Plugin {
|
|
||||||
return {
|
|
||||||
name: 'astro-inject-env-ts',
|
|
||||||
// Use `post` to ensure project setup is complete
|
|
||||||
// Ex. `.astro` types have been written
|
|
||||||
enforce: 'post',
|
|
||||||
async config() {
|
|
||||||
await setUpEnvTs({ settings, logging, fs });
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function setUpEnvTs({
|
|
||||||
settings,
|
|
||||||
logging,
|
|
||||||
fs,
|
|
||||||
}: {
|
|
||||||
settings: AstroSettings;
|
|
||||||
logging: LogOptions;
|
|
||||||
fs: typeof fsMod;
|
|
||||||
}) {
|
|
||||||
const envTsPath = getEnvTsPath(settings.config);
|
|
||||||
const dotAstroDir = getContentPaths(settings.config).cacheDir;
|
|
||||||
const dotAstroTypeReference = getDotAstroTypeReference(settings.config);
|
|
||||||
const envTsPathRelativetoRoot = normalizePath(
|
|
||||||
path.relative(fileURLToPath(settings.config.root), fileURLToPath(envTsPath))
|
|
||||||
);
|
|
||||||
|
|
||||||
if (fs.existsSync(envTsPath)) {
|
|
||||||
// Add `.astro` types reference if none exists
|
|
||||||
if (!fs.existsSync(dotAstroDir)) return;
|
|
||||||
|
|
||||||
let typesEnvContents = await fs.promises.readFile(envTsPath, 'utf-8');
|
|
||||||
const expectedTypeReference = getDotAstroTypeReference(settings.config);
|
|
||||||
|
|
||||||
if (!typesEnvContents.includes(expectedTypeReference)) {
|
|
||||||
typesEnvContents = `${expectedTypeReference}\n${typesEnvContents}`;
|
|
||||||
await fs.promises.writeFile(envTsPath, typesEnvContents, 'utf-8');
|
|
||||||
info(logging, 'content', `Added ${bold(envTsPathRelativetoRoot)} types`);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Otherwise, inject the `env.d.ts` file
|
|
||||||
let referenceDefs: string[] = [];
|
|
||||||
if (settings.config.integrations.find((i) => i.name === '@astrojs/image')) {
|
|
||||||
referenceDefs.push('/// <reference types="@astrojs/image/client" />');
|
|
||||||
} else {
|
|
||||||
referenceDefs.push('/// <reference types="astro/client" />');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fs.existsSync(dotAstroDir)) {
|
|
||||||
referenceDefs.push(dotAstroTypeReference);
|
|
||||||
}
|
|
||||||
|
|
||||||
await fs.promises.mkdir(settings.config.srcDir, { recursive: true });
|
|
||||||
await fs.promises.writeFile(envTsPath, referenceDefs.join('\n'), 'utf-8');
|
|
||||||
info(logging, 'astro', `Added ${bold(envTsPathRelativetoRoot)} types`);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue