@fougere/cli 0.12.5-alpha.0 → 0.13.0-alpha.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/dist/.fougere/scan.generated.d.ts +3 -0
- package/dist/.fougere/scan.generated.d.ts.map +1 -0
- package/dist/.fougere/scan.generated.js +140 -0
- package/dist/.fougere/scan.generated.js.map +1 -0
- package/dist/app/commands/BuildCommand.d.ts +18 -0
- package/dist/app/commands/BuildCommand.d.ts.map +1 -0
- package/dist/app/commands/BuildCommand.js +35 -0
- package/dist/app/commands/BuildCommand.js.map +1 -0
- package/dist/app/commands/CallCommand.d.ts +16 -0
- package/dist/app/commands/CallCommand.d.ts.map +1 -0
- package/dist/app/commands/CallCommand.js +73 -0
- package/dist/app/commands/CallCommand.js.map +1 -0
- package/dist/app/commands/CheckCommand.d.ts +11 -0
- package/dist/app/commands/CheckCommand.d.ts.map +1 -0
- package/dist/app/commands/CheckCommand.js +59 -0
- package/dist/app/commands/CheckCommand.js.map +1 -0
- package/dist/app/commands/CompletionCommand.d.ts +7 -0
- package/dist/app/commands/CompletionCommand.d.ts.map +1 -0
- package/dist/app/commands/CompletionCommand.js +23 -0
- package/dist/app/commands/CompletionCommand.js.map +1 -0
- package/dist/app/commands/DevtoolsCommand.d.ts +20 -0
- package/dist/app/commands/DevtoolsCommand.d.ts.map +1 -0
- package/dist/app/commands/DevtoolsCommand.js +79 -0
- package/dist/app/commands/DevtoolsCommand.js.map +1 -0
- package/dist/app/commands/ExplainCommand.d.ts +18 -0
- package/dist/app/commands/ExplainCommand.d.ts.map +1 -0
- package/dist/app/commands/ExplainCommand.js +111 -0
- package/dist/app/commands/ExplainCommand.js.map +1 -0
- package/dist/app/commands/FreezeCommand.d.ts +21 -0
- package/dist/app/commands/FreezeCommand.d.ts.map +1 -0
- package/dist/app/commands/FreezeCommand.js +102 -0
- package/dist/app/commands/FreezeCommand.js.map +1 -0
- package/dist/app/commands/GrantCommand.d.ts +18 -0
- package/dist/app/commands/GrantCommand.d.ts.map +1 -0
- package/dist/app/commands/GrantCommand.js +39 -0
- package/dist/app/commands/GrantCommand.js.map +1 -0
- package/dist/app/commands/GraphCommand.d.ts +11 -0
- package/dist/app/commands/GraphCommand.d.ts.map +1 -0
- package/dist/app/commands/GraphCommand.js +72 -0
- package/dist/app/commands/GraphCommand.js.map +1 -0
- package/dist/app/commands/KeysCommand.d.ts +22 -0
- package/dist/app/commands/KeysCommand.d.ts.map +1 -0
- package/dist/app/commands/KeysCommand.js +50 -0
- package/dist/app/commands/KeysCommand.js.map +1 -0
- package/dist/app/commands/LoadCommand.d.ts +19 -0
- package/dist/app/commands/LoadCommand.d.ts.map +1 -0
- package/dist/app/commands/LoadCommand.js +37 -0
- package/dist/app/commands/LoadCommand.js.map +1 -0
- package/dist/app/commands/MigrateCommand.d.ts +17 -0
- package/dist/app/commands/MigrateCommand.d.ts.map +1 -0
- package/dist/app/commands/MigrateCommand.js +47 -0
- package/dist/app/commands/MigrateCommand.js.map +1 -0
- package/dist/app/commands/NewCommand.d.ts +24 -0
- package/dist/app/commands/NewCommand.d.ts.map +1 -0
- package/dist/app/commands/NewCommand.js +108 -0
- package/dist/app/commands/NewCommand.js.map +1 -0
- package/dist/app/commands/ServeCommand.d.ts +17 -0
- package/dist/app/commands/ServeCommand.d.ts.map +1 -0
- package/dist/app/commands/ServeCommand.js +92 -0
- package/dist/app/commands/ServeCommand.js.map +1 -0
- package/dist/app/commands/grant-material.d.ts +5 -0
- package/dist/app/commands/grant-material.d.ts.map +1 -0
- package/{app/commands/grant-material.ts → dist/app/commands/grant-material.js} +2 -2
- package/dist/app/commands/grant-material.js.map +1 -0
- package/dist/fronds/analysis/entities/Build.d.ts +10 -0
- package/dist/fronds/analysis/entities/Build.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Build.js +9 -0
- package/dist/fronds/analysis/entities/Build.js.map +1 -0
- package/dist/fronds/analysis/entities/Check.d.ts +8 -0
- package/dist/fronds/analysis/entities/Check.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Check.js +7 -0
- package/dist/fronds/analysis/entities/Check.js.map +1 -0
- package/dist/fronds/analysis/entities/Devtools.d.ts +10 -0
- package/dist/fronds/analysis/entities/Devtools.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Devtools.js +9 -0
- package/dist/fronds/analysis/entities/Devtools.js.map +1 -0
- package/dist/fronds/analysis/entities/Explain.d.ts +11 -0
- package/dist/fronds/analysis/entities/Explain.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Explain.js +10 -0
- package/dist/fronds/analysis/entities/Explain.js.map +1 -0
- package/dist/fronds/analysis/entities/Freeze.d.ts +10 -0
- package/dist/fronds/analysis/entities/Freeze.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Freeze.js +9 -0
- package/dist/fronds/analysis/entities/Freeze.js.map +1 -0
- package/dist/fronds/analysis/entities/Graph.d.ts +9 -0
- package/dist/fronds/analysis/entities/Graph.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Graph.js +8 -0
- package/dist/fronds/analysis/entities/Graph.js.map +1 -0
- package/dist/fronds/analysis/entities/Load.d.ts +10 -0
- package/dist/fronds/analysis/entities/Load.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Load.js +9 -0
- package/dist/fronds/analysis/entities/Load.js.map +1 -0
- package/dist/fronds/analysis/entities/Migrate.d.ts +10 -0
- package/dist/fronds/analysis/entities/Migrate.d.ts.map +1 -0
- package/dist/fronds/analysis/entities/Migrate.js +9 -0
- package/dist/fronds/analysis/entities/Migrate.js.map +1 -0
- package/dist/fronds/analysis/handlers/BuildHandler.d.ts +50 -0
- package/dist/fronds/analysis/handlers/BuildHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/BuildHandler.js +63 -0
- package/dist/fronds/analysis/handlers/BuildHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/CheckHandler.d.ts +30 -0
- package/dist/fronds/analysis/handlers/CheckHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/CheckHandler.js +196 -0
- package/dist/fronds/analysis/handlers/CheckHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/DevtoolsHandler.d.ts +45 -0
- package/dist/fronds/analysis/handlers/DevtoolsHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/DevtoolsHandler.js +61 -0
- package/dist/fronds/analysis/handlers/DevtoolsHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/ExplainHandler.d.ts +99 -0
- package/dist/fronds/analysis/handlers/ExplainHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/ExplainHandler.js +157 -0
- package/dist/fronds/analysis/handlers/ExplainHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/FreezeHandler.d.ts +55 -0
- package/dist/fronds/analysis/handlers/FreezeHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/FreezeHandler.js +145 -0
- package/dist/fronds/analysis/handlers/FreezeHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/GraphHandler.d.ts +23 -0
- package/dist/fronds/analysis/handlers/GraphHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/GraphHandler.js +23 -0
- package/dist/fronds/analysis/handlers/GraphHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/LoadHandler.d.ts +26 -0
- package/dist/fronds/analysis/handlers/LoadHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/LoadHandler.js +35 -0
- package/dist/fronds/analysis/handlers/LoadHandler.js.map +1 -0
- package/dist/fronds/analysis/handlers/MigrateHandler.d.ts +34 -0
- package/dist/fronds/analysis/handlers/MigrateHandler.d.ts.map +1 -0
- package/dist/fronds/analysis/handlers/MigrateHandler.js +92 -0
- package/dist/fronds/analysis/handlers/MigrateHandler.js.map +1 -0
- package/dist/fronds/analysis/services/ProjectScan.d.ts +22 -0
- package/dist/fronds/analysis/services/ProjectScan.d.ts.map +1 -0
- package/dist/fronds/analysis/services/ProjectScan.js +48 -0
- package/dist/fronds/analysis/services/ProjectScan.js.map +1 -0
- package/dist/fronds/analysis/versions.d.ts +21 -0
- package/dist/fronds/analysis/versions.d.ts.map +1 -0
- package/dist/fronds/analysis/versions.js +48 -0
- package/dist/fronds/analysis/versions.js.map +1 -0
- package/dist/fronds/scaffold/entities/BuildFrond.d.ts +7 -0
- package/dist/fronds/scaffold/entities/BuildFrond.d.ts.map +1 -0
- package/dist/fronds/scaffold/entities/BuildFrond.js +6 -0
- package/dist/fronds/scaffold/entities/BuildFrond.js.map +1 -0
- package/dist/fronds/scaffold/entities/Call.d.ts +8 -0
- package/dist/fronds/scaffold/entities/Call.d.ts.map +1 -0
- package/{fronds/scaffold/entities/Call.ts → dist/fronds/scaffold/entities/Call.js} +4 -3
- package/dist/fronds/scaffold/entities/Call.js.map +1 -0
- package/dist/fronds/scaffold/entities/Completion.d.ts +7 -0
- package/dist/fronds/scaffold/entities/Completion.d.ts.map +1 -0
- package/dist/fronds/scaffold/entities/Completion.js +6 -0
- package/dist/fronds/scaffold/entities/Completion.js.map +1 -0
- package/dist/fronds/scaffold/entities/Grant.d.ts +8 -0
- package/dist/fronds/scaffold/entities/Grant.d.ts.map +1 -0
- package/{fronds/scaffold/entities/Grant.ts → dist/fronds/scaffold/entities/Grant.js} +4 -3
- package/dist/fronds/scaffold/entities/Grant.js.map +1 -0
- package/dist/fronds/scaffold/entities/Keys.d.ts +6 -0
- package/dist/fronds/scaffold/entities/Keys.d.ts.map +1 -0
- package/{fronds/scaffold/entities/Keys.ts → dist/fronds/scaffold/entities/Keys.js} +3 -2
- package/dist/fronds/scaffold/entities/Keys.js.map +1 -0
- package/dist/fronds/scaffold/entities/New.d.ts +19 -0
- package/dist/fronds/scaffold/entities/New.d.ts.map +1 -0
- package/dist/fronds/scaffold/entities/New.js +18 -0
- package/dist/fronds/scaffold/entities/New.js.map +1 -0
- package/dist/fronds/scaffold/entities/Serve.d.ts +10 -0
- package/dist/fronds/scaffold/entities/Serve.d.ts.map +1 -0
- package/dist/fronds/scaffold/entities/Serve.js +9 -0
- package/dist/fronds/scaffold/entities/Serve.js.map +1 -0
- package/dist/fronds/scaffold/entities/Sync.d.ts +8 -0
- package/dist/fronds/scaffold/entities/Sync.d.ts.map +1 -0
- package/dist/fronds/scaffold/entities/Sync.js +7 -0
- package/dist/fronds/scaffold/entities/Sync.js.map +1 -0
- package/dist/fronds/scaffold/handlers/BuildFrondHandler.d.ts +11 -0
- package/dist/fronds/scaffold/handlers/BuildFrondHandler.d.ts.map +1 -0
- package/dist/fronds/scaffold/handlers/BuildFrondHandler.js +82 -0
- package/dist/fronds/scaffold/handlers/BuildFrondHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/CallHandler.d.ts +10 -0
- package/dist/fronds/scaffold/handlers/CallHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/CallHandler.ts → dist/fronds/scaffold/handlers/CallHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/CallHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/CompletionHandler.d.ts +9 -0
- package/dist/fronds/scaffold/handlers/CompletionHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/CompletionHandler.ts → dist/fronds/scaffold/handlers/CompletionHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/CompletionHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/GrantHandler.d.ts +9 -0
- package/dist/fronds/scaffold/handlers/GrantHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/GrantHandler.ts → dist/fronds/scaffold/handlers/GrantHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/GrantHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/KeysHandler.d.ts +9 -0
- package/dist/fronds/scaffold/handlers/KeysHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/KeysHandler.ts → dist/fronds/scaffold/handlers/KeysHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/KeysHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/NewHandler.d.ts +9 -0
- package/dist/fronds/scaffold/handlers/NewHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/NewHandler.ts → dist/fronds/scaffold/handlers/NewHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/NewHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/ServeHandler.d.ts +10 -0
- package/dist/fronds/scaffold/handlers/ServeHandler.d.ts.map +1 -0
- package/{fronds/scaffold/handlers/ServeHandler.ts → dist/fronds/scaffold/handlers/ServeHandler.js} +3 -2
- package/dist/fronds/scaffold/handlers/ServeHandler.js.map +1 -0
- package/dist/fronds/scaffold/handlers/SyncHandler.d.ts +18 -0
- package/dist/fronds/scaffold/handlers/SyncHandler.d.ts.map +1 -0
- package/dist/fronds/scaffold/handlers/SyncHandler.js +327 -0
- package/dist/fronds/scaffold/handlers/SyncHandler.js.map +1 -0
- package/dist/fronds/scaffold/services/ProjectWriter.d.ts +54 -0
- package/dist/fronds/scaffold/services/ProjectWriter.d.ts.map +1 -0
- package/dist/fronds/scaffold/services/ProjectWriter.js +315 -0
- package/dist/fronds/scaffold/services/ProjectWriter.js.map +1 -0
- package/dist/src/bin.d.ts.map +1 -0
- package/dist/src/bin.js +11 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/bridge.d.ts.map +1 -0
- package/dist/src/bridge.js.map +1 -0
- package/dist/src/completion.d.ts.map +1 -0
- package/dist/src/completion.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/loader.d.ts.map +1 -0
- package/dist/src/loader.js.map +1 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +19 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/runner.d.ts.map +1 -0
- package/dist/{runner.js → src/runner.js} +22 -22
- package/dist/src/runner.js.map +1 -0
- package/dist/src/theme.d.ts.map +1 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/src/typescript/EntityTypes.d.ts.map +1 -0
- package/dist/src/typescript/EntityTypes.js.map +1 -0
- package/dist/src/typescript/FacadeTypes.d.ts.map +1 -0
- package/dist/src/typescript/FacadeTypes.js.map +1 -0
- package/dist/src/typescript/syntax.d.ts.map +1 -0
- package/dist/src/typescript/syntax.js.map +1 -0
- package/dist/{ui.d.ts → src/ui.d.ts} +0 -1
- package/dist/src/ui.d.ts.map +1 -0
- package/dist/{ui.js → src/ui.js} +24 -22
- package/dist/src/ui.js.map +1 -0
- package/package.json +25 -29
- package/templates/frond/fronds/tsconfig.json +17 -0
- package/templates/workspace/fronds/tsconfig.json +2 -4
- package/templates/workspace/package.json +1 -1
- package/templates/workspace/pnpm-workspace.yaml +5 -3
- package/app/commands/BuildCommand.ts +0 -43
- package/app/commands/CallCommand.ts +0 -70
- package/app/commands/CheckCommand.ts +0 -70
- package/app/commands/CompletionCommand.ts +0 -24
- package/app/commands/DevtoolsCommand.ts +0 -92
- package/app/commands/ExplainCommand.ts +0 -136
- package/app/commands/FreezeCommand.ts +0 -119
- package/app/commands/GrantCommand.ts +0 -46
- package/app/commands/GraphCommand.ts +0 -91
- package/app/commands/KeysCommand.ts +0 -57
- package/app/commands/LoadCommand.ts +0 -46
- package/app/commands/MigrateCommand.ts +0 -61
- package/app/commands/NewCommand.ts +0 -137
- package/app/commands/ServeCommand.ts +0 -108
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -64
- package/dist/bin.js.map +0 -1
- package/dist/bridge.d.ts.map +0 -1
- package/dist/bridge.js.map +0 -1
- package/dist/completion.d.ts.map +0 -1
- package/dist/completion.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js.map +0 -1
- package/dist/machine.d.ts.map +0 -1
- package/dist/machine.js.map +0 -1
- package/dist/runner.d.ts.map +0 -1
- package/dist/runner.js.map +0 -1
- package/dist/theme.d.ts.map +0 -1
- package/dist/theme.js.map +0 -1
- package/dist/typescript/EntityTypes.d.ts.map +0 -1
- package/dist/typescript/EntityTypes.js.map +0 -1
- package/dist/typescript/FacadeTypes.d.ts.map +0 -1
- package/dist/typescript/FacadeTypes.js.map +0 -1
- package/dist/typescript/syntax.d.ts.map +0 -1
- package/dist/typescript/syntax.js.map +0 -1
- package/dist/ui.d.ts.map +0 -1
- package/dist/ui.js.map +0 -1
- package/fronds/analysis/entities/Build.ts +0 -8
- package/fronds/analysis/entities/Check.ts +0 -6
- package/fronds/analysis/entities/Devtools.ts +0 -8
- package/fronds/analysis/entities/Explain.ts +0 -9
- package/fronds/analysis/entities/Freeze.ts +0 -8
- package/fronds/analysis/entities/Graph.ts +0 -7
- package/fronds/analysis/entities/Load.ts +0 -8
- package/fronds/analysis/entities/Migrate.ts +0 -8
- package/fronds/analysis/handlers/BuildHandler.ts +0 -87
- package/fronds/analysis/handlers/CheckHandler.ts +0 -217
- package/fronds/analysis/handlers/DevtoolsHandler.ts +0 -97
- package/fronds/analysis/handlers/ExplainHandler.ts +0 -263
- package/fronds/analysis/handlers/FreezeHandler.ts +0 -183
- package/fronds/analysis/handlers/GraphHandler.ts +0 -38
- package/fronds/analysis/handlers/LoadHandler.ts +0 -44
- package/fronds/analysis/handlers/MigrateHandler.ts +0 -110
- package/fronds/analysis/services/ProjectScan.ts +0 -55
- package/fronds/analysis/versions.ts +0 -59
- package/fronds/scaffold/entities/BuildFrond.ts +0 -5
- package/fronds/scaffold/entities/Completion.ts +0 -5
- package/fronds/scaffold/entities/New.ts +0 -19
- package/fronds/scaffold/entities/Serve.ts +0 -8
- package/fronds/scaffold/entities/Sync.ts +0 -6
- package/fronds/scaffold/handlers/BuildFrondHandler.ts +0 -96
- package/fronds/scaffold/handlers/SyncHandler.ts +0 -376
- package/fronds/scaffold/services/ProjectWriter.ts +0 -339
- package/fronds/shims.d.ts +0 -9
- package/src/bin.ts +0 -77
- package/src/bridge.ts +0 -118
- package/src/completion.ts +0 -145
- package/src/index.ts +0 -1
- package/src/loader.ts +0 -28
- package/src/machine.ts +0 -17
- package/src/runner.ts +0 -152
- package/src/theme.ts +0 -19
- package/src/typescript/EntityTypes.ts +0 -92
- package/src/typescript/FacadeTypes.ts +0 -50
- package/src/typescript/syntax.ts +0 -11
- package/src/ui.ts +0 -142
- package/templates/flat/AGENTS.md +0 -14
- package/templates/flat/CLAUDE.md +0 -87
- package/templates/flat/_gitignore +0 -6
- package/templates/flat/app/app.vue +0 -25
- package/templates/flat/app/pages/index.vue +0 -7
- package/templates/flat/fougere.config.ts +0 -7
- package/templates/flat/nuxt.config.ts +0 -4
- package/templates/flat/package.json +0 -24
- package/templates/flat/pnpm-workspace.yaml +0 -6
- package/templates/flat/tsconfig.frond.json +0 -25
- package/templates/flat/tsconfig.json +0 -3
- /package/dist/{bin.d.ts → src/bin.d.ts} +0 -0
- /package/dist/{bridge.d.ts → src/bridge.d.ts} +0 -0
- /package/dist/{bridge.js → src/bridge.js} +0 -0
- /package/dist/{completion.d.ts → src/completion.d.ts} +0 -0
- /package/dist/{completion.js → src/completion.js} +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{loader.d.ts → src/loader.d.ts} +0 -0
- /package/dist/{loader.js → src/loader.js} +0 -0
- /package/dist/{machine.d.ts → src/machine.d.ts} +0 -0
- /package/dist/{machine.js → src/machine.js} +0 -0
- /package/dist/{runner.d.ts → src/runner.d.ts} +0 -0
- /package/dist/{theme.d.ts → src/theme.d.ts} +0 -0
- /package/dist/{theme.js → src/theme.js} +0 -0
- /package/dist/{typescript → src/typescript}/EntityTypes.d.ts +0 -0
- /package/dist/{typescript → src/typescript}/EntityTypes.js +0 -0
- /package/dist/{typescript → src/typescript}/FacadeTypes.d.ts +0 -0
- /package/dist/{typescript → src/typescript}/FacadeTypes.js +0 -0
- /package/dist/{typescript → src/typescript}/syntax.d.ts +0 -0
- /package/dist/{typescript → src/typescript}/syntax.js +0 -0
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, rmSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { upperFirst, type SchemaDescriptor } from '@fougere/schema';
|
|
4
|
-
import { EntityTypes } from '../../../src/typescript/EntityTypes.js';
|
|
5
|
-
import { FacadeTypes } from '../../../src/typescript/FacadeTypes.js';
|
|
6
|
-
// The card's shape is declared once, in core, and imported here. A private copy of it
|
|
7
|
-
// lived in this file and went stale the day an op stopped being a bare name: nothing
|
|
8
|
-
// compared the copy to the original, so the drift cost nothing until someone read it.
|
|
9
|
-
import { assertIdentityCard, type IdentityCard } from '@fougere/core';
|
|
10
|
-
import { type Conventions, resolveConventions, frondPackage } from '@fougere/core';
|
|
11
|
-
import { loadConfig } from '@fougere/core/node';
|
|
12
|
-
import { facadeModule, type Served } from '@fougere/compiler';
|
|
13
|
-
import { ErrorCode } from '@fougere/core/contract';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A union of enum MEMBERS, from what the card said this operation refuses.
|
|
17
|
-
*
|
|
18
|
-
* `ErrorCode` is a string enum, so `'CONFLICT'` is not assignable to it: a literal reads as the
|
|
19
|
-
* right thing and then refuses to narrow `FougereError<Code>`, which is the whole point. A code
|
|
20
|
-
* this version does not know is dropped rather than written — the far side may be newer, and a
|
|
21
|
-
* name that resolves to nothing would stop the consumer's build.
|
|
22
|
-
*/
|
|
23
|
-
function codesOf(errors: readonly string[] | undefined): string {
|
|
24
|
-
const known = (errors ?? []).filter((code) => code in ErrorCode);
|
|
25
|
-
if (known.length === 0) return 'never';
|
|
26
|
-
|
|
27
|
-
return known.map((code) => `ErrorCode.${code}`).join(' | ');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function assertSafeName(kind: string, name: string): void {
|
|
31
|
-
if (typeof name !== 'string' || !/^[A-Za-z_$][A-Za-z0-9_$-]*$/.test(name)) {
|
|
32
|
-
throw new Error(`Invalid ${kind} name '${name}' received from remote`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The line every generated file carries. It is what makes pruning safe: sync removes what
|
|
38
|
-
* IT wrote and nothing else, so a file a human dropped into the folder survives.
|
|
39
|
-
*/
|
|
40
|
-
const GENERATED = 'Generated by `fougere sync`';
|
|
41
|
-
|
|
42
|
-
export function entityClassName(name: string): string {
|
|
43
|
-
assertSafeName('entity', name);
|
|
44
|
-
const identifier = name
|
|
45
|
-
.split('-')
|
|
46
|
-
.filter(Boolean)
|
|
47
|
-
.map(upperFirst)
|
|
48
|
-
.join('');
|
|
49
|
-
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(identifier)) {
|
|
50
|
-
throw new Error(`Entity name '${name}' cannot be represented as a TypeScript identifier`);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return identifier;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* One entry — a facade or a fact — validated the same way, because sync consumes the same two
|
|
58
|
-
* values from both: a name it can turn into a class, and a descriptor it can rebuild.
|
|
59
|
-
*
|
|
60
|
-
* A missing descriptor is legal on either side and means different things: a facade that
|
|
61
|
-
* stores nothing (a health check, a search across shapes), or a fact whose announced type
|
|
62
|
-
* is not a declared entity. Neither produces a row class, and demanding one here refused
|
|
63
|
-
* the WHOLE card over a single entry.
|
|
64
|
-
*/
|
|
65
|
-
function assertEntry(kind: string, frondName: string, entry: { name: string; schema?: SchemaDescriptor } | undefined): void {
|
|
66
|
-
if (!entry || typeof entry !== 'object') {
|
|
67
|
-
throw new Error(`Remote frond '${frondName}' contains an invalid ${kind} entry`);
|
|
68
|
-
}
|
|
69
|
-
assertSafeName(kind, entry.name);
|
|
70
|
-
if (entry.schema === undefined) return;
|
|
71
|
-
// `ops` is not checked because it is not used: sync writes entities, and the name
|
|
72
|
-
// and the descriptor below are the only two values that reach a file. The clause
|
|
73
|
-
// that stood here demanded strings — the shape ops had before they carried their
|
|
74
|
-
// kind and their views — and so refused every real host. Validate what you consume.
|
|
75
|
-
const descriptor = entry.schema as unknown;
|
|
76
|
-
if (
|
|
77
|
-
!descriptor
|
|
78
|
-
|| typeof descriptor !== 'object'
|
|
79
|
-
|| Array.isArray(descriptor)
|
|
80
|
-
|| (descriptor as SchemaDescriptor).type !== 'object'
|
|
81
|
-
|| !(descriptor as SchemaDescriptor).properties
|
|
82
|
-
|| typeof (descriptor as SchemaDescriptor).properties !== 'object'
|
|
83
|
-
|| Array.isArray((descriptor as SchemaDescriptor).properties)
|
|
84
|
-
|| (descriptor as SchemaDescriptor)['x-fougere-version'] !== 1
|
|
85
|
-
|| (descriptor as SchemaDescriptor)['x-fougere-vendor'] !== 'fougere'
|
|
86
|
-
) {
|
|
87
|
-
throw new Error(`Remote ${kind} '${entry.name}' has no valid schema descriptor`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function identityCardOf(value: unknown): IdentityCard {
|
|
92
|
-
// The card's own shape is validated by the package that declares it — `fronds`, and each
|
|
93
|
-
// frond's `facades`. What stays here is what only a writer of files needs: a name safe to
|
|
94
|
-
// become one, and the descriptor a class is generated from.
|
|
95
|
-
const card = assertIdentityCard(value, 'Remote rpc.discover');
|
|
96
|
-
for (const frond of card.fronds) {
|
|
97
|
-
assertSafeName('frond', frond.name);
|
|
98
|
-
// Absent rather than empty is tolerated: a host older than the fact list says nothing
|
|
99
|
-
// about facts, and refusing it would break sync against every previous version for a
|
|
100
|
-
// feature the consumer may not use.
|
|
101
|
-
if (frond.facts !== undefined && !Array.isArray(frond.facts)) {
|
|
102
|
-
throw new Error(`Remote frond '${frond.name}' has no valid facts array`);
|
|
103
|
-
}
|
|
104
|
-
for (const facade of frond.facades) assertEntry('facade', frond.name, facade);
|
|
105
|
-
for (const fact of frond.facts ?? []) assertEntry('fact', frond.name, fact);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return card;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export default class SyncHandler {
|
|
112
|
-
// cwd is ambient in a CLI — not a DI service (the container resolves by type).
|
|
113
|
-
private cwd = process.cwd();
|
|
114
|
-
|
|
115
|
-
/** Mirror a remote frond's contract into local entities. */
|
|
116
|
-
async execute(input: { frond: string; from: string }): Promise<{ path: string; entities: string[]; removed: string[] }> {
|
|
117
|
-
assertSafeName('frond', input.frond);
|
|
118
|
-
let remoteUrl: URL;
|
|
119
|
-
try {
|
|
120
|
-
remoteUrl = new URL(input.from);
|
|
121
|
-
} catch {
|
|
122
|
-
throw new Error(`Invalid remote URL '${input.from}'`);
|
|
123
|
-
}
|
|
124
|
-
if (remoteUrl.protocol !== 'http:' && remoteUrl.protocol !== 'https:') {
|
|
125
|
-
throw new Error(`Remote URL must use http or https, got '${remoteUrl.protocol}'`);
|
|
126
|
-
}
|
|
127
|
-
const baseUrl = remoteUrl.toString().replace(/\/$/, '');
|
|
128
|
-
|
|
129
|
-
// The served frond answers `rpc.discover` on its call endpoint with its
|
|
130
|
-
// identity card — the same surface every consumer reads, no side endpoint.
|
|
131
|
-
const res = await fetch(`${baseUrl}/_fougere/call`, {
|
|
132
|
-
method: 'POST',
|
|
133
|
-
headers: { 'content-type': 'application/json' },
|
|
134
|
-
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'rpc.discover', params: { params: {}, query: {}, state: {} } }),
|
|
135
|
-
signal: AbortSignal.timeout(10_000),
|
|
136
|
-
});
|
|
137
|
-
if (!res.ok) {
|
|
138
|
-
throw new Error(`Failed to reach ${baseUrl}/_fougere/call: ${res.status} ${res.statusText}`);
|
|
139
|
-
}
|
|
140
|
-
const rpc = (await res.json()) as { result?: IdentityCard; error?: { message: string } };
|
|
141
|
-
if (rpc.error) throw new Error(`Remote error: ${rpc.error.message}`);
|
|
142
|
-
const card = identityCardOf(rpc.result);
|
|
143
|
-
|
|
144
|
-
const target = card.fronds.find((f) => f.name === input.frond);
|
|
145
|
-
if (!target) {
|
|
146
|
-
throw new Error(`Frond '${input.frond}' not found on ${baseUrl}. Available: ${card.fronds.map((f) => f.name).join(', ')}`);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// The consumer's own convention: a synced frond is laid out like the ones they wrote,
|
|
150
|
-
// and the export map below is what makes `@fronds/<name>/<dir>/X.js` resolve.
|
|
151
|
-
const conventions = resolveConventions((await loadConfig(this.cwd)).conventions);
|
|
152
|
-
const entities = conventions.dirs.entities;
|
|
153
|
-
const handlers = conventions.dirs.handlers;
|
|
154
|
-
|
|
155
|
-
const frondDir = join(this.cwd, '.fougere', 'remotes', input.frond);
|
|
156
|
-
const entitiesDir = join(frondDir, entities);
|
|
157
|
-
const handlersDir = join(frondDir, handlers);
|
|
158
|
-
mkdirSync(entitiesDir, { recursive: true });
|
|
159
|
-
mkdirSync(handlersDir, { recursive: true });
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* What was written under each name — the barrel below is a projection of exactly this.
|
|
163
|
-
*
|
|
164
|
-
* Three combinations, and all three occur: a facade with rows behind it (both files), a
|
|
165
|
-
* facade with none (the façade type alone), and a fact (the row class alone, because
|
|
166
|
-
* nothing calls a fact).
|
|
167
|
-
*/
|
|
168
|
-
const generated = new Map<string, { row: boolean; facade: boolean }>();
|
|
169
|
-
/** Absolute paths written by THIS run — anything else generated here is now stale. */
|
|
170
|
-
const written = new Set<string>();
|
|
171
|
-
const claim = (name: string): string => {
|
|
172
|
-
const className = entityClassName(name);
|
|
173
|
-
if (generated.has(className)) throw new Error(`Remote declares duplicate entity '${className}'`);
|
|
174
|
-
generated.set(className, { row: false, facade: false });
|
|
175
|
-
|
|
176
|
-
return className;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* One card, one class.
|
|
181
|
-
*
|
|
182
|
-
* `Card.toSchema` gives the JUDGE — validate, from, getFields — and now takes the
|
|
183
|
-
* row shape as a type argument, so the same declaration gives the TYPE. Both
|
|
184
|
-
* come off the same card: nothing to keep in step, and the file a consumer reads
|
|
185
|
-
* has the shape of the one they would have written by hand
|
|
186
|
-
* (`class Post extends entity({…}) {}`).
|
|
187
|
-
*/
|
|
188
|
-
const writeRow = (className: string, descriptor: SchemaDescriptor): void => {
|
|
189
|
-
written.add(join(entitiesDir, `${className}.ts`));
|
|
190
|
-
writeFileSync(join(entitiesDir, `${className}.ts`), [
|
|
191
|
-
`import { Card } from '@fougere/schema';`,
|
|
192
|
-
``,
|
|
193
|
-
`// Generated by \`fougere sync\` from ${baseUrl} — do not edit.`,
|
|
194
|
-
EntityTypes.of(descriptor).render({ name: className }),
|
|
195
|
-
``,
|
|
196
|
-
`export default ${className};`,
|
|
197
|
-
``,
|
|
198
|
-
].join('\n'));
|
|
199
|
-
generated.get(className)!.row = true;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
/** What the card says of each address — the same three facts a scan gives. */
|
|
203
|
-
const served: Served[] = [];
|
|
204
|
-
|
|
205
|
-
for (const { name, schema: descriptor, ops } of target.facades) {
|
|
206
|
-
const className = claim(name);
|
|
207
|
-
generated.get(className)!.facade = true;
|
|
208
|
-
served.push({
|
|
209
|
-
at: name,
|
|
210
|
-
handler: `import('./${handlers}/${className}Handler.js').${className}Handler`,
|
|
211
|
-
ops: (ops ?? []).map((op) => ({ name: op.name, codes: codesOf(op.errors) })),
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// No shape behind this facade: its operations still travel, its rows do not exist.
|
|
215
|
-
// `rowType` falls back to `unknown`, which is the truth rather than an empty class.
|
|
216
|
-
if (descriptor !== undefined) writeRow(className, descriptor as SchemaDescriptor);
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* The facade's type, next to the row's — what `Facade<T>` needs and what nothing
|
|
220
|
-
* carried across a repository boundary.
|
|
221
|
-
*
|
|
222
|
-
* Writing `Facade<ArticleHandler>` used to require importing the handler's class.
|
|
223
|
-
* `sync` does not ship handlers and should not: a handler is behaviour with state,
|
|
224
|
-
* and behaviour does not travel. Its OPERATIONS do — the card names them, says how
|
|
225
|
-
* much each returns, and that is exactly a signature.
|
|
226
|
-
*/
|
|
227
|
-
written.add(join(handlersDir, `${className}Handler.ts`));
|
|
228
|
-
writeFileSync(join(handlersDir, `${className}Handler.ts`), [
|
|
229
|
-
...(descriptor !== undefined ? [`import type { ${className} } from '../entities/${className}.js';`, ``] : []),
|
|
230
|
-
`// Generated by \`fougere sync\` from ${baseUrl} — do not edit.`,
|
|
231
|
-
`// The shape of an invocation, restated rather than imported: this file is a`,
|
|
232
|
-
`// contract, and a contract that drags a runtime dependency is not one.`,
|
|
233
|
-
`type Invocation = { params?: Record<string, string>; query?: Record<string, unknown>; body?: unknown; state?: Record<string, unknown> };`,
|
|
234
|
-
``,
|
|
235
|
-
FacadeTypes.of(ops ?? []).render({
|
|
236
|
-
name: `${className}Handler`,
|
|
237
|
-
...(descriptor !== undefined ? { rowType: className } : {}),
|
|
238
|
-
}),
|
|
239
|
-
``,
|
|
240
|
-
].join('\n'));
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* The facts, which is the only reason a subscriber needs this command at all.
|
|
245
|
-
*
|
|
246
|
-
* A fact has no operation, so no façade type is written: a listener spells
|
|
247
|
-
* `reindex(fact: Fact<PostPublished>)` and the class is the whole of what it needs.
|
|
248
|
-
* Announced without a declared shape, there is nothing to write — a class built from
|
|
249
|
-
* a bare name would validate everything, which is worse than the absence.
|
|
250
|
-
*/
|
|
251
|
-
for (const { name, schema: descriptor } of target.facts ?? []) {
|
|
252
|
-
const className = claim(name);
|
|
253
|
-
if (descriptor === undefined) {
|
|
254
|
-
generated.delete(className);
|
|
255
|
-
continue;
|
|
256
|
-
}
|
|
257
|
-
writeRow(className, descriptor as SchemaDescriptor);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* The facade module, written from the CARD rather than from a scan.
|
|
262
|
-
*
|
|
263
|
-
* A frond in another repository cannot be scanned — there are no sources here. What the
|
|
264
|
-
* card carries is exactly the three facts the module needs: the addresses, the operations,
|
|
265
|
-
* and what each one refuses. The handler TYPE is the one thing it cannot carry, so the
|
|
266
|
-
* synthetic interface written above stands in its place: it names the same operations with
|
|
267
|
-
* the same answers, which is what a page reads.
|
|
268
|
-
*
|
|
269
|
-
* `facadeModule` is the compiler's own, not a copy: two spellings of one format would
|
|
270
|
-
* drift the day either gained a member.
|
|
271
|
-
*/
|
|
272
|
-
writeFileSync(join(frondDir, 'facade.ts'), facadeModule(served, `${baseUrl} — a card, not a scan`));
|
|
273
|
-
|
|
274
|
-
// Barrel index
|
|
275
|
-
// One binding carries the value AND the type, because a class is both — the pair of
|
|
276
|
-
// re-exports that stood here was the price of declaring them separately.
|
|
277
|
-
const indexLines = [...generated].flatMap(([name, { row, facade }]) => [
|
|
278
|
-
...(row ? [`export { default as ${name} } from './${entities}/${name}.js';`] : []),
|
|
279
|
-
...(facade ? [`export type { ${name}Handler } from './${handlers}/${name}Handler.js';`] : []),
|
|
280
|
-
]);
|
|
281
|
-
writeFileSync(join(frondDir, 'index.ts'), indexLines.join('\n') + '\n');
|
|
282
|
-
|
|
283
|
-
// Package.json
|
|
284
|
-
writeFileSync(join(frondDir, 'package.json'), JSON.stringify({
|
|
285
|
-
name: frondPackage(input.frond, conventions),
|
|
286
|
-
version: '0.0.0-synced',
|
|
287
|
-
type: 'module',
|
|
288
|
-
fougere: { frond: input.frond, synced: true, source: baseUrl },
|
|
289
|
-
exports: {
|
|
290
|
-
'.': './index.ts',
|
|
291
|
-
[`./${entities}/*`]: `./${entities}/*.ts`,
|
|
292
|
-
[`./${handlers}/*`]: `./${handlers}/*.ts`,
|
|
293
|
-
'./package.json': './package.json',
|
|
294
|
-
},
|
|
295
|
-
}, null, 2) + '\n');
|
|
296
|
-
|
|
297
|
-
// .fougere/remotes.json is the central registry of synced remotes.
|
|
298
|
-
this.updateRemotesRegistry(input.frond, baseUrl, frondDir);
|
|
299
|
-
|
|
300
|
-
// Non-Nuxt projects only: Nuxt writes its own paths.
|
|
301
|
-
this.updateTsconfigPaths(input.frond, frondDir, conventions);
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* What the host no longer serves stops being importable here.
|
|
305
|
-
*
|
|
306
|
-
* The barrel is rewritten every run, so a dropped entity loses its export on its own
|
|
307
|
-
* — but the FILE stayed, and the generated `package.json` exports `'./entities/*'` as
|
|
308
|
-
* a wildcard, so `@fronds/blog/entities/Ticket.js` kept resolving to a class nothing
|
|
309
|
-
* behind it answers for. The consumer compiles, its local validator accepts, and the call
|
|
310
|
-
* comes back NOT_FOUND at the facade — or never leaves, because the page dropped the
|
|
311
|
-
* call and kept the type.
|
|
312
|
-
*/
|
|
313
|
-
const removed = [...this.prune(entitiesDir, written), ...this.prune(handlersDir, written)];
|
|
314
|
-
|
|
315
|
-
return { path: entitiesDir, entities: [...generated.keys()], removed };
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/** Delete the files this run did not write — and only the ones sync itself produced. */
|
|
319
|
-
private prune(dir: string, written: Set<string>): string[] {
|
|
320
|
-
const dropped: string[] = [];
|
|
321
|
-
for (const name of readdirSync(dir)) {
|
|
322
|
-
const path = join(dir, name);
|
|
323
|
-
if (written.has(path)) continue;
|
|
324
|
-
// Never remove what sync did not write. The folder is sync's, but a human who put
|
|
325
|
-
// something there meant it, and a delete is not the place to be clever.
|
|
326
|
-
if (!readFileSync(path, 'utf-8').includes(GENERATED)) continue;
|
|
327
|
-
rmSync(path);
|
|
328
|
-
dropped.push(name);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return dropped;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/** Write/update .fougere/remotes.json — read by @fougere/nuxt for auto-aliasing. */
|
|
335
|
-
private updateRemotesRegistry(name: string, baseUrl: string, localPath: string): void {
|
|
336
|
-
const registryPath = join(this.cwd, '.fougere', 'remotes.json');
|
|
337
|
-
let registry: Record<string, { url: string; path: string }> = {};
|
|
338
|
-
|
|
339
|
-
if (existsSync(registryPath)) {
|
|
340
|
-
try {
|
|
341
|
-
const parsed: unknown = JSON.parse(readFileSync(registryPath, 'utf-8'));
|
|
342
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('expected an object');
|
|
343
|
-
registry = parsed as Record<string, { url: string; path: string }>;
|
|
344
|
-
} catch (cause) {
|
|
345
|
-
throw new Error(`Cannot update corrupt remote registry at ${registryPath}`, { cause });
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
registry[name] = { url: baseUrl, path: localPath };
|
|
350
|
-
mkdirSync(join(this.cwd, '.fougere'), { recursive: true });
|
|
351
|
-
writeFileSync(registryPath, JSON.stringify(registry, null, 2) + '\n');
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/** Add the frond's scoped name to tsconfig paths if tsconfig.json exists. */
|
|
355
|
-
private updateTsconfigPaths(name: string, localPath: string, conventions: Conventions): void {
|
|
356
|
-
const tsconfigPath = join(this.cwd, 'tsconfig.json');
|
|
357
|
-
if (!existsSync(tsconfigPath)) return;
|
|
358
|
-
|
|
359
|
-
try {
|
|
360
|
-
const raw = readFileSync(tsconfigPath, 'utf-8');
|
|
361
|
-
const tsconfig = JSON.parse(raw);
|
|
362
|
-
|
|
363
|
-
// Don't touch Nuxt-managed tsconfigs (extends .nuxt/tsconfig.json)
|
|
364
|
-
if (tsconfig.extends?.includes('.nuxt/')) return;
|
|
365
|
-
|
|
366
|
-
tsconfig.compilerOptions ??= {};
|
|
367
|
-
tsconfig.compilerOptions.paths ??= {};
|
|
368
|
-
|
|
369
|
-
const relative = localPath.replace(this.cwd, '.').replace(/\\/g, '/');
|
|
370
|
-
tsconfig.compilerOptions.paths[frondPackage(name, conventions)] = [`${relative}/index.ts`];
|
|
371
|
-
tsconfig.compilerOptions.paths[`${frondPackage(name, conventions)}/*`] = [`${relative}/*`];
|
|
372
|
-
|
|
373
|
-
writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\n');
|
|
374
|
-
} catch { /* tsconfig parse error — skip */ }
|
|
375
|
-
}
|
|
376
|
-
}
|