core/providers/deno/deno.go
core/providers/deno/deno.goBrowse 1970 files
812 tokens
2,861 bytes
Token encoding: o200k_base
Snapshot 21a254f
← Back to SKILL.md
1package deno2 3import (4 "fmt"5 6 "github.com/railwayapp/railpack/core/app"7 "github.com/railwayapp/railpack/core/generate"8 "github.com/railwayapp/railpack/core/plan"9)10 11const (12 DEFAULT_DENO_VERSION = "2"13 ROOT_CACHE = "/root/.cache"14)15 16type DenoProvider struct {17 mainFile string18}19 20func (p *DenoProvider) Name() string {21 return "deno"22}23 24func (p *DenoProvider) Detect(ctx *generate.GenerateContext) (bool, error) {25 hasDenoJson := ctx.App.HasFile("deno.json") || ctx.App.HasFile("deno.jsonc")26 return hasDenoJson, nil27}28 29func (p *DenoProvider) Initialize(ctx *generate.GenerateContext) error {30 p.mainFile = findMainFile(ctx.App)31 return nil32}33 34func (p *DenoProvider) Plan(ctx *generate.GenerateContext) error {35 miseStep := ctx.GetMiseStepBuilder()36 p.InstallMisePackages(ctx, miseStep)37 38 build := ctx.NewCommandStep("build")39 build.AddInput(plan.NewStepLayer(miseStep.Name()))40 p.Build(ctx, build)41 42 ctx.Deploy.AddInputs([]plan.Layer{43 miseStep.GetLayer(),44 plan.NewStepLayer(build.Name(), plan.Filter{45 Include: []string{".", ROOT_CACHE},46 }),47 })48 ctx.Deploy.StartCmd = p.GetStartCommand(ctx)49 50 return nil51}52 53func (p *DenoProvider) CleansePlan(buildPlan *plan.BuildPlan) {}54 55func (p *DenoProvider) StartCommandHelp() string {56 return "To start your Deno application, Railpack will look for:\n\n" +57 "1. A main.ts, main.js, main.mjs, or main.mts file in your project root\n\n" +58 "2. If no main file is found, it will use the first .ts, .js, .mjs, or .mts file found in your project\n\n" +59 "The selected file will be run with `deno run --allow-all`"60}61 62func (p *DenoProvider) GetStartCommand(ctx *generate.GenerateContext) string {63 if p.mainFile == "" {64 return ""65 }66 67 return fmt.Sprintf("deno run --allow-all %s", p.mainFile)68}69 70func (p *DenoProvider) Build(ctx *generate.GenerateContext, build *generate.CommandStepBuilder) {71 if p.mainFile == "" {72 return73 }74 75 build.AddInput(plan.NewLocalLayer())76 build.AddCommands([]plan.Command{77 plan.NewExecCommand(fmt.Sprintf("deno cache %s", p.mainFile)),78 })79}80 81func (p *DenoProvider) InstallMisePackages(ctx *generate.GenerateContext, miseStep *generate.MiseStepBuilder) {82 deno := miseStep.Default("deno", DEFAULT_DENO_VERSION)83 84 miseStep.UseMiseVersions(ctx, []string{"deno"})85 86 if envVersion, varName := ctx.Env.GetConfigVariable("DENO_VERSION"); envVersion != "" {87 miseStep.Version(deno, envVersion, varName)88 }89}90 91// selects the entrypoint for a Deno app. It prefers an explicit main.* file in the92// project root, falling back to the first .ts/.js/.mjs/.mts file found anywhere in the tree.93func findMainFile(app *app.App) string {94 if name, _, _ := app.ReadFirstFileOf("main.ts", "main.js", "main.mjs", "main.mts"); name != "" {95 return name96 }97 98 matches, err := app.FindFiles("**/*.{ts,js,mjs,mts}")99 if err != nil || len(matches) == 0 {100 return ""101 }102 return matches[0]103}104